メモりメモる

ハトいエンジニアのアメリカ生活と技術のメモ。

Scala Koansで穴埋め問題を解いてScalaの入門してみる

最近、私の周囲のscala人口が高くなってきたので、
「valとvarを覚えておけば、あとはノリと勘でなんとかなる!」というメンタルを改めようと思い至りました。

scalaのkoansを一通りやってみました。

f:id:hatyone:20130422054848p:plain


1. koansのダウンロード
Learn Scala with the Koans | Scala Koansの右のリンクから、Scala Koansをダウンロード。

2. koansを適当な場所で解凍
sbtが必要になるので、無い場合は「brew install sbt」してsbtをインストールしておきます。

3. scala koansの起動
Scala Koansを解凍したディレクトリに移動し、sbtを起動します。
初回だけテストをコンパイルして、"~test-only org.functionalkoans.forscala.Koans"でkoansのテストを走らせます。

$ sbt
[info] Loading project definition from /Users/hatone/SandBox/scalakoans/project
[info] Set current project to Scala Koans (in build file:/Users/hatone/SandBox/scalakoans/)
>
> test:compile
> ~test-only org.functionalkoans.forscala.Koans
[info] Koans:
[info] AboutAsserts:
(以下略)


4.教えに導かれながら、もくもくコードを書く
src/test/scala/org/functionalkoans/forscalaにあるscalaのコードを、ひたすら穴埋めしてテストを通していきます。
koansを起動するとコンソールで「Please meditate on koan "(問題名)" of suite "(クラス名)"」の形で、これをやりましょうと指示されます。
f:id:hatyone:20130422061049p:plain


koans.htmlにお品書きが書かれているので、それを見て気になる所だけやっても良いかもしれません。
f:id:hatyone:20130422061713p:plain


scalaのコードを編集して保存すると自動でテストが走り、結果を確認できます。
f:id:hatyone:20130422061109p:plain


そんな感じで、scala koansをもくもくと出来ます。
実際にちょっと何か作ってみようと思っていて、ノンブロッキングI/Oのechoサーバー書いたり手を動かして遊んでみます。

新人だった1年間とアメリカにいる今と、新卒配属に思うこと。

この記事をみて「ああ、もうそんな時期か」と感じ、
配属に悩んでいる人達もいるのかなぁと、ちょっとブログを書いてみました。

f:id:hatyone:20130327004256j:plain
新卒として入社し、気がつくと1年が経過していました。
2年目を、アメリカで迎えられることが出来たのはとても感慨深いことです。
ソーシャルゲームやコミュニティサービスからは程遠いのですが、海外市場向けの広告システムを作っています。


卵から孵ったアヒルが最初に見た存在を親だと思うように、
配属後に出会った先輩によって、エンジニアとしての性格が大幅に影響されるのではないか?
一年経って、振り返るとそんな風に私は思います。


  • 私の配属先の話

CyberAgentAmericaへの配属後、
AMoAdというアドテクノロジーの会社での海外事業に関わりました。

 初めてペアプロした先輩はとてもストイックな神系の技術者でした。
この先輩から、"テスト駆動開発の技法"、"まともに共同開発するためのgitの一歩進んだ使い方"、"まともな会話をするために必要なデザインパターン"、これぞエンジニアの教養!とばかりに様々なこと学ばせていただきました。OSSのことを常に追いかけ、時にはプロジェクトへコミットし、洋書和書問わずにイチオシの技術書籍を教えてくれる超クールな先輩です。
最近は、先輩が中心となってAMoAd社内で行われる社員オンリーの型システムの勉強会が気になって仕方ありません。


 また、その後現れた先輩は、正直理解出来ないスピードとクオリティでコードを書いてしまう先輩でした。私の座席は、この先輩と神系の先輩との間となり、毎日が強化合宿のような日々でした。

 USで凹んだ時真っ先にご飯へ連れだしてくれたり、エレベータに閉じ込められると駆けつけてくれる先輩がいたり。普段は辛口な先輩が飲み会の帰り際に「あんた、辛い時は甘えていいんだからねっ!!」と力強く励ましてくれたり。「ヘ(゚∀゚ヘ)」「( ꒪⌓꒪) ノ」で会話が成立できる先輩がいたり。とても気さくなrailsのことを教えてくれる先輩がいたり。朝も晩も社内にいて帰宅が疑わしい先輩がいたり。正直私より海外勤務に向いてるような海外の四年制の大学を出てる先輩や物凄いストイックな帰国子女の先輩がいたり。

「どうして、こんな技術者たちが集まってしまったのでしょうか」
「うん。正直、このチームは奇跡だと思う」

月例面談で、マネージャーとそんなやりとりをしました。
多くの先輩達から多くのことを学び、このチームで仕事が出来る今を大切にしたいと考えるようになりました。


  • 渡米するちょっと前の話

 個人的な感覚ですが、渡米の1ヶ月前あたりからコードレビューの難易度が上がりました。開発の難易度があがり、指摘される項目が増え、所々ペアプロをしてもらいながらこなしていきました。
「むこうに行っても、しっかりコミット出来るようになってほしいから」とエレベーターで、ぼそっと言われたことを覚えています。

 渡米する際には、エンジニアだけじゃなくセールスの方までという会社規模の壮行会を開いていただき、「amazonのウイッシュリストに入れてあったので」と前から欲しかったClean Coderをいただきました。もちろん、神の推薦図書です。

Clean Coder プロフェッショナルプログラマへの道

Clean Coder プロフェッショナルプログラマへの道


そして、いただいたこの書籍、
なんとそこには沢山のメッセージが書かれていたのした。

f:id:hatyone:20130409141344p:plain
(※熱烈なメッセージが書籍の様々なところ、さらには本文上にまで書き連ねられ、温かい沢山の言葉にうるっとしてしまい、なかなか読み進められません)


  • 今、アメリカで想うこと

f:id:hatyone:20130409141011p:plain
 残念なことですが今、この社内には新卒エンジニアが海外で働くパスはなかなかありません。こちらでエンジニアが開発しているプロダクトは皆さんがイメージするほど多くはないためです。

 だからこそ私は、この土地で人を繋げ、コードを書いて、今目の前にあるプロジェクトでの技術的成果を出し、そこから未来の希望を創りだしていきたいと思っています。

 ここにいる意味を常に考え、エンジニアがUS配属される可能性を絶やさないために、次の可能性を作るために、海外プロジェクトと向き合っています。AMoAdのメンバーの一員としてもっとより大きな仕事をして、ここで成果を出していきたいなって考えています。


  • 新卒配属に思うこと

f:id:hatyone:20130325045830j:plain

エンジニアとして配属に迷っている方に出来るアドバイスといえば、

トラフィック多い、シビアなところ」

私としては、この一言に尽きます。

気合いや単なる労働だけで解決できない問題に出会えるのは素晴らしいことです。
シビアさを求められるのはとても大変なことですが、"やりがい"なんて言葉では済ませない難攻不落な世界へチャレンジ出来る楽しさがあります。


Pressure makes diamonds.

という言葉があります。

これは文字通り、良いプレッシャーがダイアモンドを生み出すということを意味しています。
宝石としてのダイアモンドは様々な人に身につけられ役立ってるし、工業用ダイアモンドはありとあらゆる作業場で重宝されています。
自分自身に良いプレッシャーをかけられる場所を掘り当てて、磨くことが出来たらいいなと思います。


 技術的な難易度、海外市場、そんなプレッシャーの中で、AMoAdという技術者集団の中で、エンジニアの未来を作り出せたら素敵だなと私は思っています。

そんなこんなで、私の想いの放出はおしまいにしようと思います。

AMoAd.inc -The Leading Ad Platform for Smart Device-

情報科学若手の会・冬の陣 #wakate2013w でバナー広告(アドテク)の話をしてきた!

情報科学若手の会に参加して、幹事として初イベント。
情報科学若手の会・冬の陣(#wakate2013w)を運営してきました。

f:id:hatyone:20130127213421p:plain


情報科学若手の会・冬の陣
今回のイベントは、人と人の繋がりが活発になるようなクローズドなセッションを目指し、敢えてUstはされていません。
id:yumu19さんが、本陣のときにロケットの話を熱く語り合ったことを覚えていてくれたのがとても嬉しくて、「ああ、夏に参加して本当に良かった!」と思えるエピソードでした。


私は、「アドテクノロジーの世界 -嫌われがちなアレの話-」というタイトルで、ウザがられるバナー広告の裏で展開される広告技術の進化についてお話させてもらいました。

社外のアドをやっているエンジニアとの出会いがとても少ないので、多くの方に興味を持っていただけて嬉しかったです。
「参考本などありませんか?」という声をかけていただいたのですが、全体的なアドテクノロジーの歴史について触れられた本は未だ読んだことがありません。
まだまだ勉強中の身なので、むしろ是非教えて下さい!という心境です。

最後のほうで触れた株取引っぽい広告技術の話は、「DSP/RTBオーディエンスターゲティング入門 ビッグデータ時代に実現する「枠」から「人」への広告革命」という本が良いです。
DSP/RTBの考え方からアドテク業界動向まで広めに触れられていて、アドテクを知らない人が読んでも情報量があると思います。

DSP/RTBオーディエンスターゲティング入門 ビッグデータ時代に実現する「枠」から「人」への広告革命 (Next Publishing)

DSP/RTBオーディエンスターゲティング入門 ビッグデータ時代に実現する「枠」から「人」への広告革命 (Next Publishing)


懇親会&二次会の話
懇親会も、ディスプレイが準備されたお洒落レストランでLT祭りが勃発していました。
お互いのことを知らない参加者さんが知り合い同士になれるように…と、人や話題をパスして歩く自分に対して、お見合いのおばちゃんか何かではないか?とツッコミをしつつ。
皆さん楽しそうだったのと、若手の会独特の雰囲気がとても居心地良かったです。


帰り道の話
id:kyoro353の講演が、とても面白くて盛り上がったのですが、"何故面白いのか?"という話を帰り道にしました。
現実は小説より奇なりという言葉があるように、
本人の思考・思想・体験談を自らが語ることは、それだけでカッコイイことで、大切なことなんだろうね、という話になりました。


チラシの裏のような話
数年前の未踏の成果報告会以来、id:kumagiに会うと「肥えてきましたね(・∀・)」的なツッコミを毎度頂いてしまっていたので、開催中に一切指摘を受けなかったのが、とても大成功ではないかと私としては思っています。

新米エンジニアの見た世界。2012年の私の気持ちのまとめ。

ジェットコースターで気絶するレベルの私が、ラスベガスの砂漠の25000フィート上空からスカイダイビングしたあたりから2012年は始まってました。
f:id:hatyone:20120306165722j:plain


  • 社会人になる前の話。

修士1年に在学している途中で、何処にシリコンバレーが在るのかも理解せずにノリと勢いで渡米し、fluxflexでインターンをさせてもらってや色々な開発に参加させてもらって、帰国したのが3月。
帰国翌日から連続で面接を設定してもらい、サイバーエージェントへの入社が決まったのは帰国3日後の出来事でした。
去年の12月頃から相談したり履歴書を出したり少しずつ活動していたのですが、突然の就職っぽく見えたかもしれません。


北海道に戻る前に、未踏カンファレンスで登壇しました。


  • 研修の話

少しだけ北海道に戻って大学に休学届を提出し、4月から新社会人をスタートさせました。
入社後は7月に入るまで入社研修が中心で、新人研修の記事が結構なアクセス数を記録しました。
研修の中で最も嬉しかったのは、広告プランコンペで、CoovaAPを使った無線LAN広告の提案して優勝出来ました。
f:id:hatyone:20121231220747p:plain
社内ではモックプランのコンテストがあったりするのですが、より手を動かせるデモのかっこよさ&技術カッコイイ!みたいなので一発仕掛けられた感があって少し自信になりました。


  • 私生活の話

様々なことが初めて!という状況で、アプリ作ったり作曲活動を少しだけしました。

vibeeというアプリを、クックパッドの開発コンテスト24向けに24時間で開発&PV撮影しました。

vibee 言葉のいらないパジャマタイムコミュニケーションツール


deploygateのBGMを作成させてもらった時には、"それっぽさ"をいつも以上に追求することになって技量を強制的に底上げすることになりました。

DeployGate

情報科学若手の会に参加して、幹事を一緒にやらせていただくことになりました。
f:id:hatyone:20120915141947j:plain

あとは、ちょこちょことブログを更新するようにしていました。



  • 渡米の話

cyberagentamerica.incに配属が決まったのが6月末で、H1-Bのアプライをその前からしていました。
実際の面接は、10月頃にありました。

そして、壮行会。
f:id:hatyone:20121118105752j:plain
多くの人の暖かい声援とLTとプレゼントで、送り出していただくイベントがありました。

いつでも温かい声を(主にtwitterで)かけてくれる@ukayareさん。
websigに誘って下さった@akitectさん。
いつも人生の転換期にばったり会って縁を何か感じる@fuuriさん。
カッコイイ女性の象徴的キャラクターである@miroc007さん。
会社の先輩で日米でお世話になってる@satullyさん。

会場にきてくださった40人くらいの皆さま、本当にありがとうございました!!!


f:id:hatyone:20121231215042j:plain
↑会社の先輩でもある@satullyさんの作成した画像。


その後、経営方針によるこんな事情があり、現状の会社でのアメリカで働くパスが完全に消え去ってしまうという事態がありました。
話を聞いた瞬間は、本当に色々悩みました。
悩んで悩んで、テンダーロインのど真ん中でホームレスに愚痴を聞いてもらったり、skypeで相談したりして、自分の取り得る選択肢を列挙していきました。

f:id:hatyone:20121231231508j:plain

荷物を整理して渡米し、アメリカで手に入れた荷物をほぼ全て捨てて帰国。
日本に戻った頃には、自分の身近な持ち物が一週間分の服とPCくらいになってしまっていました。
会社という組織に対して、沢山の夢を抱いて絶望を学びました。
このことは、今のところ今後の人生に影響を与えそうなイベントのひとつです。

その後、会社の上司と相談して、2月・3月周辺でまた向こうで働けるように挑戦中です。
1月からはcyberagentamerica.incから、別の会社に出向になります。


  • 色々感じている話

「別に日本でコードを書くのも、アメリカでコードを書くのも、大して変わらない」と考えてました。
実際、fluxflexでインターンをしていた時は不自由を感じることはほぼなかったのですが、会社に入って日米でチームが別れて開発するということは想像以上に大変なんだということを学びました。


スタートアップ規模では上手く出来ていたコミュニケーション手段も、会社規模になってしまうとやりづらくなってしまうことに勿体なさをよく感じました。
でも、新人だから……と思うと発言するのを気後れしてしまっていました。
帰国後は、こまめに議事録共有したり朝会の様子をskype中継してみたり、少しずつトライするようにチャレンジしてます。
日米で共同開発が出来ることを私は経験したつもりだからこそ、まだ諦めたくないところです。


「別に日本でコードを書くのも、アメリカでコードを書くのも、大して変わらない」
この考えは裏を返すと、日本人がコードを書くのもアメリカ人がコードを書くのも、むしろ自分がコードを書いても大して変えられないという事実であり、
"自分はもっと必要とされる働き方があったのではないか?"と改めて考えるきっかけとなりました。

このことに対する答えは自分の中では出ているのだけれど、気持ちの整理も必要で、言葉にするには少し時間が必要そうです。

f:id:hatyone:20121231232056j:plain

また、私が"かっこいい"と感じる人々は、社外でのアウトプットのインパクトも結構ある人だと改めて気がつきました。
むしろ、そういう人たちは会社で何をしているのか謎な人々で、でも私の知っている世の中では"あのプロダクトの人"と共通認識されていたりします。


エンジニアとして取り得るアウトプットの仕方は、今2種類考えられていて、

・会社と別に、プライベートで開発して成果を出している
・会社に満足して、アウトプットする力をほぼ全て社内へ向けてる

このどちらかと感じてます。


今の会社では後者になりがちに思えるのだけど、自分の思い描くエンジニアの幸せ像は前者です。
仕事で得た技術をプロダクトとしてお金に変えるだけじゃなく、知識という形で世の中にアウトプットしていきたいと考えていて、そういう環境になるよう会社にコミットしていきたいです。
変化の多い会社だからこそ、変えていくことを諦めたくないです。


2012年ももうすぐ終わり。
今年も沢山の素敵な人々に出会いました。
今年お世話になった色々な人に、"ありがとうございます"を伝えたいです。
来年は本に描かれている世界や言葉はその著者の数カ月前の出来事だからこそ、人と技術ともっと直に向き合っていきたいです。

rubyでgoogle Custom Search API入門。複数キーワードのマッチング。

f:id:hatyone:20121021223632p:plain


下記のクラシックの3曲のうち、ショパンに最も関連ある曲は何でしょう?

・Fantaisieantaisie Impromptu(幻想即興曲)
・Quasi una Fantasia(月光)
・Klaviersonate Nr.11 A‐dur(トルコ行進曲)



少し音楽がわかる方なら一発で答えられるかもしれませんが、これが3曲じゃなく3000曲とかだったらどうしましょう。
ショパンの次はモーツァルトベートーヴェンと、いくつか問題がある場合はどうしましょうか。

なるべく自動でやってみたいと思い、googleの検索エンジンを利用してみました。
「対象名 候補名」のセットで検索をしてヒット件数をみるという、お手軽な方法です。

普通に"foo bar"と検索しても良いのですが、英語の場合は"foo is similar to bar"といった要領で検索してみたら、とても良い感じの結果を得られました。



■幻想即興曲の場合。
検索キーワード: "Chopin is similar to Fantaisieantaisie Impromptu"
ヒット件数: 4,450,000件
f:id:hatyone:20121021224206p:plain


■月光の場合。
検索キーワード: "Chopin is similar to Quasi una Fantasia"
ヒット件数: 36,600件
f:id:hatyone:20121021224213p:plain


トルコ行進曲の場合。
検索キーワード: "Chopin is similar to Klaviersonate Nr.11 A‐dur"
ヒット件数: 132,000件
f:id:hatyone:20121021224218p:plain

そんなこんなで、ショパンはこの3曲の中だと幻想即興曲との関連が最も強いということがわかります。


  • Custom Search APIを使ってみる。

APIs Console - Google CodeからAPIキーを取得します。
"Services"メニューから、"Custom Search API"の項目をONにします。
f:id:hatyone:20121021233259p:plain

"API Access"メニューの"Simple API Access"に、APIキーが書かれてあります。


  • サンプルソース

対象名(category1.ym)と候補名(category2.yml)のyamlファイルを用意します。

require "rubygems"
require "net/http"
require "uri"
require "json"
require "pp"
require 'yaml'
require 'cgi'

GOOGLE_KEY = "API KEY"
categories1 = YAML.load_file("category1.yml")
categories2 = YAML.load_file("category2.yml")

api_path = "http://ajax.googleapis.com/ajax/services/search/web"
api = URI.parse(api_path)
headers = {'Referer' => 'http://hoge.fuga.net/'}

categories1.each do |category1|
   max_count = 0
   category = ""

   categories2.each do |category2|
        data = "?v=1.0&key=#{GOOGLE_KEY}&q="+ CGI.escape(category1.to_s+" is similar to "+category2.to_s)
        apicall = Net::HTTP.new(api.host)
        response = apicall.get2(api.path + data, headers)
        
        data = JSON.parse(response.body)
        if data['responseStatus'] == 403
          exit
        end

        count = data['responseData']['cursor']['estimatedResultCount']
        count = count.to_i
        if max_count < count 
            max_count = count
            category = category2.to_s
        end
   end
   
   pp category1 + " is " + category

end

アレとコレが一致するか? — Gist


  • 注意したいこと

100 requests/dayなので、案外すぐに制限がきてしまいます。
データ量が多い場合は、 割とすぐに403が返ってくるので、根気よく、時間をかけてゆっくりスクリプトをまわすと良いと思います。
対象名300・候補名20くらいのデータだと、3日くらいかかりました。

2泊3日の超濃密高エネルギー温泉合宿。情報科学若手の会(#wakate2012)へ行ってきた。

f:id:hatyone:20120915141947j:plain
情報科学若手の会とは、学生・若手研究者・社会人と情報科学に携わる人々が職種を超えてディスカッションと交流するイベントです。
伊東温泉の旅館で2泊3日の合宿形式で行われました。

とても雰囲気の良い温泉旅館で、プロフェッショナル・コネクターの勝屋 久さん、さくらインターネット社長の田中 邦裕さんの招待講演や、未踏最年少採択者の矢倉さん、topcoderのレッドコーダーとしても有名な秋葉さんの特別講演など、様々なお話を聞くことができました。


ご飯をみんなで食べる時や夜セッションの時には、本当に沢山の人と馬鹿話から技術話まですることが出来て本当に楽しかったです。

f:id:hatyone:20120915185621j:plain
時折、"ガチ勢”という単語をちらほらと耳にするのですが、それだけ研究や技術に情熱をかけてる人が今身近にいるのか!と思うとテンションが高まります。

参加者の層は、言では言い表せなくて、学生だったり、社会人だったり、社会人ドクターだったり、おおむね島根高専生だったり、topcoderのレッドコーダーだったり、特殊な高校生だったり、ロックフリーだったり、女帝だったり、そんな感じでした。

あと意外で嬉しかったのが、山口正栄記念奨学財団の奨学生時代に一緒だった方との再会でした。


  • ナマの知識・技術がいっぱい

会場のネットワークがあまり安定せずブラウジングなどし難い状態もあったのですが、逆に"この環境をどう乗り切ろうかー"みたいな気分で楽しんでました。
f:id:hatyone:20120917234027p:plain
色々な方に聞きながら、野良IRCサーバを立ててみました。
ネットワークにつながらずgoogleで検索できなくても、そこら辺の誰かに聞けば教えてくれるような人々が集まっていたというのが若手の会の素敵な点です。


  • 色々思ったこと

どんなに敗北しても勝つまで研究してるし、勝っても研究し続けてる姿。かっこいいの一言では表せない物凄さを感じました。
様々な方と出会って話して良かったなぁで終わるのもいいけれど、悔しいなーって感じられるほどの才能と能力に出会ってしまった刺激は大切にしていきたいです。
人数がとても多いのに、ほとんど進行がつまらず、凄いなと思いました。
幹事の皆さま、本当にありがとうございました。

  • 次回予告

次回より、幹事として参加させていただくことになりました。
このような空気感を本当に大切にして、人生のターニングポイントの演出をしていけたら素敵だなって思ってます。


  • 余談

旅館の近くにある、日本一短い横断歩道らしいです。
f:id:hatyone:20120917121714j:plain