新米エンジニアの見た世界。2012年の私の気持ちのまとめ。
ジェットコースターで気絶するレベルの私が、ラスベガスの砂漠の25000フィート上空からスカイダイビングしたあたりから2012年は始まってました。
- 社会人になる前の話。
修士1年に在学している途中で、何処にシリコンバレーが在るのかも理解せずにノリと勢いで渡米し、fluxflexでインターンをさせてもらってや色々な開発に参加させてもらって、帰国したのが3月。
帰国翌日から連続で面接を設定してもらい、サイバーエージェントへの入社が決まったのは帰国3日後の出来事でした。
去年の12月頃から相談したり履歴書を出したり少しずつ活動していたのですが、突然の就職っぽく見えたかもしれません。
北海道に戻る前に、未踏カンファレンスで登壇しました。
- 研修の話
少しだけ北海道に戻って大学に休学届を提出し、4月から新社会人をスタートさせました。
入社後は7月に入るまで入社研修が中心で、新人研修の記事が結構なアクセス数を記録しました。
研修の中で最も嬉しかったのは、広告プランコンペで、CoovaAPを使った無線LAN広告の提案して優勝出来ました。
社内ではモックプランのコンテストがあったりするのですが、より手を動かせるデモのかっこよさ&技術カッコイイ!みたいなので一発仕掛けられた感があって少し自信になりました。
- 私生活の話
様々なことが初めて!という状況で、アプリ作ったり作曲活動を少しだけしました。
vibeeというアプリを、クックパッドの開発コンテスト24向けに24時間で開発&PV撮影しました。
vibee 言葉のいらないパジャマタイムコミュニケーションツール
deploygateのBGMを作成させてもらった時には、"それっぽさ"をいつも以上に追求することになって技量を強制的に底上げすることになりました。
DeployGate
情報科学若手の会に参加して、幹事を一緒にやらせていただくことになりました。
あとは、ちょこちょことブログを更新するようにしていました。
- 渡米の話
cyberagentamerica.incに配属が決まったのが6月末で、H1-Bのアプライをその前からしていました。
実際の面接は、10月頃にありました。
そして、壮行会。
多くの人の暖かい声援とLTとプレゼントで、送り出していただくイベントがありました。
いつでも温かい声を(主にtwitterで)かけてくれる@ukayareさん。
websigに誘って下さった@akitectさん。
いつも人生の転換期にばったり会って縁を何か感じる@fuuriさん。
カッコイイ女性の象徴的キャラクターである@miroc007さん。
会社の先輩で日米でお世話になってる@satullyさん。
会場にきてくださった40人くらいの皆さま、本当にありがとうございました!!!
↑会社の先輩でもある@satullyさんの作成した画像。
その後、経営方針によるこんな事情があり、現状の会社でのアメリカで働くパスが完全に消え去ってしまうという事態がありました。
話を聞いた瞬間は、本当に色々悩みました。
悩んで悩んで、テンダーロインのど真ん中でホームレスに愚痴を聞いてもらったり、skypeで相談したりして、自分の取り得る選択肢を列挙していきました。
荷物を整理して渡米し、アメリカで手に入れた荷物をほぼ全て捨てて帰国。
日本に戻った頃には、自分の身近な持ち物が一週間分の服とPCくらいになってしまっていました。
会社という組織に対して、沢山の夢を抱いて絶望を学びました。
このことは、今のところ今後の人生に影響を与えそうなイベントのひとつです。
その後、会社の上司と相談して、2月・3月周辺でまた向こうで働けるように挑戦中です。
1月からはcyberagentamerica.incから、別の会社に出向になります。
- 色々感じている話
「別に日本でコードを書くのも、アメリカでコードを書くのも、大して変わらない」と考えてました。
実際、fluxflexでインターンをしていた時は不自由を感じることはほぼなかったのですが、会社に入って日米でチームが別れて開発するということは想像以上に大変なんだということを学びました。
スタートアップ規模では上手く出来ていたコミュニケーション手段も、会社規模になってしまうとやりづらくなってしまうことに勿体なさをよく感じました。
でも、新人だから……と思うと発言するのを気後れしてしまっていました。
帰国後は、こまめに議事録共有したり朝会の様子をskype中継してみたり、少しずつトライするようにチャレンジしてます。
日米で共同開発が出来ることを私は経験したつもりだからこそ、まだ諦めたくないところです。
「別に日本でコードを書くのも、アメリカでコードを書くのも、大して変わらない」
この考えは裏を返すと、日本人がコードを書くのもアメリカ人がコードを書くのも、むしろ自分がコードを書いても大して変えられないという事実であり、
"自分はもっと必要とされる働き方があったのではないか?"と改めて考えるきっかけとなりました。
このことに対する答えは自分の中では出ているのだけれど、気持ちの整理も必要で、言葉にするには少し時間が必要そうです。
また、私が"かっこいい"と感じる人々は、社外でのアウトプットのインパクトも結構ある人だと改めて気がつきました。
むしろ、そういう人たちは会社で何をしているのか謎な人々で、でも私の知っている世の中では"あのプロダクトの人"と共通認識されていたりします。
エンジニアとして取り得るアウトプットの仕方は、今2種類考えられていて、
・会社と別に、プライベートで開発して成果を出している
・会社に満足して、アウトプットする力をほぼ全て社内へ向けてる
このどちらかと感じてます。
今の会社では後者になりがちに思えるのだけど、自分の思い描くエンジニアの幸せ像は前者です。
仕事で得た技術をプロダクトとしてお金に変えるだけじゃなく、知識という形で世の中にアウトプットしていきたいと考えていて、そういう環境になるよう会社にコミットしていきたいです。
変化の多い会社だからこそ、変えていくことを諦めたくないです。
2012年ももうすぐ終わり。
今年も沢山の素敵な人々に出会いました。
今年お世話になった色々な人に、"ありがとうございます"を伝えたいです。
来年は本に描かれている世界や言葉はその著者の数カ月前の出来事だからこそ、人と技術ともっと直に向き合っていきたいです。
rubyでgoogle Custom Search API入門。複数キーワードのマッチング。
下記のクラシックの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件
■月光の場合。
検索キーワード: "Chopin is similar to Quasi una Fantasia"
ヒット件数: 36,600件
■トルコ行進曲の場合。
検索キーワード: "Chopin is similar to Klaviersonate Nr.11 A‐dur"
ヒット件数: 132,000件
そんなこんなで、ショパンはこの3曲の中だと幻想即興曲との関連が最も強いということがわかります。
- Custom Search APIを使ってみる。
APIs Console - Google CodeからAPIキーを取得します。
"Services"メニューから、"Custom Search API"の項目をONにします。
"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
- 注意したいこと
100 requests/dayなので、案外すぐに制限がきてしまいます。
データ量が多い場合は、 割とすぐに403が返ってくるので、根気よく、時間をかけてゆっくりスクリプトをまわすと良いと思います。
対象名300・候補名20くらいのデータだと、3日くらいかかりました。
金魚が舞う艶やかな世界観。アートアクアリウム展のナイトアクアリウムへ行ってきました。
艶やかな世界観が展開されていました。
写真の一部を公開してみます。
2泊3日の超濃密高エネルギー温泉合宿。情報科学若手の会(#wakate2012)へ行ってきた。
情報科学若手の会とは、学生・若手研究者・社会人と情報科学に携わる人々が職種を超えてディスカッションと交流するイベントです。
伊東温泉の旅館で2泊3日の合宿形式で行われました。
とても雰囲気の良い温泉旅館で、プロフェッショナル・コネクターの勝屋 久さん、さくらインターネット社長の田中 邦裕さんの招待講演や、未踏最年少採択者の矢倉さん、topcoderのレッドコーダーとしても有名な秋葉さんの特別講演など、様々なお話を聞くことができました。
ご飯をみんなで食べる時や夜セッションの時には、本当に沢山の人と馬鹿話から技術話まですることが出来て本当に楽しかったです。
時折、"ガチ勢”という単語をちらほらと耳にするのですが、それだけ研究や技術に情熱をかけてる人が今身近にいるのか!と思うとテンションが高まります。
参加者の層は、言では言い表せなくて、学生だったり、社会人だったり、社会人ドクターだったり、おおむね島根高専生だったり、topcoderのレッドコーダーだったり、特殊な高校生だったり、ロックフリーだったり、女帝だったり、そんな感じでした。
あと意外で嬉しかったのが、山口正栄記念奨学財団の奨学生時代に一緒だった方との再会でした。
- ナマの知識・技術がいっぱい
会場のネットワークがあまり安定せずブラウジングなどし難い状態もあったのですが、逆に"この環境をどう乗り切ろうかー"みたいな気分で楽しんでました。
色々な方に聞きながら、野良IRCサーバを立ててみました。
ネットワークにつながらずgoogleで検索できなくても、そこら辺の誰かに聞けば教えてくれるような人々が集まっていたというのが若手の会の素敵な点です。
- 色々思ったこと
どんなに敗北しても勝つまで研究してるし、勝っても研究し続けてる姿。かっこいいの一言では表せない物凄さを感じました。
様々な方と出会って話して良かったなぁで終わるのもいいけれど、悔しいなーって感じられるほどの才能と能力に出会ってしまった刺激は大切にしていきたいです。
人数がとても多いのに、ほとんど進行がつまらず、凄いなと思いました。
幹事の皆さま、本当にありがとうございました。
- 次回予告
次回より、幹事として参加させていただくことになりました。
このような空気感を本当に大切にして、人生のターニングポイントの演出をしていけたら素敵だなって思ってます。
- 余談
旅館の近くにある、日本一短い横断歩道らしいです。
音のデザイン。10年続けてそれっぽくなったかもと感じた作曲の話。
久しぶりに色々と漁っていたら、2003年頃の自分の音楽を発掘し、色々な気分になりました。
2000年、中学へ入り、国際交流の企画で中国へピアノ演奏しに行くのをきっかけに、親から1台のPCを買ってもらいました。
Yahoo!のジオシティーズでhtmlをモゴモゴと書いて、自分のホームページを作ってみたり、BBSのperlをいじるようになって、自宅サーバーをやってみたり。
そんな傍らで、PCで作曲(DTM)をずっと続けていました。
特に、舞台・動画・ゲームを引き立てるBGM作りを続けてきました。
一番はじめに作った頃は「cherry」というフリーソフトでMIDIを打ち込んでいました。
高価な外部音源など持っておらず、はじめはPCにデフォルトで入っていたGM音源でした。
- 欠点を生かした音楽の方向性
かなり初期の頃。
割と出来が良い!と自分で確信していた音楽を人に聴かせた際に、「なんだか眠くなる」と言われてショックを受けたことがあります。
ピアノを演奏する時は物凄く身体が動いたり音で主張する性格なので、「メロディで主張するのが得意じゃないかも…」と自分でも考えるようになって、多少凹みました。
その後、「それなら、主張する必要がない分野(=BGM)での音作りをすればいいじゃん」と開き直って、現在に至ります。
ゲームをプレイするときはシーン別(例、戦闘シーン・フィールド移動シーン・アレなシーンなど)、テレビドラマを見る時もシーン別に使用されている楽器・音階をひたすらメモってました。
そして頭の中で、「現在の状況にBGMをつけてみた場合は?」みたいな想像をしていました。
結果として、「主人公が、衝撃事実が発覚して凹み、その後立ち直っていく途中な感じ」とか「回想している感じ」のそれっぽい音を即興で作れるようになりました。
- とにかく色々作ってみる。色々、考えて作ってみてる。
雰囲気を引き立てる音作り。
BGM特化を目指して、結果として色々な音楽が生まれました。
高校に入ると、同人ゲーム・ラジオドラマに音楽を提供したり、放送局のコンテスト作品に音をつけたり、コミケに数曲ずつ参加させていただいたり。
大学に入ると、劇団で音楽を作らせてもらったり、自分の音楽中心でラジオドラマCD出したり。
最後には、上の写真のホールで行われた舞台の音楽を全曲担当させてもらって、作曲者として活動させていただくことも出来ました。
社会人になってからは、コンペのPVで音も使ったり、プロダクトの効果音を作ったりしました。
- 音の持つ空気感のデザイン
・ドラマティックな気分のときは黒鍵の和音。
・平素な音は、白鍵の単音。
・ダウンロードするようなものであれば音が下がって、その逆にアップロード・送信であれば音が上がる。
そんな感じのマイルールが沢山もごもごと蓄積されてきました。
"雰囲気"の音には、様々なルールがあると私は思ってます。
昔の曲↓
天地遊々 by hatone(Takako Ohshima) on SoundCloud - Create, record and share your sounds for free
何もかもが我流すぎるけど、振り返ってみると、音がそれっぽい雰囲気になってきた気がします。
昔の曲聴いて「ギャー黒歴史ー!!!」と隠したくなる気持ちよりも、「あー、頑張ってたね」と思えます。
厨二病もこじらせきってしまえば作品と言い切れちゃうかなって思います。
そろそろDTMや楽典をちょっとだけ勉強してみようと思い、本を買いました。
ニコニコ動画でVOCALOIDの歌を公開してみるとかそういうのやってみたいなーと考えることもあるのですが、身のまわりのプロダクトや世界観を引き立てる音をこれからも作っていければいいなと思いました。
ふと気づいたら、10年かーと思ったのですが、
情熱を情熱だと気づかないくらいが、結果として長く頑張り続けるのにはちょうど良いのかも、と思いました。
次の十年後も恥ずかしくないようなモノづくりがしていきたいです。
iOSアプリ開発ではじめるOpenCV再入門
iPhoneアプリでOpenCVを動かそう!としたら、色々と苦戦したり茨の道だったので、そのレポートを書きます。
※Xcode4.3,SDK5.1で開発しました。
- 参考にしたサイト
「OpenCV iPhone」で検索すると、真っ先にヒットするページです。
yoshimasa niwa - iPhoneでOpenCVを使う方法
こちらを参考にさせていただきました。
上記サイトで配布されているビルド済みライブラリをインポートしてそのまま使おうとすると、最新SDKとバージョンが違うので動きませんでした。
- ライブラリをビルドする準備
1.サンプルコードをダウンロード
上記のページのコメント欄に、stephanepechard/iphone_opencv_test · GitHubというリポジトリがあるので、こちらを使ってみます。
% git clone git://github.com/stephanepechard/iphone_opencv_test.git % cd iphone_opencv_test % wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.2/OpenCV-2.2.0.tar.bz2/download % tar xjvf download
2. cmakeをインストール
cmakeでビルドをするので、ない場合はインストールしましょう。
% brew install cmake
3.OpenCVをiOS SDKでビルド出来るように、パッチを当てます
% cd OpenCV-2.2.0 % patch -p1 < ../OpenCV-2.2.0.patch
4.opencv_cmake.shを書き換える
if [ -z "$SDK_VERSION" ]; then SDK_VERSION="5.1" //SDKのバージョンを5.1にする fi //Xcode4.3からSDKの場所が変わってるので、それに合わせる DEVELOPER_ROOT="/Applications/Xcode.app/Contents/Developer/Platforms/${TARGET_SDK_NAME}.platform/Developer" SDK_ROOT="${DEVELOPER_ROOT}/SDKs/${TARGET_SDK_NAME}${SDK_VERSION}.sdk"
- ライブラリをビルドしてみる
iOSのシュミレーターと実機は、CPUが異なるので、2つ分ライブラリを用意します。
1.シュミレーターのライブラリ
% cd .. % mkdir build_simulator % cd build_simulator % ../opencv_cmake.sh Simulator ../OpenCV-2.2.0 % make -j 4 % make install
2.実機のライブラリ
% cd .. % mkdir build_device % cd build_device % ../opencv_cmake.sh Device ../OpenCV-2.2.0 % make -j 4 % make install
- Xcodeのライブラリのパスを設定
Library Search Pathsで、シミュレータと実機向けのパスを指定します。
- freamworkの追加
Accelerate.frameworkというフレームワークがOpenCVでは必要となるので追加します。
- 早速OpenCVを使ってみる
yoshimasa niwa - iPhoneでOpenCVを使う方法を参考にして、UIImageとIplImageの相互変換することが出来ます。
UIImage -> lplimage
// NOTE you SHOULD cvReleaseImage() for the return value when end of the code. - (IplImage *)CreateIplImageFromUIImage:(UIImage *)image { CGImageRef imageRef = image.CGImage; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4); CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height, iplimage->depth, iplimage->widthStep, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault); CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width, image.size.height), imageRef); CGContextRelease(contextRef); CGColorSpaceRelease(colorSpace); IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3); cvCvtColor(iplimage, ret, CV_RGBA2BGR); cvReleaseImage(&iplimage); return ret; }
lplimage -> UIImage
// NOTE You should convert color mode as RGB before passing to this function - (UIImage *)UIImageFromIplImage:(IplImage *)image { NSLog(@"IplImage (%d, %d) %d bits by %d channels, %d bytes/row %s", image->width, image->height, image->depth, image->nChannels, image->widthStep, image->channelSeq); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize]; CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data); CGImageRef imageRef = CGImageCreate(image->width, image->height, image->depth, image->depth * image->nChannels, image->widthStep, colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault); UIImage *ret = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); CGDataProviderRelease(provider); CGColorSpaceRelease(colorSpace); return ret; }
注意点として、 IplImage->UIImage と変換する際に、cvCvtColor(src_image, dst_image, CV_BGR2RGB);のようにBGRからRGBに変換しなければ、変な色として出力されてしまいます。
気をつけましょう。
こんな流れで、iOS上でOpenCVを扱うことが出来ます。
//画像を読み込む UIImage *src_image=[UIImage imageNamed:@"sample.png"]; //OpenCVで使われるIplImage形式に変換 IplImage *cv_image = [self CreateIplImageFromUIImage:src_image]; //-----ココらへんでOpenCVな処理を書く //BGRになっているのでRGBに変換 cvCvtColor(cv_image, cv_image, CV_BGR2RGB); //IplImageをUIImageへ変換 UIImage *dst_photo = [self UIImageFromIplImage:dst_image];
- ハマったポイントと対処方法
1.配布されていいるライブラリそのまま使っても動かない…
→SDKのバージョンが違うので、大人しくビルドしましょう
2.画像が表示されない…
→cvCreateImage(cvGetSize(src_image),IPL_DEPTH_8U,3);みたいな部分で、画像のサイズやチャンネル数が一致してるか確認しましょう
3.色が、なんか…すごく変…
→RGBとかBGRとかそこら辺を疑いましょう
[追記]
dandelion (dandelion1124) sur Twitterさんからリプライを頂きました。
OpenCV 2.4.2からはiOS用frameworkが公式に配布されているそうです。
frameworkとして生成できるので、導入がとても簡単そうです。
Installation in iOS — OpenCV v2.4.9 documentation
Web業界へ入ったので、陶芸教室でろくろをまわしてみました。
Web業界へ入ったので、せっかくならろくろをまわしてみたい!と思いました。
ちなみに発端となった記事はこちらです。
WEB業界ろくろ回しすぎワロタ:ハムスター速報
id:luminさんからWeb業界の人向けろくろを回すオフ 【新宿】 : ATNDというイベントのお誘いをいただき、嬉々として参加してきました。
ありがとうございますm(__)m
今回はこちらの陶芸教室へ行ってきました。
陶芸教室・体験 東京・新宿の「COM陶芸教室」
先生から、ろくろを回すコツを最初に習います。
「膝に腕をぴったりと固定して、手をぶらさないように」「水をなるべく足しながら……」などレクチャーを受けます。
ろくろを回す際の基本の手はこんな感じです。
あのポーズは、なかなか見れず。
先生が作るととても簡単そうに見えます。
私もチャレンジします。
案外難しいです。
力を入れすぎたり、水が足りないと、このように崩れます。
二時間の中で2つ器を作ることが出来ました。
釉薬(うわぐすり)を選ぶことで、器に好きな色をつけることが可能です。
白や黒、ベージュなど、様々な種類がありました。
(一ヶ月後!)
3週間ほど器を乾燥させた後に釉薬を塗って焼いて出来上がりです。
とても綺麗な出来上がりで、大満足です。
- ろくろのあのポーズ
ろくろを回す際は、基本的には右手を添えるようにして器を形作っていきます。
あのろくろポーズは、器が広がりすぎた際に幅を小さくする整形するために使われるポーズで、なかなかやらないようです。
陶芸教室の先生があのポーズで整形しはじめたときに「おおおおお!」と参加者の歓声が湧き、そして困惑した先生のなんとも言えない表情は忘れられません。