火曜日, 9月 19, 2023

Qt6 の日本語化 (CMake, QtLinguist)

 Qt5 の日本語化の記事はあるようですが、Qt6 CMake を使っての方法が探してもなかったので書いておきます。

プロジェクト作成時、言語を設定してもそのままでは日本語化できません。

手順は以下の通りです。

  1. 空の TS ファイルを作る
  2. CMakeLists.txt を更新する
  3. CMake を用いて単語を抽出する
  4. QtLinguist で日本語化する
  5. アプリ側で QM ファイルを読み込む


空のTSファイルを作る


このファイルはプロジェクト作成時、言語を指定すると自動生成されます。指定していなければ作成します。

ファイル名は任意ですが、 <アプリ名>_ja_JP.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 で日本語化する


QtCreator で TS を右クリックすると Open With メニューから Qt Linguist を起動できます。

コマンドラインからも起動できます。


アプリ側で QM ファイルを読み込む


TS ファイルは QM ファイルへ変換されます。

アプリ側でファイルを読み込むと作業は完成です。標準コンポーネントのため、標準 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 では画面のデザインが標準化されていて楽です。きっちり並んだ部品は感動です。

縦横並べるコマンドがあって、隙間をそろえる部品があります。

Qt オープンソース・ダウンロード

水曜日, 2月 17, 2021

Flask/wtform/SelectField フォームで入力チェックがうまくいかないとき

 Flask の wtform は入力値の自動チェックを行うので便利なんですが、自動チェックさせるとときどき引っかかるので面倒です。

SelectField を使うなら値はしっかり設定しておかねば入力値はすべてはじいてくれます。選択肢をデータベースからひいてきて自動設定している場合なぞ要注意です。

SelectField を設定する関数を書けば便利です。

Form をインスタンス化しただけで form.validate() をついかけてしまうような間違いを防ぐことができます。

月曜日, 2月 15, 2021

Flask/url_for() で引数を省略

Flask ではルートを指定して動作を指定します。動作は関数で記述します。Flask は指定された関数を起動します。

引数を指定することもできます。引数は<引数>の形で指定、関数の引数で受け継ぎます。この引数を省略できるのか、っていう問題です。

Python の関数はデフォルト値を持つ引数は省略できます。そのノリでそのまま引数のデフォルト値を指定してもルートは判別しません。

ここは引数なしのルートを指定してやります。関数のほうはデフォルト値を指定することで対処します。ここでルートの最後の/(スラッシュ)を指定します。

これで url_for() で引数を省略できます。


水曜日, 8月 21, 2019

Jinja (Flask/SQLAlchemy) で日付をフォーマットする

Flask/SQLAlchemy 使ってる方、jinja で困ってませんか?

本体で Python の関数を書いてもいいんですが、テンプレートでも関数が呼べます。

日付を出したい場合、フォーマットなら strftime() が使えます。


わざわざ文字列を作って渡す必要はありません。



月曜日, 7月 22, 2019

PyMongo で内部結合

PyMongo を使った内部結合の実装です。classics テーブル、baroque テーブルの内部結合を キー composer_id で照らし合わせたものです。

外部結合なら $match の部分なしで結果がとれます。

_id で照らし合わせる場合、ObjectId(id) で合わせるか文字列へ変換するか気を付ける必要があります。

土曜日, 6月 29, 2019

Python: 指数分布のグラフを書く

Python の使いやすさはただごとじゃありません。

ユーザーの層が厚いのはユーザーが多いから。人気が人気を呼ぶパターンですね。ドキュメント類の豊富さ(本家じゃなくても)が質を変えているわけです。民主主義ですよこれは。

使いにくさなんてユーザーが変えていくもんです。多くの人たちが使っていればですね。意見を取り入れる柔軟さはピカイチです。もとからかなり特色ある言語ですが、ライブラリの豊富さでも群を抜いてます。

グラフを書くのもお手の物です。使い慣れた言語で思いのままってのは数式が近く感じられていいもんです。そのままシェルからグラフが書けます。

以下のスクリプトは指数分布を描きます。




日曜日, 1月 27, 2019

Scala: BigInt で階乗を計算する

Java の BigInteger の扱いは面倒です。すべての演算が関数形式で引数を指定しなければならないのでとても不便です。オペレータ演算子を定義できない安全志向 Java の弱みでもあります。

Scala ならその心配はありません。何の躊躇もなく演算子を書き換えれば独自の世界が展開します。BigInt の扱いも自然です。オペレータ演算子をほぼすべてそのまま使えます。いわゆる中置記法(infix)で書けるので読みやすくデバッグしやすいコードが書けます。

Java: BigInteger で階乗を計算する では Java の BigInteger で階乗を計算するコードを載せました。Scala で書いたのがこれです。これだとなんか特記すべきこともないです。



比べてみれば利点は明らかです。言語設定がプログラミングの効率をどこまで上げるのか、現場を顧みない世迷いごとは「プログラミング言語はどれもC言語が基本だから(!)、基本構造が同じなら書けることは同じ」これで論破できますね。

金曜日, 9月 21, 2018

型破りな Python

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 ブロックでコードが終わるとき

ゆえあってPythonでシステムを書いている今日この頃なんですが、面白い発見をしたのでここで書いておきます。

まあ、もとはといえばtry-except-finallyなど書いていて、データベース接続をどこで閉じるかっていう議論があったわけです。finallyブロックでどうか、なんていうことで議論は収束しました。

しかしながらここで「え」「これfinallyこないんじゃない」「無理だよ」「unreachable」っていう指摘が出てきたわけなんです。tryブロックで値を返していたわけなんですね。finallyへは来ないんじゃ…

しばらくして「あれ?」って声が上がりました。これです。

この結果は…(走らせてみてください)。

tryブロックで終了するコードだと起きる現象ですね。

実はこれ、Javaでも同様です(走らせてみてください)。

土曜日, 8月 11, 2018

Python でタイミング図(信号)を描く

Python ライブラリの matplotlib を使ってタイミング図を描く方法です。


それはいいんですが、ここで一言。



Python プロジェクトでライブラリのバージョンを管理するなら仮想環境が要ります。
 
numpy モジュールを読見込む際、signal.py でみごとこけました。です。

ので「休日を返せ」モードで 

(Python は素晴らしい言語かもしれないが)ライブラリ管理がなっていない。 

なってないです。つまり、Java でいう Central Repository + Maven がない。

「numpy を使うなら singal.py ファイルを作ってはならない」なる注意書きが必要です。信じがたい。



で、タイミング図を書く方法です。

ここのポイントは線グラフの描写で、毎クロックで縦線をひきます。

折れ線グラフは点を指定して図を描いているのと同じなので、x値を繰り返せばそこで縦線がひかれるわけですね。

xValue で指定しているのがそれです。

金曜日, 5月 04, 2018

Python: ファイルリストをソートする

このところゆえあって Python プロジェクトを担当しております。

括弧のない簡便さ、行末のセミコロンなし、インデント必須ってのははまりますね。

ライブラリの豊富さってのはプログラミング言語のすべてみたいなもんですが、こいつばかりは人気がモノを言います。

もっとも好まれる言語で選ばれる Python ならではの強みですね。

その Python でディレクトリ中のファイルをリストアップするスクリプトを書いてみました。

path でディレクトリを、type でソートのキーを指定します。

金曜日, 1月 19, 2018

Arduino: ネオピクセルLEDテープライト

ちょっと感動しました。このネオピクセルLEDテープライト。まずフルカラーです。

どんどん明るくなっていくLEDなんですが、このテープ、それぞれLEDを指定して点灯できるんですね。

これLEDごとレジスタがついてる。

WS8212B データシート

シフトレジスタを使ってLEDを指定して点灯する方法がありますが、その原理です。シリアルで信号を送ってそれぞれ点灯できるわけです。それぞれ切り取って使えます。

「なんてこった」って思いましたね(笑。

Arduino 使ってつないで点灯してみたんですが、これですね。いいライブラリまで出てる。鮮やか。動きがある。並べるとイメージが違う。(実際はこの動画よりもっと鮮やかですよー)

Guide for WS2812B Addressable RGB LED Strip with Arduino



プログラムです。ライブラリはこちらです。


これ並べたマトリックス・ディスプレイまで出てますが(まだ高いですね)、夢が広がります。


日曜日, 1月 14, 2018

Arduino: 光と音で警告するマウス

作ってみました。ここは当然の如く3Dプリンターで。IR距離センサーで反応します。

近づくと光と音で警告します。

フルカラーLEDで通常は青、反応すると赤、しばらくは緑が点灯します。

LEDが赤で点灯中は振動モーターで鳴ってくれます。

ケースは丸く作ったのですが思い直して両側を削って作りました。

のっかってる赤トンボは愛嬌です(頭でバランスがとれてます)。


こんな感じで動きます。




このプログラムは音声センサまでついてますが、写真のマウスは距離センサだけです(なくても動きます)。


金曜日, 1月 05, 2018

コメントを消すプログラム (flex)

できました。うざいコメントを消すプログラム。

コメントをすべて消してくれるプログラムです。

// から行末、/* */ 内を消すプログラムです。あしからず。

自分で書いても良かったんですが、flex 使ってみました。これならクオート(リテラル)の処理が自動です。

コンパイル方法は以下の通り。
flex remove-comments.l;
gcc lex.yy.c -lfl -o remove-comments.exe

ファイル名を指定してください。
./remove-comments.exe filename

追記です(2021-02-24)。Cygwin 環境での flex のインストール方法です。結論から言うと、m4 をインストール。gcc をインストールで動きます。Devel パッケージからはだめです。個別のプログラム名でインストール。

うるさいコメントがこれで消えます。

(追記)IME変換ってのはアメ公のエゴが満開ですよね。日本語は連中の所有物じゃない。冒涜です。

火曜日, 12月 26, 2017

互換性(mysql_xxx)

年末の大掃除ですね。古いコードを再利用しようとしたらひっかかりました。PHP って互換性ないんですね。

mysql_xxx この辺を全部 mysqli クラスの関数へ変換。変数の順序が違う。

迷惑ですね。

しかしながら思うんですが…

プログラミング言語ってのはプロトコルですよ。一方的な変更は勝手ですよね。

少なくとも互換性は確保してほしい。


月曜日, 12月 25, 2017

MySQL で、NULL 値

MySQL で、NULL 値を許可するかどうかで条件分岐が変わってきます。

LIKE では NULL 値をはじけないんですね。

コラムの値で NULL 値を許可するなら、OR で指定せねばなりません。


SELECT * FROM pages WHERE menuid=$id AND NOT status LIKE 'onhold' ORDER BY id desc



これなんですが、ここの status の値が NULL の場合、こうやって指定せねばなりません。


SELECT * FROM pages WHERE menuid=$id AND (status IS NULL OR NOT status LIKE 'onhold') ORDER BY id desc


気を付けましょう。

金曜日, 11月 24, 2017

デジタルからアナログへ

PC を使わないアナログ回路は設計・制作が(かなり)手間ではありますが省電力です。

LED を点滅させるだけならトランジスタでいけます。


それはいいんですが、アナログ回路の欠点といえばモジュール化できないところ。回路を組み合わせるのはケースバイケース、至難の業です。これが PC を使っていればどのようなセンサーでも使えます。標準化されたインターフェース(HIGH-LOW)だからですね。

ここでは回路をフォトダイオードで制御する回路を組み合わせてみました。

感度の調整は可変抵抗です。





木曜日, 11月 23, 2017

Arduino: アナログからデジタルへ

大抵のセンサーの出力はアナログです。光セル、音声マイク、赤外線距離センサーなど。Arduino ならアナログでもアナログ端子があるので使えるんですが、これを割り込み操作で使おうと思うとデジタルな値が欲しい場合があります。

オペアンプでセンサーの出力をデジタル化できます。



この回路は赤外線距離センサーの出力を増幅し、オペアンプでコンパレータ回路を実現したものです。基準値は非反転入力で調整します。

これでアナログの束縛から解放されますね。

割り込みを使った Arduino 用のプログラムはこちらです。

日曜日, 11月 19, 2017

可変電源+ケース


可変電源を組んでケースを作ってみた。実用性はともかくきれいなのができた。青いケース、青い7セグがいい。こんないいのができると夢を誘う。



人間心理ってのは微妙なもので、「アクリル板曲げ」のサイトを読んでいたら危機感(これはまずい)が襲ってきたっていうか。急遽CADでデザインして3Dプリンタでケースを印刷。

PHP: 定数を扱う

プロジェクトごとの定数を扱うクラス Config\Constants の紹介です。 <?php namespace Config; class Constants {     public const DB_USER = "linguist...