Chromeで見てるページのURLをmikutterから投稿できるようにしたよ
なにこれ?
古来、ブログとは、
狭義にはWorld Wide Web上のウェブページのURLとともに覚え書きや論評などを加えログ(記録)しているウェブサイトの一種である。「WebをLogする」という意味でWeblog(ウェブログ)と名付けられ、それが略されてBlog(ブログ)と呼ばれるようになった。(Wikipediaより)
であるからして、「マイクロブログ」と称されるTwitterのクライアントについてもWebブラウザとの密接な連携が不可欠なのである。
と、言うわけでChromeで見てるページのURLをmikutterから投稿できるようにしてみました。
インストール
GitHubからzipファイルをダウンロードして適当なディレクトリに展開して下さい。
※mikutterプラグインマネージャ"Packaged"で"moguno"を検索してインストールするのもおすすめですけどこれまだ動くんかな? ← ダメだったので直しました。
Chrome拡張のコンパイル
今回はChromeにボタンを追加するので、Chrome拡張のインストールを伴います。
大して手間じゃ無いのでソースだけ添付してユーザーさんにコンパイルしてもらうことにしました。
(バイナリの管理嫌い)
突然ですがここでニュースです(2016/3/5)
先日のChromeのアップデートから、野良拡張がインストール不能になりました。
セキュリティ上の都合だそうです。にゃあ。
仕方が無いので$5.00払って正式公開しました。
以下、せっかく頑張って書いたので残しておきます。
公開前のデバッグなどに有効な手順だと思います。
使い方
これは!と思うページを見つけたら、みくったーちゃんボタンを押すだけです。
こんな感じでmikutterのポストボックスにタイトルとURLがコピーされます。
後は思う存分ふぁぼを稼いでください。
実は・・・、
Chromeとmikutterとの会話を実現するために、mikutterをWebサービス化すると言う技を今回考案しました。
mikutter-webapi-hardpointをインストールすると、mikutterにhttp://127.0.0.1:39080/testと言うエンドポイントが生えます。
Chromeのボタンを押すとhttp://127.0.0.1:39080/test?title=タイトル&url=URLをGETし、mikutterが受け取った情報をPostboxに挿入すると言う仕組みです。
このmikutterをWebサービス化する仕組みは他にも応用が効きそうなので、DSLを用意しました。
webapi DSL
Webサービスのエンドポイントを追加します。
req, resはそれぞれWEBrick::HTTPRequest、WEBrick::HTTPResponse オブジェクトとなっています。
ぶっちゃけWebrick::mount_proc()のラッパーなのでそっちを色々見てもらえれば。
今回のtestエンドポイントはこんな感じです。
webapi("test") { |req, res| message = ">#{req.query["title"].force_encoding("UTF-8")}\n#{req.query["url"].force_encoding("UTF-8")}\n" Plugin[:gtk].widgetof(Plugin::GUI::Postbox::cuscaded.values.first).post.buffer.text = message }
Ubuntu15.10でterminologyを使う
ふと、mikutterをBot的に使うために必要最低限のパッケージで構成したコンテナを作りたいなと思いました。
ベースは Ubuntu Server15.10(大好き)。
vnc経由で軽量なウインドウマネージャと適当なターミナルを使えるようにして、後はmikutterのインストールかなと。
ウインドウマネージャはFluxbox。ターミナルはUbuntu15.04からパッケージ化された未来的オシャレ端末terminologyにしました。
そこでちょびっとハマった時のメモです。
terminologyがFluxboxのメニューに出てこない!
次のコマンドでFluxboxとterminologyをインストールしました。
apt-get install fluxbox terminology
しかし、Fluxboxのメニューにterminologyが追加されませんでした。
試しに別のターミナルxterm、gnome-terminalを入れるとメニュー登録される。
逆にデスクトップ環境XFCE4を導入するとterminologyがメニューにちゃんといる。
謎。
UbuntuにおけるGUIメニューシステム
調べてみると、Ubuntuにはアプリケーションをデスクトップ環境のメニューに追加する仕組みが大きく2系統あることがわかりました。
freedesktop.org
デスクトップ環境を設計する上で、守ったほうがいいお約束をfreedesktop.orgと言う団体がまとめています。
このお約束に沿っていれば、例えばGTK製アプリとQtアプリで連携が取れるようになったり、各種設定ファイルがGnomeとKDEで共有出来たりします。
ランチャーのメニュー項目についてもfreedesktop.orgに規定があり、アプリケーションはメニュー項目を定義した*.desktopファイルを用意することで、freedesktop準拠のデスクトップ環境のメニューにアプリケーションを登録できます。
先ほどのXFCE4も freedesktop.org準拠のデスクトップ環境です。
Debian Menu System
とは言え、昔ながらのデスクトップ環境(とかランチャー付きのウインドウマネージャ)はfreedesktop.orgに準拠していないものも多いです。
これらのデスクトップ環境では、ユーザ自身がメニュー定義を編集してアプリケーションを登録する必要があります。
それはさすがに面倒だよねということで、Debian系のディストリビューションにはDebian Menu Systemと言う仕組みがあります。
これはfreedesktop.orgのdesktopファイルと同等に、アプリケーション提供側がメニューファイルを用意します。
そしてupdate-menuコマンドでメニューファイルを元に各種デスクトップ環境用のメニュー定義が生成できるというものです。
古き良きBlackbokの流れを組むFluxboxはこっちのグループです。
つまり
今回のterminologyのパッケージにはfreedesktop.orgのterminology.desktopは収録されていたけれど、Debian Menu Systemのメニューファイルが入っていなかったのが原因です。
対策
Debian Menu Systemのメニューファイルを書きました。
/usr/share/menu/terminology
?package(terminology): \ needs="X11" \ section="Applications/Terminal Emulators" \ title="Terminology" \ command="/usr/bin/terminology" \
めっちゃかっこいい
無事、Fluxboxでterminologyが起動できました。
カーソルが怪しい青白の光を放っていたり、ベルの代わりに赤色灯が回ったりします。
Fluxboxのテーマともあつらえたように合ってますね。かっこいい。
Yet Another 実行中のmikutterにコードを流し込むやつを作ったよ
何これ?
明けましておめでとうございます。
これは「あー正月ってテレビもつまんないしマジすることないよねー」カレンダー (なにそれ?)1日目の記事です。(1年ぶり2記事目)
今回は「起動中のmikutterに外部から任意のコードを流し込むプラグイン&コマンド」を作ったのでその紹介をば。
これ、コンセプトは@toshi_aさんのmikutter-modeと同じで、プラグインを改造するたびにmikutterをいちいち再起動したくないよねと言うところです。
じゃあなんで再発明してんだよ溜まってるIssue処理しろよ最近お前の腹の出方ヤバイだろ痩せろよ?のかと言うと、
インストール
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
ちゃんとつぶやけましたね。
速攻で複数人からふぁぼられてるのは弊TLの仕様です。