2012-02-19
面接を突破する簡単な方法
Never mind a crisp shirt or a firm handshake. If you want to impress a potential employer, put on a pair of spectacles.
Job hunters are more likely to be hired if they wear glasses to their interview, according to a study.
A third of adults think spectacle-wearers look more professional, while 43 per cent think they appear more intelligent.
適当な訳:
ノリの効いたシャツや固い握手なんて不要。面接官を感心させるなら、眼鏡をかけよう。
ある研究によると、眼鏡をかけた人は採用されやすいことが分かった。眼鏡をかけた人について、回答者の33%は「プロフェッショナルに見える」と思い、43%は「もっと知的に見える」と思ったという。
論より証拠。私は最近まで6連敗だったのだが、眼鏡をかけて2社を受けたらどちらも受かった。そのうちの一社が某SNSの会社であり、もう一つが今度移る会社だ。
ちなみに今までの総合成績は9勝8敗(受かって辞退したケースもあるので、勝利数=転職数ではない)。就職戦線を知っている人なら分かると思うけど、抜群の成績である。
2012-02-12
物語は次の舞台へ(2)
かなりドタバタした挙句、次は開発の仕事をすることにした。某SNSで運用の仕事をする機会もあったけど、ここで運用畑に戻ればキャリアが運用で決まりそうな気がしたからだ。私は開発も運用も選べる贅沢な悩みに直面している状態であるが、キャリアを積むなら開発をやりたい。
理由は色々あるが、
1. 開発者はモノを創造できる。運用は他人が作ったサービスのお守りであるが、開発者はゼロから創造できる。
2. 開発者の方が条件が良い。Facebook社の新卒を例にとると、
- 年収10万ドル (770万円)
- サインボーナス5万ドル (96万円/年)
- 未公開株4000株 (231万円/年)
一ドル77円で計算しても、トータル・パッケージは約1100万円に上る。まあFacebookはトップクラスの給料だとしても、一般的に開発者の方が運用より条件が良いのは事実である。
3. 変則スケジュールに悩まされない。運用の仕事では、10x4や12x3シフトを敷くのは珍しくないし、代休をくれるとはいえ祝日出勤もありえる。開発者は普通の8x5スケジュールで仕事が出来る。
2012-02-10
物語は次の舞台へ
会社で辞表を出してきた。
タイミング的にはあまり良くないのだろう。今年の査定プロセス(馬鹿みたいに毎年5ヶ月もかかる)がもうすぐ終わるので、昇給やボーナスはとり逃すことになる。
辞表を出したらマネージャーが査定内容を漏らしてきた。私の評価は、部署全体でもトップ3に入る高評価だそうだ。引き止め工作ではなく、実際に高評価なのだろう。だけど、私が今年だけ特別に良く働いたわけではない。マネージャーに気に入られるかどうかが全てなのだ。例えば、仕事内容で言えば実際のところ去年の方が結果を出している。業務時間外で学んだPHPを使って、監視システムのグラフレポートの在り方を根底から変えたスクリプトを作った。
だけど、それは評価されなかった。少なくとも査定上は。
今年の評価が高いのは、チーム内のエンジニアが辞めて私が彼の仕事を積極的に引き受けた事と、部下の仕事ぶりをきっちりと見てくれるマネージャーに当たったのが大きい。だけど、別に特別に多く働いたわけではなく、極普通に仕事をしているだけだ。本来なら去年の方が評価が高くて然るべきであるが、現実は逆だ。
一応上記みたいな事を直接マネージャーやディレクターへ言ってみたけど、まあ何も対策は取らないだろうな。部下を評価できない奴はマネージャーになっちゃいけないし、年一度の査定なんて遅すぎてまともな評価なんて出来ないよ。
2012-02-05
Fantasy Basketball用のスクリプトを書き直した(6)
APIで自在にデータを取得できるようになったので、他チームの選手も分析できるようにした。以前に書いた「チーム全体のパフォーマンスを調べる機能」の拡張版である。これで、対戦相手の強みと弱みを把握できるようになった。プレーオフで役立つ機能だ。
今のところウチのチームは3位。ドラフトが11位だったことを考えれば、順調と言えるだろう。
2012-01-29
Perlでsubclass
use baseを使おう。
package SubClass; use strict; use warnings; use base qw(WWW::Mechanize); sub new { my $class = shift; return bless {}, $class; } sub something { my $self = shift; return "hello"; } 1;
ドライバースクリプトはこちら。SubClassオブジェクトからWWW::Mechanizeのget()メソッドが使える。
#!/usr/bin/perl use strict; use warnings; use SubClass; my $subclass = SubClass->new(); print $subclass->something, "\n"; my $thing = $subclass->get( "http://www.google.com" );
2012-01-24
シリコンバレー・エンジニアの給料
大体のレンジで言えば、8万ドルから12万ドルが相場。本エントリーでは、10万ドルを例として毎月の手取りを計算してみる。
大きく持っていかれる要素は3つ。税金、401KそしてESPP。
1. 税金
33%程度は持っていかれる。戦争大好きな国の軍事費を賄うのは大変なのだ。
2. 401K
IBMやBoeing等の老舗企業を除いて、退職金など出ないので個人積立の401Kへお金を入れることになる。401Kは毎年1万5000ドル程度積み立てられるうえ、会社がいくらかマッチングしてくれる。ここでは毎月10%(833ドル)を401Kに回す計算とする。
3. ESPP
半年間給料の一部をプールして、自社株を安く買う仕組み。大体給料の15%を注ぎ込めるようになっている。お金が半年間ロックインされるものの、株を買った直後に売れば必ず儲かる仕組みになっている。ここでは15%注ぎ込むものとする。
結果、税金に33%取られ、401Kへ10%入れ、ESPPへ15%入れると残りは42%、つまり4万2000ドル。毎月3500ドルの手取りになる。
サニーベール辺りでは、1ベッドルームのアパートの相場は1600ドル。家賃を引けば、残りは1900ドルになる。一ドル76円で計算すると14万4400円が生活費になる。
2012-01-22
ロマサガ2をクリア
約20年前のゲームを今更ながら。昔は攻略本も持っていたけど、遊ぶ機会が無いまま捨ててしまったのでネットで情報を集めつつクリア。戦闘がとにかくシビアなので、普通に進めていたら敵が強くなりすぎてクリアは難しい。途中で何度もやめかけたけど、ラピッド+クイックを取得してヌルプレイでクリアした。
しかし結構手抜きのゲームだよなあ。ヌオノの町なんて全員同じコメントしか言わないし、モール族も台詞は使いまわし。あと、色々なクラスのキャラクターが用意されているのは面白いんだけど、戦闘で使えるクラスは余り多くない。中盤以降はインペリアルガード2人にイーストガードを加えた物理攻撃パーティーになってしまった。イーリス族の術とか強いみたいなんだけど、出会った時には最終皇帝だったので加えられず。
まあ一応クリアしたので長年のモヤモヤが晴れたのは良かった。
2012-01-10
SIGPIPEの悪夢(5)
もう一度、get_hostsで何が起きているのか確認してみよう。
sub get_hosts {
my $self = shift;
# ... talk to MySQL and get hostlist
return @array;
}
このメソッド内でDBハンドルがオープンのままになっていた。ただし、DBハンドルが他のメソッドで使い回されている可能性もあるので一概にバグとは言えない。
では、DBハンドルが開きっぱなしだとどういう問題が起きるのだろうか。結論から言うと、メインスクリプトの書き方に少々癖があったと言うべきか。このループをもう一度見てみよう。
foreach my $host ( @hosts ) {
push @joblist, {
"desc" => $host,
"fn" => sub {
$SIG{"PIPE"} = sub {
print "abc\n";
exit(13);
};
$stuff->run_thing($host);
},
};
}
@joblistの中身はハッシュレフの集まりであり、それぞれのハッシュレフは無名関数が含まれている。また、Mockオブジェクトのメソッドを呼び出していることにも注目したい。これらの塊がフォークされて並列作動するようになっている。
すると、子プロセスが終了するときにガベージコレクトされるわけだが、$stuffのコピーもスコープ外になる。その際に、開きっぱなしだったDBハンドルをdisconnectしてしまう。
最初の子プロセスは普通にDBハンドルをdisconnectするので問題ないが、それ以降の子プロセスはすべて既にdisconnectされたDBハンドルを再度disconnectしようとする。これがSIGPIPEの嵐の原因であった。
2012-01-09
SIGPIPEの悪夢(4)
次に試みたのは、straceを挟んでスクリプトを動かすことだった。システムコールでSIGPIPEが起きているのが確認できた。
write(3, "\1\0\0\0\1", 5) = -1 EPIPE (Broken pipe)
これは何をwriteしていたのだろうか。Googleで調べてみると、どうやらMySQL辺りが怪しそうな感じだ。元のスクリプトで言えば、
my @hosts = $stuff->get_hosts();
このメソッドが怪しいことになる。そこで、試しに@hostsの内容をYAMLへ書き出して、get_hosts()の代わりにYAMLを読み込んで動かしてみた。すると、SIGPIPEは発生しなくなった。(続く)
2012-01-08
SIGPIPEの悪夢(3)
今度はオレオレフォークの実装を疑ってみた。最初のコードにあるように、オレオレフォークは並列実行数を調整できるようになっている。もしかしたらフォークのコードのどこかにバグが潜んでいるのかもしれない。
そこで、Mock.pmのようにParallel::ForkManagerで書き換えてみたのだが、依然としてSIGPIPEは治らなかった。この時点で、シングルサインオン周りやフォーク実装部分でのバグである可能性は低くなった。後は何を調べれば良いのだろうか?(続く)
2012-01-07
SIGPIPEの悪夢(2)
子プロセスでSIGPIPEが発生している形跡が見当たらないので、問題なのは子プロセスがexit(0)する時に発生しているように見えた。子プロセスで無名関数を走らせた後に、Mockオブジェクトがスコープ外になる際に何かのハンドルが閉じてSIGPIPEが発生している可能性がある。
それを確かめるためにconfessを使ってスタックトレースを取得。すると、HTTP::Responseオブジェクトのデストラクタが呼び出されていたことが分かった。
この時点で臭いのはrun_thingである。HTTP::Responseで何らかの問題が発生しているなら、それを使うのはシングルサインオンか、HTTP経由でのデータ取得がまず思い浮かぶ。
そこで、シングルサインオンを止めてLWP::Simpleで書き換えてみたがSIGPIPEは依然として発生したままだった。(続く)
2012-01-06
SIGPIPEの悪夢(1)
ここ数日間、SIGPIPEの悪夢と戦っていた。
退社したエンジニアの書いた複雑怪奇なコード。実行する度に迫り来るSIGPIPEの嵐。print文、バックトレース、データダンプ、ルーチン書き換え、他エンジニアの協力・・・
とりあえずモックアップを作ってみたので晒してみる。まずはメインスクリプト。
#!/usr/bin/perl
use strict;
use warnings;
use Mock;
my $stuff = Mock->new();
my @hosts = $stuff->get_hosts();
my @joblist;
foreach my $host ( @hosts ) {
push @joblist, {
"desc" => $host,
"fn" => sub {
$SIG{"PIPE"} = sub {
print "abc\n";
exit(13);
};
$stuff->run_thing($host);
},
};
}
Mock::parallel(10, @joblist);
次に、Mock.pm
package Mock;
use strict;
use warnings;
use Parallel::ForkManager;
use DBI;
sub new {
my $class = shift;
return bless {}, $class;
}
sub get_hosts {
my $self = shift;
# ... talk to MySQL and get hostlist
return @array;
}
sub run_thing {
my ( $self, $host ) = @_;
# ... シングルサインオンの後にHTTPでリモートホストのデータ取得
}
sub parallel {
my ( $max, @joblist ) = @_;
my $pm = Parallel::ForkManager->new( $max );
foreach ( @joblist ) {
$pm->start and next;
$_->{ "fn" }->();
$pm->finish;
}
$pm->wait_all_children;
}
1;
モックアップなので簡略化してあるが、大体の流れはこんな感じ。実物はParallel::ForkManagerではなくご丁寧にオレオレフォークを実装してある。
で、問題なのはメインスクリプトを走らせるとどこからともなくSIGPIPEの嵐が吹くこと。SIGPIPEは閉じたファイルハンドルやソケットへ読み書きを行おうとする際に発生するので、最初はシングルサインオンやHTTP経由のデータ取得周りを疑った。しかし、いくらprintやdieを挟んで走らせてもSIGPIPEは発生しなかった。(続く)
2012-01-03
Fantasy Basketball用のスクリプトを書き直した(5)
チーム全体のパフォーマンスを調べる機能を付け加えた。同じサイトからデータを引っ張るのだが、この機能はExcelのダウンロードが提供されていないので出力はHTMLでお茶を濁す。HTML::FormatText等でゴリゴリと解析することも可能だが、面倒い上にカラーを失ってしまう。
ptsV 3V rebV astV stlV blkV fg%V ft%V toV -5.78 -4.93 -1.97 -2.53 -3.53 0.39 -2.06 -6.77 4.46
出力の抜粋はこんな感じ。ターンオーバーはずば抜けて良し、ブロックは及第点。その他は改善の余地ありという結果になった。この機能、同データサイトで無料で提供されているのだが、全NBA選手のリストから自チームの選手を毎回選ばないと分析出来ない。その作業を軽減するのが今回の目的であった。
2012-01-02
Fantasy Basketball用のスクリプトを書き直した(4)
チームとFAのレポートはこんな感じで出力される。Valueが一番価値のある情報で、選手の活躍度の標準偏差だ。ウチのチームではMartin、Aldridge、Millerが活躍していて、逆にLamar Odomがダメなことが分かる。また、獲得可能な選手ではRushとWilliamsが狙い目であることも分かる。
Report for my_team First Name Last Name Position Games Value ------------------------------------------------------- Kevin Martin SG 4 0.24 LaMarcus Aldridge PF,C 3 0.22 Andre Miller PG 4 0.15 Al Jefferson PF,C 3 -0.05 Amir Johnson PF,C 3 -0.07 Landry Fields SG,SF 4 -0.11 Kevin Garnett PF 4 -0.13 Elton Brand PF,C 4 -0.15 Emeka Okafor C 3 -0.27 Luke Ridnour PG 3 -0.30 Shane Battier SF 4 -0.52 Beno Udrih PG 3 -0.57 Lamar Odom SF,PF 4 -0.87 Report for free_agents First Name Last Name Position Games Value ------------------------------------------------------- Brandon Rush SG,SF 3 0.26 Marvin Williams SF 4 0.21 Wayne Ellington SG 1 0.04 Jonas Jerebko SF,PF 4 0.04 JJ Redick SG 4 0.01 Mario Chalmers PG 4 -0.03 Andris Biedrins C 3 -0.05 Greg Stiemsma C 2 -0.07 Daniel Gibson PG,SG 3 -0.09 Jon Leuer SF,PF 3 -0.09 MarShon Brooks SG 4 -0.11 Ersan Ilyasova SF,PF 3 -0.12 Markieff Morris PF 4 -0.12 Delonte West PG,SG 4 -0.13 Hakim Warrick PF 3 -0.15 Richard Jefferson SF 4 -0.18 Alonzo Gee SG,SF 3 -0.19 Jeremy Pargo PG,SG 3 -0.19 Anthony Parker SG,SF 3 -0.20 Thabo Sefolosha SG,SF 5 -0.21
上記のレポートは9項目のスタッツ、試合平均、そしてシーズン全体を選んで出力したものだが、任意のスタッツを抽出したり、過去X週間に絞ることも可能だ。例えば下記は得点、フリースロー成功率、アシスト、スチールと3ポイントシュートで貢献しているFAリストだ。
Report for free_agents First Name Last Name Position Games Value ------------------------------------------------------- Mario Chalmers PG 4 0.34 Wayne Ellington SG 1 0.28 Delonte West PG,SG 4 0.21 Brandon Rush SG,SF 3 0.07 Jeremy Pargo PG,SG 3 0.03 Marvin Williams SF 4 0.03 Brandon Knight PG,SG 4 0.03 Mike Dunleavy SG,SF 3 0.02 Josh Howard SG,SF 4 0.00 CJ Watson PG,SG 4 -0.05 Keyon Dooling PG,SG 4 -0.07 JJ Redick SG 4 -0.09 Rodrigue Beaubois PG,SG 3 -0.13 Rudy Fernandez SG 4 -0.15 Vladimir Radmanovic SF,PF 4 -0.18 Greivis Vasquez PG,SG 3 -0.20 Leandro Barbosa PG,SG 3 -0.20 MarShon Brooks SG 4 -0.25 Anthony Parker SG,SF 3 -0.28 Daequan Cook SG,SF 5 -0.35
2012-01-01
Fantasy Basketball用のスクリプトを書き直した(3)
手続き型のスクリプトは一応完成をみたのだが、さらに進化させることにした。今回の変更はオブジェクト指向にすること。プログラムを部品化することにより、メンテ・テスト及び変更を行いやすくする。
既に作ってあったPlayer.pmに加え、下記のパッケージを作った。
Monster.pm - 選手データのサイトへ繋ぎ、Excelファイルをダウンロードし、データ構造へ落とし込む。そしてPlayerオブジェクトの配列を作る。
OAuth.pm - ヤフーAPIとのOAuth認証や、認証後のAPIアクセスを担う。
Yahoo.pm - OAuthオブジェクトを所有し、FA選手や自チームのデータをJSONフォーマットで引っ張ってくる。そしてPlayerオブジェクトの配列を作る。
メインプログラムの仕事は、
これで、手続き型よりもすっきりしたプログラムが出来上がった。
2011-12-27
Fantasy Basketball用のスクリプトを書き直した(2)
選手データの提供元サイトから、Excelでダウンロード出来るオプションが加わった。また、Yahoo Fantasy SportsのデータはAPI経由でもアクセス可能だ。そこで、選手データはWWW::Mechanizeでフォームをいじった後にExcelを取得してパース、自チームのデータはYahoo Fantasy SportsのAPI経由でJSON形式で取得することにした。
また、少しオブジェクト指向をスパイスとして使おうと思い、「Player」パッケージを作った。するとモジュールリストが膨れ上がってしまった。
use strict; use warnings; use Log::Log4perl qw(:easy); use Getopt::Long; use Carp; use YAML::Syck; use Data::Dumper; use WWW::Mechanize; use Spreadsheet::ParseExcel; use List::MoreUtils qw/uniq/; use Net::OAuth; use URI::Escape; use JSON;
あと、YahooのAPIはOAuthという認証方式を使っているのだが、これが一筋縄では行かなくてしばらくはまった。OAuth Authorization Flow - YDN
1. ヤフーへリクエストトークンを発行してもらう。
2. ユーザーをリクエストトークンと紐付いた認証サイトへ誘導し、アクセスを許可してもらう。するとOAuth Verifierを取得出来るので、ユーザーから何とか入手する。
3. リクエストトークンとOAuth Verifierを持って、ヤフーからアクセストークンを取得。
4. アクセストークンが手に入ったら、ヤフーのAPIへアクセス可能になる。
ここら辺のノウハウはそれだけで一つのエントリーになりそうなので、今回は割愛する。とりあえず、大量のモジュールを使用する手続き型のスクリプトは出来上がった。これをさらに進化させることにした。(続く)
2011-12-25
Fantasy Basketball用のスクリプトを書き直した(1)
Fantasy Sportsの面白いところはデータ分析にある。選手の活躍度を教えてくれるサイトは沢山あるのだけど、ネックになるのは獲得可能な選手を見つけることだ。言うまでもなく、活躍している選手の殆どは既に他のオーナーに獲られている。だけど、誰かの怪我でスタメンになって突然活躍し出す選手や、普段ベンチにも関わらず活躍してスタメンに躍り出る選手等が必ず出てくる。そういう選手を見つけて適宜獲得しなければならない。
というわけで、データサイトからデータを引っ張ってきて、Fantasy Leagueの自チームおよび獲得可能選手のリストを作り、レポートを作成するスクリプトを一昨年ごろ作った。昨シーズン9位から5位へ浮上してギリギリプレーオフへ入れたのもこのスクリプトのお陰である。
初期のバージョンはHTMLをゴリゴリとパースするものだった。
use strict; use warnings; use WWW::Mechanize; use HTML::FormatText; use Getopt::Long; use Data::Dumper;
WWW::Mechanizeでデータサイトからデータ取得、そして同様にFantasy Leagueからデータ取得。後はHTML::FormatTextや正規表現で解析、データ構造へ落とし込んでゴニョゴニョ。ちゃんと動いてはいたものの、もっと良い方法へ移行することにした。(続く)
2011-12-22
Fantasy Basketball 2011/2012!
というわけでようやくロックアウトも終わり、バスケットのシーズンが始まる。ウチのFantasy Basketballも先ほどドラフトが終わったばかりだ。
私のチームはドラフトの順位が12チーム中11位でトホホな出だしだった上に、J.R. Smithを獲得したら何と中国チームへ出張中で契約解除できず戻ってこられないそうな。他にも数人、中国へ出稼ぎに行って帰ってこれなくなったNBAerが居るらしい。これに関して秀逸なツイートを見つけたので紹介する。
The irony... the CBA is why you went there. Now it's because of the CBA you won't be here.
一番目のCBAは「団体交渉」のこと。NBA選手団とオーナーの間で揉めたから中国へ行ったわけだ。
二番目のCBAは「Chinese Basketball Association(中国バスケットボール協会)」のこと。協会が契約解除に応じないのでNBAer達は帰ってこれない。
思わず唸ってしまうほど見事だ。アメリカ人って本当にジョークが上手い。
2011-12-17
Facebookの本番環境
「Facebookにはテスト用サーバーが無いんです。エンジニアはすべて本番環境の上で開発をしていて、リリースとなったらそれを一般ユーザーに見えるように公開するだけ。エンジニアにすごい権限が与えられている。」
まあ確かに「テスト用サーバー」と呼ばれるサーバーは無いのかもだけど、一般ユーザーに見えないようにしている状態は本番環境というよりは「ステージング用サーバー」だなあ。
アクセス制限を徐々に公開できるようにして、ステージング環境を本番環境へシームレスに移行できる状態にしているのは賢い。だけど、ステージング環境が本番環境とハード・ソフトの面で同じなのはある意味当たり前。違ったらステージングの役に立たないからね。
2011-12-12
ゲイツ君にみるストーカーの気持ち悪さ
がんばれ!!ゲイツ君というサイトをご存知の方も居るかもしれない。ビル・ゲイツ氏をおもしろおかしく皮肉るコラムを不定期連載していたサイトなのだが、今日ふらっと訪れたら昨日付で閉鎖していた。
普通に閉鎖に至ったのかと思いきや、どうやら管理人の職場へ電凸、手紙凸を行った者が居るらしい。
外崎則夫/がんばれ!!ゲイツ君 まとめwiki - トップページ
管理人のプロフィールがかなり暴露されてしまっている。職場へ仮名を名乗り電話をかけた顛末も書いてあるが、非常に陰湿で卑怯と言えるだろう。サイト閉鎖に関してストーカーの影響があったかどうかは定かではないが、影響があった可能性は十分に高いと考える。
確かにゲイツ君の内容は過激な表現も多かったし、不快に思う人もそれなりに居たとは思う。だけど、何の関係もない第三者が仮名を語って職場へ電話してサイト閉鎖や懲罰を求めるのっておかしいよなーと思う。
管理人さんの脇が甘かった、と片付けるのは簡単だけど、じゃあ脇が甘くないやり方は何?と考えると、匿名ブログという結論にしかありえない。本名が割れてしまうと、FacebookやTwitterなど根こそぎ掘り出されてまとめブログが作られるかもしれないのだから。
管理人さんは敵が多かったかもしれないけど、これは誰にでも起こりうる問題なのである。安心して本名でブログを運営出来る日は来るのだろうか。
2011-12-11
fsvs
某SNSで使われているらしい。考え方としては、バージョン管理システムを使ってOS上のファイルを管理しちゃおうぜ!という話。
何でもパッケージ化してプッシュするのが普通のやり方だけど、パッケージの依存性等の確認にものすごく時間がかかる。そこで、単純にsvn upをかけて設定ファイル等を更新しましょう、ということ。開発側はパッケージを作らずとも良いので開発スピードアップにも繋がる。
ソフトウェアのデプロイに関しては色んな手法が提唱されていて面白い。うちの会社は伝統的な手法を使っているけど、TwitterなんかP2Pでやっているみたいだし、FlickrもContinuous Integration的な手法を使っているらしい。fsvsも中々面白いアプローチと言えるのではないだろうか。
2011-11-27
オーストラリア旅行
今回は旅行の話でも。
友人がオーストラリアへ移住したので、遊びに行ってきた。やっぱり知り合いが居る所へ行くのは良い。現地の話を詳しく聞けるし、お勧めスポットとか教えてくれる。
行ってきたのはブリズベンとゴールドコースト。旅行に行くまで都市の位置関係を知らなかったのだけど、どちらもオーストラリア東海岸に位置する街だ。
ブリズベンは街の特徴がはっきりと分かれているのが面白かった。CBDと呼ばれるビジネス街が街の中心だけど、川を越えて南側へ渡るとサウスバンクと呼ばれる地域になる。こちらはアートギャラリーや博物館があってゆったりとした雰囲気になっている。
ゴールドコーストはリゾート。ビーチに沿ってアパートがずらりと並んでいる。久々のビーチは楽しかった。
旅行中に身内に不幸があったので、途中オーストラリア - 日本往復も入った。大変だったけど、お通夜とお葬式に参加できて良かった。結果的に二週間の休暇で飛行機に9回乗るという行程になった。
行き:
サンフランシスコ -> ロス
ロス -> ブリズベン
日本行き:
ブリズベン -> シドニー
シドニー -> 成田
オーストラリア戻り:
成田 -> シドニー
シドニー -> ブリズベン
帰り:
ブリズベン -> シドニー
シドニー -> ロス
ロス -> サンフランシスコ
2011-11-20
2011-10-30
Race Conditionを制するものは、レースに勝つ
Race conditionの概念は分かっていても回避方法を全く分かっていなかったので書いてみる。まずはrace conditionを全く考慮していないスクリプト。
#!/usr/local/bin/perl use strict; use warnings; my $racer = "race"; foreach ( 1 .. 10000 ) { open( my $fh, ">>", $racer ) or die "could not open $racer: $!\n"; print $fh $_, "\n"; close $fh; }
単体で動かすには問題無いけど、複数のマシンからNFS上の"race"へ書き込ませるとたちまちrace状態が発生する。2台のマシンから動かしてみたら、
$ wc -l race 16854 race
本来なら20000なきゃいけないのに16854しかない。16%もの処理がどこかへ行ってしまった。そこで、ロックファイルを作ることにする。ロックファイルが無ければ作り、raceをいじる。もしあれば、タイムスタンプをチェックして、待つかロックファイルを破棄。
#!/usr/local/bin/perl use strict; use warnings; use Sys::Hostname; my $racer = "race"; my $lock = "race.lock"; foreach ( 1 .. 10000 ) { if ( !-f $lock ) { open( my $lockfh, ">", $lock ) or redo; print $lockfh hostname, "\n"; close $lockfh; open( my $fh, ">>", $racer ) or die "could not open $racer: $!\n"; print $fh $_, "\n"; close $fh; unlink $lock; } else { my $timeout = 1; my $age = (stat($lock))[9]; if ( time - $age > $timeout ) { unlink $lock; } redo; } }
結果はこうなった。
$ wc -l race 19967 race
完璧じゃないけど、99.8%のカバー率なのでまずまずだろう。ちなみにFcntlを使って排他制御をかける手もあるみたいだけど、NFS上だからなのか私のやり方がまずかったのかあまり効果が実感できなかったので割愛する。
2011-10-23
ruby-shadow
EPEL版puppetを入れると付いてくるのがコレ。これによって、puppetがユーザーの追加や削除を行える。
ユーザー管理やパッケージ管理は大規模環境では結構難しい。数千人のエンジニアが、それぞれ正しいマシンへアクセス出来るように管理しなければならない。さすがに権限まできっちりとやるのはアレなので、基本的にはsudo権限が与えられる。
パッケージ管理は更に難しい。正しいマシンへ正しいパッケージがインストールされるだけではなく、数十人の開発者から上がってくる新しいパッケージを組み込んでQAプロセスを経て、さらにロールバックも確認してようやくロールアウトになる。
もう少し小規模ならアジャイルにSubversionからそのまま持ち出すとかアリなのかもしれないが、うちのマネージメントの許可は降りないだろーなー。まあ私はパッケージ管理部門じゃないから直接は関係ないんだけど。
2011-10-16
監視ソフトのスケーラビリティ
Munin uses the excellent RRDTool (written by Tobi Oetiker) and the framework is written in Perl, while plugins may be written in any language. Munin has a master/node architecture in which the master connects to all the nodes at regular intervals and asks them for data. It then stores the data in RRD files, and (if needed) updates the graphs. One of the main goals has been ease of creating new plugins (graphs).
久しぶりにMuninを見てみたけど、やっぱり変わってない・・・
master/nodeアーキテクチャはシンプルだけどスケールしない。masterがハンドルできるクライアント数を超えたらアウトだ。
フリーの監視ソフト周りで一番スケールするのはGangliaだろう。Gangliaはクライアント同士でクラスターを組むので、masterはクラスターの代表ノードからデータを集めるだけでよい。クライアントの密集度にも依るが、10のオーダーでスケーラビリティが向上する。master同士でデータ交換する仕組みもあるのでさらにスケーラブルになっている。
ただ、常に問題になるのはRRDファイルの置き場所。この問題はGangliaとて例外ではなく、masterノードのハードディスク以外に置き場所がない。これはmasterノードのI/Oを圧迫する可能性があるのと、グラフ生成のパフォーマンスがブレる可能性を意味する。また、ディスクが一杯になってしまった場合やディスク障害の対策も必要になる。
2011-10-09
神取引が炸裂!
私は以前は頻繁に株取引をやっていたのだけど、ここ3年ほどは一年に3-5回程度取引する超カジュアルなトレーダーだ。手前味噌になるが、つい先日行った取引が完璧なものだったので紹介したい。
銘柄は由緒あるフィルム会社のコダック(EK)。最近は不調だが、名前を知らない人は居ないだろう。
Symbol Lookup from Yahoo! Finance
コダック社の株が9/26に$2.38から$1.74と27%も下落し、私のレーダーに止まった。その後数日乱高下するものの、9/30日に事件が起きる。Bloomberg社がコダック倒産の可能性を報道し、株価は急転直下。
ナイアガラの滝でもここまで急じゃないよ、というくらいの下落ぶり。この日私は自宅勤務していて、そろそろお昼にしようかなと考えていた12時50分頃にこの暴落が目に止まった。株式市場は西海岸では1時に閉まるので、閉場の10分前である。さっそく口座の全額をつぎ込んだ。一株$0.76台で約定。
マーケット終了後、コダック社が倒産の意志は無いことを発表。Bloombergの記事が飛ばし記事だったことが判明する。このニュースを受けて株価は時間外取引で$1.05まで急上昇。週末を挟むが、月曜日の寄り付きで大幅なギャップアップが起きる可能性が感じられた。
指値は色々と考えたのだけど、結局ちょうど二倍にあたる$1.54で全株を売り払うことにした。日曜日に指値オーダーを入れて、月曜日の寄り付きを待つ。とは言っても、マーケットが開く時間は普通に寝てたけどね。
月曜日、コダック社の株は$1.17でスタート。そこから一気に$1.61まで駆け上がり(100%以上の上昇率)、私の株も全株$1.54で売れた。約定したのは寄り付きから大体一時間後。
つまり、ザラ場に晒した時間は一時間で資金が倍になった。

