| @技術/プログラミング
gem install chef # => 11.6.0 が入る
gem install knife-solo # => 0.2.0 が入る

入門 Chef Solo には knife-solo は 0.3.0 を使えとある。

gem install knife-solo --pre # => 0.3.0.pre5 が入る

knife solo ○× したときに solo なんていうサブコマンドないと怒られる。

knife-solo 0.3.0 使いたいなら chef のバージョンは 11.4.4 に落とさないといけない。ローカルマシンの Chef のバージョンだけでなく、リモートのやつのバージョンも落とさないといけない。この辺地獄っぽい。

プロビジョニングツール的なやつ、使えたら便利なんだろけど自分は環境作るのってもの凄くたまにしかないし Chef とか Puppet の使い方覚えるより手動でインストールしていった方が速いような気がする。Nginx をインストールするのにもの凄く時間がかかった。

| @散財

スバル インプレッサ / SUBARU Impreza

2月に車を買った。スバルインプレッサの中古。車、維持費高いけどやっぱりあると便利だと思う。生活圏広がるし、これまで行けなかった糸島(福岡の湘南みたいなところ)の農産物直売所に行ってうどんを食べたりすることもできる。

子どもが生まれるとやはり車がない生活が原理的に不可能な気がしてくるようになった。子ども服を売っている店はそもそも車でしか行けないような場所にあることが多い。意外と都会の真ん中で子ども服を扱ってる店はない。ユニクロも赤ちゃん服は売ってない。百貨店に行けば何でもあるので都会の真ん中にも子ども服あると言えばあるんだけど、当然のことながら異常に高い。百貨店には庶民が買えるようなやつは売ってない。子ども用品を激安価格で売っているチェーン店に西松屋というのがあるけど、例外なく郊外で営業してる。安く子ども用品を揃えようとしたらどうしても車で西松屋に行くしかない。

そもそも子ども用品はかさばることが多く(おむつ、ミルクなど)、電車+徒歩で行けるような場所に店があったとしても買った品物を持ち帰るのが非常に難しい。以前、電車とタクシーで西松屋に子ども用品を買いにいったことがあるけど、子ども用の風呂桶などが大きすぎて手で持ち帰ることができず、同じ市内なのに宅急便で家まで配達してもらって送料が2000円くらいかかった。そのほかにも駅からタクシーでショッピングセンターをはしごしたりで、一回の買い出しで交通費・送料だけで5000円くらいかかったことあった。

また公共交通機関での移動は公共交通機関に都合を合わせないといけないのが辛かった。地下鉄のホームから地上への上り下りや高速バスの乗り降りは結構きつい。時間も電車やバスに合わせないといけない。子どもがうんこしたからといって高速バスで移動している最中におむつを替えるわけにもいかない。車ならこういう問題があらかた解決される。

以上のような理由で車を買った。

車はカーセンサーとかで調べて実物を見に行ってから決めた。中古車屋は非ディーラー系とディーラー系の両方に行った。非ディーラー系は飲み物を出してくれたりゆったりとしたソファがあったりして店の作りは贅沢だと思ったけど、車の値段が詐欺っぽかった。車検付き80万円という価格につられて行ったのに乗りだし価格は+40万必要で120万円からになりますとかそんな感じだった。これはアホらしいと思ったのでここでは買わなかった。

ディーラー系の中古車屋はしょぼかった。店はプレハブで車を見に行っても飲み物とか出てこなかった。しかし詐欺っぽいところはなくて、何も言ってないのにカーセンサーに載っけてる値段より安い値段出してきたし、窓にバイザーつけてくださいとか ETC 付けて下さいとか色々言ったら無料でやってくれた。スバル保証みたいのも付いたし、怪しい中古車屋よりネットに出てる値段は高いけど最終的にはディーラーの中古車屋で買うのが良い気がした。

新車とかは一生乗れないと思うので死ぬまでディーラーがやってる中古車屋で車を買って乗り継いでいこうと思います。

| @技術/プログラミング
[1] pry(2.0.0-p195)> require 'open-uri'
[2] pry(2.0.0-p195)> require 'active_support/core_ext/hash/conversions'
[3] pry(2.0.0-p195)> Hash.from_xml(open('http://www.portalshit.net/index.atom').read)
=> {"feed"=>
  {"xmlns"=>"http://www.w3.org/2005/Atom",
   "id"=>"http://www.portalshit.net/",
   "title"=>"portal shit!",
   "updated"=>"2013-06-18T19:07:44+09:00",
   "link"=>
    [{"type"=>"text/html",
      "rel"=>"alternate",
      "href"=>"http://www.portalshit.net/"},
     {"type"=>"application/atom+xml",
      "ref"=>"self",
      "href"=>"http://www.portalshit.net/index.atom"}],
   "entry"=>
    [{"id"=>"tag:www.portalshit.net,2013-06-18T19:04:33+09:00",
      "title"=>"Alfred で Chrome のブックマークを検索する",
      "published"=>"2013-06-18T19:04:33+09:00",
      "updated"=>"2013-06-18T19:07:44+09:00",
      "link"=>
       {"type"=>"html",
        "rel"=>"alternate",
        "href"=>
         "http://www.portalshit.net/2013/06/18/chrome-bookmark-search-with-alfred"},
      "content"=>
       "<p><img src=\"https://resources.portalshit.net/945-chrome-bookmark-search-with-alfred.png\" alt=\"945-chrome-bookmark-search-with-alfred.png (708×295)\
      "author"=>{"name"=>"morygonzalez"}},

で XML の内容を Hash にできる。ActiveSupport 便利。

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

jQuery Validation で特定のイベントに対してだけバリデーションを無効にする方法が分からなくて困ってた。例えばフォームの中の送信ボタンではなくキャンセルボタンが押されたときにはバリデーションを行わずにフォームを送信したいということがあると思う。

調べていたら以下の記事がひっかかった。

input タグの class に "cancel" を指定すれば validate されないとある。ほかに、ボタンの click イベントとかで

$("form").validate().cancelSubmit = true;

と書いてやっても良いみたい。こちらは JavaScript で form を submit() するタイプのやつにも使えて使い勝手良さそう。

jQuery Validation 、便利だけどドキュメントが充実してなくてつらい。あとどれが公式か分からないのもつらい。去年くらいまで jQuery Plugin のサイトにドキュメントあった気がしたんだど今は別のサイトに単独で存在してる。

| @雑談

思うに、若いときは一番給料低くて、お金ないから、暮らせてたら節約する必要ない、どうせ今の若い人とか30歳までに死ぬから、それまでに貯金しても仕方ない、万が一長生きしても、相応に技術が高まってれば収入も上がるはずだから、健康を維持できれば取り返せる、ので、僕は今は特に貯金しようといった考えない。今けっこう本買って勉強したり書いてるコードも悪くないと思ってるから、これで若いときに貯金してなくてお金なくなって死ぬようなら理不尽だと思う。ハードモードすぎる。変に無理して節約しようとして精神が異常になるほうが損だと思う。

健康 - hitode909の日記

ヒトデさんの言うことは正しい。能力の高い人は高価な技術書を買って自己投資して将来荒稼ぎできるので週五日タクシーで山奥まで行ったり高級Tシャツ買ったりしても大丈夫だと思う。

残念ながら普通の人はそうはいかない。普通の人は将来自分が荒稼ぎできる自信がないので若い頃からちまちまお金を貯めるしかない。普通の人は無理して節約せず浪費したときの方が不安が高まって精神に異常を来してしまう。

僕は会社の若者に蓄財を説いたことがあるけど、この若者は有能だから僕のアドバイスは間違っていたかもしれないと思った。世の中には金を貯める必要がある人と貯める必要がない人の二通りがいる。

| @労働

RubyKaigi 、2010 年のに行ってすごく感化されて 2011 年も 2012 年の Sapporo も行きたかったけど結婚するといろいろあってそういうのは無理だった。当然のように今年も無理だった。恐らく自分は終生 RubyKaigi には行けないのだと思う。ああいうプログラミングのイベントに熱心に参加したり運営の方に回ったりする人は本当にすごいと思う。みんなそれぞれ家庭とか奨学金の返済とか住宅ローンとかあるんだろうけど、時間をやりくりしてコミュニティ活動を行っている。

受託の会社にいた頃、技術とかどうでも良くて言われたとおり作って金がもらえるならそれでいい、というような情熱がない感じの人だらけの職場がとても嫌だった。しかしいま自分が彼らのようになりつつあるように感じる。悪い感じにサラリーマン化している。このままでは新卒とか有能な若者にあっという間に追い越されて老いさらばえていくだけだと思う。それは分かっているけど 30 歳くらいになるといろいろ厳しい。

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

Lokka でキャッシュしたいと書いてたけどキャッシュできるようになった。

結局 sinatra-cache を使った。sinatra-cache、2 年くらいメンテされてなくて全然だめかなと思ってたけどドキュメントが執拗なほど詳しく書かれてて使い方がわかりやすかったので使ってみることにした。フラグメントキャッシュがページごとに共有されなくて非効率的だったところは適当に改造した(morygonzalez/sinatra-cache · GitHub)。

footer 部分だけキャッシュするようにしてるのでトップページのレンダリングはあまり変わってないように感じる。個別記事ページは HTML が返ってくるまで 2, 3 秒かかってたのが 500ms から 600ms くらいになった。割とよいと思う。

いまのところ cache の有効期間みたいのを設定できないのでこれを任意の時間で設定できるようにしたい。しばらく使ってみて問題なさそうだったら Lokka 本体に Pull Request してもよいかも。