コマンドラインからスクリーンロックを解除する

TouchUtils.clickView() とかで UI に触るようなテストを書いてみると、実行時に

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

とか出て失敗することがあった。 ググってみるとスクリーンがロックされているのが原因らしく、実際スクリーンロックを解除してから実行するとちゃんと通った。

エミュレータを起動した直後は必ずロックされた状態になっていて、emulator-arm -help 見てもそれを解除する方法が見当らない。 emulator-arm -no-window で起動してすべてコマンドラインで完結させたかったので解決法を考えた結果、adb 経由で Android にキーイベントを送れることがわかったので、 スクリーンロックを解除するメニューキーを押すようなキーイベントを送る方法でいけた。

あとデバイスがオンラインになるまでブロックするのは adb wait-for-device でいけるけど、デバイスがオンラインになっている状態で adb shell input keyevent 82 しても Killed と言われたりすることもあって、 よくわからないけど Killed が出なくなるまで送り続けるようなスクリプトを書いて実行するようにしてる……

https://gist.github.com/3092913

Module#include, Object#extend の逆操作

include/extend したモジュールを後から取り外すことができたら便利そうだと思った。

RHG を読み返しながら、拡張ライブラリとして作ってみた。 クラスが管理している内部的な情報が r31627 から隠されてしまったようで、ruby/backward/classext.h をインクルードする必要があった。 ruby-trunk-changes r31623 - r31642 - PB memo

動作例は test.rb を参照。

ghcmod.vim 0.1.0

ghcmod.vim 0.1.0 をリリースした。 https://github.com/eagletmt/ghcmod-vim/downloads からダウンロードできます (リポジトリ内のファイルからプラグインとして利用する上で不必要なものを除いて zip で固めただけ)。

前回 からの変更点について書いていく。

:GhcModExpand コマンドを追加した

ghc-mod 1.10.8 で追加された ghc-mod expand のためのインターフェイス。 Template Haskell の展開の様子を quickfix に表示する。

ちなみに、ghc-mod expand と同等の出力は ghc -ddump-splices でコンパイルしても得られる。

GHC や hlint にオプションを渡せるようにした

ghc-mod は GHC や hlint を利用しており、それらにオプションを渡す機能が備わっている。 これらをそれぞれ g:ghcmod_ghc_optionsg:ghcmod_hlint_options でちゃんと設定できるようにした。

例えば :GhcModLint 時に "Redundant $" というヒントを出させないようにするためには以下のように ~/.vimrc で設定する。

let g:ghcmod_hlint_options = ['--ignore=Redundant $']

非同期チェックをサポートした

なぜ自動チェックが嫌いなのか - eagletmt's blog なんてことも書いたけど、 ブロックしない自動チェックならば便利だと思うので quickrun での非同期実行の実装を参考にして非同期的に :GhcModCheck:GhcModLint を実行できるようにした。 それぞれ :GhcModCheckAsync:GhcModLintAsync というコマンドを用意している。 さらに両方同時にチェックする :GhcModCheckAndLintAsync というコマンドも用意した。

バッファ保存時に自動的に実行するには ~/.vimrc で

autocmd BufWritePost *.hs GhcModCheckAsync

とか設定するといいと思う。

lint はともかく、check のほうは import しているモジュールが多かったりメタプログラミングをしていたりすると 結構時間が掛かるので、効果があるんじゃないかと思う。

ただし現状の非同期実行はちょっとロバストでない点があって、もしかしたらエラーを出してしまうかもしれない。 このへんは近いうちに改善したい…

Cabal を利用しているプロジェクトでの動作を改善した

Cabal はビルド時にやってくれていることがいくつかあって、それらに依存したプログラムのために 適切なオプションを GHC に渡すことで :GhcModCheck:GhcModType でエラーが出ないようにした。

具体的には、cabal build

  1. 依存パッケージに対してバージョンのテストを行うマクロを提供したり、
  2. 自身のパッケージに関する情報を提供する Paths_pkgname というモジュールを生成したり、
  3. 拡張子に応じて適切な前処理を実行したり

しているので、そのためのパスを設定したりしている。これら3点に関しては考慮しているつもりだけど、他にも何かあったりするのかな。

注意点としては、これらは cabal build 時に行われるので、一度 cabal build を実行して dist/build 以下にファイルを生成しておかないと意味がない。 1, 2 に関しては一度生成してしまえば後から変わることは無いので問題にはならないけど、 3 に関してはチェックの度に前処理が実行されて欲しいと思う。 単純な .cabal ファイルであれば https://gist.github.com/2227993 で前処理のみ実行できると思うけど、 Build-type: Simple ではない場合はどうするのがいいのかわからない。

リリカルマジカル13

11時半くらいに会場に着いて、一通り巡った後昼飯のために一旦外に出て、それから14時過ぎくらいまで会場にいた。

サークル一覧見て初めて気になったサークルがいくつかあったんだけど、俺が行った頃にはもう売り切れていたのが多かった…… 今日買えたのはこんなかんじ。

特に気に入ったのは BANDIT さんの BREAKERS!! PORTABLE 4。ちょっとしたシリーズ物で、お話も好きだし服装が見ていて楽しい。

あと昼飯を京急蒲田の商店街でとったんだけど、シャッターが多いように感じた。 主にリリマジ目的で何度か来てるけど、よく行ってた定食屋がなくなっていたりしてなんか一気に飯屋がなくなった気がする。

Haskellでいかにしておっぱい画像をダウンロードするか〜2012 Conduit 編

元ネタはここらしい: いかにしておっぱい画像をダウンロードするか〜2012 - ゆーすけべー日記

D言語でいかにしておっぱい画像をダウンロードするか〜2012 — Gist を見かけたので Haskell 版を書いてみたんだけど、どうやら既にやられてしまっていたようだ…

いかにしておっぱい画像をダウンロードするか~2012 Haskell編 - 厨二病患者のプログラミング入門

まぁ今流行りの(?) Conduit 版だとこんなかんじ、という例として見てもらえれば。今気付いたけど TupleSections は特に有効にする必要なかったな…

映画

昨日、舞台挨拶付きのストライクウィッチーズ劇場版を見てきた。 一部展開が強引に感じられたものの、総じてとてもよくできてると思った。少し間を空けてもう一回は見たい。 お姉ちゃんの登場シーンが多くてうれしいし、貴重な(?)きれいなペリーヌさんを見ることもできるのでおすすめ。

入場のときに Chaos TCG のカードをもらった。下のほうに「NOT FOR SALE」とある。Chaos TCG 的にこのカードがどれくらい良いのかは全然知らない。

魔法少女リリカルなのは The MOVIE 2nd A's の前売券が劇場窓口で売られ始めたので、ストライクウィッチーズを見る前についでに買っておいた。 1st のときに別の劇場でA3ポスター付きの前売券を買ったときは手提げ袋をもらえなくて持ち帰るのに苦労したけど、今回はもらうことができた。 自分と同じ大きな黒いビニールの手提げ袋を持ってストライクウィッチーズのほうの劇場に入ってくる人を何人か見つけられた。

今回の前売券は前回よりもさらに種類が増えている気がしますが、はやてちゃんのものを中心に買っていきたいと思います。

ghcmod.vim と Unite hoogle の組み合わせ

ghcmod.vim でカーソル位置の型を得ることができるため、これを Unite hoogle の入力としてみると便利そうだと思った。

例えば ~/.vim/ftplugin/haskell.vim

nnoremap <buffer> <silent> <Space>o :<C-u>call <SID>unite_hoogle_type()<CR>
function! s:unite_hoogle_type()
  let [_, l:type] = ghcmod#type()
  call ghcmod#type_clear()
  call unite#start(['hoogle'], { 'input': l:type })
endfunction

を追加する。

すると、よくわからない位置に undefined を書いてとりあえずコンパイルは通る状態にした後、

undefined の位置で <Space>o と打鍵すると

こうなる、みたいな使い方がありそう。

まぁ undefined に限らず、型でも検索できる hoogle と、型を得ることができる ghc-mod type の組み合わせは良さそう。