Cookpadインターンシップに行ってきた(前半)

Cookpadのサマーインターンシップに行ってきました. recruit.cookpad.com
(追記 2015/09/02)機械学習の公開資料URLを追加しました
(追記 2015/09/11)公式に講義資料が公開されたので個々のURLを消してそちらを貼ります

techlife.cookpad.com

経緯と流れ

実は2年前にもインターンに応募していて(その時はあえなく落選でしたが),2年ぶりのリベンジ応募でした.

事前に過去のインターン記事を漁ってみてはいたのですが,今まで開催されていたのはこちらの5日間サービス開発のコースのみで 今回僕が参加することになったインターンとはまた異なる内容だったようです. recruit.cookpad.com

というわけで来年も行われるかどうかはわかりませんが,新しく始まった技術職インターンシップ体験記を書いていきます. 外部に公開されていた一部の講義資料も載せましたので,今後のご参考にどうぞ.

内容

インターンは前後半に別れていて,前半の講義形式の中で資格アリと見出された者のみが後半に進める構成. オリエンテーションやセットアップを行った後,順次日程にそって講義が行われます. 前半で学ぶ内容は以下の通り.

  1. TDD / Rails
  2. Android開発
  3. iOS開発
  4. サービス開発 / 機械学習
  5. プログラミングパラダイム

TDD

Rspecを使ってテスト駆動開発の基本を学びます. プロコンの問題のようなお題が出て,ソレに対してテストを書き,実装するというサイクルを繰り返します. 「TDD知ってる人ー」で皆手を挙げて,「TDDやってる人ー」でパタリと手が下がったのを覚えています. 個人的にはプロコンやってるみたいで楽しかったです. テストケースをあんなに簡単に書ける仕組みがあるならもっとやってくべきだなと思いました. ただ,今回はお題が非常にわかりやすく,テストケースが書きやすかったのですが, 「これのテストって一体何を書いたらいいんだ……?」的なケースに陥った時,本当のテスト力が試される気がします.

Rails

ちょっと昔にMVCをかじったことがある程度でした. その時はerb書きづらいなぁとしか思わなかったです.今回はhaml使いました. URLで指定した画像をタイトルと一緒に投稿するWebアプリを作りました.コメント機能もあります. JSONで叩けるAPIを用意してHerokuにデプロイすることで以降のAndroidiOS開発にも使いました.

Android開発

Railsで作ったAPIを利用してアプリ開発をしました. モバイルアプリ開発は全くの初めてだったので若干の不安もありました. 実際に作ってみてだんだんとコツを掴んでくると,HTMLとJavaScriptのノリでいける気がする〜とか思う程度になりました. 休日に会ったAndroid開発ガチ勢にそう言ったら鼻で笑われました. contextは未だにわからない.というかいくら説明を聞いても上手く飲み込めない感じがします.

iOS開発

対してAndroidと変わらないだろう,むしろAppleのことだからAndroidよりも作りやすいだろう,とか思っていました. AutoLayoutやばかったですね.レイアウトで詰まる人が多かったように思います. かといって,じゃあAndroidみたいにソースで書いたほうが速いのかというとそんなことありえなかったので慣れるしかなさそうです. 処理の詳しいことまではあまり頭が回りませんでしたが,レイアウトさえ慣れればむしろAndroidよりラクなのかもしれません. 1日ではまだその域まで達することができませんでした.

サービス開発

唯一PCを使わない講義,という触れ込みの講義. 冒頭の通り「cookpad インターン」で過去のインターンを調べると,大体5日間の開発インターンシップが出てくると思います. (というかそのコースしかこれまでやってなかったハズ)
その中でよく出てくる,価値仮説シート.これ周りの話でした. 新しくサービスを開発するにあたって何に気をつけるのか. スタートアップに興味がある人には既に見知った内容だったのかもしれないです. 開発において必要な手法,知識を学んだ後,最後は実践ということで, 架空のインタビューを元に簡単なサービスのプロトタイプを作成しました. 今まで知識として聞いてはいたものの,いざやってみると勝手がわからなくて苦労しました.

機械学習

機械学習自然言語処理に関するチュートリアルの説明を受けた後, 講師の方が用意してくださったword2vecスクリプトを使って色々遊んでいました. 本当は前処理とか学習とか出力整形とか面倒くさそうなことが大量にあるはずなのに, そこら辺をすべてすっ飛ばしていきなりword2vecするという接待感を感じながら遊んでました. wikipediacookpadそれぞれの辞書から作ったモデルで色々試そう,という内容. 他のインターン生があれこれしている中,僕は熱心に日本酒に合うつまみを探していました.
痛風,怖いですからね.
結果としてビールにおける餃子の役割を果たす日本酒に合う料理は焼売ということでした. 皆さんいいですか.これからはビールに餃子なんて不健康かつオッサンな組み合わせはNGです. これからのへるしーぷろぐらまーは日本酒に焼売,これです.

プログラミングパラダイム

Cookpadの人も聞きたがる内容,との前評判でどんな講義なのか気になってました. 講義の最初はホントにプログラミング言語の話をしていたかと思いきや, 即座にCPUアーキテクチャの話に移り(もうわからない)さらにコンパイラの話が始まりました.
あらかた簡単な座学を行った後,演習タイム.
SpiderMonkeyの機能を一部流用してオリジナルのJavaScriptコンパイラ(のコードジェネレーター)を作ろう,という内容でした.
「"エグくする"と言ったけど,ごめん,ぜんぜんマゾくならなかった.ちょっとヌルすぎたかも」との談.
nullくなかったです.
後半若干泣きが入りそうになってひいひい言いながら実装していました. この日一日で最も理解したことは言語処理系の実装するマン頭ヤベえということです.

まとめ

さすがcookpadインターンシップ,内容も来る学生も凄かったです. どの日もガッツリ演習しました. 何度「はいはいはい!わからないです教えてください!」ってやったか覚えてないです. そんな中で颯爽と課題を全て終わらせて自主的に発展課題を解いてる人達はカッコ良かったですね. 僕も彼らのようになりたいなと思いながら懇親会でビール飲んでました.

同時期に総合職のインターンも行われていたらしく,ラウンジでワイワイやってる様子を見ました. 薄暗くて男しか居ないむさ苦しい部屋で必死にカタカタMacでアプリを作っている一方で, 総合職は男女和気あいあいと日の当たるラウンジでやっていたようです. 住む世界が違うと割りきっていたのであまり羨ましくはなかったのですが,どうにも対照的だったと思います.

講義する側に立って考えれば1日ないし半日で初心者から上級者まで全てをカバーしつつ 演習も行う必要があるというこの無茶ぶり.どんな内容にするか大変苦労したと思います. ありがとうございました.

さてタイトルの通り本記事はまだ半分です. 既に内容の項目で触れた通り,インターンは前後半にわかれています. 2015年のインターンシップは2015年8月18日(火)から9月9日 (水)までで, 最初の7日間が前半で,後の10日間が後半です. これを書いている今日は2015年の8月31日です.日付からお分かりの通り現在後半戦まっただ中です. こちらは実務なのでひょっとしたらほとんど書くことができないかもしれませんが, 前半との違いとか書けることは書こうと思います.

はい,というわけで後半戦頑張ってきます.

mixiのScrapChallengeに行ってきた

mixiのScrapChallenge 2015に行ってきた.

alpha.mixi.co.jp

研究室でCTFゼミをやったり,セキュリティの授業に出ていたりしてはいたが,どうにもうだつが上がらない. ここは1つガチ勢に揉まれてこようではないか.

開始前

そんなわけでインターンの合間を縫って渋谷にあるmixi本社にお邪魔してきました.
渋谷って恵比寿から歩いていけるんですね.しかも11時開始,余裕じゃないですか.
そう思ってた時期が僕にもありました.
着いたのは数分前,ギリギリでしたね.

f:id:sukerutulo:20150830010136j:plain 着いた時には皆席についていて,グループ分けがなされていました.
前日にブログ等で事前調査をしたところ,なんか地域で固まるらしい.
案の定id:oboenikuiと同じチームでした.これで安心して難問を投げられます.

遠方から来る人もいるために集合が遅めだったので,
今回の主旨やセキュリティに関する軽い説明を行って昼飯を食べました.
焼き肉焼き肉〜

f:id:sukerutulo:20150830010225j:plain

チュートリアル

とりあえずログインしてみて,XSSを運営に報告するといういわゆるsubmit確認フェイズ. 実はこの時ログインユーザーを間違えてしまった挙句,他人のアカウントでパスも変更してしまうという失態をやらかしていました.
あの時は本当にすいませんでした.
若干時間に余裕があったので問題が公開される前だったけど,どんなページなんかなーとあちこち試してみたりとか.

スタート

いよいよ競技開始です.競技自体はSlackを通じて行われるので,以下の記述はSlackのログを元に書かれています. あ,問題内容はオフレコなんで,とりあえず雰囲気と進行具合だけです. 大会中は進行に合わせて問題のヒントが公開され,ヒントの分だけ獲得ポイントが下がっていきます. なんか妨害コンテンツも流れていたらしいですが,普通にいつも聞いてるBGMが流れていた気がします.(あまり覚えてない)
作業BGM探している人はニコニコで"電子ドラッグ"タグ検索するのオススメですよ.

前半戦

何時に始まるんだろう〜とかぼやぼやしている内にスタートしました.(14:00)
スコアボードから全11問の出題と把握していましたが,とりあえず5問のオープンです.
なぜか2問目,3問目から解き始めるチームメンバー達.ぼくは1問目です.
えーと,あーと,なんて戸惑っている内によそのチームがfirst acceptを取り焦る焦る.
なんとかして1問目を解いて提出した際には2問解いてたチームもあったかと.(14:36)
次に何を解けばいいのかわからなかったけど,とりあえず2問目に着手.
この辺で僕と入れ替わりに2問目から5問目にシフトしていたメンバーの提出がaccept(14:57)
うちが2問解けたくらいで別のチームが前半5問を解いて「あ,これは無理かな」と思い始める.
うんうん唸ってとりあえずこれでいいのかな,と提出した2問目が無事accept.(15:19)

後半戦

この頃にはよそのチームが解き進めたことで後半6問もオープンしていました.
大会は後半戦に進行.
ヒントの公開も進んでいき,順調に下がっていくポイント数.精神的焦りがマッハ.
この辺りで「もう俺にはわからん!」と他のメンバーにあとを任せてSQL(6~8問目)に専念.
チームメンバーも5問目をacceptします.(15:35)
oboenikuiが3問目を提出するのとほぼ同時に僕も6問目を提出し,accept.(15:47)
その後延々とSQLを叩き続け7問目,8問目と連続acceptを果たしました(16:04)(16:22)
その後,他の問題はチームメンバーに任せ,僕は9問目に取り組みます.
9問目は最後まで解くことができず,oboenikuiが10問目と11問目をacceptしました(16:23)(16:39)
そしてついに大会終了(16:40)

これ書いてて知ったんですが最後ギリギリだったんですね.
1時間近く9問目に悩まされていたせいで全くチームのことがみえていなかったのですが,
終了後に確認したら9問目以外は全て解き終わってたとのこと.我々の最終成績は10/11でした.

進行と流れ

上記のaccept状況をまとめました.時系列順だと確かこんな感じ.
開始 14:00
問1 14:36
問4 14:57
問2 15:19
問5 15:35
問3 15:47
問6 15:47
問7 16:04
問8 16:22
問10 16:23
問11 16:39
終了 16:40
誰かsecconみたいにイイカンジのスコアグラフお願いします, と言いたいところだけど実際には正確な点数推移がわからないので無理ですね.

解説

f:id:sukerutulo:20150830010350j:plain 膀胱が限界だったので競技終了後にトイレに飛び込んで帰ってきたら問題解説がスタート. 自分が解いた問題は想定解答をチェックし,解かなかった問題はそもそも何の問題なのかを確認. つくづくSQL担当で良かったと実感. 最後まで解けなかった9問目ですが(このタイミングでは)解答聞いてもよくわかんなかった.
あとで懇親会直前に質問し直してようやく理解ができて納得.

結果発表

ついに結果発表,という緊張の時間だったはずなんですが9問目の本当の解答が気になってそれどころじゃなかったです. それよりも9問目の方が重要でした.最優先事項.
3位,2位とチーム名に得点が発表され,最後の1位は我々のチーム
……え,何? 若干の間ぽかんともしたけど,優勝したようです.マジか.

感想とまとめ

9問目,悔しかったですね.
正しい解答を聞いた後には「ああ!」と納得し「いや,でも無理だったな……」と納得したものの, それでもやっぱり全完したかったです.

さておき今回の勝利は一目見て「あ,よくわからん.無理そう」と思った問題をぶん投げさせてくれて, しかもそれを解答してくれたチームメンバーのおかげだと思います. あんまりチームの方針決めてませんでしたがうまくはまったかな,と.

チームメンバーとこの素晴らしい機会を与えてくれたmixiの方々に感謝です. 運営の方も仰っていましたが,実際のウェブサイトをこんな風に攻撃できる機会はあんまりないです. 常設CTF系はいっぱいありますが,scrap challengeはただflagを取りに行くよりももっと実践的に攻撃できます. それに,まぁ……常設CTFとかは常設されてるだけあって進んでくと結構難易度高めですし……
あとやっぱりこういう機会がいっぱいあったほうがモチベーションに繋がると思います.

今後こんなにいい成績をとれることはないと思うので当分自慢させてもらいます. f:id:sukerutulo:20150830014301j:plain

Yahoo!のインターン(サイエンス/大阪)に行ってきた

Yahoo!の黒帯インターンシップにてサイエンスコースの大阪オフィスに行ってきました.
サイエンス 〜黒帯インターンシップ〜
5日間のコースで(多分)人生初の大阪.
時間が経ってしまった上にあまりメモをとれていなかったので覚えていることを.

経緯と流れ

過去何回かCTFに参加していたため,インターンに応募の際に最初にオススメされたのは"セキュリティ 〜黒帯インターンシップ〜"でした.
確か"セキュリティ専門ではない企業が珍しく募集している"という流れだったはず.
その時に今年のYahoo!インターンは細分化されたコース分けになっていることを初めて知りました.
今年はいくつかの企業にインターンに行きたいなぁと思っていたので,興味がある∧日程が被りにくいコース,という基準で選びました.
その結果サイエンスコースの大阪に応募することに.

エントリーシートだけでなく面接も必要だったため,新幹線の中で急いで卒論を外部向けの真面目なverに変更して発表練習をしていた記憶が.

内容

コースが細分化された結果なのかインターン生は3人のみ. 5日間のなかで,セットアップ,課題決め,黒帯による講義,そして最終日に成果発表を行いました.

インターン課題

短時間でいっぱいor難しいことをやるのは難しかったため,僕はpythonHadoop(streaming)でゴニョゴニョする程度で終了です. Hadoopは初めて触ったのですが,一筋縄ではいかないなというのが5日間を終えての感想です.
(Hadoop印象遷移)
「あ,なんだラクそう」->「え,なにこれバグわかんない」->「つらい」->「でもやっぱりすごい」
インターン中メンターの方と色々相談しながら作業を進めていき,方針や目標がサクサク決まったのでコーディング作業に集中できました. 最後に結果を分析する際には非常にお世話になりました.

黒帯の講義

サイエンス 〜黒帯インターンシップ〜に書いてなかったので行くまで知らなかったのですが,インターン中に自然言語の専門家と機械学習の専門家から講義を受ける時間が用意されていました.

Yahoo!には黒帯制度なるものがあるらしく……あれ,課題解決休暇? は知らなかった.
Yahoo! JAPAN - IR関連情報
研究室のOBの方が黒帯と聞いて驚きました.

発表

準備

発表前日にデバッグのためHadoopを回している間の待ち時間があったので,「大体こんな感じになるのかなー」と大体の構成を考えてました.
スライドの中身は当日の午前中から作り始めてメンターに見てもらい,更に一度練習をしてフィードバックを頂きました.
発表の準備時間は割りとタイトでしたが,スライド枚数を減らしてなんとかしました.
(その分かなり発表時間が余った.なんとかなってない)

結果

なんと,優秀賞を頂きました.
景品に自撮り棒とスマホ用レンズを頂きました.
発表を色々な方々に褒められて非常に嬉しかったです.

他の記事とのdiff

この記事を書くにあたって今までのインターンの記事を参考にしたんですが,オフィスによる違いなのか時間による変化なのか違いがあったのでdiffをとっておきます.
(といってもよくよく調べたらそんなに記事なかた……)

マシン

インターン生にはWindows機が渡されていましたが,オフィス全体を見渡すとWinとMacは大体半々くらいでした.
メンターの方に聞いたらMacだからと特別な申請はないらしく,最初に好きに選べるそうです.
エンジニアやデザイナーはMacを選ぶ傾向があるとか.

エディタ

あんまり話にあがりませんでした.
エディタは……まあ好きに選べばいいんじゃないかな.

あ,美少女はいなかったです.

まとめ

も っ と デ ー タ に さ わ り た い !

はてなブログに引っ越した

ブログを引っ越すのはこれで2度目になるか.

最初はBloggerで書き始めた.

その内Markdownで書きたくなり,どうしようか悩んだ結果

ドメインを購入してPericanとGithub.pageを使って公開することにした.

しかしPericanという部分がネックになり,

外出先や研究室で書けずなかなか更新ができなくなった.

また,Github.pagesをブログに使うのはもったいないという同期からの指摘もあった.

 

というわけで,sukerutulo.comポートフォリオサイトにし,

ブログは sukerutulo.hatenablog.comにすることにする.

 

その内以前のブログの内容をこっちに持ってこようかと思う(フラグ)

持ってくるほどの内容でもないけれど.

 

ポートフォリオにするといったものの,コンテンツがない.

作らねば.

アルバイトについて

技術的なことが書けないのでふと思いついたことを書いてみる。

今まで自分が関わってきたアルバイトについて振り返ってみる。

どのバイトでもNDA(秘密保持契約)があるので、業務内容ではなく自分自身について書く。

某研究室のアルバイト

自然言語処理を研究する研究室でアルバイトの募集があった。学部2年の時だったから、3年前か。応募メールの日付を確認したところ2012年の9月末だった。当時の自分は情報系の学生ながらも何もできない状況だったと思う。

この研究室で学部3年の冬、2014年の1月くらいまでアルバイトをさせてもらっていた。ここでの経験がほぼ今の自分を形作っている。

課題を与えられて週1の進捗報告を交えつつ自学自習の形で作業を行っていた。PythonC++、各種コマンドやgitを覚えた。(gitは今でも怪しい) とりあえず基本はemacsコマンドラインでにらめっこ、わかんなかったらググる、という感覚になった。

テスト期間や帰省など途中で休みを交えつつ課題をこなしていった。結果は奮わないことがほとんどだったが、着実に力は身についていったように思う。作業自体は1人だったので色々と気楽な部分もあった。研究室の環境を使わせてもらっていたので、勝手がわからず色々と迷惑をかけてしまったこともあった。本当にサーバー周りでは何度嫌な汗をかいたかわからない。

学部4年になり研究室配属が決まったので一旦アルバイトをやめることにした。

現在しているアルバイト(今まで)

研究室の先輩が以前お世話になった方の元でデータ解析のアルバイトをしていると聞いた。前回のバイトの業務からデータを扱う仕事はとても気になっていた。ビッグデータとかデータサイエンティストとか流行りの単語もあったし、この手の経験をしておけば今後食いっぱぐれにくくなるだろうと、先輩に自分も加わりたいと願い出た。

こちらもメールの日付をみたところ2014年の9月頭だった。9月に職にありつくジンクスでもあるらしい。既にチームで走りだしていたようなので、作業のキャッチアップに時間がかかると思いきや、その月の下旬にはタスクをこなしていた。

前のバイトと違いこちらはチーム戦になった。用意してあった時系列データを2チームに分かれて解析した。チーム間で作業は独立していたが、時には同じ作業を各々こなして互いの手順の正しさを確認することもあった。

一緒にチームを組んだ前述の先輩がとんでもなく優秀なエンジニアだったので学ぶことが多く、色々と勉強させてもらった。傍から見てめんどくさそうな作業をホイホイ引き受けて「え、マジっすか」と思っていたらいつの間にかササッと仕上げている様子には感服するしかなかった。逆に「これならSQLに命令追加して叩くだけで大丈夫っすね」と言ったらすごいと褒められることもあった。ああ、やはり世によく見受けられる1人よりもチームがいいという言説は嘘じゃなかったんだなと本気で思った。

こちらも週1でミーティングがあり、その間の課題をこなしていく形だが、作業・解析の提案なども行わなければならない。単純にアルゴリズムを実行するコードを書くだけでなく、どのアルゴリズムを採用するかなども一緒に考える。仕事のレイヤーが1つ上がった感じ。

現在しているアルバイト(これから)

件の先輩が卒業してしまったので現状チームを組む相手がいなくなってしまった。

このままではチームに割り振られるタスクを1人でこなす必要がある。作業量よりも心理的な負担や、相談相手がいなくなったことが厳しい。そうでなくとも最悪でも卒業までに1人は後任を確保しなければならない。

だが、そううまい具合に人材が見つからない。仕方がないので質を問わず、ともかく手の空いている人を募集することにした。最悪コード周りは全て自分でやればいいから、ともかく相談相手が必要だ。

探してみたところ、二人ほどアテがついた。この二人に作業に加われるよう教育を施し、チームとしてマネジメントしていけばやっていけるようになるかもしれない。

そういった経緯で「教育って一体何したらいいんだよ」と頭を抱えながらgitとpythonを教えている。pythonで動的にSQLを作成し、SELECT結果をpython側であれそれできるようになってくれれば十分だが、そこまでが途方もなく遠く感じる。

(ただしまだアルバイト志望の二人に関してはあくまで"予定"。

もしダメだったとしてもgitとpythonの知識は二人の無駄にはならないだろう)

バイトを通して

プログラミングに関わるバイトはこれで4年目ということになる。

1-2年目:基礎の時間

プログラマとしての感覚、というか。SSHでサーバに入ってtopでリソースの空きを確認してからtmux上でプログラムを並列に回してデタッチして授業に出る、みたいなことを平然とできるようになった。

基礎練というか、ゲームとして成り立たせることができるようになったというか。

3年目:ステップアップの時間

単純なスキルを身につける、できないことを減らすというのとはまた違う経験ができた。1人では得られない経験というやつ。人と一緒に仕事をしたからか頭打ちに感じていた成長率に先を感じられるようになった。

コートに立てるようになったというか、チームメンバーとの連携を覚えたというか。

4年目:成果の時間(?)

今まで自分が得た経験を人に与え、適切な仕事の割り振る。これらを今までの作業と同時並行にこなすのかと思うとちょっと自信がない。けどコードを書かずにいれるわけもないし、何よりデータを解析するという一番面白い作業を手放す道理もない。 また1つレイヤーが上がりそうな気もする。チームギークとかアジャイルとかの本でも読むべきだろうか。

チームを回す役割、キャプテンにでもなった気分。トップではないので中間管理職。

おまけ

現状を把握するために文章化してみた。

書く前から薄々感じていたのだけどなんだかこれ社会人の経歴のような……

学んだことをいくつか

研究資料検索システムの進捗を出すために作業してて学んだことをいくつか

シェルスクリプトはスペースに容赦無い

下手するとpython以上にコード表記に厳しいんじゃないかっていうくらい。 スペースがあるかないかでよく怒られる。代入の=とかif文の[]とか。

やっぱりpythonエンコード周りは闇だった

単純な文字列のUnicodeErrorによくあるstr型とunicode型の扱いくらいなら慣れてきた。 今回困ったのは名前が日本語のファイルをopen()しようとしたとき。 ああでもないこうでもないとやった挙句、結局それまでと同様にunicode()で直った。 実際の問題はファイル名ではなく、パスが絶対パスではなかったことだったようだ。なぜ文字化けしたのかは不明。

valueソートの辞書

keyではなくvalueで辞書をソートしたいというのはよくある。sort()にkey=lambda x:x[1]してやればよい。 今回jsonを使って辞書型をvalueの降順にdumps()したかった。 しかし上述のsort()のやり方はdict.items()をソートしているためソート後は辞書型にならない。 では辞書型に戻してやればいいのかというとそれも違う。ソートした順番通りに辞書型が作れない。 さてどうしよう、とググったところOrderedDict()を使えばいいとのこと。 ついでにdumps()で日本語を出力する方法(ensure_ascii)も覚えた。

from collections import OrderedDict

dict = {'赤':1, '青':32423, '黄色':0}
sorted_dict = OrderedDict(
        sorted(dict.items(), key=lambda x: x[1], reverse=True))
        print json.dumps(sorted_dict, ensure_ascii=False, indent=4)

githubについて

学生は大学のメールアドレスを登録すればgithubのプライベートリポジトリが使える。 このプログラム自体は公開しても全然構わないのだが、対象データが個人情報なのでうかつに公開したくない。 そういうわけでプライベートリポジトリを使って管理している。 折角なのでgithubに関する今まで使ったことのない機能もいっぱい使っていきたい。 コミット量がそこまで多くないのが少し問題だが、[successful git branching model]とかgithubを正しく使えるようになりたい。 とりあえずissuesを存分に利用してみる。branchもmasterとdevelopで切っているが、一人作業なので有り難みがない。 もっとfeatureとかreleaseとか使っていきたい。

進捗

とりあえず全pdf,pptxファイルの単語をベクトル化するところまではできた。tf-idfもすぐに計算できる。 これからどうやってクラスタリングをするのか、アイデア程度ならあるが実装レベルではまだわからない。

考えついた当初は「単語をベクトル化するくらいまではサラサラっと書けそうだし大変なのは検索エンジン化とクラスタリングの作業かな」などと思っていたのにここまで苦労してしまった。 自分で「簡単な作業」と思う仕事を1週間でさらっとこなせるようになりたい。 書き上げたコードを見て振り返っても、かかった時間の大半は調査時間に含まれる気がする。 自分が欲しいと思う技能全てが一気に進歩するわけないだろうし、一歩一歩やっていくしかなさそうだ。

デバッガに打ちのめされた

IDE最強

gdbに触れたことはあるものの、積極的に使っていくほどではなかった。

どうせ自分が書くプログラム程度ならprintデバッグで十分だろう、と。

最近ICPCに向けて研究室でもプロコンが盛んになってきている。

ついさっきまでゼミの課題であるTopCoderの問題に取り組んでいた。

最初は単純にどう書いたらいいかわからずウンウンやっていた。

自前で書いたやり方がどうも違う気がして仕方なく蟻本を開いた。

アルゴリズムの書き方はわかったけど、どうにもおかしい。エラーがとれない。

それも何か奇妙な値のとり方をしている。どこか実装をミスったか。

奇声をあげながらTypoを探していると同期がやってきた。

彼には既に「その問題はintじゃあふれるよ」とのアドバイスを受けていた。

変なエラーが治らない、一部だけ通って一部だけ通らない、と助けを求めると、

「longにしたのか、桁あふれしてるんじゃないか」という。

いや、さっきの助言通りlong long intにした、そんなことはないはず。

そう言うと彼は「変数の中身は確認した? デバッグにVisualStudio便利よ」という。

いや、研究室用PCはMacだし。一応VirtualBoxに入って入るけど(DreamSparkという学生の特権)。

しぶしぶXcodeを使ってみることにした。使い慣れないIDEにものすごく苦労した。

「buildできない。runのボタンがない」「なにそれ(画面を見る)俺の知ってるXcodeと違う」

「ググってもよくわからない(情弱)」「プロジェクト作った?」「え、なにそれ?」「作れ」

想像以上に間抜けを晒してしまった。

でもライブラリやら何やらの依存があるきちんとしたソフト開発ならともかく、

一回問題を通すためだけに書き捨てるプロコン用のコードにもいちいちプロジェクトを作るのは

なんだか無駄が多いような気がしてならない。あまり好きになれない。

プロジェクトなしに生のソースをそのままコンパイルして実行したいのだけど。

あ、ちなみにエラーは桁溢れでした。

まさかlong long intが溢れるとは思ってもいなかった。

結局何から何まで彼の言う通りだった。

Emacs? まさか

そんなことがあって、「Emacsでコード書くのやめたほうがいいのかな」と少しへこんだ。

だが、ぐぐるEmacsgdbの連携はなかなか悪くないらしい。

周りの人は皆GUIが好きだと言うが、僕はCUIが好きなのでこっちのほうを覚ることにしよう。

とりあえず、まずはprintデバッグからの脱出、というところか。

あとでEmacs+gdbの自作チートシートを作っておこう。