Qt 5 の未来は明るいブログ

環境変数 QT_LOGGING_RULES でのログ出力のルールの設定を改善しました

Published: 2015-07-17

Qt Japan Summit 2015 でカテゴライズされたログ出力の仕組みや出力の形式の設定についてのセッションをした時に色々気になっていたところを直す余裕がちょっとできたので色々改善中です。

Qt のログの出力のルールは QLoggingCategory の「Logging Rules」 に記載されているようにいくつかの設定方法がありますが、環境変数 QT_LOGGING_RULES もその一つです。基本的に改行区切りで設定するルールですが、環境変数の時は(改行区切りで設定するのがめんどくさいので)一行で書きたいなーと思って QT_LOGGING_RULES supports multiple rules separated by semicolons というパッチを作成しました。

変えたのは一行

- const QByteArray rulesSrc = qgetenv("QT_LOGGING_RULES");
+ const QByteArray rulesSrc = qgetenv("QT_LOGGING_RULES").replace(';', '\n');

パーサーは改行を区切りとして動作するので、セミコロンを改行に置換するだけという、とても単純明快な変更です。

それ以外がめんどくさかった

最初は 5.5 ブランチにプッシュしたのですが、「これ挙動の変更だから 5.6 の方(dev ブランチ)にプッシュしてね」と言われたり、「環境変数のセパレータは普通はコロンなので、それも対応して」と言われたり、「コロンはやめようぜ」と言われたり、「挙動が変わるからドキュメント書いてね」と言われて、似たようなことをしているところのドキュメント を参考に 頑張って書いた り、ChangeLog に載せるためのコメントを コミットメッセージ に書いたり、不安定な CI と粘り強く付き合ったりと、色々頑張りました。

Qt 5.6 (LTS) で使えるようになります

今年の11月とか12月とかにリリースされるやつですね。それまで待ちきれない人はこのパッチを当てててください。

Qt のログ出力のルールのバグを修正しました

Published: 2015-07-16 / Last modified: 2015-07-16

Logging Rules にログ出力のルールの指定方法が載っていますが、「*.debug=false;driver.usb.debug=true」のような無効な指定が行われた場合に警告が出ないというバグを見つけたので修正しました。

パッチ

Add warning for malformed logging rule です。別の警告をパクって、そのまま出力するようにしました。仕事中に書いたので (PTP) がついていますね。

そもそも、環境変数で複数のルールを指定する場合にQT_LOGGING_RULES="*.debug=false;driver.usb.debug=true" みたいにできたらいいなぁと思って色々ためしているうちに見つけたバグです。本命は 別のパッチ で対応中なので、対応が完了した際にはまた記事を書こうと思います。

libQt5Core.so が実行可能にならないバグを修正しました

Published: 2015-07-15 / Last modified: 2015-07-16

libQt5Core.so の実行結果のバグを修正しました で紹介したとおり、libQt5Core.so は実行可能なのですが、自分でビルドした libQt5Core.so を実行すると以下のエラーになったので色々調べて修正しました。

問題点

$ ./lib/libQt5Core.so
./lib/libQt5Core.so: cannot execute binary file: Exec format error

色々調べる

前回見た、qt_core_boilerplate ですが、ELF_INTERPRETER というマクロが定義されていた場合のみ有効になっています。

そして、このマクロは global.pri の中で以下のとおり指定されます。

if(linux*|hurd*):!cross_compile:!static:!*-armcc* {
    QMAKE_LFLAGS += -Wl,-e,qt_core_boilerplate
    prog=$$quote(if (/program interpreter: (.*)]/) { print $1; })
    DEFINES += ELF_INTERPRETER=\\\"$$system(readelf -l /bin/ls | perl -n -e \'$$prog\')\\\"
}

/bin/ls を readelf でオブジェクトの情報を表示させて、「program interpreter:」の項目を取り出して使っているようですね。

Continue reading...

libQt5Core.so の実行結果のバグを修正しました

Published: 2015-07-11 / Last modified: 2015-07-15

Linux をお使いのみなさん、さっそくですが以下のコマンドを実行してみてください。

$ `qmake -query QT_INSTALL_LIBS`/libQt5Core.so.`qmake -query QT_VERSION`

自分がリンクしている Qt5 の libQt5Core.so がどこにあるかわかっている場合は

$ /path/to/libQt5Core.so

でも同じです。

libQt5Core.so は実行可能です

Qt 4 のいつからか忘れましたが、QtCore ライブラリは実行可能になっています。

これは libQtCore のビルド時に リンカ に-e オプションで qt_core_boilerplate を設定するようになっているからです。

そして実行結果の情報が正しくない

$ ./libQt5Core.so.5.5.1

This is the QtCore library version Qt 5.5.1 (x86_64-little_endian-lp64 shared (dynamic) debug build; by GCC 4.8.4)
Copyright (C) 2015 The Qt Company Ltd.
Contact: http://www.qt.io/licensing/

Build date:          2012-12-20
Installation prefix: /home/tasuku/io/qt/qt/qt5/5.x/xcb/qtbase
Library path:        lib
Include path:        include
Processor features:  sse2[required] sse3 ssse3 sse4.1 sse4.2 avx

「Build date: 2012-12-20」の部分がおかしいですね。

数ヶ月前に「ビルドの日時をバイナリに埋め込むとビルドするごとにバイナリの内容が変わってしまうデメリットの方が大きいからやめない?」という ML での話し合いの結果、Avoid hardcoding build date in qtcore and tools というパッチが取り込まれました。

これによって libQt5Core.so の出力結果からも Build date: が削除されるべきでしたがなぜか見落とされていたので今回修正するパッチを作りました。

パッチを送りました

remove Build date from qt_core_boilerplate() で、実際の修正は該当の2行を消すだけの簡単なものです。

Qt 5.5 ブランチで取り込まれたため、次の Qt 5.5.1 では修正されていると思います。

おまけ

普段使っている環境で試すと libQtCore.so の実行に失敗してしまう問題があり、そちらも 現在修正中 です。修正が終わったら記事にしたいと思います。

Qt Creator のマウスホイールのスクロールでズーム機能のバグを修正しました

Published: 2015-07-11 / Last modified: 2015-07-11

2015年7月の Qt 勉強会 #24 の時に送った TextEditor: follow "Enable scroll wheel zooming" setting behavior というパッチが取り込まれました。

修正したかった問題

Qt Creator の差分表示画面で、Ctrl + ホイールスクロールが有効になっていて、しかも片方だけズームが変わる問題を修正しようと思っていました。

最初のパッチ

この差分表示画面にはスクロール位置を同期させるコードがあったので、そこを真似して、wheelEvent が来てズームが変わったら、もう片方のビューアーのズームも同じように変えるようなパッチを送りました。

再現しない

最初にレビューしてくれた方から「これ何のパッチなの?」と聞かれ、「そもそもその問題再現しないんだけど?」というコメントがついて、そんなバカな?という感じでしたが、設定の TextEditor > Behavior options > Enable scroll wheel zooming にチェックが入っている場合(デフォルトの動作)にはこの現象は起こらず、うまく同期されているということが判明しました。

方針転換

その設定にチェックが入っていない場合にはそもそもスクロールしないのが正解ということで、最終的な変更は src/plugins/texteditor/texteditor.cpp このようになりました。

だいぶ対処療法的ですが、そもそものホイールスクロールズームが void QPlainTextEdit::wheelEvent(QWheelEvent *e) でこのように実装されているため、スマートには解決できず、注意コメント付きの怪しいパッチになってしまいました。

Qt Creator 3.5.0 から反映されます

本当は 3.4 ブランチにプッシュすべきパッチだった気がしますが、もう 3.5 系がリリースされていると勘違いしていたため 3.5 ブランチにプッシュしてしまいました。

どうでもいいバグなのでこの修正を心待ちにしている方はいないと思われますが、つい先日リリースされたばかりの Qt Creator 3.5 beta1 にはこの修正が取り込まれているので気になる方はお試し下さい。

Qt 勉強会 #24 @Tokyo 開催しました

Published: 2015-06-22

2015年6月20日(土曜日)に Qt 勉強会 #24 @Tokyo株式会社 PTP のミーティングルームで開催しました。

簡単な自己紹介

今回は参加者が18人(+懇親会から1人)。初めて参加された方が7名、学生さんも3名いらっしゃいました。

Qt Japan Summit 2015 について

結構参加された方がきていましたので、今回のイベントに対するフィードバックのお願いを再度しました。

Qt Contributors' Summit 2015 の報告

イベントの Qt 土産を少し配って、そもそもイベントだったのかとか、どんな話があったのかについて簡単に報告しました。

おやつを食べながらもくもくタイム

自己紹介の後は自由時間ということで、各自自分のやりたいことを進めながら、質問があったり困ってることがあったりしたらみんなで相談にのるような形で進めていきました。

成果発表

コラージュ療法用のアプリの開発を進めていました

今回は QPrinterQPainter を使用して印刷機能を作っていましたが、座標変換のところで色々苦労していましたが、問題点と解決策は整理できたということでした。

開発環境をインストールしていました

Qt 自体のインストールはしていたのですが、OpenCV のインストールを忘れていたということで、それに半日かかってしまったということでした。

TreeView 用のモデルを作っていました

3D のオブジェクトファイルを GUI でロードして柔軟に扱うための GUI を作成中で、オブジェクトの中身をツリー状に表示するためのモデルを QAbstractItemModel の派生クラスとして開発していたということで、「予想通り必要以上に面倒くさい」ということでした。

自作ソフトの開発を進めていました

内部ウィジェット的なものをプラグイン形式で拡張できるような仕組みを作っていたということでした。

Sailfish 関係のことをアレコレ進めていました

Qt の勉強をはじめました

ファイルダイアログで画像ファイルを選択して、QLabel に表示するアプリケーションを作りました。

Qt の勉強を進めました

会社で Qt をやれと言われたそうですw

QWebView のスクロール位置の再設定と格闘していました

QWebViewでのスクロールについて - スタック・オーバーフロー の内容で、そちらにも回答を書いておきましたが、QWebFrame::contentsSizeChanged などを駆使して一応問題は解決したということでした。

「Qt QuickではじめるクロスプラットフォームUIプログラミング」を読んで勉強していました

Keys の汎用ハンドラと専用ハンドラの違いがよくわからなかったということですが、なんとか解決して、4.8 章の「アニメーション」の前まで終わったということでした。

自作エディタの開発を進めていました

今回は QCompleter を使って補完機能を追加したということでした。

自作ソフトの Qt 化を進めていました

3D の MRI のデータを、ボリュームレンダリングという方法で描画するソフトの GUI を freeglut で作っていたのすが、ツラくなってきたので Qt に移植中で、だいぶ Qt のことがわかってきたということでした。

線グラフの描画を作っていました

QPainter を使用してグラフを書くウィジェットを作成していました。背景のクリアの処理の関係で描画がゴミゴミになってしまうところでハマりました。

自作の 3D アプリの開発を進めていました

前回はタイムライン機能を追加していましたが、今回はモデルのオブジェクトの表示とパストレース機能の実行用の UI を作りました。

Qt Creator の変なバグを修正しました

DiffEditor: sync font size between two editors というパッチを送ったのですが、そもそも修正しようとした挙動自体がおかしいという話になりまして…。

懇親会

8人で懇親会を行いました。

まとめ

今回も様々な人が参加してくれて、とてもおもしろかったです。

Continue reading...

Qt Contributors' Summit 2015(2日目)

Published: 2015-06-08

昨日 に引き続き今日も一日セッション三昧でした。

Local Qt Meetups, how to get them going and what support is needed?

セッションのノートは https://wiki.qt.io/QtCS2015_LocalQtMeetups

各国や各都市で勉強会を開催している人、してみたい人、したけどうまく行かなかった人などが集まってローカルな勉強会について議論をしました。

スペイン、ベルリン、ロンドン、サンフランシスコ、東京の他何人かの人が集まっていましたが、そもそも Qt の勉強会を単独でやる意味があるのか?とか、例えばこの間 MySQL の発表したんだけど、みんながみんな興味のあるトピックってないよねーとか。色々苦労しているようでした。

日本でも2年半前にそういうことを色々悩んで、結局2013年の1月からは発表形式ではなくモクモク形式での勉強会を開催しつづけてきていますが、まぁ普通に色々難しいですよね。

とりあえず日本では色々準備するの面倒くさいから発表なしで毎月やっていること、10人〜20人くらいコンスタントに集まっていること、場所だけ提供して、聞きたいことや発表したいことがあったら自由にしてもいいことにしていることなどを説明しました。

それ以外で現場でアレコレ地味な工夫とか努力をしていたりするのはしゃべれませんでした。

後半はどうやって宣伝してるの?とかいう話が多かったようですが、「Qt 勉強会」とかでググったら毎月やってることがわかるのが一番大事じゃない?と思ってました。言えませんでしたが。

最後に、Qt の中の人は何ができるか?という話になり、「シールとかTシャツとかなんでもいいから送ってよこせ!」という意見で一致しました。

本当は、もう少し長期的なスパンで、「コミュニティをどう育てるか」について話をしたかったのですが、「勉強会をどう成功させるか」が焦点だったので少し不発に終わった感じでした。

Continue reading...

Qt Contributors' Summit 2015(1日目)

Published: 2015-06-07 / Last modified: 2015-06-07

昨日も色々頑張りましたが 今日からが本番です。

受け付け

ネームタグを自分で探してTシャツを一枚受け取るスタイルでした。Tシャツはデザインがいまいちな感じで残念。

オープニングスピーチ

イベントの責任者が簡単な業務連絡を行ったあと、スポンサーを代表して floglogic の CEO が簡単な挨拶を行いました。

全体会議 by Lars

簡単な自己紹介(いまさら必要ない)のあと、Qt の20周年 についてちょっと感慨深そうに話をしていました。

その後、昨年の QtCS で発表した qt.digia.com と qt-project.org の qt.io への一本化の進捗について説明がありました。

ライセンスとして LGPLv3 を今後(新規で開発するものについて)は積極的に採用していく方向であること、それによって(LGPLv3が採用できないケースで)商用ライセンスを使ってもらうチャンスが増えることを期待しているという話がありました。

OSS としての Qt も KDE Free Qt Foundation との取り決めにしたがって引き続き積極的に推進していくこと、今後に向けて契約条項を改訂していく予定であることなどについても説明がありました。

Qt の現在の開発状況を(いつもどおり)コミットログの統計グラフ を元に説明し、Qt のコミットの2〜3割は The Qt Company 以外の会社や個人によるものであることであることを強調し、コミュニティからの貢献は Qt の開発の欠かせないピースであることを(いつもどおり)アピールしていました。

それから、Digia の子会社として The Qt Company を作るにいたった経緯や、財務的な状況、会社として製品のラインナップを見直したこと、今後は(デスクトップ&モバイルの)アプリケーション開発と、独自端末開発向けのソリューションの2本柱でビジネスを推進していくこと、ウェブサイトも引き続き改善していく予定であることなどについても触れました。

技術的な面では、Qt を「開発者に魅力的な選択肢にみえるように」、「最先端のアプリケーション/デバイス開発が常に可能であるように」していくことを目標に、C++11/C++14 のような最新の規格に迅速に追従し、Qt 自体の開発にも積極的に活用していくこと、逆に、古いモジュール、コンパイラ、OS などは段階的に非サポートにしていくこと、特に組み込み向けにメモリの使用量を削減していくことなどを改めて表明しました。

現在 Qt 開発のボトルネックの1つになっている CI システムについても触れ、現在新しいシステムを構築中であること、3人くらいのエンジニアをアサインしていること、それにより現在抱えている様々な問題が改善されることをシェアしました。

Continue reading...

Qt Contributors' Summit 2015(前日編)

Published: 2015-06-06 / Last modified: 2015-12-26

2015年6月6日から2日間ノルウェーのオスロで開催される「Qt Contributors' Summit 2015」 に参加するため、オスロに来ました。

移動

日本から11時間半くらいかけてドイツのミュンヘンまで行き、さらに2時間かけてオスロに到着するというただでさえツラい感じなのですが、先週 Qt Japan Summit 2015 が無事開催できて、気が抜けて、ちょうど風邪を引いてしまったため、喉が痛い&鼻水が止まらない&頭が痛いで結構ツラい思いをしながらなんとかたどり着きました。

ミュンヘンからオスロへのフライトが、偶然 QtCore のメンテナと一緒だったので、オスロに着陸してからはボケーッと彼に着いていけばほぼホテルまでたどり着けたのがラッキーでした。

ホテルに着いたのは夜の10時過ぎでしたが、まだ太陽が沈んでいなくてさすが北欧!という感じでした。

オスロ市内観光

次の日は朝から朝木さんといおりさんと3人でオスロ市内の観光をしてきました。

2011年の9月にオスロに出張で来て以来、4年ぶり3度目の観光で、2時間ほど中心部を適当に歩いてきました。

Royal Palace

Nobel Peace Center

Continue reading...

Qt Japan Summit 2015 (本番編)

Published: 2015-05-29

2015年5月26日(火)、秋葉原のコンベンションホールにて「Qt Japan Summit 2015」が開催されました。

この記事では当日のドタバタを紹介したいと思います。

8時会場着

当日の朝方4時半まで発表資料を作っていて、少しだけ寝てから会場まで電車で行きました。

ユーザー会の展示ブース

内容については今更書かなくてもいいはず。こういう光景を見ると俺いいことしてるなーと思いますね。

展示内容とかブース担当とか全然ちゃんと話し合わなかったのに、当日なんとかしていたユーザー会のみなさん、特に @helicalgear さんありがとう!

開会の挨拶

前日に10回くらいリハーサルをしたのですが、当日は緊張していて、全然おもしろくなかったので深く反省しております。

20周年記念ケーキのプレゼント

Continue reading...