エンジニアの未来サミット2014

エンジニアの未来サミット2014〜働く場所の見つけ方、作り方」というイベントに行ってきたのでメモを残す。一部時系列順ではない。

テーマ

Engineer's Paradise

インテック 先端技術研究所 中川さん

  • テーマ: (会社だけでなく)業界を変える
  • 社長に業界を変えるような技術開発をさせろと直訴したら会社ができた
  • MPLSなど特定の分野に注力した結果、3大キャリアに導入されるなど、製品化に成功した
  • パートナー企業からエース級のエンジニアに出向してもらうという取り組みをした。終了後社長にプレゼンしたり、ポジションを作ってもらうなど、先方でも会社をあげてバックアップしてもらった
  • 本人の技術的チャレンジと、経営者の期待でエンジニアはすごく伸びる

Preferred Infrastructure 西川さん

  • テーマ: あらゆることをコンピューティングで加速する
  • 技術と実用製品のギャップを埋める、技術とビジネスの両方を考える
  • 研究者が実用化の困難さを理解することが重要
  • 行動原理を大切にするため、外部資本(VCとか)を入れないことにした
  • 受託は製品につながるものだけやる
  • 今はedge-heavy dataに注目している
  • 最初はとにかく組織を作るのに注力
  • 今は持続的に技術的なチャレンジを作ることに注力
  • Haskellで世界を変えるよ、みたいな人もいる。技術が好きすぎて妄想するくらいでもいい
  • エンジニアは鮪 = 成長しないと死ぬ
  • 技術に対するモチベーションがほぼ全て 福利厚生はおまけ

サイボウズ・ラボ 畑さん

  • 旧テーマ: 既存の製品にとらわれず、世界に通用する技術を追究する
  • 現テーマ: 製品に結びつく技術開発
  • 目立つし制度も別にできるので、研究部門ではなく子会社にした
  • 社名とか50%ルールなど、弱者が目立つための方策
  • プロダクトに結びつかなかったので方向修正した
  • 評価は難しいので主観でやりますと伝えている
  • その人に合ったテーマを設定することに注力
  • サイボウズ・ラボユースで合宿したりしている

サイバーエージェント Ameba Technology Laboratory 福田さん

  • 飲み会でlabo作るなら秋葉原がいいと言ったら翌日やることになっていた
  • 物件も自分で探した
  • 部品: Hadoop, Hive, Flume, HBase, Solr
  • 毎月研究会、半期に1度の研究レポート
  • 実サービスに使えて、かつ、新規性のある部分をやっている
  • 実サービス部隊と連携しすぎると研究に影響が出てしまうので、室長がコントロールしている

統計数理研究所 丸山さん

  • if you are given a change, you take it
  • 自然言語処理から、XML&Java
  • 研究者として挫折したと思ったが、実用性のあることをやれて良い経験になったし、結果的に研究所の所長のオファーが来た
  • research that matters
  • 研究は面白いからやるのではない 必要だからやるのだ
  • 研究の3フェーズとして、(1)研究提案(2)研究実施(3)技術移転・論文発表
  • 日本人は(2)が得意だけど(1)と(3)(入り口と出口)が苦手なイメージ
  • 参考文献: 素人のように考え、玄人として実行する
  • 読んでもらえることが論文の価値
  • どの組織に勤めているかは仮の姿 真の姿は人のつながり
  • 同じ環境に長くいすぎると幅を狭めるかも

楽天 技術研究所 安武さん

  • テーマ: インターネットを軸にアカデミアをつなぐ
  • 研究者になりたかったが会社が急成長しすぎて運用で手一杯
  • 参考: 大学への数学
  • 少し余裕が出てきたので技術研究所を作った
  • ハコだけ用意して何をしてもいいよ、はうまくいかなかった
  • 所長として森さんを迎えて、ビジョンを決めたら回り始めた
  • 研究者は運用の部署のとなりにいる
  • 実サービスに結びつくことが重要
  • 社内公募制度があり、異動できる。がんばらないと部下を失う
  • 日本の大学だとインターンシップは1〜3ヶ月が一般的だが、海外だと1年とかはざらにある
  • 日本の大学は密な連携が取りづらい
  • アメリカのほうがさばけていて、教員の副業を認めている大学が多く、協業しやすい

パネルディスカッション

  • ゴールやビジョンの共有は重要 最初にきちんと話し合う
  • 共有できないと「臨機応変」が「朝令暮改」になる
  • 優秀な人が集まればいいというわけでもない
  • 会社に誘うということは研究者の人生を左右しかねないが、最終的には本人のリスクなので、その人の人生を背負うみたいなことは考えすぎないようにした
  • 企業の研究に個人名が入ってないことが多い
  • 有名になりすぎると辞めちゃう?
  • 成功にリソース(お金、工場)が果たす役割は低下しつつある
  • 個人にフォーカスする時代 (安いPC、クラウド)
  • IBMは一人会社が何十億もできるかもと言っている(IBMの希望・都合もあるかもしれない)
  • 企業の意義が薄れているかも
  • そうはいってもフリーランスの場合はcompetitorでもあり運命共同体ではないので、同じ会社の仲間は重要
  • 国を越える手段ではある

感想

研究所の運営者がこれだけ集まるというのはなかなかない貴重なイベントだった。仮題は「研究所の作り方ワークショップ」だったらしく、研究所を運用するには、または、研究者として生きるには、という話だったのだが、研究職でなくても当てはまる部分はあったと思う。全体として、よい環境を作るということは、本分を追究することと同義なのだなと感じた。
一昔前は技術者はメーカーが囲い込んでいたので、こういうイベントというのは学会くらいしかなかったような気がするが、終身雇用が崩れて転職が珍しくなくなり、色々な働き方が増えてきた中で、働き方を共有するというのはすごくいいテーマだと思った。

サンタのためのコードゴルフ

CodeIQアホな素敵な企画をやっていたので参加。
1回目の「最短コードを書く!」は円状のアスキーアートを出力する問題。
2回目の「もしもエンジニアがサンタだったら」はツリー上のアスキーアートを出力する問題。

1回目に提出したコードはこれ(75文字)

for(w='',x=y=z=40;y+z;)w+="-*\n"[x+z?0|x*x--+y*y<900:(x=z,y-=2,2)];return w

2回目に提出したコードはこれ(215文字)

for(a=c=k=y=t=z='',b=[],i=h=40;j=y%8+y>>1,r=(a+k)*k*49999-5537&65535,v=r%38-y+1,w=r%78-h+i+1,a<4;)
h+i?k++<160?z=v*v+w*w<2?v?4:w?2:6:z:(c+="_%--||**"[z|i*i--<j*j],k=z=0):
(i=h,++y<h?c+='\n':(b[a++]=c,c=y=''));return b

ゴルフといえばPEゴルフしかやったことなく割と初心者。
1回目は最短タイ、2回目は5位でなかなか楽しめた。

オフラインイベントにも参加してきた。全員がサンタ帽かぶってコードゴルフしてる横でへそだしサンタと写真撮影という愉快なイベントだった。ここではドーナツ状のアスキーアートを出力する問題が出題されてこれを回答。

for(h=x=y=48,r="";z=x*x+y*y,h+y;)r+=h+x--?z<256?2:0|z<1024:(x=h,y-=2,"\n");return r

83文字で制限時間内ではトップだったが、すぐ縮みそうみたいな5位っぽさを発揮してきた。その後twitterで@notfuncさんが縮めてくれたので、それを77文字まで縮めた。

for(h=x=y=48,r="";h+y;r+=h+x--?!z+(z<4):(x=h,y-=2,"\n"))z=x*x+y*y>>8;return r

出題者の柳井氏が詳細に解説してくれたが、JavaScriptコードゴルフはなかなか奇天烈だったのでメモ。

  1. 2重以上のforループは1重に変換できる
  2. カンマでつなげばforの中だけで処理できる
  3. 演算子の優先順位とにらめっこ
  4. ifを3項演算子
  5. ビット演算子は短いので有用
  6. 59999≡-5537 (mod 1<<16) ※ ビット演算だと余りが必ず正になる

〜 この辺からJavaScript

  1. セミコロンは省略可能なことがある
  2. varをつけない代入文でグローバル変数が作れる(=短い)
  3. 色んな場所でグローバル変数が作れる
    例: a=[i=4]
  4. 型が異なるもの同士の演算は暗黙の型変換が行われる
    例: 文字列に数値100を足すと、'100'が足される
  5. 数値でないものを数値として扱うとゼロ(初期化や評価に使える)
    例: a='',++a → aは1
  6. Booleanは加減乗除やビット演算すれば数値化できる
    例: c+="ab"[0|a==b]
  7. ビット演算で浮動小数点を整数化できる
  8. 素数1以下の配列は数値として扱える(これは驚き...)
    例: a=[4],a+=1 → aは5

柳井さんありがとうございました。
JavaScript面白い!

memcachedでレアな不具合

memcachedを使っているサービスにて、ある日、データのキャッシュが更新されない現象に遭遇した。キーと値をダンプしてみたところ、タイムスタンプがおかしな値になっていた。
心当たりというと、そういえばサーバの日付がおかしくなっていた日があったような気がする。
memcachedは、利用する際にexpireを指定するのだけど、実装としては無効になるepoch値を保持するようになっている。なので未来の日付でキーが作成されてから時計が戻されると、ずっと無効にならないということのようだった。
更新されていくデータに対してキー名が変わらない、というのは、(発生頻度はともかくとして)こういう気づきにくいバグを生むのでよくない。
きっとベストプラクティス的なものがあるのだと思うが、安直に、キー名にタイムスタンプをつけて解決を図ることにした。すなわち yyyymmddhh_keyname みたいな感じである。これで仮に日付がぶっ飛んでも、おかしくなっていた間に生成されたキーを無視することができる。

ところでPHPにはMemcacheとMemcachedというライブラリがあって、Memcachedの方が新しいのだけど、手軽にキーの一覧を取る方法がなくてデバッグ時に困る。どうしろと...

Quick Fire Rapid 赤軸 届いた


赤軸2枚目。1枚目はCherry純正のG80-3600LYCで、好きなんだけど無駄に大きいのでテンキーレスがほしかった。
FILCOの赤軸テンキーレス(Majestouch Linear R Limited Edition、FKBN91MR)が、この配列いまいちだなあと思っていたら完売してしまい悲しい思いをしていたところ、Cooler Masterからほぼ同じのが出たので購入。スペックはFNキーがある以外はFILCOのとほぼ同じで、FKBN91MRの厨二病エディションといったところ。
CherryのMXスイッチの押し心地は

俗称 個人的感触
黒軸 リニア、重い
茶軸 リニアでない、軽い
赤軸 リニア、軽い

こんな感じなのだが赤軸が一番好み。PC-8001とかPC-9801のキーボードの感触に近いかも。カシャカシャしないけどメカニカルっぽい。へたった5576-002にも近いような気がする。
RealForceと比べると、RealForceはリニアでなくゴムっぽいような気がする。91UDK-Gというのを持っているんだけど45gなので少し重い。きっと30gだとちょうどよさそうなんだけどDRTCKB91UBKは買えないし。
押し心地が非常によいし場所も取らないので、しばらくこれ使う。赤軸最高!

社会人になってから始めるTopCoder

これはCompetitive Programming Advent Calendarの11日目の記事です。
Advent Calendarには入門記事が意外となさそうなのと、自分自身初心者なので、紹介記事を書きます。

きっかけ

今年の4月から競技プログラミングをはじめました。「人材獲得作戦」や「コーディングスキル判定」をやってみたらめちゃくちゃ時間がかかったりして漠然とどうにかしたいなと思っていたところ、Google Code Jam勉強会というのを取引先の人から教えてもらい参加しました。問題が面白いし、あまりにもコードが書けないのでTopCoderに登録してそれ以来はまっています。

TopCoderとは

競技プログラミングは文字通りプログラミング能力を競うものです。TopCoder競技プログラミング環境を提供する会員制サービスで、要は、コーディングの速さと正確さを競うオンラインゲームです。
競技プログラミングサイトはいくつかありますが、以下の理由でTopCoderがお勧めです。

  1. 競技時間が比較的短い
    年をとると集中力が続かないので短いほうが良いです。
  2. 頻繁に開催される
    参加できる日は多いほうが良いです。
  3. 順位づけされる
    個人練習より刺激になります。
  4. 履歴が充実している
    問題の解説や、他の人が書いたコードを読むことができます。
  5. 参加者が多い
    色々な方法で解いている人を見つけることができます。

はじめかた

ユーザ登録して、プラグインをインストールすれば誰でも参加できます。こちらの記事が大変参考になります。

参戦するまでの流れですが

  1. ブラウザにJava Runtime(JRE)をインストールする
  2. http://community.topcoder.com/tc でユーザ登録する (例えば pokutuna氏の解説記事)
  3. 上のメニューの「Algorithm Competitions」からARENAを開いてログインする
  4. プラグインをダウンロードして設定する (こちらを参照)
    必須ではないですがおそらくほとんどの人が入れています
    なおTZTesterについては更新版のほうがお勧め (例えば nitoyon氏のもの)
  5. メニュー「Practice Rooms」から「SRMs」をクリックすると、部屋の一覧が出てくるので、適当な番号のDiv2というやつを選ぶ
  6. まんなかへんの「Coding Phase」の「Select one」の250を選ぶ
  7. 解いてsubmitする
  8. 2〜3問解いてみて感触がつかめたら、本番参戦
  9. 撃沈したら「プログラミングコンテストチャレンジブック」(通称蟻本)を買って読む

こんな感じです。
ちなみに「はてな」には「TopCoder部」というグループがあり、TopCoderの日記はそちらに書いています。

FAQ1 難しそう

Div2のEasyの問題は易しく作られていますので、がんばれば解けるかと思います。そのほかはまあ難しいです。でも楽しいです。
私は適当にぐぐって、当たって砕けろ的なゆるい感じではじめました。事前の準備を真面目に考えると、学ぶことが多すぎて尻込みしてしまうと思います。

FAQ2 英語が読めません

競技プログラミング(主にTopCoder)に参加しない理由」を見ると英語だから敬遠している人も多いようです。私も英文を読むのが得意ではなく、最初の2〜3回は問題文を読むのに10分くらいかかっていました。
これは慣れるしかないのですが、おそらく10回くらい参加するとどういう意図の問題なのかはなんとなくつかめるようになってきます。20回くらい参加しましたが、最近は英文であること自体がボトルネックになることは減ってきました。題意が何かをつかめない問題もあるのですが、たぶん日本語になっていても同じだと思います。
日本語でないといやだという方には、AOJという素晴らしいサイトがあります。

FAQ3 時間帯が合いません

TopCoderが開催されるのは、(1)平日の10:00から(2)深夜の01:00から(3)土曜日、が多いようです。平日の10:00は社会人には難しいと思いますが、プログラマであれば、勉強したいのでと上司にかけあってみるのも手かと思います。もし裁量労働であれば1時間くらい都合をつけるのは可能ではないでしょうか。

FAQ4 競技プログラミングって役に立つの

業務でのコーディングに直結することはあまりないかもしれません。でも楽しいです。
トレードオフを意識してコードを書くという点では業務のコーディングに近い面もあります。
100行くらいのコードで色々な問題が解けるというのが競技プログラミングの素晴らしいところで、エラー処理や保守性というような観点で見るものではありません。1000行の仕様書を読んで10000行のテストコードを書かなければいけないとしたら萎えますし。

FAQ5 学生に勝てません

学生には勝てません。Twitterを眺めていると、最近の学生はよく勉強していて優秀だなあというのがよくわかります。学生の知識の1/100くらいでも吸収できればだいぶ実力がつきます。

FAQ6 レッドコーダーってどのくらいすごいの

TopCoderではレーティング(≒実力)により色分けされていて、赤が最上位です。目安としては、色が一段階違うと、同じ問題を解く速さが2倍くらい違います。色が二段階違うと、質的に難しい問題に取り組んでいます。
私はこの前ようやく青くなりました。まだまだですね。
参考: Petr伝説

プログラミングの楽しみ

もし競技プログラミングが合わない方でも、楽しむのが目的のプログラミングはたくさんあります。

色々チャレンジしてみると楽しいと思います!

CygwinかVMwareか

良い記事

そんな私はPutty + VMware Workstation派。

Cygwinだと困ること

ビルドできないものがあるのと、web開発だと、リリース環境との違いを意識するのが面倒。
ビルド速度については、coLinuxより速いケースもあるし、個人的にはCygwinを導入しない主因ではない。
それよりも色々気をつけないといけないという気がして、安心感がいまいち足りない。
なんだかんだでVMwareは楽。電車の中でもデバッグできるしスナップショットもある。

サスペンドすると接続切れる問題

これは重大。うろ覚えだが、Windows XP + VMware Workstation 5/6のときは、host onlyまたはNATにしていれば、ホストとゲストのSSH接続は切れなかったような記憶がある。
これがWindows 7だと、待機状態から復帰すると全ての接続が切れてしまいげんなりしていた(VMware Workstation 6と8で確認)。
が、試しにVMwareのNATの設定にあるゲストOSへのポートフォワーディングを設定して、そこ(127.0.0.1)へSSHを張ってみたところ、切れないことが判明。すごく快適になった。

PuTTYPoderosaではポートフォワーディングできない

誤解。
むしろ、PuTTYのほうが、ポートフォワーディング先がいくつかあるとき(例えば会社では直接つながるけど、自宅では会社経由でつなぐとか)に、GUIで手軽に選べると思う。
怠惰なのでクリックして選びたい。ユーザ名とかFQDNを入力したくない。

PuTTY 0.61

なんとPuTTYは四年ぶりにバージョンアップしていて、Windows 7のタスクリストに対応している。
これがあると(設定画面を経由せずに)セッションを直接選べる。


Windows Vistaまでは、スタートメニューと同列にフォルダを作成しておいて、セッションのショートカットを置けばよかった。(画像左側)
Windows 7からはこれができないようなのだが、タスクリストに入れると近い感じになった。(画像右側)
スタートメニューにPuttyを表示させておいて、右端の矢印をクリックすると、Recent Sessionsなどが選べる。矢印をクリックしないといけないのがやや面倒ではある。
Recent Sessionsだと順番がばらばらなので選びづらいが、右クリックして「いつも表示」を選べば順番が固定されるのでましになる。

PuTTYの鍵生成の問題

puttygen.exeの問題点は二つ。

  1. 1024bitを指定してもなぜか1023bitになる
  2. AESで暗号化された秘密鍵がインポートできない

なので、以下の手順で鍵を生成するとよい。

  1. Linux上)ssh-keygenにて、パスフレーズなしで秘密鍵を生成する
    コマンドは ssh-keygen -t rsa -b 1024 など
  2. puttygenでそれをインポートする(必要ならパスフレーズを設定する)
  3. Linux上で必要であれば)opensslでパスフレーズつきに変換する
    コマンドは openssl rsa -in in.key -out out.key など