and the spring goes on...

いつかは別れがやってくることはわかっていたけど、ばあちゃんが死んだ。年明けに具合が悪くなって「一週間ばかり」のつもりで入院したら、末期の肝硬変であることがわかり、入院して3週間で亡くなった。91歳になったばかりだった。

自分にとってばあちゃんは特別な存在だった。親が共働きだったので保育園の迎えにはばあちゃんが来てくれていたし、夏休み冬休み春休みはばあちゃんと過ごす時間が長かった。中学生くらいまでばあちゃんの部屋に布団を敷いて寝てた。

大学を出て病気になり、治療のために実家に帰ってきてからは、ばあちゃんととにかくよく出かけた。竹田の岡城跡の桜、知覧の特攻記念館、久住の紅葉などなど、後期高齢者をいろんなところに連れて回った。ばあちゃんは親と友達の中間のような存在だった。 Flickr にはばあちゃんの写真がいっぱい上がっている。

入院後は休みの度に看病をしに帰省した。写真を見せてやろうと、これまでに自分が撮ったばあちゃんやひ孫たちの写真を大量にプリントして病室に持っていった。家にあった昔のアルバムも病院に持っていって見せた。

ばあちゃんの具合がよくて話ができるときには、ばあちゃんが子どもの頃の話や昔の話を聞いて iPhone に録音した。ばあちゃんの実家は旧士族でそこそこ金持ちだったため、ばあちゃんが赤ん坊の頃の写真があったりした。亡くなる二日前に子ども時代の写真を押し入れから引っ張り出して病室に持っていって見せたらとても喜んだ。

入院中、ばあちゃんは早く死にたいと言っていた。「ばあちゃんはいつ死ぬとじゃろか」と俺に聞くこともあった。みんなに迷惑がかからないように早く死にたいからご飯は食べたくない、とも言っていた。本人には病状は知らされてなかったので、最後まで自分の病気が何なのかは分かっていなかった。しかし助かる見込みはないということは分かっていたと思う(亡くなる前まで意思疎通はできていて、痴呆ではなかったから頭はハッキリしていた)。

平日会社に行っているときにはばあちゃんのことが気がかりで仕事が手につかなかった。自分はいったい何のために実家を出たのだろう。実家を出ずに家にいて地元で働いてればもっとばあちゃんの面倒を見られたし、最初に体調が悪くなったときに病院に連れて行ってもっと長生きさせてあげられたかもしれない。自分がいま置かれている現状を悔やむことが多かった。

火曜日の夜、11時頃ベッドに横になってうとうとしていたら母から電話がかかってきて、亡くなったことを知らされた。結局、死に目に会うことはできなかった。

若い頃は、何を勉強したいとか、どういう仕事に就きたいとか、どんな暮らしをしたいかとか、そういうのばっかりでどこの学校に行くか、どこで働くか、どこに住むかを考えてしまう。ずっと地元に残るということが考えられなかった。しかし実家の近くに住んで、家族が病気のときにはすぐ駆けつけられるのが一番こころ穏やかでいられるのではないかと思うようになった。どんな仕事をするか、どれだけの収入を得るか、どんな暮らしをするか、そういうことも人生の中で大切なことではあると思う。ただそのために自分の両親や祖父母の面倒を見ることが出来ないのは何か違うんじゃないかと考えるようになった。

ばあちゃんが入院している間、阿蘇山がとても勢いよく噴煙を上げていた。まるでばあちゃんの具合が悪くなるのに呼応するかのように黒々とした煙を上げ、阿蘇谷に火山灰を降らせた。葬儀の日は特にひどく、雪と見まごうばかりの灰の塊を降らせていた。

ばあちゃんの死を通じて、自分のルーツを深く考えるようになった。時を同じくして阿蘇の火文字焼きの中止と終了が発表された。子どもの頃、ばあちゃんと一緒に見た阿蘇の火文字焼きがなくなってしまう。ばあちゃんと一緒に阿蘇の習慣が失われたような気がして言い様のない寂しさを覚えた。

自分はばあちゃんが91年間住んでいた阿蘇を飛び出してどれだけの価値を生み出せたのだろう。ばあちゃんの死に目に会えなかったことに見合うだけの人生を歩んでいるのだろうか。

すき焼き

ばあちゃんからもらった上等の牛肉があったのでカセットコンロを買ってきてすき焼きした。鍋がないので鉄のフライパンでやったけどちゃんと文明開化の味がした。

すき焼き、最初に長ネギを斜めに切ったやつを焼いて香りづけしてから肉を投入して軽く焼き、酒、砂糖、醤油を入れてから白菜とか春菊とかを投入したら幸福が実現するという知見が得られた。

九州新幹線

関わっているサイトの Rails のバージョンが 3.2.20 から 4.1.8 に上がった。自分は割と傍観していて他の人が主にバージョンアップしてたんだけど、いくつかはまりポイントがあって自分も Pull Request 送ったりしたのでやったことを書いときます。

1. session に注意

Rails 4 から Flash メッセージ(ログインしましたとか)を格納する session のオブジェクトが普通の Hash になってる。 Rails 3 ではこれは FlashHash とかいうやつ。

Rails 3 から Rails 4 へのアップグレードで一旦 Rails 4 を出してやっぱりやめて Rails 3 に戻したりとか、ロードバランサーに Rails 3 と Rails 4 で動くサーバーを混ぜてリクエスト捌いたりするとまずいことになる。

Rails 4 のサーバーで session 出来た人が次にリクエストしたときに Rails 3 に当たるとログイン後とかに session に残っているメッセージを消そうとする処理とかで NoMethodError が発生して落ちてしまう。しかもたちが悪いことに Rack 層で死んでしまったりするから皆さんよく使ってると思われる ExceptionNotification とかで気づくことが出来ない。これはつらい。

対処法としては Hash クラスをオープンしてモンキーパッチするというのがある。こういうの。

Rails 4 FlashHash Upgrade Gotcha | Jason Neylon's Blog

↑のだと #alert とか #notice が呼ばれたときにエラーになるので自分は以下のようにした。

# NOTE Rails 4 と Rails 3 を混ぜて使うと Hash#sweep が見つからなくてエラーに
# なるようなのでモンキーパッチします。
# 参照: http://jasonneylon.wordpress.com/2014/08/27/rails-4-flashhash-upgrade-gotcha/

class Hash
  def now
    Rails.logger.warn "Stubbing now during upgrade"
    {}
  end

  def keep
    # stub keep for upgrade purposes
    Rails.logger.warn "Stubbing keep during upgrade"
  end

  def sweep
    # stub sweep for upgrade purposes
    Rails.logger.warn "Stubbing sweep during upgrade"
  end

  def alert
    Rails.logger.warn "Stubbing alert during upgrade"
    self[:alert]
  end

  def notice
    Rails.logger.warn "Stubbing notice during upgrade"
    self[:notice]
  end
end

ただこれもパーフェクトではなくて、何もしないように上書きしているだけなのでログイン後のメッセージとか削除後のメッセージが消せなくなったりする。それでも 500 エラーになるよりかはましなのでどうしても Rails 3 と Rails 4 を混ぜて投入したいみたいときなんかは有効。

2. 絵文字に注意

Rails 3 の頃は ActiveRecord が絵文字を DB に保存することが基本的になかった。ユーザーが POST してきたフォームの中に絵文字が含まれてたら絵文字のところでテキストをぶった切って DB に保存するような挙動だった。しかし Rails 4 からは ActiveRecord は絵文字を素通りさせるようになってしまったので困ったことになる。

絵文字を DB に保存するためには、 MySQL の場合は DB のテキストエンコーディングを utf8mb4 というやつにしてないといけない。ただの utf8 だと保存時に Mysql2::Error: Incorrect string value というエラーが出て DB に保存できない。emojimmy のような gem を使えば utf8mb4 でない DB でも使えるけど、 stores_emoji_characters :column_name を忘れずにモデルに定義しないといけない。たとえば購入時に購入した製品のスナップショットを注文テーブルに取るような DB 設計だと、製品テーブルのカラムは stores_emoji_characters してたとしても注文テーブルのカラムを stores_emoji_characters し忘れていて死亡、というような悲劇が起こり得る。

いまはスマートフォンの時代で、ユーザーが入力してくるフィールドには必ず絵文字が含まれると思っておいた方がいい。スマートフォンをメインで使ってる人たちは開発者が想定しないようなフィールド(名前の敬称とか)に平気で絵文字を使ってくる。下手すりゃ住所や名前にも絵文字を入れて送ってくるかも知れない。アスキー文字しか受け付けないようなフィールドは JavaScript やサーバーサイドでバリデーション行ってると思うけど、ユニコード文字列を受け付けるフィールドの場合はせいぜい長さくらいしかチェックしてないと思う。チェックを入れて絵文字を弾くことも可能だけど、スマートフォンの時代の流れに反しているしユーザーを失うことになりそう。これから新規でサービスを作ってデータベースに MySQL を使う場合はエンコーディングは utf8mb4 にしておいた方がいい。

他にも script/rails が bin/rails に変わってること忘れてて rails runner なバッチ処理が動いてなかったとか、 paranoia.gem の Rails 4 対応バージョンで物理削除のときに呼び出すメソッド名が変わっててはまったとかいろいろあったけど大きなところは上の session と絵文字だった。開発環境で使ってるときには気がつかず本番に出すまで気がつきにくいという意味で非常にやっかいな現象だと思う。

これから Rails 4 に上げる皆さんは頑張ってください。応援しています。

セルフホストの個人のウェブログでも Twitter カード出てるサイトあることに気がついて個人でもできるぽかったのでやってみた。メジャーサイト感出る。

Twitter Card

Lokka 用のプラグイン作っといた。

morygonzalez/lokka-twitter_card

MacBook の内蔵キーボードを有効にしたり無効にしたりするやつ、よく使うけど毎回 Terminal でコマンドうつの面倒くさいので Alfred の Workflow にした。

Alfred の Workflow でシェルコマンド実行できるけど sudo しないといけないのは実行できない。調べたら AppleScript 経由だと実行できることが分かった。

Workflows requiring privileges - Workflow Help & Questions - Alfred App Community Forum

こんな感じ

do script “実行したいシェルスクリプト” with administrator privileges

MacBook の内蔵キーボードの有効無効の切り替えは以下のような感じになる。

on alfred_script(q)
  set script_to_run to "sudo kext" & q & " /System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext"
  do shell script script_to_run with administrator privileges
end alfred_script

これ打つと認証プロンプト出るのでそこでパスワード入力すればよい。便利。

追記

workflow にして公開しといたので使ってみたい人いたら使ってください。

http://resources.portalshit.net/internal-keyboad-activeness-toggler.alfredworkflow