F11とF12はKinesisキーボードで使いやすいキーにリマップする。IME切り替え部分のコードはこちらからいただいた。kenjiゴールデンウィークで暇だったので、AndroidでBackキーを押したときにActivityが終了してアプリが切り替わる部分を調べてみる。仕事でこのあたりいじって独自処理を埋め込むことになりそうなので。Lollipopの間はがっつり変わる部分では無いでしょう。スタート地点はActivity.javaのonkeyDown。onKeyDownの中でonBackPressed呼んでますね。true;}onBackPressedもActivityで実装されています。mFragmentsでBackStackが無ければfinishAfterTransitionですね。{finishAfterTransition();}}ActivityTransitionStateは終了時のアニメーションですかね。中は見ていないですが、アニメーションが無ければ即finishと言うところでしょうか。{finish();}}finishは次のような感じ。mParentは親となるActivityですね。ActivityGroupでActivityの中にActivityを埋め込んだ時のかな。ActivityManagerServiceのfinishActivityを呼んでいますね。{mParent.finishFromChild(this);}}ここからはSystemServiceのプロセスです。ActivityManagerServiceのコード量は多いので、一部分だけ抜粋。ActivityManagerService.finishActivityです。finishTaskがtrueかつ終了するActivityがルートであれば、removeTaskByIdLockedでタスクを終了しています。なければ、ActivityStackのrequestFinishActivityLockedを呼んでいます。同一タスク内でのActivity終了によるActivity切替は深く追いかけませんが、この後いろいろあってActivityStack.finishCurrentActivityLockedあたりで終了処理をしています。app-request");}}removeTaskByIdLockedの中身です。removeTaskActivitiesLockedはperformClearTaskAtIndexLocked(0)が呼ばれ、すべてのActivityがfinishされます。finishの処理はActivityStack.finishActivityLockedですね。この中身は後で見ています。false;}cleanUpRemovedTaskLockedの中身です。killProcessは今回falseなので、プロセスをkillする前にreturnします。mRecentTasksは最近使ったアプリ一覧です。TaskRecord.removedFromRecentsはサムネイルの削除などの後始末をしています。{return;}ActivityStack.finishActivityLockedの中身を見てみます。長いので一部省略しています。終了処理をしたり、キーのディスパッチを停止したりしていますね。Activityがなくなった場合はendTaskがtrueになり、mWindowManager.prepareAppTransitionしてmWindowManager.setAppVisibilityでVisibilityをfalseにしています。false);}WindowManagerService.setAppVisibilityを見てみます。wtokenはAppWindowTokenです。wtoken.hiddenRequestedがtrueになり、WindowManagerServiceのmClosingAppsにwtokenがaddされています。mClosingAppsに追加されたAppWindowTokenが実際に処理される場所はどこでしょう。handleAppTransitionReadyLockedかな?とりあえずアプリ切替はWindowManagerServiceのsetAppVisibilityをfalseとする事で実現されているようです。このあたりをゴニョゴニョしたらホニャホニャできそうです。この調査はコードを追いかけただけで、実際にログを仕込んで確認したわけでは無いのであしからず・・・。2011)を使っていて、いつの間にかkernel_taskがCPUを使いまくってマシンのレスポンスがとても遅くなってしまった。日本語で「あいうえお」と入力すると、1秒ごとにあ、い、う、え、おと入力されるぐらい遅い。結論を言うと、ファンのホコリの除去とSMCをクリアしたら直った。同じような現象が出た方のために経緯とチェックすべき点を書いておく。Fusionを起動しているときに遅くなったことに気がついたので、VMwareが原因かなと考えていた。VMwareを起動していないときにも遅くなってきた。iStatで確認すると、kernel_taskがCPUを400%ぐらい使っている。ロードアベレージがやたら高い。起動直後はロードアベレージが150とかになっている。起動直後からファンがフル回転の6200回転固定になっている。これはどうやら何かがおかしいと言うことで、まずはOSのクリーンインストールを試してみた。必要なデータはDropbox等のクラウドに置いているので、クリーンインストールの精神的なハードルがとても低くなり、良い。Yosemiteをクリーンインストールしたが、まだkernel_taskがCPUを使っている。これはどうやらソフトウエアの問題では無いようだ。ファンがまだフル回転しているので、熱の問題かと考えた。iStatでは温度は特に問題無いが(CPUは70度程度)、センサーに問題があるかもしれない。マシンが極端に遅くなっているのは、熱が原因でCPUのクロック数が下がっている可能性を考える。Gadgetを入れてみた。Gadgetはリアルタイムにそれを確認することができる。すると、このMacはCPUの定格が2.4GHzなのだが、0.8GHzで固定されているような動作をしていた。マシンが遅いのはこいつが原因のようだ。Proの排気口にエアダスターを吹きかけて、ホコリを吹き飛ばしてみた。4年近く使っているので、結構な量のホコリが出てきた。大きなホコリの塊もある。吹き飛ばしてみると、0.8GHz固定ではなくなったが、それでも2.4GHzは出ない。ファンの回転数も6200回転で動かない。次に、SMCをクリアしてみた。SMCはMacの電源周りをコントロールしているチップで、これが原因でスリープ等の電源周りがおかしくなることがあるらしい。リセットを参考にし、SMCをリセットしてみた。すると、これがビンゴでファンの回転数が正常に戻り、CPUのクロック数も2.4GHz以上出た。マシンが遅くなることも、kernel_taskがCPUを食いつぶすこともなくなった。解決したので、Macの動作が異常に遅くなった場合の確認ポイントをまとめてみる。ActivityモニタかiStatのようなCPUを使っているプロセスを確認することができるアプリで、どのアプリがCPUを食っているか確認する。kernel_taskがCPUを食っている場合、様々な原因が考えられるが、今回のようにCPUをアイドル状態にしてCPU温度が上がらないように制限する場合もkernel_taskのCPU利用率が上がる。Gadgetで確認する。常にクロックダウンしているのであれば、熱とSMCの問題が考えられるので、ファンを掃除し、SMCをクリアする。kenjiMac(Mavericks)上でEmacsを使っていると、distnotedというプロセスが暴走してファンが止まらずうるさい。一応パッチがあるようだけど、なんだか効果が無いようなので、直っているという24.4を入れてみた。linkappsまだ正式リリースされていないバージョンと言うことで、設定ファイルに互換性が無いとか動作が怪しいとかいう情報があったけど、特に問題なく使えている。kenjiCookpadって便利ですよね。料理をしている最中にレシピを確認するのって意外と大変です。Wearでレシピ情報が確認できれば非常に便利そう!と言う事で作ってみました。AndroidのCookpadアプリでレシピを表示します。「レシピを送る」ボタンを選択し、「料理パッドWear」を選択します。Wearに通知が表示されます。スワイプすることで行程を確認することができます。料理をしながら手元でレシピを確認できる!便利ですね!処理は次のような感じにしています。text/plainを受け取るActivityを用意します。ActivityでIntentを受け取り、その中にCookpadレシピのURLがあれば、HTMLを取得します。HTMLの取得に成功すれば、HTMLをパースし、行程のテキストを抜き出します。Wearに送信します。Notificationを使い、行程を表示します。Wearの画面が時計に戻っちゃうので、このままでは使い物になりませんが、そのあたりちゃんと作れば便利そうです。Wearって以外と便利なガジェットになりそうですね。Wearが発売されましたね。使ってみましたが、結構良い感じでは無いでしょうか。小さい時計型端末の中でAndroidが動いているのがわくわくします。一般の方にはオススメできるような出来では無いですが、将来性はある予感がします。Wearでのアプリ開発も、ドキュメントが公開されていますね。hasSystemFeature()でチェックしろよな!」とあります。ちなみにAndroid標準APIの中で使えないのは次のものが使えないと書かれています。android.webkitandroid.printandroid.app.backupandroid.appwidgetandroid.hardware.usbでは早速PackageManager.getSystemAvailableFeaturesで有効なFeatureを確認してみましょう。Watchでは次の17のFeatureが有効でした。Watchのみに存在したFeatureはandroid.hardware.type.watchだけでした。マイクはついてるのに音は鳴らせないんですね。kenji名前付きパイプというものがあると言うことは聞いていたけれど、使ったことは無いのでちょっと使ってみました。OS(Mavericks)です。名前付きパイプの説明はこちら。簡単に言うとファイルみたいに読み書きできるパイプで、プロセス間通信に使うことが多いようです。お互いのプロセスで名前付きパイプを開き、片方でwriteすると、もう片方でreadすることができます。ファイルですが、実際にディスクに読み書きするわけでは無いので省エネということですね。Macで名前付きパイプを作成する場合は、mkfifoコマンドを使います。named_pipelsすると、普通のファイルのように作成されます。named_pipe今回は、echoコマンドで名前付きパイプに書き込み、それをJava側で読み込んでみます。書き込み側は次の通りです。named_pipeこれを実行すると、Java側で読み込むまでブロックします。Java側は次のようにします。null){System.out.println(line);}Macでは読み込み側、書き込み側両方がopenするまで、openでブロックしました。JavaではFileInputStreamのnewでブロックします。書き込む場合は、FileOutputStreamのnewでブロックします。Linuxでは、Macと挙動が違い、Readをopenしなくてもバッファがいっぱいになるまで書き込みができます。OSによって挙動の違いが気になりますが、気軽にプロセス間通信できそうですね。キーボード、マウス共有アプリShareMouseを導入してみた。kenji複数のPCを同時に使う必要がある場合、それぞれのPCにキーボード、マウスを繋いで使い分けるのはとても不便です。そんな時は、1台のキーボードとマウスを複数のマシンで使い回すことができるキーボード共有アプリを使うと幸せになれます。キーボード共有アプリはオープンソースだと有名なSynergyがあり、今までSynergyを使ってきたのですが、ちょっとバグに悩まされたので別のソリューションを探してみました。そんな中で一番良さそうだったのは有料になってしまいますが、ShareMouseです。対応OSはWindowsとMacのみなのですが、次の利点がありました。マシン間のドラッグアンドドロップでファイルorディレクトリをコピーできる。ファイルorディレクトリをクリップボードにコピーし、それを別のマシンでもペーストできる。サーバ、クライアントの区別が無く、さらに接続先のサーバIP設定なども必要ないので設定が楽。マシン2台、モニタ2台だと無料で使える。デモビデオを見ると便利さがわかります。ファイルのコピーをドラッグアンドドロップでできるのが非常に便利です。試しに2.5Gのファイルをドラッグアンドドロップすると、コピー中を示すShareMouseのプログレスダイアログが表示され、ちゃんとコピーできました。クリップボードの共有はちょっと癖があり、ペーストとして設定したキーを押した瞬間に共有処理が実行されます。私は、Mac側ではKeyRemap4MacBookを使ってEmacsキーバインドのCtrl+Yで貼り付けとしているのですが、これではローカルのみの貼り付けで、共有クリップボードの貼り付けにはなりませんでした。その場合は、ShareMouseの共有クリップボード貼り付けのショートカットをCtrl+Yに設定してあげると解決です。ペーストしようとした際に共有処理が実行されるので、巨大なテキストをコピーした状態でマシンをまたぐと固まってしまうと言うSynergyの悲しい挙動に悩まされることはありません。価格はマシン2台モニタ2台であれば無料(ただし一部機能制限あり)、マシン2台モニタ無制限であれば20ドル、マシン無制限モニタ無制限であれば50ドルです。このライセンスには1年間のアップグレードがついており、その間であれば新しいバージョンを利用できるようです。期限が来てもアップグレードができませんが使い続ける事は可能です。言う事で、Linuxに対応していないのが残念ですが、WindowsとMacのみであればShareMouseがとても便利です。diffしてますか?patchを作成するときに便利ですよね。diffすると、新規作成したファイルは反映されず、patchを当ててもビルドエラーなんて悲しいことになった事がある方も多いと思います。FILENAMEをすれば解決。diffの結果に含まれるようになります。HEADを実行する必要があります。kenjiMacで作業するとき、たまに「高速なディスクが欲しい!」と思うことがあります。そんなときはメモリをディスクとして使うことができるRAMディスクを用いることで解決することができます。Lionで動作確認していますが、バージョンによっては動かないかも。