ページ

2014-09-26

Linux版HipChatで日本語入力できないときの対処(Ubuntu + 野良Qt5アプリで日本語入力)

Linux版HipChatで日本語入力ができなくて、最初そんなもんかと思ったけど追っかけてみたら直せた。
結論的にはださいがこれでいけた:

今回はこうだったが、実際は環境によっていろいろだと思うので、進め方を残しておく。

環境

Distribution
Ubuntu 14.04 Japanese Remix (amd64)
Desktop 環境
Cinnamon →第342回 デスクトップ環境Cinnamonを使用する:Ubuntu Weekly Recipeを参照

Qt5での日本語入力に必要なこと

Qt5でbuildされた QtCreatorで日本語入力をできるようにする(@Linux環境) によると、どうやら2つのことが必要らしい。
  • 環境変数QT_IM_MODULEの設定
  • platforminputcontextsプラグインの配置(or 環境変数でプラグインパスの変更)

対象アプリケーションの構成の確認

HipChatのインストール方法はHipChat - Downloadsに書いてある通り、apt-lineを追加してapt-get install。つまり、公式ではない野良アプリケーション。

以下のコマンド出力からわかるように、自前でQt5ライブラリを抱えており、シンボリックリンク"/usr/bin/hipchat"からのbash script "/opt/HipChat/bin/hipchat"からの/opt/HipChat/lib/hipchat.binで起動するようになっている。
$ dpkg -L hipchat
/usr
/usr/bin
/usr/share
/usr/share/applications
/usr/share/applications/hipchat.desktop
/usr/share/icons
/usr/share/icons/hicolor
/usr/share/icons/hicolor/256x256
/usr/share/icons/hicolor/256x256/apps
/usr/share/icons/hicolor/256x256/apps/hipchat.png
(略)
/opt
/opt/HipChat
/opt/HipChat/bin
/opt/HipChat/bin/linuxbrowserlaunch
/opt/HipChat/bin/hipchat
/opt/HipChat/bin/HipChatNowPlaying.rb
/opt/HipChat/lib
/opt/HipChat/lib/libvorbis.so.0.4.5
/opt/HipChat/lib/libvorbisfile.so.3.3.4
(略)
/usr/bin/hipchat
(略)
/opt/HipChat/lib/hipchat.bin
(略)
/opt/HipChat/lib/libQt5Network.so.5
/opt/HipChat/lib/libvorbis.so
/opt/HipChat/lib/libQt5Sql.so.5
/opt/HipChat/lib/libdbusmenu-qt5.so.2
$ file /usr/bin/hipchat
/usr/bin/hipchat: symbolic link to `/opt/HipChat/bin/hipchat' 
$ file /opt/HipChat/bin/hipchat 
/opt/HipChat/bin/hipchat: Bourne-Again shell script, ASCII text executable
$ tail -1 /opt/HipChat/bin/hipchat 
exec -a "$0" $commandtorun "$hipchatRoot/lib/hipchat.bin"  $arguments

環境変数QT_IM_MODULEの設定

QT_IM_MODULEが設定されていることを確認する。

$ env | grep IM_
CLUTTER_IM_MODULE=xim
QT_IM_MODULE=fcitx
QT4_IM_MODULE=fcitx
GTK_IM_MODULE=fcitx

fcitxに設定されているようだ。

platforminputcontextsプラグインの確認

先ほどの記事によると、platforminputcontextsプラグインが重要らしい。ということでパッケージを調べてみると

$ dpkg -L hipchat | grep platforminput
/opt/HipChat/lib/plugins/platforminputcontexts
/opt/HipChat/lib/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so
/opt/HipChat/lib/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so

ということで、fcitxはない。ibusはあるので、おそらくibusだったらそのまま入力できたのだろう。

Ubuntu側にあればもらってこようと思って調べたら、
$ dpkg -S fcitxplatform
fcitx-frontend-qt5:amd64: /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so
ということで、存在していた。なければapt-get install fcitx-frontend-qt5で入りそうである。

そのため、以下のようにシンボリックリンクを張ることで日本語入力を行うことができるようになった。
$ sudo ln -s /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so \
 /opt/HipChat/lib/plugins/platforminputcontexts/
それぞれビルドされた環境が異なるし、いつまでこれができるかわからないので、いっそcpでコピーしたほうがいいかもしれない。

番外:環境変数QT_PLUGIN_PATHの設定

先ほどの記事からするとQT_PLUGIN_PATHを/usr/lib/x86_64-linux-gnu/qt5/pluginsに向ければいけそうであるが、そうはいかない。というのも、/opt/HipChat/bin/hipchatがunsetしているからである。

/opt/HipChat/bin/hipchat抜粋:
thisfile="`readlink -f "$0"`"
thisdirectory="`dirname "$thisfile"`"
hipchatRoot=$thisdirectory/../
export HIPCHAT_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export HIPCHAT_QT_PLUGIN_PATH=$QT_PLUGIN_PATH
export LD_LIBRARY_PATH=$hipchatRoot/lib
unset QT_PLUGIN_PATH
exec -a "$0" $commandtorun "$hipchatRoot/lib/hipchat.bin"  $arguments

自前のほうに向けないとあらぬプラグインを読んだりするかもしれないものね。こういうケースもあるので、野良アプリケーションでは起動するときの流れを確認されたい。

2014-09-20

WindowsアプリのUI自動操作をUI Automation PowerShell Extensionで行う

UI Automation PowerShell Extensionは、.NET Frameworkに付属するUI オートメーションライブラリのPowerShellラッパーで、UI自動操作(UIオートメーション)をPowerShellで記述できる。これにより、GUIしかないアプリの定型作業をスクリプト化したり、UIテストを行ったりすることができる。だいぶ前に書こうと思ったのだけど、思い出したのでようやく書くことにした。

まずは例として、Windowsに付属する「電卓」を使って1 + 2を計算してみるスクリプトを書くと以下のようになる。

$process = Start-Process calc -PassThru
$window = Get-UiaWindow -ProcessId $process.Id
$window | Get-UiaButton -Name '1' | Invoke-UiaButtonClick | Out-Null
$window | Get-UiaButton -Name '加算' | Invoke-UiaButtonClick | Out-Null
$window | Get-UiaButton -Name '2' | Invoke-UiaButtonClick | Out-Null
$window | Get-UiaButton -Name '等号' | Invoke-UiaButtonClick | Out-Null


結構簡単に操作できることがわかると思う。ではここから使い方を見ていく。

準備

まずは準備として、http://uiautomation.codeplex.com/ に行き、Downloadボタンを押してzipをダウンロード、どこかに展開する。

本当はこの中身をDocuments\WindowsPowerShell\Modules\UIAutomationに入れるのだけど、お試しなのでとりあえず
Import-Module .\UIAutomation.dll
とする。

Get-Moduleして以下のようにでてくればOK。

PS > Get-Module UIA*

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     0.8.7.79   UIAutomation                        {Add-UiaBannerText...


作り方

作り方は、「UI要素を探す」「UI要素をコントロールする」を繰り返すだけ。

UI要素を探す

UIをポイントするとUI要素を表示してくれるSpyツール「UIAutomationSpy.exe」が付属しているので、これを使ってコマンドを生成することができる。

UIAutomationSpy.exeを起動すると、ボタンが2つとテキストボックスがいくつかある画面が起動するので「Start」ボタンを押してから、マウスカーソルに適当なウィンドウに持っていくと、テキストボックスにコマンドが表示される。



欲しい部品が見つかったら、素早くStopボタンを押す。

一番下のテキストボックスにホバーしたUI要素を探すためのコマンドが書かれているが、基本的にはこれをそのまま使うのではなく、不要な部分を削ったり、ちょっと加えたりする。例えばさっきの電卓の例であれば、採取したタイミングでは以下のようになっている。

Get-UiaWindow -Class 'CalcFrame' -Name '電卓' | `
Get-UiaPane -Class 'CalcFrame' | `
Get-UiaPane -Class '#32770' | `
Get-UiaButton -AutomationId '81' -Class 'Button' -Name 'クリア'

しかし、Get-Uiaシリーズは基本的に再帰的に要素を探してくれるので、ウィンドウを取得できたら、あとは特定できるのであれば詳しく書く必要はない。上記の例では、以下でもOK.

Get-UiaWindow -Class 'CalcFrame' | Get-UiaButton -Name 'クリア'

なお、Idというだけあって、通常はAutomationIdを使うのがおすすめ。上記の例では適切なものがついていないが、WPFアプリケーションならx:NameやNameに設定したものがついている。

UI要素をコントロールする

上記のGet-~で得られたオブジェクトを、コントロールするコマンドレットにパイプで渡せばコントロールすることができる。例えば、ボタンをクリックするなら以下の通りになる。

$button | Invoke-UiaButtonClick

コントロールするコマンドレットは自分で探すしかないが、基本的にSet-UiaやInvoke-Uiaがついているので、補完でだいたい探せる。例えば「Invoke-UiaWindowPattern -PatternName Close」や「Set-UiaTextBoxText」などである。

見つからないときは「Get-Command *uia*」とすれば一覧がでてくるので、これから探す。なお、テキストを取得するGet-UiaTextTextなど、取得する系のコマンドレットもあるので、テストなんかには活用されたし。

上記を組みわせていけば自動操作するスクリプトができる。

もっと詳しく

ほとんど上記で行えているが、歯抜けではあるがドキュメントがあるので、こちらも参考にできる。

また、このライブラリはSystem.Windows.Automationのラッパーでしかないので、.NETのUI オートメーションの情報、例えばMSDNのドキュメント(UI オートメーションの概要)や既存の記事なども参考にできる。コマンドレットで不足があれば、.NETのAPIを得られたオブジェクトに対して実行してしまっても動作する。

なお、試してみてはいないが、Metro UIなんて記載もあるので、Windowsストアアプリも操作できそうである。興味があればぜひ。

Tips

UI自動操作は対象によってTips的なものが使うほどにでてくるが、最初から大事そうなものを挙げておく。

ウィンドウをプロセスで絞り込む

ウィンドウはプロセスを決めなくても検索できるが、自分で起動している場合など、限定できる場合は-ProcessIdで絞っておくと安全である。

Get-UIAWindow -ProcessId $proc.Id -AutomationId hogehoge

UI要素をガイドする赤枠を外す

デフォルトでは選択した要素には赤枠がつくようになっている。しかし、通常は邪魔なので以下で外すことができる。

[UIAutomation.Preferences]::Highlight = $false

タイムアウトを変更する

既定でもUI要素が出てくるまである程度待ってくれるが、足りない場合は-Secondsで延長できる。

Get-UIAWindow -AutomationId hogehoge -Seconds 60

以上、Happy UI Automation Lifeを。

2014-09-19

一部のSSDとext4でWriteが激しく遅い問題に対処する

結論:dbench 5 -D .で3MB/s程度しか出ないときは、barrier=0マウントオプションを検討する。

背景

Windows8.1の上のVirtualBoxにUbuntuを乗せて開発をしていたのだけど、開いたウィンドウがフルスクリーンの裏/表に回っちゃうとか、3D性能が下がるせいでウィンドウマネージャが限定されて効率が悪いといった不満があったので、今のご時勢にデュアルブートにすることにした。

それ自体はまぁいつもの感じでできて、グラフィックがサクサクになって期待通りの感じだったのだけど、ディスクI/Oが異常に遅い。apt-getすると「Unpacking~」で数十分とか待たされて、apt-get upgradeが全然終わらない。

これでは使い物にならないので、なんとかすることにした。
 

対処

使っているSSDはcrucialの「CT256V4SSD2」。ファームウェアが更新されていて、変更内容がパフォーマンス改善だったので、更新してみるものの、改善されない(なお、ディスクは消去されるのでインストールし直した)。

遅くなる事例がないかなと思って調べてみると、どうやら廉価なモデルらしく、painfully slowとか言われていて、機種のせいかとあきらめかけたら、まさかの日本のAmazonレビューに気になる記述を発見。

※2013/2/14追記
公式フォーラムでの情報を参考に、Linux ext4ファイルシステム環境において
ほぼ完全な動作を得られましたので一応追記しておきます。

mountオプションとしてnoatime,nodiratime,data=writeback,barrier=0,commit=180,nobhを指定することでフリーズを回避できるようです。
CD/USBブート後当SSDに対してtune2fs -o journal_data_writeback /dev/sd**を実行、
fstabのオプションフィールドに上記パラメータを追加することで、ようやく完全にSSDとしての性能を発揮するようになりました。
http://www.amazon.co.jp/product-reviews/B0092LHA7Y

この中ではbarrier=0が気になったのでmount -o remount,rw,barrier=0 /でマウントしたらapt-getのひっかかりがなくなった。

計測

もう体感では明らかに速くなっているのでこれでもいいのだけど、検索してみると同じ症状ではないかと思われる人がベンチマークを取っている(ext4のボトルネック除去:(SSDの)命懸けベンチマーク編)ので真似して「dbench 5 -t 30 -D .」で1回だけざっくり測ってみた結果がこちら。

Crucial CT256V4SSD2 / dbench 5 -t 30 -D . / 1回
Throughputmax_latency
未設定3.29658 MB/sec1222.288 ms
barrier=0106.397 MB/sec841.859 ms
barrier=13.29504 MB/sec1100.531 ms

体感と一致するありえないぐらいの遅さが数字に出ていた。3MB/sって光回線より遅いよ...

barrier=1がいつでもここまでインパクトを与えるかというとそうではなく、ずっと使っているノートPCのSSD(Crucial C300-CTFDDAC128M)では以下の通り。

Crucial C300-CTFDDAC128M / dbench 5 -t 30 -D . / 1回
Throughputmax_latency
未設定118.525 MB/sec52.287 ms
barrier=0144.024 MB/sec29.145 ms
barrier=1118.909 MB/sec44.737 ms

確かに遅くはあるのだけど、桁が変わるほどではない。max_latencyを見ると、さっきのSSDは投げ捨てろって感じだけどね...

ついでなので、SSDにTRIMコマンドを発行するようになる「discard」オプションをつけて測ってみたが、特に変化はない様子。

結局

上記の結果と、たいして重要なデータを置いていない作業用PCだということを踏まえて「barrier=0,discard」を/etc/fstabにマウントオプションとして追記することにした。

大事なデータを扱っている機械なら、こんな個体に当たったら使うのをやめるべきと思う。

2014-09-04

localhostへのリンクがFiddler経由になるようレスポンスを書き換える(スマホ開発用)

iPhone から開発マシンの localhost にアクセスする(Windows)のようにFiddlerの設定を変更し、「Allow remote computers to connect」をオンにすることで、iPhoneやAndroidのスマートフォンから開発者のPCにアクセスしてデバッグできるようになる。しかし、HTML内のURLにlocalhostや127.0.0.1が含まれている場合があり、そのリソースにはアクセスできない。

そんなときは、FiddlerでResponse bodyを置き換えることで、アクセスすることができる。

RulesメニューのCustomize Rulesから編集できるCustomRules.jsのOnBeforeResponse関数に以下を記述する。



もっと書き換えるべきヘッダがあったり、書き換えすぎちゃうものがあったりするかもしれないけど、そのとき適宜スクリプト書き換える方向で。

参考:Modifying a Request or Response