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の自作チートシートを作っておこう。

研究資料検索システム

近況報告

研究室に入ってからかなり経った。学ぶことばかりだ。

しかし今年の目標として掲げたアウトプットがおろそかになってしまった。

新しく特殊なキーボードを注文した話とか、そのファームウェアを書き換えた話とかネタはある。

とりあえず今やりたいと思ってることを文章として残しておこうと思う。

研究資料検索システム

現在研究室にある資料、先輩方の残した論文やスライドはきちんと管理されている。

しかし現状の管理では「どこに誰が書いたものがある」がわかる程度で、その中身についてはファイルを開けてみないとわからない。

研究室が持つ資料数年分ともなればその量も結構なものとなる。

長く所属している人ならばどんな内容の資料があるかある程度想像つくだろうけれど、そうじゃない人は必要な情報を探し当てるのに遠回りをしてしまうかもしれない。

というか僕が先輩や先生に「こういうことについて調べたいけど、それについて調べた先輩っていますか?」とかいちいち聞くのが申し訳ないだけだったりする。

と、いうわけで研究室の資料をなんとかして内容から検索しやすいようにできないかと考えている。

計画

  • 研究に関連する主な資料は論文(tex, pdf)とスライド(ppt, pptx)
  • 各データの内容を対象にして検索をしたい
  • 含まれる文字列を抽出していろいろあれこれすればできそう(?)
  • texはテキストファイルと同じで直に扱える
  • pdfからの抽出はツールもライブラリもあるだろうし困らなさそう
  • スライドの2種類が鬼門かと思ったがpythonにライブラリがあるようだ(参考URL)
  • これらから抽出した文字列の中から名詞を抜き取り、ファイルの場所とひもづける
  • ファイルが含む名詞と場所とで索引構造を作り検索できるようにする

できたらいいなと思ってること

参考URL

pythonでオフィス快適化計画 - SlideShare 覚書ブログ: pythonで PowerPointを操作する。

win32.comとかpython-pptが使えるらしい。もっときちんと調べてコードを書きたい。