Emacs のミニバッファから(タイムラインを開かずに)Twitter に投稿する1

これは何か

自分は Twitter を「短いメモ置き場」として利用しており、SNS の本来(?)の使い方はしていない。つまり、コミュニケーションの手段としては使用しておらず、他のユーザーをフォローしたり、メッセージを送ったりはしないし、たまに来る他者からのコメントもほとんど反応しない(すみません)。

こうした利用法なので、タイムラインをいちいち表示しないで Tweet したい。そうなると、Emacs の Twittering-mode も xyzzy の xyttr もやや使いづらいものとなる。

少数派ながら同じようなことを考える人はいるもので、かつてタイムラインを表示せずに Emacs のミニバッファから Twitter に投稿できる拡張が公開されていた(現在は見れないリンク)。非常に便利に使わせていただいたのだが、いつの間にか投稿できなくなってしまった。

以下では、それを復活させた過程を書く。

Ruby のインストール&最新版に更新

環境が Windows XP Pro (32bit) から Windows 7 Pro (64bit) に変わったので、Ruby のインストールから始める。Cygwin を入れているので、同インストーラーから Ruby をインストールした。さらに、Ruby に Twitter ライブラリを入れなければならない。ここでまず躓いた。

Ruby のライブラリは、RubyGems というパッケージ管理システムを利用して簡単にインストールすることができる。ところが、以下にようなエラーが出て Twitter ライブラリをインストールできなかった。


$ gem install twitter
ERROR: While executing gem ... (ArgumentError)
invalid byte sequence in UTF-8

エラーメッセージを検索すると、Ruby のバージョンを 2.1.0 以上に上げなければならないようだ(参照)。Cygwin のインストーラーからは不可能なので、rbenv と ruby-build を使って最新の状態にする。

まず、このサイトの説明を参考にして、Cygwin 上で atp-cyg というコマンドが使えるようにする。

その後、以下にようなコマンドで必要なパッケージを入れる。


$ apt-cyg install git gcc-core gcc-g++ make zlib-devel curl \
autoconf libiconv libiconv-devel rsync patch unzip openssh openssl-\
devel libxml2-devel libxslt-devel libffi-devel libgdbm-devel

次に、rbenv と ruby-build を入れる(以下での ~/.bashrc は、人によっては ~/.zshrc にする)。


$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build


$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc


$ $SHELL --login


$ rbenv install 2.2.0
$ rbenv global 2.2.0
$ rbenv rehash

なお、利用可能な Ruby のバージョンは、rbenv install -l で確認できる。

これで次のように確認して、最新版が出れば問題ない。


$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-cygwin]


しかし、私の場合はそう簡単にはいかなかった。まず、~/.rbenv というディレクトリがないというエラーがでたが、これは何でもないので手動で作った。今度は問題ないように見えたが、以下のようなエラーが出てインストールが失敗してしまった。


uncommon.mk:187: ターゲット 'build-ext' のレシピで失敗しました
make: *** [build-ext] エラー 2

CYGWIN/tmp/ 以下の ruby-build.<ビルド番号>.log には、次のように書いてあった。


make[2]: ディレクトリ '/tmp/ruby-build.20150228024619.4332/ruby-2.2.0/ext/-test-/printf' に入ります
compiling printf.c
printf.c:23:1: エラー: ‘utoa’ と型が競合しています
utoa(char *p, char *e, unsigned int x)
^
In file included from /usr/include/stdio.h:29:0,
from ../../.././include/ruby/defines.h:26,
from ../../.././include/ruby/ruby.h:29,
from ../../.././include/ruby.h:33,
from printf.c:1:
/usr/include/stdlib.h:184:8: 備考: 前の ‘utoa’ の宣言はここです
char * _EXFUN(utoa,(unsigned, char *, int));
^
Makefile:241: ターゲット 'printf.o' のレシピで失敗しました
make[2]: *** [printf.o] エラー 1
make[2]: ディレクトリ '/tmp/ruby-build.20150228024619.4332/ruby-2.2.0/ext/-test-/printf' から出ます
exts.mk:118: ターゲット 'ext/-test-/printf/all' のレシピで失敗しました

これは、CYGWIN/tmp/ruby-build.<ビルド番号>/ruby2.2.0/ext/-test-/printf/ 以下の printf.c というファイルで3箇所ある、utoa という定義名が問題だということ。このサイトを参考にして、上記ファイルを改名(名称は他と競合しなければ適当でいいようなので、my_utoa とした)し、その後、下記のように手動でインストールする。


$ cd /tmp/ruby-build.<ビルド番号>/ruby-2.2.0
$ make
$ make install

これでようやく、Cygwin 上の Ruby を最新にすることができた。



次回に続きます。