#81 RubyのRefinements & Hammerspoonで叩け

どうも、esuiです。

スギ花粉も少しずつ落ち着いてきて、いよいよお花見の時期になってきましたね。
そろそろ某位置情報ゲームも活発にやっていきたいとか思ったり思わなかったりしています。




RubyのRefinementsとは



とても濃い発表だったのですが、これを書いている時点で発表資料が手元に無いので簡易的な紹介だけに留めさせていただきますのでご了承を…

RubyのRefinementsについての紹介でした。
Refinementsとは、Ruby 2.0から導入されたモンキーパッチを行うための仕組みです。
主なユースケースとして、
モンキーパッチだけではなく、DSLを書いたり、デザインパターンのデコレータの代わりに使ったり、組み込みクラスのメソッドを再定義したりと、様々な使い方があるそうです。

一例として、身長の入力単位がhydeしか使えないというのは笑いましたw
2017-03-24 14.22.35.jpg

実際にどれだけ使われているかというと、、現状はこのくらいのようです。
https://github.com/search?utf8=%E2%9C%93&q=refine+language%3ARuby+extension%3Arb&type=
スクリーンショット 2017-03-31 02.43.07.png

使い方によってはとても便利なのですが、制約も多いようなので、今のところあまり業務の方で使う機会は出来ていないそうです。
と、使いどころは難しいものの、影響範囲は明示的にusingしたスコープだけとなるようなので、機会があれば使ってみたいとのことでした。




Hammerspoonで叩け!



第2部は、Hammerspoonのカスタマイズの紹介ネタでした。

Hammerspoonとは


http://www.hammerspoon.org/
https://github.com/Hammerspoon/hammerspoon

HammerspoonはOS Xの挙動を自動化するためのツールで、Luaのコードを書いて色々と自動化できるフレームワークみたいなもの。
ウィンドウ操作、ホットキー、イベント処理、等々と適用可能となっています。

主な利用例として、
# ウィンドウマネージャ
- アプリ単位でなくウィンドウ単位の切替とか
- 並べ替えとか再配置とかスペース移動とか

# ホットキー
- 特定のキーでアプリを起動またはフォーカスとか
- キーマクロとか

# イベント処理
- ウィンドウ切替、USB機器の着脱、IM切替、タイマー等々、色々なことをトリガーにしてアクションを実行可能

のようなものがあるそうです。

Karabinerの終焉


https://github.com/tekezo/Karabiner
これまでKarabinerがOSXでデファクト的となっていたキーボードドライバでした。
が、macOS Sierra (10.12)でOSのキーボード・マウスドライバのアーキテクチャ大幅変更となってしまったことによって動作不能に…💣

Karabiner-Elements


https://github.com/tekezo/Karabiner-Elements
Karabinerの焼き直し版として開発中、
Karabinerの設定ファイルはXMLでやや難解な記述方式だったが、K-EはJSONで平易、さらにGUIで設定可能になっています。
ただし、機能はまだ単純な1:1のキー置換のみとなっています。

SandS機能は?


https://github.com/tekezo/Karabiner-Elements/pull/247
によるPRが出ているようですが、マージされるかどうかはまだ不透明のようです。

アプリや状態に応じたキー設定は?


Hammerspoonを使えばできる、ということで以下のような設定を書いてみたそうです。
https://github.com/knu/hs-knu
本来、ユーザランドのことはユーザランドでやるべきで、
単純なキー置換は下位レイヤ(K-E)でやった方が良いので棲み分けると良いでしょう、とのことでした。

同時押しは?


K-Eで出来るようになるのが理想だが、Hammerspoonで実装してみたのが以下の例となります。
https://github.com/knu/hs-knu/blob/master/chord.lua

応用例:絵文字入力


絵文字入力の選択UIを作ってみたそうです。
https://github.com/knu/hs-knu/blob/master/emoji.lua

アプリによっていくつかの戦略を使い分ける必要あるということで、Bundle IDで分岐させているそうです。
上位(U+10000〜)の絵文字は属性付きテキストなので、Keynoteなどの書式を扱うアプリにkeystrokeで送っても入らないため、クリップボード(pasteboard)経由で貼り付けるのがもっとも汎用(クリップボードの内容はその前後で退避〜復元する)とのこと。
iTerm2では、AppleScriptで送り込むのが高速かつ信頼性も高く、Emacs.appでは、特殊文字はC-x 8 RET codepointで入力するようにしているそうです。

応用例:「www」したときの顔


ちょうど話題になっていた、
「www」と打ったときの表情を相手に知らせるデバイス - デイリーポータルZ
http://portal.nifty.com/kiji/170321199097_1.htm
にインスパイアされたということで、
とりあえず、0.5秒の間に連打したら写真を撮ってpastebinに上げるやつを書いてみたそうです。
https://gist.github.com/knu/997886c314b5c60865a7b3a11ef738de
実際にデモ。
2017-03-24 15.06.52.jpg
wwwをタイプするとMacのカメラが立ち上がってcurlでアップロード、
その時の表情が見事にキャプチャされてましたw 動画で見せられないのが残念ですが、良いネタでしたw

HSで出来ない事&落とし穴


Hammerspoonでは以下のような注意点があるようです。

CGEventとNSEventというフレームワークの問題があるため、
- 修飾キーの右左は判別できない
- 修飾キー単独の押下は送出できないので、シフトキーロックのようなことは後続のキーイベントを自前で処理・改変する必要がある

# eventtap(イベントハンドラオブジェクト)は、LuaのGCの回収対象!
- GCされるとイベントリスナーも外れるのでknu.runtime.guard()でガードしよう

# ハンドラ内での注意
- あまり時間の掛かる処理を実行するとUIが引っかかったり最悪操作不能になるので、適宜タイマー等を使って非同期実行する
- イベントを発行しても即処理されるわけではなく、キューに積まれてハンドラを抜けた後に順次処理される
- よって、「入力ソース変更」→「キー送出」→「入力ソースを戻す」のような処理はタイマー処理をチェーンさせる必要がある

感想


まとめとして、以下のような感想を述べられていました。
# 総じてLuaはまともで使いやすい言語😄
- JavaScriptにかなり近い(プロトタイプベースOO)

# Hammerspoonはかなり悪くない選択肢
- OSSなのでエンジンやプラグインまで含めて自分でいじってPR可能(Keyboard Maestroなどと比べて)
- 開発はそれなりに活発でオープン(Keyhacなどと比べて)
- 機能はかなり強力。ただし、元の古いコードベース・フレームワークを引きずっているため、前述のような制約があり、新しいもの(Touch Barとか?)への対応に時間が掛かるかも

ということで自分はまだSierraに上げてなかったのでKarabinerを使えちゃっていたのですが、Hammerspoonを使って身の回りのちょっとした事を自動化していけると楽しそうですね。

この記事へのコメント