もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

Yet Another 実行中のmikutterにコードを流し込むやつを作ったよ

何これ?

明けましておめでとうございます。

これは「あー正月ってテレビもつまんないしマジすることないよねー」カレンダー (なにそれ?)1日目の記事です。(1年ぶり2記事目)


今回は「起動中のmikutterに外部から任意のコードを流し込むプラグイン&コマンド」を作ったのでその紹介をば。

これ、コンセプトは@toshi_aさんのmikutter-modeと同じで、プラグインを改造するたびにmikutterをいちいち再起動したくないよねと言うところです。

じゃあなんで再発明してんだよ溜まってるIssue処理しろよ最近お前の腹の出方ヤバイだろ痩せろよ?のかと言うと、

もぐのがMacDBusを動かせなかった

mikutter-modeがプロセス間通信に使っているLinux御用達フレームワークDBusが、もぐののMacではなんかエラーになるんですよね。
なので、今回は古のRuby標準ライブラリであるdrubyでプロセス間通信を実現しました。

もぐのがvim

mikutter-modeはEmacsLISPで実装されてる所がいっぱいあって、vimで使うにあたってよくわかんなかったので。
せっかくなので、エディタに依存しない仕組みにすることにしました。

(ちなみにmikutter-modeのvim移植は2GMonさんによる実装があったりします。)
github.com

インストール

GitHubからzipファイルをダウンロードして、プラグインディレクトリにmikutter-code-injectorと言うディレクトリ名で展開して下さい。

moguno/mikutter-code-injector · GitHub

※mikutterプラグインマネージャ"Packaged"で"moguno"を検索してインストールするのもおすすめです。

使い方

普通にmikutterを起動する。

ごく普通にmikutterを起動してください。

見た目には変化はありませんが、netstat -aするとこんな行が増えてたりします。

tcp6       0      0  localhost.39311        *.*                    LISTEN

コードを送り込む

~/.mikutter/plugin/mikutter-code-injector/にmktrと言うコマンドがあります。
そのmktrの標準入力にRubyコードを流し込んでみてください。
起動中のmikutterでコードが実行されます。

実行できるコードに制限はなく、mikutterのフル機能を操作できます。

仕組み的にはmikutterのトップレベルbindingをdrubyで公開しておいて、mktr側でそれを取得。
んで、取得したbindingのevalを呼ぶとmikutter側でコードが実行されると言う寸法です。

それでは試しに、コマンドラインからつぶやいてみましょう。

echo 'Service.primary.post(:message => "みくっ")' | ./mktr

f:id:moguno:20151121103409p:plain

ちゃんとつぶやけましたね。
速攻で複数人からふぁぼられてるのは弊TLの仕様です。

vimから使ってみる。

もぐのはvimスクリプトが書けない人なので、mikutter-modeの様なvimとの統合機能は作り込んでません。
て言うか、vimではこんな風に現在のバッファをmktrの標準入力に流し込むことが出来るので、これでいっかーな感じになってます。

:w !./mktr

これで本格的なプラグイン開発にも対応できますね。

f:id:moguno:20151121111310p:plain

現状の制限として、mikutter起動時のイベントon_bootはコード流し込み時には実行されません。
この辺はなにか工夫できたらいいなと思ってます。

Mac OS Xでmikutterの通知とサウンドが使えるようになるプラグイン

何これ?

OS Xでmikutterの通知ポップアップとサウンドを使えるようにします。
RubyからMacの通知を出すgem(terminal-notifier)を見つけた記念です。

インストール

GitHubからzipファイルをダウンロードして適当なディレクトリに展開して下さい。

moguno/mikutter-notifier-osx · GitHub

※mikutterプラグインマネージャ"Packaged"で"moguno"を検索してインストールするのもおすすめです。

もしかするとmikutterディレクトリでbundle installしないといけないかもしれません。

使い方

他のOS同様に、設定画面の「通知」メニューから有効にしたい通知とサウンドファイルを設定してください。

f:id:moguno:20151018221201p:plain

加えて、「サウンド」メニューから「Mac OS X」を選択してください。

f:id:moguno:20151018221213p:plain

こんな感じで通知が出て来ればOKです。

f:id:moguno:20151018221535p:plain

タイトルのターミナルっぽいアイコンはOS Xの仕様でterminal-notifierのアイコンから変更できないそうです。残念。

mikutter on Mac OS XのためにCairoとPangoのオレオレPortfileを作った話

OS X El Capitanへのアップグレードに伴いMacPortsをアップデートしたところ、cairoのQuartzサポートが悪さをする事象が再発しました。

moguno.hatenablog.jp

MacPortsのアップデートでactivateしていた古いパッケージが破棄された模様。

今使ってるsvnから古いPortfileを持ってくる技も今後使えなくなる可能性があるので、いい感じのPortfileを書いて、オレオレで抱え込むようにします。

方針

variantの+quartzが悪さをしているのは確実なのだけれど、+quartzがデフォルトで無効化出来ないようになっているので、その辺りをハックしたPortfileを作ります。

MacPortsにオレオレツリーを追加する。

ここでは、自分のホームディレクトリにmacportディレクトリを作ってそれをオレオレツリーにします。

mkdir ~/macports

vi /opt/local/etc/macports/sources.conf

・sources.conf

  8 # To add a local source, add a "file://" entry.
  9 #
 10 #   Example: file:///Users/landonf/misc/MacPorts/ports
 11 #
 12 # To prevent a source from synchronizing when `port sync` is used,
 13 # append "[nosync]" at the end.
 14 #
 15 #   Example: file:///Users/landonf/misc/MacPorts/ports [nosync]
 16 #
 17 # Note that MacPorts parses source URLs in order; when a port appears in
 18 # multiple sources, it installs the first occurrence. For local sources
 19 # to shadow remote ones, "file://" URLs must come before other URLs.
 20 file:///Users/moguno/macports             ←オレオレツリーのパスを追加

ハックするPortfileをもらってくる。

CairoとPangoを本家ツリーから頂いてきます。

cd /opt/local/var/macports/sources/rsync.macports.org/release/tarballs/ports/

tar cf - graphics/cairo | tar xf - -C ~/macports/
tar cf - x11/pango | tar xf - -C ~/macports/

Portfileの編集

デフォルトで有効になる+quartzをぶっ潰します。

cairo

118     #default_variants        +quartz     ←コメントアウト
119     # Don't allow Quartz support to be disabled. Keep the variant for awhile in
120     # case any dependents are using the active_variants portgroup to check for it.
121     #variant_set             quartz     ←コメントアウト

pango

 62     #default_variants    +quartz     ←コメントアウト
 63     # Don't allow Quartz support to be disabled. Keep the variant for awhile in
 64     # case any dependents are using the active_variants portgroup to check for it.
 65     #variant_set         quartz     ←コメントアウト

最後にPortIndexファイルを作って完成です。

cd /Users/moguno/macports
portindex

インストール

通常通りインストールすると、オレオレツリーを優先して使ってくれます。

sudo port install cairo
sudo port install pango

こんな感じで、x11にのみ+がついていればOKです。

sudo port info cairo pango

cairo @1.14.2_1 (graphics)
Variants:             opengl, quartz, universal, [+]x11     ←これ

Description:          Cairo is a vector graphics library with cross-device output support. It is designed to produce identical output on all output media while taking advantage of
                      display hardware acceleration when available (e.g. through the X Render Extension).
Homepage:             http://cairographics.org/

Extract Dependencies: xz
Build Dependencies:   pkgconfig
Library Dependencies: libpixman, glib2, fontconfig, freetype, libpng, zlib, expat, xrender, xorg-libXext, xorg-xcb-util
Conflicts with:       cairo-devel
Platforms:            darwin, macosx
License:              LGPL-2.1 MPL-1.1
Maintainers:          ryandesign@macports.org
--
pango @1.38.0 (x11)
Variants:             quartz, universal, [+]x11     ←これ

Description:          The goal of the Pango project is to provide an open-source framework for the layout and rendering of internationalized text.
Homepage:             http://www.pango.org/

Extract Dependencies: xz
Build Dependencies:   pkgconfig
Library Dependencies: glib2, cairo, harfbuzz, gobject-introspection, Xft2
Conflicts with:       pango-devel
Platforms:            darwin
License:              LGPL-2
Maintainers:          ryandesign@macports.org, openmaintainer@macports.org

これで安定してMacでmikutter出来ますね。