Qt で cout の出力が表示されない


はじめに

簡単な Qt コンソールアプリケーションを作ってみようとして躓いてしまったので、記録しておきます。Ubuntu で Qt コンソールアプリケーションを作成する場合、cout が何も表示しない場合があるという現象です。私の試した環境は、

  • Ubuntu MATE 14.10 (64bit)
  • Qt 5.4.1

です。Windows (VS 2013) では問題無いことを確認しています。

cout の出力が表示されない

以下のような単純なコンソールアプリケーションを Qt で書いてみました。

これを実行したところ、以下のように何も表示されませんでした。
cout_nothing

試しに “cout” を “cerr” に変更すると、以下のように正しく表示されることがわかりました。
cerr

バッファがフラッシュされていない

c++ – Qt standard output. cout does no print – Stack Overflow を見て、”endl” を追加してみました。

改行が追加されましたが、正しく表示されました。
cout_endl

cout の場合、endl が無いとバッファがフラッシュされないようです。ということはバッファを強制的にフラッシュしてしまえば良いので、以下のように endl でなく flush にしてみました。

cout_flush

これなら改行されません。Ubuntu 上では、flush を忘れないようにする必要がありますね。

[参考サイト]
c++ – Qt standard output. cout does no print – Stack Overflow

Ubuntu 14.10 で Genymotion の仮想デバイスがフリーズする現象の対処


はじめに

先日、Ubuntu ファミリーの最新版 14.10 がリリースされました。これを期に、これまで使っていた Xubuntu 14.04 から Ubuntu Mate 14.10 に乗り換えてみました。インストールは順調に進んだのですが、Genymotion を起動したところで問題が発生しました。仮想デバイスを作成して起動しようとしますが、いつまで経っても初期化が終了しないのです。しかも、OS 自体が入力を受け付けない状況に・・・。色々と調査&試行錯誤を繰り返して、ようやく問題が解決しましたので、ここに記録しておきます。

原因は NVIDIA のドライバ

なかなか原因が特定できなかったのですが、Genymotion の FAQ で判明しました。Genymotion – Frequently Asked Questions に以下が記されています。

When I start a virtual device, why does Genymotion freeze or crash?
This is due to an incompatibility with your video card driver.

仮想デバイス起動時に Genymotion がフリーズまたはクラッシュするのはなぜ?
ビデオカードのドライバーの非互換性が原因です。

ただ、この FAQ には解決策は書かれておらず、問題特定のために情報収集して報告するための手順が書かれているだけです。私の PC は NVIDIA Geforce GTX660M が乗っているのですが、おそらく 14.10 で提供される NVIDIA のドライバーと Genymotion の相性が悪いのだと推測されます。

NVIDIA の最新ドライバをインストールするには

まず試したのは、「追加のドライバー」にあるドライバの変更でした。プロプライエタリなドライバにしたりしてみましたがだめでした。次に、NVIDIA のサイトからドライバをダウンロードしてインストールを試みました。これは結構厄介で、一旦シングルモードで起動しなおしてから実行する必要があります。ですが、これもエラーが出ます。無理やり実行すると OS 自体おかしくなってしまいました。。。。
ここまでで打つ手が途切れてしまい、Android 標準の AVD を使おうかと考えていた所、How To Install The NVIDIA 340.46 Driver On Ubuntu 14.10, Ubuntu 14.04 And Derivative Systems | LinuxG.net を見つけ、その手順にしたがって簡単にドライバーをインストールできました。再起動したところ、見事に Genymotion が動作するようになりました。手順は、以下のとおりです。

念のため、バージョンを Unix Graphics Announcements and News Board – NVIDIA Developer Forums で確認すると、340.46 が最新のドライバなのでバッチリです。(343 はベータのようです。)

あとがき

Ubuntu Mate なかなか良いです。Xubuntu からの乗り換えでもそれ程違和感ありませんし、しっかり作られている感じがします。特に日本語化チームが頑張ってるのが感じられて好感がもてます。Ubuntu の公式ファミリー登録も間近との事で、今後はこれで行こうかと思っています。

[参考サイト]

  1. Genymotion – Frequently Asked Questions
  2. How To Install The NVIDIA 340.46 Driver On Ubuntu 14.10, Ubuntu 14.04 And Derivative Systems | LinuxG.net
  3. Unix Graphics Announcements and News Board – NVIDIA Developer Forums

Android ボタン押下テスト時の SecurityException


はじめに

これまで UI のテストは書いていなかったのですが、今後は書くようにしようと思い、早速ボタンの押下テストを書いてみました。が、いきなり例外(SecurityException)発生です。今回は、その内容と対処法について記事にしてみました。

ボタン押下テストでセキュリティ例外発生

“Start” ボタンを押すと表示が “Stop” になるという、トグルボタンのテストコードを以下のように書きました。

TouchUtils.clickView() を使うと、UI スレッドを意識しなくて良いので楽ちんです。しかし、テストを実行してみると、以下のような例外が発生してしまいました。

java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission

原因は

調べてみたところ、Android.test.TouchUtils methods don’t work on headless emulator, help! – Stack Overflow を発見。エミューレータがロックスクリーンになっていたのが原因でした。確かに、最初にエミュレータを起動した後、Android Studio の後ろに隠れてしまっていて画面を見ていませんでした。あらためて確認してみると。

間違いなくロックスクリーンでした。
鍵マークをスワイプしてロックを外してからテストを実行すると問題なくテストが動きました。

これで問題は解決しましたが、さらに調べると、Activity Testing | Android Developersに記述がありました。

You may find that UI tests don’t work if the emulator’s or device’s home screen is disabled with the keyguard pattern. This is because the application under test can’t receive key events sent by sendKeys(). The best way to avoid this is to start your emulator or device first and then disable the keyguard for the home screen.

エミュレータもしくはデバイスのホームスクリーンがキーガードパターンで無効になっていると、UI テストは動作しません。これは、テスト下のアプリケーションが sendKeys() で送られるキーイベントを受け取れないためです。これを避ける一番良い方法は、最初にエミュレータもしくはデバイスを起動し、ホームスクリーンのキーガードを無効にしておくことです。

まぁ、当然といえば当然ですね。エミュレータの設定でロックが動作しないようにもできたと思いますが、できるだけ通常の状態でテストしたいので今はそのままにしておくことにしました。

追記

Activity Testing | Android Developers の記事の下にはコードでキーガードを外す方法も書いてあるのですが、パーミッション(android.permission.DISABLE_KEYGUARD)を設定する必要があります。その場合リリース時にはパーミッションを外す必要があり、それを忘れるとユーザに余分なパーミッションを提示する事になってしまいます。リリース時とは別にテスト用のマニフェストが使えたらなぁと思っていたところ、Android Studio 0.8.11 Released – Android Tools Project Site で可能になるようです。今はまだ canary channel ですが、ベータになるのは時間の問題と思います。待ち遠しいなぁ。

[参考]

  1. Android.test.TouchUtils methods don’t work on headless emulator, help! – Stack Overflow
  2. Activity Testing | Android Developers
  3. Android Studio 0.8.11 Released – Android Tools Project Site