SECCON CTF オンライン予選 反省会

テスト期間真っ最中にも関わらず参加してました。勧誘に失敗したので1人です。
ksnctfや8946などは知っていましたが、公式なCTFのイベントに参加するのは今回が初でした。
なんとか1問くらいは解いてwrite-upをここに書いてやろうと思っていたのですが、結局練習問題(提出方法確認問題)以外1問も解けませんでした。大体6時間くらい経過後に1問も解けていない状態でかなり心が折れてました。最後には諦めて試験勉強に移って寝ました。
仕方ないのでどこで諦めたのか、どこまでは取り組んだのか書いてみます。
あ、基本100点問題しか取り組んでないです。
後々から上位者の得点状況とかみると、上の人でも100点とれていなかったりというパターンもあったので、開いた問題は全て片っ端から取り組んでいくべきだったようです。

(反省会)

[フォレンジックス 100]ここはどこ?

ダウンロードしたデータに符号化された文字列が。えーと、これなんだっけ。MD5?
ググってMD5でないことを確認した後、どうしても名前を思い出せなかったので一旦記憶に合った8946の問題を確認。そうだそうだ、base64だ。
確かbase64はネット上にエンコーダ/デコーダがあったはず、と探して入力。
かなり長い文字列だったので、入力制限に引っかかるものも。
なんとかデコードできるサイトをみつけたものの、結果が文字化けしていました。あれー?
うーん、文字コード指定がおかしかったのだろうか、とあれこれ調べて時間が過ぎました。
そういえばbase64程度ならコマンドラインでできるのでは、と試してもみました。
base64 -d base64.txt > result.txt
が、こちらも同様に文字化け。お手上げですね。

[プログラミング・crypt 100] calculate it/計算せよ

nc calculateit.quals.seccon.jp 45105

Hint1: 四則演算ではありません / It is not a four arithmetic operations.
Hint2: 計算例 81 9- 16 6- 4/ 15 X 3- 72 45 = 82
Hint3: G- G- G- G- G- G- G- G- G- G- = 0
Hint4: X X X X X X X X X XXX = 300
真面目にとりかかった時には既にHint1と2が出ていた状態。
Hint1と問題分を読んで、「これは/の左と右で翻訳されていることを示しているのでは」と思ってました。
与えられた場所へncすると問題が与えられ答えを聞かれる形。数秒で判断して解答しなければ「Too slow, bye.」といって切られてしまいます。結構時間がシビア。だからプログラムを書いて自動で解かせろってことなんでしょうね。
何回か試したところ問題は完全にランダムでXや/、-が出てくる数もランダムでした。一個も/がない問題もありましたので上記の推測は間違いだとわかります。
出てくる文字は0〜9とA〜X、/と-でした。Xが演算子ではなく英語のエックスだと気づいた時に数えてみましたが、Xは32進数に入りませんね。32進数ではVまでです。あと2個、惜しい。
Hint3と4が出てきた後も風呂とかで考えましたが、結局解けずに寝ました。

[バイナリ 100] Enjoy the Game

このゲームをクリアしたらパスワードが得られる。
you will get the password if you get a goal of the dungeon.
一人称視点迷路ゲームが与えられる。どうやらゴールに答えがある様子?
ダウンロードしたgame.zipの中にはdataフォルダ,game.exe,readme.txtが。
更にdataの中にはKabe.mqo,Kabe2.mqo,KabeTex.bmp,KabeTex2,bmpが。
ふむふむ、どうやらゴールとそれ以外の設定ファイルが入ってる様子。無印が道中の通路で2がついているのがゴールか。
設定ファイルの中に答えがないかな、と探してみましたが見つかりませんでした。
ただ、KabeTex2.bmpが「Print Password」を裏から見た画像だったのでやはりゴールが鍵のようです。

とりあえず起動してみる。動きはちょっともったりしてたような……どうでもいいか。
左手法とかで簡単にとけないかなーとちょっと遊びましたが、そんな簡単にはいかないようで。
こういった迷路ゲームの場合初期配置と迷路の配置が起動ごと毎回ランダムになっているのでは、と思ったので何度か起動を繰り返してみる。
どうやら初期位置と迷路は全て同じようです。じゃあゲームの書き換えとかじゃなくてもゴールまでの道筋さえ見つけられればなんとかなりそうですね。

ところでmqoってなんだ? とググるメタセコイアなる3Dモデリングソフトが。ふむ。
設定ファイルの書き方を見つける。 http://metaseq.net/jp/format.html
じゃあこれをいじるか、とKabe.mqoのvisibleを非表示に書き換え。
するとすぐそこにあるじゃないですか。(初期位置から左に向いただけ)
あれ、でもこれって壁の向こうでは……ゴールがどこにあるかわかったけど行き方がわからない。
じゃあ壁を透過してたどり着く道を探そうか、と思って再びmqoファイルをいじりましたが画面が暗くなっただけでした。3Dデータよくわからない。
なにかヒントがないかとreadmeとか読んでいましたが、結局この迷路の地図を見つけるしかないのではという結論に。
しかしdataの中にはそういったものはありませんでした。もはやexeの中を探すしかないようです。まぁバイナリの問題ですし。
これのソースを復元できればこんな風に迷路の配置がわかるはずです。
さてそこで逆コンパイル(逆アセンブル?)
objdump -d game.exe > dump.txt
そこまでは別によかったんですが、逆コンパイル後のアセンブリ(?)が読めず断念することに。
取り組みもそうですけど、こうして書いている際に自分がしたことのが逆コンパイルなのか逆アセンブルなのか、出てきたデータがアセンブリなのかバイナリなのかわかってないのが恥ずかしいですね。
バイナリって機械語(マシン語)だから01の2進数なのでは? とも思いましたけどバイナリかるたは16進数だったような……うーん、勉強しなければ。

[ネットワーク・Web 100] repeat after me

followme.capというファイルが渡されるのでとりあえずWiresharkを起動……と思ったら入ってなかったのでインストール
中を確認していきます。が、Wiresharkをほとんど使ったことなかったので読み方がわからない。
とりあえずザザーっと中を検めていくと、途中にpasswordの文字を見つけました。
followme@133.0xf2.010357's pasword:
どうやらTelnetのData欄に通信内容が書いてあるみたいですね。この前後を見ていくと、どこかからどこかへとsshで接続をしている様子。接続先のubuntuサーバの中でlsをした結果「flag.txt」なるファイルがあることもわかりました。つまりsshを成功させればよいようです。
ポート番号もSSH先を入力してる箇所で見つけましたので、あとはSSHのパスワードさえわかればなんとかなりそうです。
通信内容をみるとパスワード入力に失敗しているのか、何度かパスワードを聞かれています。
その最後のパスワード入力からログインまでの内容を追っていきます。
ls -l\025followme$whoami\027ls-l\177\177. -l.\002\177\r
(実際には¥はバックスラッシュです)
\rや\nはプログラミングでよくみるエスケープシーケンス(改行)ですが、\177や\027などは何でしょうか?
いつかどこかのCTFのwriteupで見たような気がしますが思い出せません。
エスケープシーケンスや文字コード、ASCII、unicodeなどを調べてみましたがわかりませんでした。
とりあえずその部分を抜いた文字やwhoamiなどで試してみましたが全てログインできず。
そもそもwhoamiはパスワードなのか? とばbashにうちこんでみたところ、自分のユーザー名が出力されました。lsと同様、これもコマンドのようです。
もしやこれは接続元のユーザー名がパスワードになっているのでは?
接続後のユーザー名はfollowmeのようですが、それ以前のユーザー名はわかりませんでした。
このあたりを数時間取り組んでみましたが成果が出ず、断念。

[その他 100] 練習問題

答えは、「SECCON」です。
提出方法の確認問題でしょうか。こういう公式のきちんとした大会にもこういった問題があるのには驚きました。ひょっとしたら罠か何かだと思ってビクビクしながらの回答提出。

[その他 200] Encode me.

encode_me_91というファイルが渡される。
この問題に対して何かをした記憶がないので取り組んでないと思います。
とりあえずfileコマンドで形式をみて、「AmigaOS bitmap font」と出たところまでは確認したのですが、その後ググっても有益そうな情報がなかったので放置してました。


終わってからの感想。
どのCTF大会でもそうですが、とりあえず終了後も問題に取り組めるようにしてほしいなと思いました。サーバ設定の関係から現実的には無理だとは思いますけど、現状復習がかなり難しい状態です。
この投稿を書いていて「問題文なんだっけ?」と思いましたが問題ページも完全に閉じられているので見に行けない状態です。スクショくらいとっとけばよかったかな。

そういえばIRC、一応何かに使うのかなと思ってXchatをインストールしておきましたが、最初に開始直後に繋げた以外使いませんでしたね。その時は誰も喋ってなかったし、あれなんの意味があったんだろう。


(CTF 復習)

ここまで書き終えて、他の人のWrite Upを見てきました。(2014/1/26 PM 9:00)

[フォレンジックス 100]ここはどこ?

なんでみんなすんなりデコードできているんだろう。
ともかくBase64は画像にも使えるということを知った。
ps.
あれ……他の人と同じようにperlで画像にデコードしても見れないんですが……
何がいけないんだろう

[プログラミング・crypt 100] calculate it/計算せよ

これはちょっと気がつけませんね。僕には無理だったと思います。

[バイナリ 100] Enjoy the Game

あそこまでする必要はなかったようです

[ネットワーク・Web 100] repeat after me

例のバックスラッシュから始まる文字は制御文字だったようです。
というか普通にASCIIで合ってたようですね。
ただ8進数だったようです(10進数で見てた)。範囲に177を入れるにはそれしかなさそうです。
\027 ETB 伝送ブロック終結
\177 DEL  抹消
\002 STX テキスト開始
それで、これら文字をどうやって入力したらいいんだろう。DELはDeleteキーを押せばいいとして、伝送ブロック終結とテキスト開始って……?
あ、Wikiに書いてある^BとかってCtrl+Bなのね。そういえばEmacsとかnanoとかでも同じ記法見たっけ。
と、いうわけでそれらを含めつつ試してみたところ
Permission denied (publickey,password).
 まだ何かを勘違いしているようです。

[その他 200] Encode me.

バイナリだったんだこれ……
base91...?


以上でした。
精進します。
とりあえず今はテスト勉強します。

ubuntu 13.04(32bit)から13.10(64bit)へアップグレードしてわかったこと


結論:すごい。超速い。すごい

少しでも記憶に残りやすいインパクトのある出だしになればと思って、小学生並みの感想で始めてみましたが以下普通に続けます。
まず経緯について。

年末あたりからPCが不調を訴える。
(電源が入らない、フリーズ、mikutter+chromiumで死ねる)

年が明けたら買い換えることを決意。
この時ついでにOSも入れ直すことを決める。

新年早々価格コムを眺めつつ計画を練る。
重要視したのはグラボ周りの拡張性。
予算10万弱で将来6面ディスプレイに耐えられるようなマシンという要望。
mini-Displayport*4とかのグラボも一時は考えた(高すぎるし総出力数が変わらないのでやめた)

細かく調べるのは面倒なので大雑把なスペック遷移。
CPU:Core2Duo -> i5 4670(Haswell)
マザボ:P5K -> Z87-PRO
グラボ:GF9400GT -> HD770
電源とケースは価格コム上位のを適当に。
ストレージと光学ドライブは以前のものを流用。
ついでに折角だからTVキャプチャをつけた。

CPUのファンが回らないとか(CPUファンのコードが引っかかってた)
グラボつけたら画面が出ないとか(画面優先出力先がマザボからグラボに変わってた)
デュアルディスプレイの片面回転ができない(64bitにしたできた)
マザボ出力のUSBが一部使えないとか(未だ不明)
TVキャプチャ用のソフトが動かないとか(未だ不明)
いろいろ問題はあった。
でもとりあえず一旦旧PCから引っこ抜いたSSDのままで動いた。

ここからが本題。
旧PCの中に入っていたOSはubuntu13.04(32bit)。
しかも全然違う構成マシンにインストールしたもの。

電源を入れた当初は「これ、動くのか?」と思ってはいた。
SSDだけ引っこ抜いて別マシンに移すこと自体は以前やったことがあったが、その時と今回とでは構成内容の変化が違い過ぎた。
今回の引越しはその前後の構成内容の規格が1,2世代ほど変化するほど時間が経っている。
まぁ懸念は懸念、結果としてきちんと動いたから問題ない。
動かなかったら旧PCに戻してバックアップを取り直していただけのこと。
そして初めて新PCを動かした時の第一印象は「びっくりするほど変わらない」だった。
SSDを移す前と後で使い勝手が何も変わらなかった。あれ、これi5なんだよね、とびっくりした。
そして下記のサイトを参考にバックアップをとる。

Ubuntuの64bit版へのアップグレード方法(超手抜きバージョン)

(「ubuntu 32bit 64bit アップグレード」でググった時の検索トップサイト 2013/01/17)

そして早速64bitをクリーンインストール――と、思いきや、ここでコケた。
LiveUSBが作れない。Ubuntu標準搭載の「ブータブルUSBの作成」で作るとエラーが出て権限がないと言われてしまう。
無茶な入れ替えをしたからか、と予備のネットブックでも試したが同様のエラーが出た。
別のUSB作成ソフトを試してみたがダメ。しょうがなく結局sudo suしてターミナル上からusb-creator-gtkを呼び出して事なきをえる。
今までこんなことはなかったんだけどなぁ。どうしてだろう。
権限の要求なら書き込み操作よりUSBのディスク消去操作の方がよっぽど危険だと思うのだけど。

ともかくなんとかして13.10(64bit)をクリーンインストールする準備が整った。
早速USBを指してLiveUSBを起動……上手くいかないのでBIOSから起動。
見慣れたブート画面が表れて、いつもより若干遅く感じながらクリーンインストール作業を行う。
再度起動した時、ようやく新しいPCの真価を実感できた。
めちゃくちゃ速い。ぬるぬるというかサクサクというか、ともかく快適。
上手くいかずに不便を感じていた画面の回転も当たり前のように問題なくできた。
やはり構成を変えたらクリーンインストールしなければいけないようだ。

問題はここからだった。
僕はこのあとなんの考えもなしにバックアップにとったhomeとetcを戻した。
大量のファイルがあるため時間がかかり、ちょっと放置していた。
homeとetcの同期が終わり、端末上でコマンドを叩いて驚いた。

sudoが通らない。
どうやら大事な設定ファイルまで変えてしまったらしい。

どこをどう直したらいいのかもわからない。幸いバックアップ用のファイルは健在だ。
仕方なくクリーンインストールをやり直した。2回目。
sudoに関わる設定ファイルはetcにあるらしい。じゃあhomeだけ移せばいいか、とhomeをrsync -Cav

またsudoが通らない。
仕方なくクリーンインストール。3回目。

homeを戻すときにrsyncというよくわかってないコマンドを使うからいけないのだ、とこんどはGUIで動かす。これならroot権限の危ないファイルとかも触らないで済むはずだ。
homeについてはこれでなんとかなった。ではetcは?

諦めた

また下手に触ってsudoが通らなくなるのも怖いのでやめてしまった。
apt-get installも自動でバックアップをとったリストから読み込んでインストールしてくれるのかと思いきや、全部手動でいれることになってしまった。

今回の教訓
クリーンインストール大事、思わぬ力を授けてくれる
・でも自動化がキモ。こんなん毎回やってられない。

あ、あと13.10リリース当初に言われていた日本語周り、やっぱりちょっと違和感がありますね。Japaneseチームの人たちが作ってくれた日本語Remixを使っているのですが、なんだか以前とIME切り替えの感じが違います。
以前は日本語(Mozc)と英語をCtrl+Spaceで切り替えつつのDvorakをAlt+Shiftで切り替えてたと思います(多分)
日本語・英語切り替えはできるんですが、Dvorak切り替えが出来なくなりました。
Dvorakを使おうとすると日本語・英語・Dvorakの三択をCtrl+Spaceでローテーションする感じです。
Dvorakはたまに練習する感じなので、そんな頻繁に切り替わらなくてもいいです。
一番つらいのはCtrl+Spaceの反応が若干遅いことでしょうか。少し長めに押し続けていないと切り替わらないように感じます。個人差でしょうか? 今度設定とか調べてみます。

とりあえず一旦はこんなところでしょうか。
新環境に移行したことでリモートPCとかTVチューナーとかいろいろ導入していこうかと思っているので今後もアウトプットしていけたら、と思います。

チューリング機械を学ぶ

気を抜いたら前回の投稿から2ヶ月も開いてしまった。その間色々あったような気もするけど、とりあえず今思いついてることをメモしておこう。

最近はLisp熱が再燃している。そしてそれと同時にそろそろこの先自分がどういう分野を勉強しようか、それを考える足がかりとしてチューリング機械について学び直している。
(ちなみに今は計算複雑性理論を学びたいなーなんて漠然と考えている)

チューリング機械についての簡単なことは随分前からwikipediaなんかで読んだこともあったし本で目にすることもあった。それどころか昨きちんと大学の授業の中で勉強する機会もあった。
しかしやはり表層的な理解しかしていないのではないかと薄々感じてはいた。
そこで偶然図書館でこの本をみかけたのでとりあえず読んで見ることにした。


いや正直なところをいうと実は勘違いして本来とは別の本を借りてしまったのだ。
当初借りる予定だった本はこちら。




Amazonのオススメか何かでよくみかけていた。
しかし今になって見てみると後者はあまり評判が良くなく、前者の方がレビューは高評価だったのでまぁいいかと思っている。とりあえず、「チューリングを読む」を読み終えたらこちらも借りてみようかと思っている。

これと並行してLispSBCLでのCommon Lispの勉強もしている。
今回はそんな中思いついたことをいくつかメモしておこうと思って投稿を書いている。

[その1]
Lispにおいてプログラムとはデータである、という文言をよくみかけるけど今までよくわからなかった。
とりあえずシングルクオートがそれを直観的に理解する分かりやすい例だと今は思っている。
本当はS式の仕組みだとかマクロだとかのことかもしれないが、ともかくぼくにはそう感じた。

[その2]
チューリング完全の性質には「自己記述が可能である」が含まれている?
でも自己記述とは2種類あるのではないか
1.自己複製
要するにクワイン、自己増殖をするプログラムのこと。
現実ではウイルスとか。ニコニコ動画ライフゲーム動画の最後にあった。

2.自己言及
フラクタルみたいな。枠組みそのものをコピーする。
Lisp上でのLispの実装とか、ライフゲームの中でライフゲームとか。

前者はある体系の中で自己言及を行うオブジェクトが記述できるという話。
しかし後者はある体系そのものを自己言及し、再現することが可能という話。
枠組みの段階、というかメタ度(?)が異なっている。
GBE本に再挑戦する必要があるのだろうか。

[その3]
色々な文章で既に書かれているが、Lispはことこのチューリング機械にかんする話題と親和性が高いらしい。
それはやはりLispメタプログラミングしやすいという特徴からきているのだろうか。
なぜLispなのか? そこをもう少し知りたいと思う。


ps.
Lispの勉強法をゆるく募集している。
とりあえずりりかる☆Lispを終えて、はじめての人のためのLispを途中まで読んでいる。
でもはじめての〜は途中でわけがわからなくなって投げてしまった。
再入門には何が良いだろうか?
他の言語に比べれば数は少ないが、それでも入門書はある。
問題は、またそれらを読んでも挫折するんじゃないかという点だ。
プログラミングの本は安くないのでできれば入門書は一冊に留めたいところ。

2013/1/8 追記
タイトル脱字を修正

選択と未練

ruby on railsを扱うということで事前に勉強していったけれど、研修ではまだ使っていない。
というかJavaScriptが便利すぎるのだ。
あまり面倒なことをしようと思わなければ、たいていのことはHTML+CSS+JSですむ。
今回のrails使用も「え、それでrails使うの?」という気がした。
railsのインストールやらMVCやらデーターベースやら使えるようになるまでに必要となる知識の習得コストが高すぎるんじゃないかと思う。それだけの知識を要請する機能を実装したい、というのなら話は別だが、今回の件はどうもそうは思わない。

一番気になるのは保守性と速度だ。
都合上、JSを使った方が早い部分が多い。特にUIに関わる部分は。そうなるとJSが外せなくなる。つまりJSとrubyのコードが混ざった状態になる。それはソースコード保守の観点から考えて大丈夫なのだろうか?
HTMLとCSSが別ファイルになっているにも関わらずそういった心配がないのは、おそらく機能面で階層が異なっているからだと思われる。HTMLは組み版を作り、CSSはデザインやレイアウトを作る。それぞれの階層は切り離されている。しかし、JSとrailsではサイトの動的部分というほぼ同じ階層を扱っている。
そういうのは体験してみないことにはわからないが、どうも心配だ。

そして速度面。JSが速いとも、railsが遅いとも言わない。というかそもそも両者の速度を感じられるほどまだ慣れ親しんでいない。
だが、railsの高速化とJSの高速化、これらに関するウェブの資料にはかなりの差があると思う。
皆JSの高速化には興味があるが、railsの高速化となると一部の人間しか気にしないのではないか。
これから作るサイトの速度面はほとんど気にする必要のないものだが、簡単に、より多くの高速化体験を得られるJSにどうしても未練を感じてしまう。

最終的に「今後の拡張性を考えるとやはりrailsがよい」と言われて納得してしまった。
今度研修が終わったら自分でJSを使ったサイトを作って見ようか。

それと最近若干いろいろな言語に手を出しすぎて器用貧乏的な状況になっている感が否めない。
何かを極めなければ。

これも車輪の再発明か

Rubyでとりあえず簡単なプログラムは書けるようになったので、cygwinemacsを導入がてらproject eulerの問題を解いてみた。
余談だがcygwinのapt-cygの挙動がどうもおかしい様子。
既に気づいていた人がいるらしく、七日前の記事に修正したという内容が載っていたが自前の環境での修正方法がわからないので放っておいている。
irbが使えないのが地味につらい。

さて、rubyに触れていてきづいたこと。
CやJavaでいうfor文を回す時pythonではrange関数を使う。
rubyでこれと同じような動作をするRangeクラスがある。
こちらは関数ではなくクラスとして定義されていて、こういう使い方をする。

for i in 1..10
  print "#{i} "
end
#=> 1 2 3 4 5 6 7 8 9 10

で、じゃあ「10..1」という書き方ができないのかと試してみたら動かない。
エラーではなくそこの部分が無視されてしまう。
じゃ、1..10.reverseで、と思ったらエラーが出た。
(最初、Rangeクラスというものを知らなくて、てっきり配列だと思っていたのだ。)
Rangeクラスにはreverseはないらしい。
そこで仕方なくdownto()を使うことにした。

10.downto(1) do |i|
  print "#{i} "
end
#=> 10 9 8 7 6 5 4 3 2 1

うん、これなら動く。
で、ここまできてようやくRangeクラスというものの存在を知って「ruby range 逆順」でググったら既に同じような記事がいくつかあった。
その記事によるとRangeクラスにsuccが使われているため、らしい(?)。
つまり昇順(段々大きくなる順序)しかないわけで。

直観的なプログラミングをするとしたら10..1は欲しいと思うんだけどなぁ。

Ruby-ing now

最後の投稿から一ヶ月以上開いてしまった。
これは反省しなければならない。

現在帰省先でRubyを学んでいる。結局夏期休暇は9/6~9/20の間インターンに行くことになった。
逆に言えばそれ以外の期間は全て暇だというわけでもある。
折角なのだからきちっと何か身につけよう、ということもあって書籍も色々持ってきた。

今回の夏期休暇で手を付けようと思っているテーマは三つ。
Ruby
機械学習
・セキュリティ

後ろ二つは単純な興味からきているのだが、Rubyインターン課題という外部要因があったためだ。
最初はPythonでプログラミングしてるしRubyくらい三日で身につくだろうと思っていた。
しかし帰省して五日近く経つが、まだ制御文が終わったあたりだ。
いや、単純にサボりすぎただけという話である。
だがここまでくれば後は実際にコードをガリガリ書くだけの話だろう。
これからRuby機械学習のコードを書こうと思っている。

機械学習は元々興味のある分野で、以前からどうやって勉強したらいいかと考えていた。
折角なのだから自分の手で実装したいと思っていたが、「機械学習」で見つかる情報の大体は数式や理論ばかりで一見しても実装の仕方がわからなかった。
更に在籍する大学の図書館で「機械学習」を探すとどれも既に借りられてしまっていた。
研究室選びでもぜひこの分野を軸に考えていきたいところなので今の内に基礎だけでも身につけたい。
ただ問題なのは研究室が志望する生徒の中からどの生徒を採用するかを選ぶ際、完全に成績のみしか見られないという点だ。
つまりいくら適正や希望があろうと成績がよくないとどうにもならない。
今はどうか希望研究室に入れますようにと祈って学習を続けるしかない。


セキュリティについては応用情報(AP)に合格したので、折角だから秋も何か挑戦しようと思ったのが理由だ。
ただ正直今度の情報セキュリティスペシャリスト(SC)に合格できる気がしない。
まだ2ヶ月もあるのに何を今からと思うかもしれないが、9月まではインターンにかかりっきりだろうし、10月から始めて間に合うような学習量ではない。
SCにはもう申し込んでしまったので引くに引けない。やれるだけやってみようとは思う。



はじめてのじぇねりっくぷろぐらみんぐ

あと2,3週間を目処にバイトをやめようということで、先生に話した結果ライブラリの拡張作業を行うことになった。
実はライブラリを作ったことがなかったりする。
それで見せられた基となるメインプログラムとライブラリが、C++のtemplateをふんだんに駆使したジェネリックプログラミングによるものだった。
実は以前LSHをやめる際、先生に参考として見せていただいたソースもジェネリックな内容だった。
僕はそのコードを追っかけるのにいっぱいいっぱいで、とても自分がこんなコードを書けるとは思っていなかった。templateなんか恐怖の対象でしかなかった。templateを実際に書くわけではないコンテナですら、エラーログが意味不明過ぎてわけがわからなかったのだ。コレに加えて自作のtemplate関数・クラスなど正気の沙汰とは思えない、というわけだ。

だがいつまでもそうも言っていられないわけで、ともかく取り組んでみることに。
今回は直前までのmultiprocessingと違って参考にすべきソースがあった。
これが何よりも一番の手助けとなった。わからない部分(主にoperatorとtemplate)は検索や書籍で補いつつ、コードをちょこちょこ書いては消しを繰り返した。
一番辛いのは今までのようにflymakeを使って連続的にコーディングできなかったこと。
仕方なかったのでGCCとclangの両コンパイラコンパイルしてエラーログを見比べつつ逐一修正する作業を行なっていた。
自分でも非常に効率が悪いような気がしてならない。
誰か改善案を教えて欲しい。やはりIDEを使うべきだろうか。

とりあえずtemplateには慣れてきたように思う。なんとなくだが、どうしてここでtemplateを使い、どうしてここでtypedefをするのかが見えてきた。しかしやはりなぜ静的言語でわざわざジェネリックプログラミングを? と思わずにはいられない部分もある。
もっと言語仕様と設計思想から理解しなければ見えてこない部分が多いんだろうと思っている。

今回は自分で一からコーディングしたわけではないのでソースを公開できそうにない。
いつかは自分もあんなパワフルなライブラリを作ってみたいと思う。

ところでC++のソースを何時間も眺めていてふと思ったのだけれど、実際の現場ではC++による開発はどのように行われているのだろう。
プロジェクトのチームで規約を守りながら使う言語とも、一人の優秀なプログラマーが爆速開発に使う言語とも違う気がする。
前者ならJavaとかもっと意思統一しやすい言語があるだろうし、後者ならLLの方がいいだろう。
C++はあまりにも自由に書けすぎて、しかし使うのには重すぎるように感じる。
C/C++と考えてパッと浮かぶのは他の言語の基盤だとかOS開発だとかだが、それはどちらもC言語であってC++ではないような気がする。となるとやはり組み込み系だろうか。リソースが限られた分野などに強そうだ。
メモリもそうだがきっとC++による非常に強力なデータ構造が高速化をもたらすのではないだろうか。
これからももっと書き続けてこの言語の長所を見極めたいと思う。