プロジェクトごとの定数を扱うクラス Config\Constants の紹介です。
月曜日, 7月 28, 2025
PHP: 定数を扱う
水曜日, 7月 23, 2025
PHP: Composer の使い方
PHP には Composer という優れたパッケージ管理ツールがあります。最近、PHP サイトを Composer を使って再構築する作業を行いましたので、方法を書いておきたいと思います。
Composerとは?
ComposerはPHPのパッケージ管理ツールです。PythonにおけるPoetryに似ており、依存関係の管理とプロジェクトの構造化を支援してくれます。
composer.jsonによってすべての依存情報を一元管理Packagistというリポジトリから多くのパッケージをインストール可能
Composerの最大の魅力のひとつが、オートローディング機能です。PSR-4準拠の設定を行えば、名前空間に応じてクラスファイルが自動的に読み込まれます。
インストール方法はこちら⇒公式サイト
プロジェクトの初期化
プロジェクトフォルダで以下のコマンドを実行して composer.json を生成します:
composer init
オートローディング設定
composer.json に以下を追加してクラスを読み込みます。
"autoload": {
"psr-4": {
"Pages\\": "src/Pages/"
}
}
追加後は以下のコマンドを実行して、オートロード情報を更新します。
composer dump-autoload
使用法
EditPage というクラスを作るなら、src/Pages/EditPage.php ファイルで namespace を指定し、クラスを定義します。
namespace Pages;
class EditPage {
public static function hello() {
return "EditPage::hello() が呼ばれました。";
}
}
EditPage を使うファイルで以下を設定します。
require 'vendor/autoload.php';
use Pages\EditPage;
echo EditPage::hello();
火曜日, 7月 22, 2025
Python: Poetry の使い方
Python のパッケージ管理で便利なツールがあります。pip や venv などもいいですが、ここでは poetry の使い方を説明したいと思います。
インストール
curl -sSL https://install.python-poetry.org | python3 -使い方
poetry new <proj>Python モジュールの追加
poetry add requests仮想環境の管理
poetry run py script.py仮想環境の構築
poetry install水曜日, 7月 02, 2025
Laravel サイトのアップグレード
Laravel のサイトをアップグレードする機会がありましたので、その方法をここで書いておきたいと思います。かなり構成というか書き方が変わってきているので注意が必要です。
1. 新しいLaravelプロジェクトの作成
まずはクリーンなLaravel環境を作成します。
composer create-project laravel/laravel new-site
2. 既存コードの移行
必要なファイルを新しいプロジェクトにコピーします:
コントローラ →
app/Http/Controllersモデル →
app/Modelsビュー →
resources/viewsルーティング →
routes/web.phpまたはroutes/api.phpミドルウェア、サービス、ジョブなど → 必要に応じて
3. Composerのオートロードを更新
クラスのオートロードを再生成します。
composer dump-autoload
4. 必要なパッケージの再インストール
Spatieの権限管理パッケージを使っている場合なら
composer require spatie/laravel-permission
5. Apacheの設定に注意
重要なのが、Apacheの mod_rewrite モジュールを有効化することです。これはひっかかりました。これを忘れるとルーティングが正しく機能せず、トップページしか表示できません。
LoadModule rewrite_module modules/mod_rewrite.so
6. ルーティングの見直し・更新
Laravelのバージョンアップに伴い、ルーティングの記述方法や構文が変更されていることがあります。
クロージャベースのルートやコントローラルートにおける名前空間の指定方法
Route::controller()やRoute::middleware()を使用したグルーピング構文Web/APIルートファイルでのミドルウェアやプレフィックスの指定
Laravel 8以降では、RouteServiceProvider が変更されましたので変更が必要な場合があります。web.php の記述はこれで動きます。
土曜日, 11月 11, 2023
Qt: 外部プログラムを起動する
Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。
外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。
この QProcess::startDetached が Qt5.10 から使用方法がアップデートされたようなので、ご報告まで。引数は外部プログラムへのパスではなく、プロセスIDをとります。
外部プログラムは QProcess::setProgram() で設定します。
金曜日, 11月 10, 2023
QTreeWidget アイテムの追加・削除
QTreeWidget はそのまま使えるツリー構造用のコンポーネントです。そのまま、というのは QTreeView 派生クラスなど作らなくても備え付けのデータクラスが使えるという意味です。
QTreeWidget へアイテムを追加するコードはヘルプにもありますが、ここではルート要素へも追加できるコードを置いておきます。
アイテムを削除する方法はこちらです。ルート要素の削除もできます。
水曜日, 11月 08, 2023
QTableWidget: ヘッダーのフォントをボールド化する
QTableWidget のヘッダーを設定し、フォントをボールド化する方法です。
QTableWidget のヘッダーは setHorizontalHeaderLabels() を呼び出し QStringList を渡すことで設定できます。
設定後、フォントを取得し、setBold() でボールドを設定します。
QTableWidget で右クリックメニュー(コンテキストメニュー)
QTableWidget で右クリックメニューを出す方法です。
まずQTableWidget でコンテキストメニューを有効化する必要があります。
呼び出したメソッドでメニューを作り、popup() メソッドで表示します。
木曜日, 10月 12, 2023
Qt6: アイコンを設定する(Windows)
Qt はまってます。Mac でも書いたアプリがコンパイルできて、しっかり動くのを確認しました。このあいだ Chitubox が Qt 使ってるのを知ってうれしかったです。
Mac でもそのまま動くんですが、アプリのアイコンの設定はプラットフォーム依存です。
公式マニュアルでも設定が分かりにくかったのでここでは Windows でのアイコンの設定を説明します。
アイコンの設定方法
1.ICO ファイルを作成します。https://realfavicongenerator.net/ などで作成できます。
2.プロジェクトからアクセスできる場所を選んで保存します。/images 下など。
3.Qt Creator でリソースファイル resource.qrc を作成します。プロジェクト名で右クリックメニューから Add New ... で作成できます。
4.メインウィンドウの初期化時などで、ウィンドウのアイコンを設定します。
setWindowIcon(QIcon("://images/phrases.ico"));
これでコンパイルすればウィンドウのアイコンが設定できているのが確認できます。
5.アプリの実行ファイルのアイコンは、icon.rc ファイルを作成することで設定できます。
右クリックメニューから Add New ... をクリック、Empty File を作成し、icon.rc など名付けます。
6.icon.rc へ以下の内容を書き込みます。
IDI_ICON1 ICON "images/phrases.ico"
これで設定は完了です。コンパイルすれば出来上がった実行ファイルのアイコンが設定されているのが確認できます。
windeployqt コマンドでデプロイが終了です。
ViFlash のソースコードはこちらです。参考まで。
https://github.com/easai/ViFlash
火曜日, 9月 19, 2023
Qt6 の日本語化 (CMake, QtLinguist)
Qt5 の日本語化の記事はあるようですが、Qt6 CMake を使っての方法が探してもなかったので書いておきます。
プロジェクト作成時、言語を設定してもそのままでは日本語化できません。
手順は以下の通りです。
- 空の TS ファイルを作る
- CMakeLists.txt を更新する
- CMake を用いて単語を抽出する
- QtLinguist で日本語化する
- アプリ側で QM ファイルを読み込む
空のTSファイルを作る
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="ja_JP"> <context> </context> </TS>
CMakeLists.txt を更新する
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
qt6_add_translations(I18n
TS_FILES I18n_ja_JP.ts
QM_FILES_OUTPUT_VARIABLE qm_files)
install(FILES ${qm_files} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}CMake を用いて単語を抽出する
cmake --build . --target update_translations
QtLinguist で日本語化する
アプリ側で QM ファイルを読み込む
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages) {
const QString baseName = "I18n_" + QLocale(locale).name();
if (translator.load(baseName)) {
a.installTranslator(&translator);
break;
}
}
QTranslator stdTranslator;
for (const QString &locale : uiLanguages) {
const QString baseName = "qt_" + QLocale(locale).name();
if (stdTranslator.load(baseName,QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
a.installTranslator(&stdTranslator);
break;
}
}
上記の方法で作成したプロジェクトです。参考まで。
https://github.com/easai/I18n.git
木曜日, 9月 07, 2023
Qt キュート(C++ GUI フレームワーク)
Qt キュート って GUI フレームワークがあります。案件が降ってくるとかで手を出したんですが(来なかった)書きやすいので引っかかったところとか書いておきたいと思います。C++です。
最新版が Qt6 で、CMake が標準です。ポータブルなのが売りですが Windows で使ってます。使えます。
画面を見たら分かるかと思いますが、Qt では画面のデザインが標準化されていて楽です。きっちり並んだ部品は感動です。
縦横並べるコマンドがあって、隙間をそろえる部品があります。
水曜日, 2月 17, 2021
Flask/wtform/SelectField フォームで入力チェックがうまくいかないとき
Flask の wtform は入力値の自動チェックを行うので便利なんですが、自動チェックさせるとときどき引っかかるので面倒です。
SelectField を使うなら値はしっかり設定しておかねば入力値はすべてはじいてくれます。選択肢をデータベースからひいてきて自動設定している場合なぞ要注意です。
SelectField を設定する関数を書けば便利です。
Form をインスタンス化しただけで form.validate() をついかけてしまうような間違いを防ぐことができます。
月曜日, 2月 15, 2021
Flask/url_for() で引数を省略
水曜日, 8月 21, 2019
Jinja (Flask/SQLAlchemy) で日付をフォーマットする
本体で Python の関数を書いてもいいんですが、テンプレートでも関数が呼べます。
日付を出したい場合、フォーマットなら strftime() が使えます。
わざわざ文字列を作って渡す必要はありません。
月曜日, 7月 22, 2019
PyMongo で内部結合
外部結合なら $match の部分なしで結果がとれます。
_id で照らし合わせる場合、ObjectId(id) で合わせるか文字列へ変換するか気を付ける必要があります。
土曜日, 6月 29, 2019
Python: 指数分布のグラフを書く
ユーザーの層が厚いのはユーザーが多いから。人気が人気を呼ぶパターンですね。ドキュメント類の豊富さ(本家じゃなくても)が質を変えているわけです。民主主義ですよこれは。
使いにくさなんてユーザーが変えていくもんです。多くの人たちが使っていればですね。意見を取り入れる柔軟さはピカイチです。もとからかなり特色ある言語ですが、ライブラリの豊富さでも群を抜いてます。
グラフを書くのもお手の物です。使い慣れた言語で思いのままってのは数式が近く感じられていいもんです。そのままシェルからグラフが書けます。
以下のスクリプトは指数分布を描きます。
日曜日, 1月 27, 2019
Scala: BigInt で階乗を計算する
Scala ならその心配はありません。何の躊躇もなく演算子を書き換えれば独自の世界が展開します。BigInt の扱いも自然です。オペレータ演算子をほぼすべてそのまま使えます。いわゆる中置記法(infix)で書けるので読みやすくデバッグしやすいコードが書けます。
Java: BigInteger で階乗を計算する では Java の BigInteger で階乗を計算するコードを載せました。Scala で書いたのがこれです。これだとなんか特記すべきこともないです。
比べてみれば利点は明らかです。言語設定がプログラミングの効率をどこまで上げるのか、現場を顧みない世迷いごとは「プログラミング言語はどれもC言語が基本だから(!)、基本構造が同じなら書けることは同じ」これで論破できますね。
金曜日, 9月 21, 2018
型破りな Python
変数やメンバ変数などそのものを配列で扱えます。しかも値を文字列で取得できます。これは便利ですね。グローバル、ローカル変数そのものが配列でアクセスできます。
globals() locals()
型でさえ抽象されてます。同じ変数名で型を変えることが Python なら可能です。なんか抵抗があるようなところが型破りな Python なわけです。
a = 0 # int a *= 1.0 # float a = str(a) # string
ここで型は変数の属性、変えることのできる属性の一種です。
これができるってことはつまり静的型チェックがないわけなんですが、そもそも Python はコンパイラなんてもたないんですよね。
有名どころでは、True/False がそのまま数です。
if False + 1: print('???')
水曜日, 9月 19, 2018
Python: try ブロックでコードが終わるとき
まあ、もとはといえばtry-except-finallyなど書いていて、データベース接続をどこで閉じるかっていう議論があったわけです。finallyブロックでどうか、なんていうことで議論は収束しました。
しかしながらここで「え」「これfinallyこないんじゃない」「無理だよ」「unreachable」っていう指摘が出てきたわけなんです。tryブロックで値を返していたわけなんですね。finallyへは来ないんじゃ…
しばらくして「あれ?」って声が上がりました。これです。
この結果は…(走らせてみてください)。
tryブロックで終了するコードだと起きる現象ですね。
実はこれ、Javaでも同様です(走らせてみてください)。
土曜日, 8月 11, 2018
Python でタイミング図(信号)を描く
それはいいんですが、ここで一言。
Python プロジェクトでライブラリのバージョンを管理するなら仮想環境が要ります。
numpy モジュールを読見込む際、signal.py でみごとこけました。です。
ので「休日を返せ」モードで
(Python は素晴らしい言語かもしれないが)ライブラリ管理がなっていない。
なってないです。つまり、Java でいう Central Repository + Maven がない。
「numpy を使うなら singal.py ファイルを作ってはならない」なる注意書きが必要です。信じがたい。
で、タイミング図を書く方法です。
ここのポイントは線グラフの描写で、毎クロックで縦線をひきます。
折れ線グラフは点を指定して図を描いているのと同じなので、x値を繰り返せばそこで縦線がひかれるわけですね。
xValue で指定しているのがそれです。
Flask の Blueprint のテンプレート問題
Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...
-
コンデンサマイク 極性があります コンデンサマイクがようやく届きました。モジュールではないのでそのままでは信号が弱いので使えません。信号を増幅する必要があります。 ちょっとした手間ですが、首尾よく動いてくれました。この回路の応用で、使えるマイクが出来ます。 ...
-
Qt はまってます。Mac でも書いたアプリがコンパイルできて、しっかり動くのを確認しました。このあいだ Chitubox が Qt 使ってるのを知ってうれしかったです。 Mac でもそのまま動くんですが、アプリのアイコンの設定はプラットフォーム依存です。 公式マニュアルでも設定...
-
PowerBuilder では Time, Date, DateTime などという型があります。 デフォルトの表示形式から変更する場合は String() 関数を使います。 String(Date('1/12/2016'),'yyyy-mm-dd...



