seri::diary

日常

祭りを終えて

2ヶ月ぐらいかけてやっていたデカいプロジェクトが終わった。時間もない、人手もない中で気合でみんなで乗り切って先日無事本番公開された。ここ2週間ぐらいはその後始末みたいなことをしていたがそれも落ち着いてきたのでちょっと安心している。
今回は自分が普段担当しているところもそうでないところも片っ端から仕事が振られてきたのでシステム全体像を把握するには良い機会だったが、それ故に色々と苦労した。今まで全く読んでいない部分の修正が突然飛んできて、必死こいてソースを読んで仕様を解釈して直す。終盤はひたすらバグフィックスだったのでその繰り返しだった。この辺のソースリーディングと仕様を整理するスキルがまだ弱い。自分が一行も手を付けてないコードに手をつけなければいけなくなるケースはこれからもあるだろうからこの辺は意識してスピードと品質を上げていかなければならないと思った。

自社サービスをやっている以上、システムを作るのは「手段」に過ぎず、それによって収益を上げているわけではない。めちゃくちゃ苦労して作った機能が何のKPIにも影響を与えなかったり、逆にちょっとした文言修正が会員登録数を激増させたりとか、リリースしてみるまで結果は分からない。今回のプロジェクトでは数字がどうとか、という以前にやることが多すぎてとにかくシステムを安定させることに必死だったが、今あらためて自分たちが作ったものを客観的に見て、これを使って今後サービスを回していくという事実と向き合えるようになった。そうして見えてきたものの中には、これからの展開でこういう風に組み合わせると良い機能になるなァと思えるものや、あまり上手く機能してないなァと思えるものなど、様々である。それらをどうやって売上に繋がるものに変えていくか。それが今後取り組むべき課題である。

結果を出すのは難しい。結果はKPIでしか評価されない環境にいる以上、とにかく売上につながるKPIを追いかける。
売上、数字、施策、優先順位。
最近はそんなことばかり考えてる。

でも俺らのサービスが世の中に対して何をやろうとしてたんだっけ?なんてことも、ふと立ち止まって考える。
そもそも俺ってなんでWeb屋になったんだっけ?

イヤフォンの無い生活

3日前、1年半ぐらい使ってたイヤフォンが断線した。
型番は覚えてないが、オーテクの4000円ぐらいのカナル型イヤホン。通勤で毎日使っている都合上、大体1年ぐらいで死ぬ消耗品だと思っているので断線したらオーテクの4000円〜5000円クラスを買い直す、というのをここ5年ぐらい繰り返している。
すぐに新しいのを買っても良いのだが、せっかくだからと3日ほどイヤフォン無しで過ごしてみたが、非常に辛いことが分かった。満員電車も、休日の街も。外を歩いている時、他の人の存在を否応なく感じさせる「音」、「音」、「音」。辛すぎる。特に電車が辛い。吐きそうなほど四方八方から圧力をかけられる地獄みたいな電車を耐えられるのは「音楽」による恩恵が非常に大きかったということが分かった。あと単純に他人同士の話し声を強制的に聞かされるのが辛い。朝は良い。大体静かなのだが、夜は騒がしい山手線と東海道本線を乗り継いで帰宅しているため、チャラいワカモノとか酔ったオッサンとかのバカでかい声の話を否応無しに聞かされる。ウザ過ぎて吐きそうになる。耳をふさぎたい。せめて耳を手で塞いでしまいたい。どうして東京はこんなに人の存在を強制的に感じさせる環境なのか。街を歩いててもうるさすぎる。音が多すぎる。人が多すぎる。モノが多すぎる。それを全部イヤフォンで塞いで、自分が大好きな音楽を耳に流しこむことでしのいできた。音楽はもはや精神安定剤なんだ。聞くのも弾くのもひっくるめて。だからここまでやってこれたんだ。

そんな訳でさっさとイヤフォンをポチッた。

きのこ話

突然今の会社を辞めたらどうやって生きていくのか

なんてことをたまに考えるようになった。
以前なら「そんなこと考えたくもない。生きていける訳がないから必死で次の職を探す」と思っていた。普通に考えたらそうだ。ある日突然無職になってもすぐに食い扶持を見つけることなんてできやしない。
しかし今は、「今は無理でも、20代のうちに、『ある日会社を辞めてもすぐに次の仕事が見つかる』ぐらい、スキルがあって人脈があって業界で知られているエンジニアになろう」と考えている。目標とリスクヘッジを兼ねて、といったところか。
理由は、自分が良いと感じている今の会社ですら、いつまで続くか分からないということだ。ここで主語は、会社そのものと、その会社に居続ける自分自身の両方。
今の会社で3社目になる。しかし4社目が無い保障はない。寧ろ、これまでの傾向から言えば、4年半社会時生活を送って2回転職している訳だから、2年以内にまた転職する確立は高いと言える。もっとも、そんな転職回数などうちの会社では当たり前レベルだから、今更「コロコロ会社を変える根性なし」などと思ってもいないが、それでも一つの組織に居続けるのはやはり得意な方ではないらしい。大学新卒で入った会社であれば、大半の人は少なくとも5〜6年は続けるように感じる(自分の知り合い調べ)。
話を戻す。とにかくそんな感じの「飽き症」の自分なので、組織はいつでも移ろえるようにしておいた方が自分の精神衛生上良いと思っている。自分と会社の方向性が相容れなくなったらスパっと辞められるように自分を鍛える。得たスキルは今の会社の利益に還元していくつもりだが、会社のためでもあり、自分の為でもある、ということだ。
自分の最終的な人生の目標なんてまだ分からない。
だが、「Webをより上手く使いこなし、より多くの人が幸せになれる社会を作る」という夢は揺るがない。一生Webと関わり続けるだろう。手段はそこまで問題ではない。

CakePHPのModelクラスのメソッドに渡す条件を組み立てるクラスを作っている


久々にPHPネタ。今作ってる。とりあえずconditionとfieldをセットするメソッドだけ作ってUT。

<?php
App::uses('ConditionBuilder','Vendor');

class ConditionBuilderTest extends CakeTestCase{
    
    
    public function setUp() {

    }
    
    public function testCreateFieldName(){
         $post = new ConditionBuilder('Post');
         $result = $post->createFullFiledName("id");
         $this->assertEqual($result, 'Post.id');
    }

    
    public function testCreateCondition() {
        $post = new ConditionBuilder('Post');
        $result = $post->setCondition('id', 3)
               ->setCondition('name', 'test')
                ->setFields('name')
                    ->build();
        print_r($result);
// Array
// (
//    [conditions] => Array
//        (
//            [Post.id] => 3
//            [Post.name] => test
//        )
//
//    [fields] => Array
//        (
//            [0] => Post.name
//        )
//
// )
        $this->assertNoErrors();
    }
}
$ Console/cake test app Vendor/ConditionBuilder

Welcome to CakePHP v2.3.6 Console
---------------------------------------------------------------
App : app
Path: /Users/seri/NetBeansProjects/digupper/app/
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
PHPUnit 3.7.21 by Sebastian Bergmann.

..Array
(
    [conditions] => Array
        (
            [Post.id] => 3
            [Post.name] => test
        )

    [fields] => Array
        (
            [0] => Post.name
        )

)


Time: 0 seconds, Memory: 6.25Mb

OK (2 tests, 1 assertion)
macbkpro:app seri$ Console/cake test app Vendor/ConditionBuilder

PHPのstdClassが地味に便利だということに今更ながら気づいた。連想配列より綺麗に書ける。

社内ハッカソンの企画・運営を行いました


去る5月18日、19日に社内ハッカソンを行った。
その企画・運営の1人として裏方の仕事を一手に引受け、色々と面白い経験が出来たのでまとめてみる。

1.目的

最初は「なんかみんなでワイワイやりたいね」的なところから始まったと記憶しているのだが、
えらい人「会社のお金使うからなんか有意義なことしたいね」
人事「じゃあ社外の人呼んでうちのエンジニアの空気を知ってもらってPRに使えたらよくね?」
えらい人「社外ゲスト付きハッカソンだ!」
ということで、多分うちの会社でも初であろう、社外ゲスト+社内のエンジニアによるイベントということで方針が決まった。

俺氏「でも初のエンジニアイベントで社外の人招いてやるのは(主に俺が)大変では」
えらい人「一番むずかしいと思うことは最初にやっとくんだよ」

2.企画

ハッカソンに参加したことはない。だから実は何も分からなかったが、他のハッカソンのレポートとかを読みまくって色々考えて決めた。

  1. 社内のエンジニアと社外のエンジニアを混ぜたチーム対抗にすること
  2. ゲストの技術レベルは当日になるまで分からないし、社内でもjavaでサーバサイド書いてる人もいればiphoneアプリしかやってない人がいるから技術縛りは無し。動けばよし。
  3. 作るもののお題は当日発表にした方がイベント感があっていい。
  4. お題は「○○を使ったサービス」みたいな縛りを持たず、自由に解釈できる緩いお題にする。

お題は運営チームで色々考えたが、やっぱり転職サイトをやっている身なので「キャリアアップできるもの」というお題にすることにした。
これなら「転職」だけでなく、TOEICのスコア上げるための学習アプリだとか、転職のための体力をつける筋トレ記録アプリだとか色々とこじつけられる。
いいお題だと思う。発案した相方のセンスに嫉妬。

3.準備

ハッカソンの9割は準備なんだなと初めて知った。昼は本業をこなしつつ、夜にミーティングしながら進めた。

宿泊先

伊東温泉の「山喜旅館」に決めた。
理由は色々あるが、

  1. 50人ぐらい入れてしかも24時間使える会議室があること
  2. 会議室では優先LANが使えること
  3. 無線LANが使えること
  4. 過去に色んな開発合宿の開催地となっていること(こことか)
  5. 安いこと(社内の稟議を通すためにこれ大事)
バス

渋谷のオフィスから伊東温泉までは大型バスを借りた。
初めてバスの手配をしたが、複数のバス会社に一括で見積もりを取れるバスなびで複数のバス会社から見積もりを取って一番安いところにした。
意外とあっさり予約できたが、予約してから一週間以内に料金を全額振込みということだったのでちょっと慌てたが、えらい人がいい感じにやってくれた。ありがとうえらい人。

社外ゲスト

一番すったもんだしたのがコレである。何しろ開催日は平日。社会人は無理。チーム編成上、社内の参加者に人数を合わせると10人ぐらいは社外のゲストが必要な計算になった。
さて誰を呼ぶか・・・と悩んでいたら、新卒採用担当者が大学生や専門学生に声をかけまくってくれた。
社外の就活イベントや、その他高専のイベントで学生とのコネクションがあったらしく、色んな学生に声をかけまくってくれて、1ヶ月ぐらいで何とか8人集めてくれた。その他学生の対応もしてもらった。本当にありがたい。自分たちだけではどうにもならなかったのでこの点は本当に感謝している。

賞品

せっかくだからと、全チームの投票で順位をつけて賞品を出すことにした。
賞品はえらい人のポケットマネーから出るものなので、それなりに値段を考慮して良い感じのものをアマゾンでぽちった。
賞は3つ用意して、kindleとポケットドルツ2個セットと初音ミク。とりあえず運営チームが欲しいものを基準に選んだ。

チーム分け

社外ゲスト枠だけ空けて独断と偏見で決めたら一部から多少の意見はあったものの、大きなトラブル無くきまった。幹事の権限は絶対である。
因みに人選の基準として、せっかくなので普段一緒に仕事していない人同士を組ませてみた。この時点で社内のエンジニアが24人だったので、別プロジェクトとかで殆んど一緒に仕事しない人も出てきている状態だった。エンジニアにとってコミュニケーションは大事である。いつ同じプロジェクトになるかも分からないので、ここで交流を深めて貰いたいと思った。

インフラ

チームごとにec2のsmallインスタンスを1台ずつ提供した。本番の一週間前には公開し、事前に必要な環境構築をしておいてもらった。
※うちはjava使いだらけなのでtomcat + nginx + mysqlを入れるチームが殆んどだった

4.当日の様子

参加者は総勢38名。当初想定していたよりも大掛かりなイベントになったが、結果を見れば大したトラブルもなく無事に終わった。

5/18(金)ダイジェスト

  • 朝渋谷を出発して昼過ぎに山喜旅館に到着
  • 着いて早々会議室のセッティング、持ってきたハブを繋ぎまくって全員分のLANケーブルを床に這わせる
  • 13時から作業開始。全員でつないでみたらLANが遅くて使えず。
  • 無線LANの方が多少マシということに誰かが気づき、会議室よりも無線LANの入りが良い客室に移動してそこで無線LANで作業し始める
  • 会議室涙目
  • 俺氏、設計が終わっていざ実装に入ろうとしたらusbで持ってきたjavaの空プロジェクトファイルに必要なjarが一部抜けていることに気づき、SAStruts + DBFluteのプロジェクト作り直し
  • 夕食は大広間で食べたが、食べ終わるやいなや「食べ終わったので戻って作業していいですか」で、ぞろぞろ帰りだす
  • 21時ぐらいから各チームのテンションがおかしくなり、色んな部屋から奇声が飛び交うようになる
  • 俺氏、DBFluteの設定に手間取って先に進めない
  • 22時頃、社長が手土産持って登場し、全チームの部屋を回って差し入れをくれた。しかし参加者は開発に忙しかったので誰にも相手にされず風呂へ。
  • 23時頃、俺氏、javaを諦めてPHPにスィッチすると叫び、持ってきたmac bookの電源を入れてCakePHPでサーバーサイドを作り始め、jspをctpに変換する作業を始める
  • 24時頃、相方が壊れ始めてシモネタを連呼するようになる。うるさいので反対側を向いてサーバサイドを黙々作る。
  • 25時頃、他の部屋を覗きに行くが普通に作業してるのでジャマするのも悪いと思って撤退
  • 26時頃、明日使う投票用紙が無いことに気づき、真夜中のコンビニへ紙を買いに行き、ついでに夜食を食う。まだ5月の伊東は結構寒かった
  • 27時頃、作業は終わらないが、眠いので3時間だけ寝ることにする。

5/18(土)ダイジェスト

  • 6時頃、起床、相方爆睡中だが作業の続き
  • とりあえず見せられるレベルだからまぁいいだろ、全然動かないけど、怒られないギリギリのライン、という基準で作業完了を宣言
  • 8時頃、朝食なので全室を回って起こして回る。徹夜チームもちらほら。
  • 9時頃、プレゼン開始。開会の挨拶とかしてみるが、全然パワーが出ない。それでもやる。それが運営。
  • 各チームとも意外とちゃんとしたものを作ってきた。大体がwebサービスでとあるチームはfirefox OSシュミレーター上で動くアプリ作ったりとか。これは熱い。
  • 他のチームのプレゼンが面白すぎて終始爆笑
  • プレゼンの時に各チーム一人ひとりに感想を述べてもらったが、みんなして「やってみたらすげー楽しかった!」と社内外の人に言ってもらえて俺氏涙目
  • 俺氏、プレゼンの質疑で突っ込まれて涙目
  • 11時頃、プレゼン終了、投票、えらい人の総評
  • 11時半頃、表彰式、えらい人の締めの言葉
  • 12時頃、会議室片付け
  • 13時頃、バスで帰還。速攻爆睡。
  • 16時頃、渋谷着、現地解散

5.感想

当日はそんなでもなかったが、とにかく準備が大変だったように思う。40人ぐらいのイベントだと運営がもう一人くらいいた方がよかったかも?
学生の技術レベルはまちまちで、結構書ける子から全く書けない子まで。でも社内エンジニアが上手くサポートしてくれて、徹夜orほぼ徹だったのにプレゼンの時に「すっげー楽しかった!」とか「もっと書けるようになりたいと思った」とか、前向きなコメントが多かったので、まぁ上手くいったんじゃないかなと思う。

あと今回は運営しながら普通に参加もしたのだが、運営やる時は参加しちゃいけないなと思った。考えてみりゃ当然なのだが、当日は旅館との調整とか各チームへの伝達とかで、自分のチームのサービス考えるどころじゃなかった(それでもそれなりに作ったけど)。この点は失敗したと思っているので、次回は運営に徹するか、運営は別の人に預けて参加者はとしてガチで勝負に行きたいと思う。

社内ハッカソンはやるべきか?
採用目的というなら、都内でサクっと開発イベントとか学生向けプログラミング講座〜とかをやった方が労力もかからずラクだったかも知れないが、やっぱオフィスを離れて、非日常の中で祭り的に開発をやるというのは特別な楽しさがあるので、時間とお金に余裕があるならやってみた方がいいと思う。

宣伝

なお、弊社では、ハイクラス転職サイト「ビズリーチ」やエンジニア向けコラボサイト「codebreak;」のサービス開発、また新規事業の立ち上げをしたいエンジニアを絶賛募集中なので、「俺も次回のハッカソンに出てぇ!」とか思った方はどしどし応募ください。

時間の使い方の整理

1日が60時間ぐらいあればいいのに

最近そんなことを考える。やるべき事、やりたい事が多すぎて時間が足りなくなってきた。

その場合、当然「やることリスト」の対象からドロップアウトされるのは「やりたい事」である。
元々自分はマンドリンオーケストラでの活動とか、バイクとか、色々と変な趣味があって週末はそれらにどっぷり時間を宛てていたのだが、最近は週末の時間が仕事に充てられるようになった。平日も入社当初よりもずっと帰宅が遅くなった。
この辺のジレンマは社会人なら誰もが抱える事だろうが、どうしても仕事をしていれば仕事が時間の使い方において最優先事項になる。夜21時から打ち合わせが入っていれば例え自分にタスクが残っていなくて早く帰りたくても会社に残っていなくてはいけないし、打ち合わせが23時まで長引けば帰宅するのは日付が変わってからになる。帰ったら寝て、すぐまた朝が来て会社に向かう。
でも、それがイヤな訳じゃない。今の仕事は楽しいし、職場の人と関係ない雑談をしていて帰宅が遅くなるケースだってある。それぐらい楽しい。
ただ、それはその場にいる時だけだ。帰宅中の電車内で、今週末にマンドリンオーケストラの練習があるけど全然練習できてない、ソレ以前にギターに触れていない、という罪悪感に苛まれる。twitter画像をバイクにしているくせに全然乗れてないバイクに対しても罪悪感を感じる。過去にプライベートで関わっていたとあるプロジェクトに仕事の多忙が理由で戦線離脱したことが今でも惜しいと感じてしまう。まだローカルのPCに眠ったままのとあるサービスをリリースできていないのも、railsの習得が一向に進まないのも。挙げればキリが無い。

薄々、棚卸が必要だと思うようになった。対外的な迷惑を考えても、自分の精神衛生を考えても。
思い切ってマンドリンオーケストラの方は8月に予定していた定期公演の参加を諦めた。バイクもバッテリーだけ充電器につないで多忙な時期が過ぎるまで乗らないことにした。
幸い、マンドリンオーケストラの方は、それなりに人数はいるパートだったので俺が抜けてもそこまで影響はないだろう。かつてギターパートが自分含めて2人だけで自分がトップをやった演奏会があるが、ああいう状況だったらどうなっていたのだろう。ちょっとどころか大分怖い。

先日、今後の予定が発表された。今後2ヶ月はかなり忙しくなるだろう。でも自分を苛む問題は出来うる範囲で取り払ったつもりなので、仕事に集中できると思う。
で、もし時間が取れる土日が取れたなら、その時はバイクにも乗るし最近興味を持って学び始めたドメイン駆動開発の本も読めるだろう。夏休みは恐らく8月下旬から9月には取れるからそしたら前から行きたかった東北ツーリングに行こう。

それはまでは色んなことを中断して、仕事に集中する。色々と使ったことのないミドルウェアをいじることになったのでその辺で得られるものがあるといいなと思う。

RubyとRailsのバージョンをrvmで管理する

色々あってRailsの勉強してる。仕事以外だけど。
まだ具体的な開発には入っていないが、久しぶりのrails環境構築でハマりまくって大変なことになったので
必要最低限のところだけメモ。

対象バージョン

今回rvmでインストールして管理するのは下記のバージョン

ホントはRails4 beta0を使いたかったのだがいろんな事情(herokuが対応してないとか)で断念

rvmでruby1.9.3をインストールする

#まずrvmを更新。これやらないとハマる確率が2割ぐらい上がる
$ rvm get stable
$ rvm -v
rvm 1.19.6 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

#必要なパッケージ類をインストールする。これをしないと、後続作業であれがない、これがないと怒られまくって大変なことになる
$ rvm pkg install openssl
$ rvm pkg install readline
$ rvm pkg install zlib
$ rvm install 1.9.3


上記で失敗する場合は~/.rvm/usrを消してから再度pkgをインストールしてみると上手くいくことがある。
自分の場合何度やってもrubyのコンパイル時にopensslが読み込まれず涙目になっていのだが、ダメもとで~/.rvm/usrを消したら上手くいった。

なお、opensslが組み込まれない場合、rubyのインストール時に下記のようにコンパイルオプション指定で要なパッケージのディレクトリを指定する方法が色々なサイトで紹介されていた。
しかし上記の手順でrvmで各種pkgがインストールされている場合は不要のようだった。
rvm管理外のopensslを使いたい時とかに使うオプションだと思われる。

$ rvm install ruby-head -C "--enable-shared=true,--with-opt-dir=/opt/local"


ちなみに、ruby2.0.0が使いたくなってruby2.0.0をrvmでインストールしたときにも似たような事態(opensslがrequireできない病)にハマって、
半日ぐらい四苦八苦した結果、以下のコマンドでうまくインストールできたログがkobitoに残ってたのでさらしておく

$ CC=clang rvm install 2.0.0 --skip-openssl --with-opt-dir="brew --prefix openssl"

因に各コマンドの意味はよくわからない。あとで調べてみる。


rvmでRailsをインストールする

rvmはrubyrailsのバージョンの組み合わせを"gemset"という単位で管理することができる。
例えば
ruby1.8.7とrails3.1のgemset
ruby1.9.2とrails3.2のgemset
という具合に管理することができる。異なるrailsバージョンのアプリを同じPC内で開発しなくてはいけない場合等に効果を発揮しそうである。
そうえいばhome brewでもphpを複数バージョン管理できるが、phpの複数バージョン同居はそこまで苦痛ではないのでいまいち恩恵を感じなかった。
しかし今回railsの環境構築で相当痛い目を見た私としては、rvmのgemset管理機能が神に見える。

今回は上記でインストールしたruby1.9.3とrails3.2.13を一つのgemsetとして管理する。

$ rvm gemset create rails32

#作ったgemset を使用する
$ rvm 1.9.3@rails32
#確認する
$ ruby -v
rruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin11.4.2]

$ gem install rails
$ rails -v
Rails 3.2.13

もし新しいバージョンのrailsが出て(というかもう4.0.0betaがあるけど)試したくなったら

$rvm gemset create rails40
$rvm 1.9.3@rails40
$gem install

とやれば試すことが出来る。

また、同一バージョンのrubyでgemsetだけ複数作成して一発で切り替えることもできる。
詳細はこちらのエントリーが非常に非常に詳しいので熟読させていただいた。
rvm 入門 … 複数バージョンの Ruby と Rails を混在させる


今回の作業で参考にした他のリンク
Macで環境を整えるための環境-homebrewとrvmとrubygems-
RVMのRuby環境にreadline,openssl,zlibなどのライブラリを追加インストールする
rvm.ioのopensslのquick fix



色々あったけどrvmはやっぱり便利。
次回からはRubyRailsや、はたまた侍ズムの山本さんにおすすめされているRubymineのエントリーがかければ良いと思う。


あと全然関係ないけどドミノ・ピザでピザ食った