「Qt World Summit 2019」「Qt Contributors' Summit 2019」参加レポート

#001 Qt活用の最前線に触れる―「Qt World Summit 2019」レポート

この記事を読むのに必要な時間:およそ 9 分

セッション

各セッションは,以下の8カテゴリに分類されており,1セッション30分または60分で,73セッションが行われました。なお,カテゴリ最後のカッコ内数字は各カテゴリのセッション数を表しています。

  1. Application Development ⁠19)
  2. Automation(4)
  3. Automotive(5)
  4. Graphics & 3D(10)
  5. Qt & Technical Deep Dive(10)
  6. Tooling & Testing(13)
  7. Embedded(8)
  8. Python(4)

ここでは,筆者が参加したセッションの中から,下記の4つのセッションについて紹介したいと思います。

  • 「QML Component Design: the two-way binding problem」
  • 「Qt for Python on Embedded Systems」
  • 「Testing Your Code for Security Issues With Automated Fuzzing」
  • 「Automating Qt GUI Tests on Desktop,Web,Mobile and Embedded」

QML Component Design: the two-way binding problem

KDAB社のAndré Somers氏は,アプリケーションのバックエンドに保存されている状態を表示及び操作するQMLコンポーネントを作成したときに,コンポーネントのユーザが設定したプロパティバインディングを確実に動作させるための方法について語りました。さまざまな方法で提起された課題に対処する方法をデモを交えながら説明しました。

セッションの中でデモを紹介する前に,以下の3点が前提としてあるとします。

  • C++で書かれたコントローラー(SomeController)
  • 接続したいチェックボックスコンポーネント(CheckBox)
  • チェックボックスとボタンを使用してコントローラーの状態をリセットするメインのqmlファイル

C++のコントローラで変更された状態(SomeController.isBlue)をコンポーネントのプロパティ(CheckBox.checked)に反映し,チェックボックスのプロパティが変更された場合にC++のコントローラの状態に反映するという,双方向のバインディングを実施したい場合,直感的には以下のようなコードが書きたくなります。

 CheckBox {
     checked: SomeController.isBlue
     onCheckedChanged: SomeController.isBlue = checked
 }

しかし,このコードではcheckedプロパティが変更される際にバインディングが破壊されるため,双方向バインディングを維持することはできません。

そこで,提案されたアプローチの1つとして,コントローラがメイン状態を更新しないという方法があります。コンポーネントを変更し,コントローラの状態をバインディングされるプロパティとUIが操作された場合の通知を目的とした中間プロパティを用意します。バインディングされたcheckedプロパティはコンポーネントからは変更されないため,バインディングは破壊されることなく簡単なコードで双方向バインディングを実現できます。

自作のコンポーネントでしか使用できませんが,非常に簡単で軽量なソリューションとして紹介されました。この方法では,値の更新はこのプロパティを介してのみ設定されます。コンポーネントはそれ自体で値のプロパティを変更せず,提案された値は,信号またはプロパティのいずれかになります。

このセッションは,QML開発でよく使う手段である一方,不具合の原因にもなりえるプロパティバインディングに着目しました。QMLで開発を行ったユーザなら誰もが経験するような,プロパティバインディングの不具合に対するアプローチを考えさせられる内容になっていました。

Qt for Python on Embedded Systems

Toradex社のValter Minute氏とStefan Eichenberger氏は,デスクトップマシン用のQtアプリケーションの開発ではコンパイルとデバッグは快適だが,組込システムに向けたコンパイル,デバッグは複雑であると言います。理由としてツールチェーン,クロスコンパイル,クロスデバッグなどに注意する必要があるためです。Qtではそうした問題に対処するためにBoot2Qtがありますが,Qt for Pythonならば全く同じアプリケーションを再コンパイルせずに実行できるとしていました。

また,C++ではなくPythonを選んだ理由として以下の4点を挙げました。

  • クロスコンパイルが必要ないこと
  • パフォーマンスが重要ではないコードであること
  • ターゲット上でも簡単に変更できること
  • アプリケーションはすぐに移植可能であること

Pythonには,MicroPythonと呼ばれる通常のPythonの標準ライブラリの全てをサポートせずに組み込みコントローラでの利用に適切としたものだけをサポートしている言語処理系が存在します。これにより,異なるマイクロコントローラでも実行できます。インタープリタの実行に十分なRAM,フラッシュ,処理能力さえあれば,別のマイクロコントローラへの移植にも大きな制限はないのが特徴です。MicroPython自体はC言語で記述されています。

また,CircuitPythonと呼ばれる,Adafruit社がMicroPythonをベースに開発した言語があります。CircuitPythonをインストールしたCPUボードはUSBメモリ&Pythonインタープリタとして動作します。このCPUボードをパソコンのUSB端子に接続すると,USBメモリとして認識されます。このUSBメモリ上のテキストファイル main.py(Pythonプログラム)を直接パソコンのテキストエディタで編集して上書きすると,即時に実行されるようになっています。

このため特別な開発環境は不要なので,ボードに電源だけを供給すればmain.pyを実行できます。こうした既存の組込み向けの技術がすでにPythonで存在していることも,Qt for Pyhotnを組込みデバイスの開発に利用しようとした経緯にあると思われます。 セッションの最後では,Qt for Pythonを利用することで組み込み開発が高速化して,快適にプロトタイプを作成できることを強調していました。

Testing Your Code for Security Issues With Automated Fuzzing

KDAB社のAlbert Astals Cid氏は,考慮すべき潜在的なケースが多数あるため,潜在的に信頼できないデータ(パーサー,インポーターなど)を扱う安全なコードを書くことは難しいとしていました。そのためコードのセキュリティを改善するための方法の1つであるFuzzingについて語りました。

Fuzzingは特定のコードに無効またはランダムなデータを与えて,動作をテストします。最新の Fuzzing では,入力で何を変更する必要があるのかを理解して,テストをより早く,正確に行えるようになっています。

特に,このセッションではoss-fuzzというGoogle社が開発したファジングエンジンを取り上げました。このエンジン自体はlibFuzzerと呼ばれています。特徴として,コードとリンクし,カバレッジベースであることが挙げられます。つまり,最小数の「ランダム」入力でカバレッジを学習および最大化できます。以下のようなコードでも,最小数のランダムな変数を入力することで安全性を担保できると言います。

 void theFunction(int x) {
         if (x > 50) {
         } else {
         }
 }

oss-fuzzは一連のdockerイメージ(clangの最新バージョン,libFuzzerなど)およびフリーソフトウェアプロジェクトを実行する小さなテストアプリケーションになっています。現時点で,GitHub上には約240程度のプロジェクトがあります。The Qt Company社のRobert Löhning氏は,Qt and oss-fuzzという観点で取り組んでいます。

ここでは,以下の5点について紹介されました。

  • libFuzzerを使用したQtのローカルファジング
  • カバレッジ情報を追加するためのスイッチの構成(5.13以降)
  • qtbase,qtdeclarative,qtsvgのいくつかのファジング
  • ファジングの初期化に使用できるテストファイル
  • oss-fuzz用に登録されたQtプロジェクト(未使用)

QtのどのコードでFuzzingテストが必要かどうかは,一般的なテスト基準と同じように信頼できない可能性のあるデータで動作するコードで,Fuzzing テストを実施するべきだと話しました。

著者プロフィール

田中智史(たなかさとし)

株式会社SRAのエンジニア。2018年からQtチームに配属され,Qtのアプリケーション開発を担当している。