| @技術/プログラミング

Amazonの検索結果画面で、個別商品URLへのリンクが target="_blank" 指定となっていてうざかったので target="_self" と置き換えるユーザースクリプトを書いた。

地味に便利。

Amazon target killer

| @雑談

昨夜、吉野家の牛丼を食べた。狂牛病騒動があってからは怖くて吉野家とか松屋の牛丼はかたくなに食べないようにしていた。しかし昨夜は暑かったしむしゃくしゃしていたし、なにより牛丼270円キャンペーン中だったので大盛つゆ抜き玉子を頼んで食べてしまった。

アルバイト先の隣の隣に吉野家があったので、15分休憩のときに一杯、30分休憩のときにまた一杯と、学生時代は吉野家の牛丼を常食していた。常食というか、愛していた。吉野家と愛し合っていた。

俺は吉野家の牛丼はつゆ抜きが一番うまいと思っている。つゆだくはご飯がべちゃべちゃになってダメだ。何も考えずに「つゆだくで」とか言ってるやつを見かけると虫唾が走る。お前、つゆだくって言いたいだけちゃうんかと。

牛丼に生卵をつけないやつも信じられない。吉野家の牛丼は関東風の塩辛い醤油をたらした生卵を牛肉の上にかけることで始めて完成する。なのにつゆだくに七味やら紅ショウガやらを盛大にぶっかけて食べている連中を見かけると反吐が出る。ただのものを全部トッピングしてやろうという貧乏人根性が丸見えだ。

吉野家での最も甘美なコマンドはアフターだ。吉野家に通い詰めていた俺も、アフターコマンドを聞いたのはこれまで一度しかない。あるとき吉野家で並つゆ抜き玉子をかき込んでいると、長髪小太りのテレビ番組制作会社社員のような男が入ってきた。牛丼を頼む際、注文の最後に「アフター並」と男は言った。アフターってなんだよ、後からキャバ嬢でも来てアフターしちゃうのか? と俺は悩んだが、アフターとは食後に牛丼を持ち帰るということであった。なんと甘美なコマンドだろうと俺は思った。今にして思えばUNIXの哲学が反映されているような気がしないでもない。男はスーパープログラマーだったのかもしれない。

とまぁ、こんな感じで、土曜の夜に博多駅で感傷に浸りながら牛丼を食べた。こんなことができるのは嫁がいない一人の夜だけだ。今の俺はなんと不自由なんだろう。一筋の涙が頬を伝った。

というわけで6月に結婚しました。金ないのに結婚してやっていけるか心配です。ご祝儀寄越せとか言わないので福岡にお立ち寄りの際はもつ鍋でもおごってください。

| @技術/プログラミング

JekyllはLiquidというRubyのテンプレートエンジンを採用してるんですが、Liquid内でLiquidの文法をエスケープする方法が分からず大変苦しんでおりました。Jekyllの公式のDocument呼んでもXML出力時とかCGI出力時にコンテンツをエスケープする方法は書いてあるのに、Liquidテンプレート自体をエスケープする方法が書いてなく、大変不満でした。しかしその方法が分かったのでお知らせいたします。元ネタはスタックオーバーフロー。

例えば {{ "{% this " %}}} と表示させたかったらこうやります。

{{ "{% this " %}}}}

ちょっとトリッキーですね。

Pygmentsと組み合わせて使うことも可能ですが、いちいち {{ "{% highlight " %}}} のなかでコメントアウト処理をしてあげないといけないません。面倒くさいですね。

| @技術/プログラミング

Ruby 1.9.2-p290 がリリースされたので入れてみた。RVMで。

$ rvm install 1.9.2 --with-readline-dir=/usr/local #homebrewで入れたreadlineのパスを指定
$ rvm migrate ruby-1.9.2-p180 ruby-1.9.2-p290

migrate を実行したところ、警告が出ながらも次のような感じでマイグレーションは完了した。

$ rvm migrate ruby-1.9.2-p180 ruby-1.9.2-p290
Are you sure you wish to MOVE gems from ruby-1.9.2-p180 to ruby-1.9.2-p290?
This will overwrite existing gems in ruby-1.9.2-p290 and remove them from ruby-1.9.2-p180 (Y/n): Y
Moving gemsets...
Moving ruby-1.9.2-p180 to ruby-1.9.2-p290
Making gemset ruby-1.9.2-p290 pristine.
ERROR: Error running 'rvm gemset pristine' under ,
please read /usr/local/rvm/log//gemset.pristine.log
Moving ruby-1.9.2-p180@global to ruby-1.9.2-p290@global
Making gemset ruby-1.9.2-p290@global pristine.
ERROR: Error running 'rvm gemset pristine' under ,
please read /usr/local/rvm/log//gemset.pristine.log
Do you wish to move over aliases? (Y/n): Y
Do you wish to move over wrappers? (Y/n): Y
Do you also wish to completely remove ruby-1.9.2-p180 (inc. archive)? (Y/n): Y
Successfully migrated ruby-1.9.2-p180 to ruby-1.9.2-p290

一見、問題なく移行できたように思えるのだけど、この後rakeなどexecutableなgemをコマンドラインから実行すると以下のようなエラーが出る。

zsh: /usr/local/rvm/gems/ruby-1.9.2-p290/bin/rake: bad interpreter: /usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby: no such file or directory
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/rake-0.8.7/lib/rake.rb:2377:in `raw_load_rakefile'
(See full trace by running task with --trace)

shebangに書いてあるrubyのパスがmigrate時に削除した ruby-1.9.2-p180 なのが問題なわけだ。

正しい対処方法かどうかは自信がないが、Rubyでサクサクッとshebangを書き換えるやつを書いた。以下みたいなやつ。

こいつを実行してやるとshebangが正しく書き換わったexecutableなgemができる。万が一のためにbackupファイルを作るのでこれをzshで rm *_backup とかしてやるといいと思います。

と思ったけど、結局↑のRubyの入れ方はまずいみたいで、jekyllとかCライブラリに依存する系のgemが動かなくなってしまったので rvm implode してRVMをまるっと入れ替えた(20回くらいRubyをインストールしなおした)。次の記事にでも書きます…。

| @労働

こういう会社で働けたら幸せだろうなと思います。

理想の会社

  1. Gitでソースコード管理している。
  2. 会社のGithubアカウントがある。
  3. 外部に公開されている技術ブログがある。
  4. IDEよりVimやEmacsを使うことが奨励されている。
  5. 社員が勉強会に参加することを奨励している。
  6. オープンソースコミュニティに貢献している。
  7. 音楽を聞きながら仕事できる。
  8. Rubyで開発できる。
  9. 会議が短い。
  10. アジャイル開発を実践している。
  11. テストコードがある。
  12. エンジニアは全員ノートパソコンで開発して、好きかってに席を替わってペアプログラミングとかやってる。
  13. MacとLinuxしかない。
  14. 優秀なデザイナーがいる。
  15. でかい本屋が近くにある。
  16. プログラムを書くことが好きな人たちが集まっている。
  17. SEという肩書きの人がいない。
  18. 大所帯でない。
  19. 金曜の夜はみんなはやく帰る。
  20. イスに金をかけている。
  21. 社員がfoursquareで会社のMayorの座を競い合っている。

| @Mac/iPhone

Google Chromeの拡張機能に、Chrome Keyconfig ってのがあります。これはMinibuffer + LDRizeとまではいかないまでも似たような機能を提供してくれるエクステンションで便利に使っていたんですけど、最近、一旦Google Chromeを終了すると前回使用時に変更した拡張機能設定項目の内容が読み込まれないという不具合が発生するようになり、非常に不便でした。

Chrome KeyconfigとTberarelooの組み合わせで、Firefox + Greasemonkey + Minibuffer + LDRize + Reblog Command とほぼ同様の快適さでTumblrが閲覧できるようになるわけでして(Google ChromeでFirefoxのようなReblogしまくれる環境を構築する - Syoichi's Tumblr)、毎回Tumblr閲覧時にChrome Keyconfigの設定画面を開いて設定を変更するのは面倒くさいこと極まりありませんでした。

ちょっと調べてみたところ、以下のような原因でChrome Keyconfigの設定項目の変更内容が反映されないようです。すなわち、Chrome Keyconfigの設定項目の内容を保存しているDBの "ItemTable" というテーブルに "Config" という key を持つレコードと "Keyconfig" という key を持つレコードがあって、設定項目の変更内容は "Keyconfig" に保存されるけどChrome KeyconfigはGoogle Chromeを一旦終了して再起動すると "Config" の方を読みに行っちゃう、ということらしいです。

したがってChrome Keyconfigの設定内容を保存しているSQLite3のDBを直接開いて編集してやればよいわけですね。"Config" という key を持つレコードの value を "Keyconfig" の値で上書きしてやればよい。上記リンク先ではWindows環境で、SQLiteを編集するソフトを使って値を変更する方法が紹介されていますが、Macでは以下のコマンドで行けます。

cd ~/Library/Application Support/Google/Chrome/Default/Local Storage  
sqlite3 chrome-extension_okneonigbfnolfkmfgjmaeniipdjkgkl_0.localstorage "update ItemTable set value = (select value from ItemTable where key = 'Config') where key = 'Keyconfig';"
{: .console }

よろしければお試し下さい。

| @技術/プログラミング

暇だったので自動で特定のユーザーを延々favし続けるスクリプトを書いた。

ヒトデ君が書いた hitode909/user-stream-receiver - GitHubRuby+User Stream APIで無言リプライに高速返信するbotを作りました - ps aux | grep aquarla を参考にさせてもらった。というかほとんどまるパクリ。またOAuthのところはtily氏の tily/ruby-oauth-cli-twitter - GitHub に全面的に依存している。

User Stremを受診してるのでcronとかの設定なしでネットストーキングしたい相手のことを延々追跡できる。しかも発言があった瞬間に即favする。大変気持ち悪いですね。

しかしUser Streamはときどき調子が悪く、発言を拾い落とすこともある。そんなときは以下のコードを使う。

これでUser Stream経由で取りこぼした発言もfavできる。それぞれ使い方はこんな感じ。

$ ruby favoritter.rb ストーキングしたい相手のユーザー名
$ ruby favstream.rb ストーキングしたい相手のユーザー名