株式会社はてなを退職しました

先週末の5/24日付で、株式会社はてなを退職しました。2008年のインターンに申し込んだのが、ちょうど5年前の今頃の季節で、以来、インターン採用、修士修了、新卒入社、結婚、第一子誕生と、人生のなかでも大きなイベントの多くをはてなと過ごして来ました。

仕事の上では、

などなど、書きだすときりが無いくらい多様な仕事に関わること出来ました。どの仕事も、沢山のユーザーさんからのフィードバックがある楽しい仕事でした。

若干いろいろな事に手を出しすぎて自分の専門分野を絞る事ができなかったとも言えますが、次の職ではその辺をどうにかしたいと思っています。CTOに、"深く技術を学ぶなら2,3年潜らないとねえ" みたいな事を言われた事もあって、それぐらいちょっと深く潜って勉強して見るつもりです。


会社を振り返ると、はてな労働環境は本当に素晴らしくて

  • 頼れる優秀な同僚
  • 京都ならではの広い机と、最新の開発環境
  • ベンチャーとは思えないホワイトな労働時間
  • 毎日出る社食と、無限のお菓子・飲み物

と、エンジニアの仕事環境としてはあまりないものだと思います。

一方で、"Web進化論"で書かれていたような、あるいは 2003 - 2005 年ごろの伝説的なへんな会社は、だいぶ普通の会社になっていて、あのビッグウェーブに乗れなかったのは少し残念でもあります。それは、上に書いた良い労働環境とは相反するものですし、入社の時点で以前と違うことは了解できていたので、無い物ねだりとしか言えないものです。

同僚にも本当に恵まれることが出来ました。スタープレーヤーが居なくなった後のはてなにも優秀な人が沢山いて、切磋琢磨という言葉が実にふさわしい環境でした。そしてなにより、よい友人を得ることが出来ました。アルバイトやインターンだった人々も含めてはてなで関わった方々は実に魅力的で、風変わりで、そして優秀でした。これからも、どうぞよろしくお願い致します。


そんな、すばらしい環境で、楽しい同僚達と、もっと長く一緒に仕事をするのも悪い選択肢では無かったと思います。しかし、以前から挑戦したかった事をやるべきタイミングが来たので、ここでお別れすることにしました。


とても楽しい4年間でした。昔から大好きだと思っていた会社で最初のキャリアを始めることが出来たことを光栄に思います。
同僚のみなさん、ほんとうにありがとうございました。

Automator のデバッグ

前回の記事で躓いたひとも多そうなので、補遺。

ショートカットキーから実行しない

文字列を選択して、コンテキストメニューを出すことでも サービス は呼び出せる

文字列を選択して、メニューバーからサービスを呼び出すことも出来る

サービスはタイミングや、呼び出してるソフトウェアとの相性によって起動できたり出来ないことがある。なので、起動できないタイミングでショートカットキーを押しても何も起こらない。
最初は、コンテキストメニューなどから呼び出して実際呼び出せるタイミングなのか知っておくとよい。

作ってる間のデバッグ

いきなり、テキストエディタなどで文字列を選択してサービスを起動しても、実際何が起きてるのか把握しづらい。
なので、Automator にある "指定されたテキストを取得"アクションを使って、入力を与える。



こんな感じ。

こうすると、間違いなく入力が渡ってくるので、次のアクション(具体的には ruby の呼び出し)がおかしいのか、入力値や呼び出し方法がおかしいのか判別できる。

考える生き方 読んだ

考える生き方

考える生き方

読書感想文。

RSSリーダーもあるのに、つい更新を確かめに行くblogがあって、極東ブログと、経済のトリセツと、やまもといろうblog の3つ。そのなかの、極東ブログid:finalvent さんが書いた自伝。

本が届くのを楽しみに待ってたら、経済のトリセツの山形さんが強烈に罵倒芸してて、それはそれで楽しみになった本。

著者のfinalvent さんは謎の多い人で、なんであんなにインターネット技術に詳しんだろなーとか、文章は文系ぽいのに理系の匂いもするとか、日頃思っていた謎が半生を追っているうちに随分了解できた。そいう意味では、ある種のアイドル本であって、今までの彼の文章などから垣間見れた姿と、照らしあわせて楽しんでしまった気もする。

個人的には、今年自分は30になるし子供できるし、山形さんのいう"知らない人の、特に変わったものでもない結婚や子供や仕事の話"がとても読んでいて面白かった。30過ぎてフラフラしてもいいよね。とか子供育てるのに3ヶ月かかりっきりになってみたいよね。とか、30歳頃のfinalventさんを見ることで、わりと僕自身のしたい事を肯定されたような気がした。子育て中に参考にした育児書も読んでみたくなった。お子さんが沢山いることも知らなかったので、普段理性的なの文章を書く人も子供のことになると、盲目というか親バカにならざるを得ないんだなあというのも面白い。

後半の、沖縄の話とか、大学の話は参考にはなる。ただ、沖縄は行ったことないのでどうしても感情移入しにくい。大学と勉強の話は、ですよねー。と思う事が大半。なにか学問に入門したい時に、欧米の大学の教科書読みましょうというのは、そうだった、忘れてた。大学にもう一回行きたくなった。

山形さんが、ちらっと紹介していたスヤリマンの話が出てたのもタイミングが良くて驚いた。ちょうど"この本の名は"を今読んでる。

この本の名は?: 嘘つきと正直者をめぐる不思議な論理パズル

この本の名は?: 嘘つきと正直者をめぐる不思議な論理パズル

finalvent ファンなら買って損はなし、そうでないならオジサマの説教に聞こえても仕方ないかも。

ただ、難病とは存じ上げませんでした、どうかご自愛ください。その点以外は、子供に恵まれて、フリーランスで自活できてて全然、人生を"負け"判定しなくても良いんじゃないかな。とは思った。55歳にして何万人かのファンがいるわけですし。

考える生き方

考える生き方

Mac を使っているなら必ず使うべき2つの機能 "Automator" と "サービス"


Automator ってなんか超高機能なマクロみたいなイメージがありますが、とても便利なのでご紹介。

もともとは、会社の上司が Windows から Mac に移行したのだけれど、"秀丸みたいに選択範囲を ruby で evalできないの" とおっしゃっており、しかも Emacs は微妙とのことなので、Automator でどうにかしてみた。Service でできるんじゃないかねと教えてくれた同僚に感謝。

追記(2013/02/24)

デバッグ方法を別エントリに書きました

できること

文字列選択して Ctrl+= を押すと選択文字列が ruby で実行されます。編集可能なテキストエリアならだいたい何処でも。

作り方

  • アプリケーション ディレクトリにある Automator を起動します。
  • 新しくサービスを作ります

  • "ruby -Ku" と書く

  • ドロップダウンリストで選べるオプションは画像のとおりに。
  • 名前をつけて保存する。たとえば "doRuby"
  • ショートカットーキーを設定する
    • "システム環境設定" を開いて、"キーボード"項目の、キーボードショートカットタブをクリック
    • 左カラムのサービスを選ぶと、さっき保存した右カラムに doRuby があるので、すきなショートカットキーを設定


  • テキストエリアで、ruby のコードを選択する。さっき決めたショートカットキーを押す。コードが実行される。

  • Ctrl-z で動作を取り消して、もとのコードに戻せるのもポイント高いですね。

ポイント

  • シェルスクリプトの標準入力になんでも渡せる。ファイル名を渡したりも出来る。ほとんどなんでも出来るじゃん。
  • つくったサービスは、コンテキストメニュー出るようになる!
  • つくったサービスは、ショートカットキーがセットできる。
  • Ctrl-z でやりなおしできる。


ショートカットキーが設定できるのが、とても重要で、画面ロックのショートカットキーも簡単にできます。

画面ロックの作り方

  • 途中まではさっきの例と同じ

  • こんな感じで"スクリーンセーバーの開始" をするだけのサービスを作成
  • 名前つけて保存
  • 上の例と同様に、ショートカットキーを設定

とすれば、画面ロックのための service になります。

発展型

スクリーンショットを撮って、fotolife に upload する。という gyazo みたいなスクリプトが一時期はやりましたが、これもショートカットキーから呼べるとかなり便利です。

use strict;
use warnings;
use Config::Pit;
use WebService::Hatena::Fotolife;
use IPC::Run qw(run);

my $conf = Config::Pit::get("hatena.ne.jp");
my $file_name = $ARGV[0];
my $tmp_filename = '/tmp/screencapture.png';

if ($file_name || run(['screencapture', '-i', $tmp_filename])) {
    my $hatena = WebService::Hatena::Fotolife->new;
    $hatena->username($conf->{user});
    $hatena->password($conf->{pass});

    my ($date) = $hatena->createEntry(
        filename => $file_name || $tmp_filename,
        folder   => 'work',
    ) =~ /(\d{14})$/;
    my $url = sprintf "http://f.hatena.ne.jp/%s/%s", $conf->{user}, $date;

    run(['open', $url]);
}

こんなスクリプトを書いておいて、

こうやってサービスを作ると、ショートカットキー一発で、スクリーンショット取得と fotolife への upload まで完了できます。

MeCab の辞書に単語を追加して利用する

いつも忘れるのでまとめておこう。
辞書と言ってもきちんとコストを計算して複雑な形態素解析をするわけではなく、
Wikipediaの項目名などを名詞として文章から抜き出すために追加するとかそういう例。
単語の活用も考えない。

1.もとになる単語のリストをつくる

上達の法則,0,0,-8944,名詞,一般,*,*,*,*,*,*,*
ツブカラカサタケ,0,0,-18101,名詞,一般,*,*,*,*,*,*,*
旗艦・三笠,0,0,-8944,名詞,一般,*,*,*,*,*,*,*
マルシェ志摩,0,0,-11757,名詞,一般,*,*,*,*,*,*,*

まあこんな感じのCSVを作る。カラムは左から順に

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html

となっているのだけれど、左文脈ID,右文脈IDは今回は利用しないので0でよい。品詞から右は品詞,品詞細分類1ぐらいが書いてあれば実用に困らない。

問題なのはコストで、これが小さいほどその単語としてきり出されやすくなる。
今回は正規表現の最長一致のようになるべく長い単語切り出してほしいので、文字列の長さに応じてスコアが小さくなるような設定をしている。
なので1行目と3行目は同じ長さがなのでスコアが同じだし、"ツブカラカサタケ"は長い文字列なのでスコアが小さくなっている。

このへんのスコアの付け方の感覚はイマイチわかっていなくて、詳しい人がいたら教えていただきたい。

2.csv から dic ファイルへ変換

さてこのcsvを直接mecabは読みこんでくれないので、独自形式に変換する。csv ファイルが words.csv、 作る辞書ファイルを original.dic とする。

$ /usr/local/Cellar/mecab/0.98/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.98/lib/mecab/dic/ipadic -u original.dic -f utf8 -t utf8 words.csv

これは osx で homebrew を使って mecab を入れている場合の例。自分の環境に合わせて変更すると良い。
mecab-dict-index が辞書を変換する実行ファイルで、-d のオプションがシステム辞書のある場所、 -u オプションが作る辞書の名前, -f が csv ファイルの文字コード、-t が作る辞書ファイルの文字コートになる。

3.作った辞書の利用

mecab -u original.dic

と -u オプションで作ったファイルを渡せば、ユーザー辞書も有効になる。システム辞書も有効なので注意。

Text::MeCab から利用する場合は、コンストラクタ

my $userdic = '/PATH/TO/original.dic';
my $mecab = Text::MeCab->new({ userdic => $userdic });

と指定してあげればよい。

MeCabさん、登場から随分たつけどやっぱり便利ですね。

詳しい解説は http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html も参考に。

ペパボのSQALEでsinatraしてみた

paperboy さんの、SQALE のbetaテストに参加できたので、Sinatra を動かしてみた。GettingStartrails なんで面食らってしまったけれど、要は rackup のための config.ru がリポジトリのトップレベルにアレばいいようだ。(参考 http://docs.komagata.org/4927)

用意するもの

ということで、Sinatra で書かれたアプリと、最低限の設定ファイルを用意する

config.ru
require './app'
run Sinatra::Application
app.rb
require 'sinatra'
get '/' do
  'Hello World'
end
Gemfile
gem "sinatra"

bundle install

上記の3つのファイルを用意したら、

$ bundle install

として、Gemfile.lock も作る。

あとは

SQALE のダッシュボードで作成した、アプリケーションのリポジトリに入れて、push するだけ!反映されないようだったら、

$ /etc/init.d restart

するとよいかも。しなくても反映されていたりする。

まとめ

config.ru と Gemfile を用意するだけで rack アプリが動くので便利!

ついでなので、ab してみた

ちゃんと対策されてた><

kurai-no-MacBook-Air:r_kurain% ab -H "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" -c 10 -n 100 "http://bench-kurain.sqale.jp/"
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking bench-kurain.sqale.jp (be patient)...Send request failed!
Send request failed!
Send request failed!
Send request failed!
apr_socket_recv: Connection reset by peer (54)
Total of 23 requests completed

nginx はデフォルトで merge slash する

久しぶり技術ネタを一つ。

問題

nginx を reverse proxy として使っていると

original http://example.com/hoge/huga//path
proxied http://example.com/hoge/huga/path

みたいな感じに重なったslash を merge してから proxy される。path最後の '//path' が '/path' となって、状況によってはありがたい。これが default なのが良いかは分からないが。slash は 2 以上連続していると、1つになる。

さらに、

original http://example.com/entry/http%3A%2F%2Fwww.hatena.com%2F
proxied http://example.com/entry/http%3A%2Fwww.hatena.com%2F

と、パーセントエンコーディングされている slash もmerge されてしまう。

backend で http://www.hatena.com/エンコードした文字列が来ると期待しているとはまる。

解決策

で、これを解決するには nginx.conf の設定に

Syntax: merge_slashes on | off
Default: on
Context: http, server
Reference: merge_slashes

http://wiki.nginx.org/HttpCoreModule#merge_slashes

というのがあるので、これを設定すればよい。

しかし!'Context: http, server' と書いておきながら、この設定は、default server の設定に書くか、http context に書かないと有効にならない。see(http://nginx.org/en/docs/http/ngx_http_core_module.html#merge_slashes)

default server の設定に書くと、すべての virtual host で有効になるようである。ある virtual host だけ有効/無効 にというのが出来ないわけだ。

まとめ

nginx を使っていると、スラッシュの数がバックエンドで少なくなってるということがある。設定で直せるけど、設定場所にも罠があるよ!!!