セキュリティ & プログラミングキャンプ・キャラバン 2008 京都2009年02月11日 16時54分

セキュリティ & プログラミングキャンプ・キャラバン 2008 京都に行ってきました。セキュリティ & プログラミングキャンプとは、IT 分野において優秀な若者の発掘・育成を目的として、22 歳以下の学生を対象に毎年夏に行われている合宿 (参加費無料) です。中学生の参加者もおり、普段はなかなかできないコンピュータの話題で盛り上がるそうです。

キャラバンはキャンプの紹介のためのイベントで、プログラミングとセキュリティに関する講義や昨年のキャンプの様子の公開などがありました。詳しい内容については「セキュリティ&プログラミングキャンプキャラバン2008 レポート - y_tsuda's blog - s21g」やそこからとだれるページ、はてなブックマークで「caravan2008」タグをつけられたページなどを参照してください。

個人的に印象に残ったのは、「セキュリティ & プログラミングキャンプの選考に受かるコツは?」という質問に対する回答です。絶対的なコツはないという前置きの下で、自分から情報発信をすること、活動が見えないと評価ができないという話でした。キャンプの選考に限らず、IT 分野において情報の発信は非常に重要だと思います。

私の場合、WEB+DB PRESS に連載を持たせていただいたり、はてなインターンに参加させていただいたりということがありました。こうした機会を得られたのは、ちょうど Ajax ブームが起きて JavaScript に注目が集まったという「タイミングがよかった」面もありますが、ひとつ確実にいえるのは、このブログを書いていなければそのような機会はなかったということです。

現在個人が情報発信する場として代表的なのはブログですが、ブログでは何かすごいことを書かないといけないというようなことはまったくありません。わからないなら何がわからないのか書けばいいのです。勉強会に行こうという話もありましたが、勉強会に行って何が楽しかったかブログに書くだけでもずいぶん違うと思います。私自身は筆不精でついついブログの更新が滞りがちなのですが (^^;)、そうしたブログを読んでいくのは楽しいし、新たな気づきが得られることもたくさんあります。

そのほかキャラバンでは、セキュリティ & プログラミングキャンプは 22 歳以下だけど、大学院生も参加できる IT Keys という取り組みもあるという話、脆弱性を報告したが製造者から「仕様です」と言われたときに、引き下がって愚痴るのではなく製造者やコミュニティに働きかけて悪い仕様を良い仕様に変えていこうという話がありました。

全体を通して主催者側のキャンプにかける意気込みが伝わってきて、若年層にはぜひキャンプに参加してほしいと感じました。同じ志を持った同年代の人たちと知り合えるというだけでも刺激的な体験になると思います。また、このような取り組みが今後も継続していけるよう、自分にできることがあれば積極的に協力していきたいです。

最後に、勉強会に行こうという話があったといいましたが、現在私が参加している主な勉強会に、関西の JavaScript 勉強会 Kanasan.JSSICP 読書会 (こちらは最近タイミングが合わずご無沙汰していますが) があります。Kanasan.JS の方はこの 2 月 22 日 (日曜日) に Greasemonkey チュートリアル読書会が開かれるので、お近くにお住まいの方はぜひ参加してみませんか。午前中には同会場で Haskell 勉強会 実践編も開かれます。

第 7 回アルゴリズムイントロダクション輪講会資料2008年12月04日 23時08分

すでにニュースでも伝えられている通り、12 月 1 日に第 7 回アルゴリズムイントロダクション輪講会がありました。今回の担当は私だったので、その発表資料を公開します。

  1. 中央値と順序統計量 (その 1)
    1. 予定
    2. 順序統計量とは
    3. 選択問題とは
    4. 最小値と最大値
    5. 平均線形時間選択アルゴリズム
  2. 中央値と順序統計量 (その 2)
    1. 最悪線形時間選択アルゴリズム
    2. 3 つずつのグループに分割した場合
    3. 7 つずつのグループに分割した場合
    4. 参考文献
  3. 中央値と順序統計量 (補足)
    1. 4 つずつのグループに分割した場合
    2. 6 つずつのグループに分割した場合
    3. Lazy-Select
    4. Randomized-Partition
    5. スタッフロール

「どうせ後から Web で公開するんだから、PDF とか見るのに手間がかかるものは使ってられないよね。やっぱ時代は XML 複合文書でしょ!」と、数式を表現するのに MathML を使いまくったら、なぜか Firefox 以外ではまともに表示されなくなってしまいました。ホスト言語が XHTML なので、IE にいたっては地の文の表示すらできません。

とは言っても MathML の仕様書を斜め読みしただけなので、適切でないマークアップが結構含まれています。本当は図も SVG で表現したかったのですが、いろいろと余裕がなかったのであきらめました。資料が 3 つ (本番では補足を除く 2 つ) の文書に分かれているのは、Firefox で MathML の要素数が一定数を越えると、文字揃えが効かなくなるというバグに遭遇したためです。

なお、MathML の記述に当たっては以下を参考にしました。

ちなみに私は今のところ風邪の症状は出ていないようです。

はてなインターンを終えて2008年09月24日 21時25分

先に書いたように 8 月は株式会社はてなのサマーインターンシップに参加していました。もう第 2 回も終わろうかというころですが、遅まきながら私の場合についてまとめたい思います。

インターン生の 1 日

「インターン生の」とつけましたが、特に後半 2 週間は何らかのチームに参加しての開発だったのであまり社員と変わらないかと思います。就業時間は 10 時から 19 時となっており、朝は東京オフィスとビデオでつないだ全体ミーティングから始まります。ここでは前日のリリース報告やはてな社に関する活動報告、当日の予定確認があります。その後はチームミーティングで、チーム (数人) の各員が前日の作業内容、当日の作業予定を報告します。私が配属されたキーワードチームには近藤社長も所属しており、社長自ら各自の報告に質問や感想をはさむことも多々ありました。これらのミーティングは不必要に長引くのを避けるためかすべて立ったままで行われ、時間は合わせて 30 ~ 50 分ほどでした。キーワードチームは人数が多めだったため、ややチームミーティングの時間が長かったかもしれません。

ミーティングが終わると開発に移ります。インターン生は基本的に二人一組でチームに配属されるので、配属後しばらくは相方の ninjinkun とのペアプログラミングが中心でした。後の方になるとリリース予定日に追われて二人が別の作業を進めることも増えてきました。私はインターン生だったのでミーティング後はひたすら開発、一区切りついたら、あるいは行き詰ったら社員を訪ねて、サーバーでの確認やアドバイスを求めるという感じでした。社員の人は単純な開発作業に加えて、サーバー調整のためにインフラ・運用チームの人とのミーティングなど、小さなミーティングをいくつかこなしていたようです。

お昼は 13 時からで、週 3 回はオフィスランチが出ます。オフィスランチがないときもご飯だけは炊いてもらえ、別途お弁当屋さんからおかずだけ買って一緒に食べることもできます。炊き立てのご飯が食べられることによる開発意欲の向上は目覚しいものがあり、私などは「初日に来たときは今にも死にそうなくらい顔色が悪かったが、毎日オフィスランチを食べているうちにどんどん顔色が良くなっていった」(伊藤直也氏談) と言われるほどでした。ランチ後もお昼休みはゆったり過ごすことができ、私の場合は社内に転がっているクッションでお昼寝することもしばしばでした。

午後も開発は続きますが、ここで重要なのがフリードリンク・フリースナックです。パイの実やチョコボールといった甘いものをつまむことで脳に糖分を補給し、万全の状態で開発に臨むことができるのです。私はもっぱら緑茶 (ハトムギ茶系のお茶がなかったので) とチョコレート菓子で午後を乗り切っていました。と、ここまで書いて思い出したのですが、ドリンクやお菓子の種類はリクエストもできます (必ずかなえられるとは限りませんが)。十六茶や爽健美茶がほしければそうリクエストすればよかったんですね。

夜は大体 20 ~ 21 時くらいまで残っていました。オフィスランチが残っていればそれを夜食にすることもあります。私はそのまま家に帰ることが多かったですが、インターン生同士 (+ α) でインドカレーやラーメンを食べに行ったり、銭湯に行ったりもしました。

インターンに参加して

このインターンで、これまであまり経験がなかったサーバーサイドでのプログラミングとチームによる開発を体験することができました。成果であるランキング機能については ninjinkun の記事も参照してください。チームの皆さんに助けられつつ、自分がチームに、会社に、ひいては社会に少しでも貢献できたかもしれないと考えると、インターンに参加して本当によかったです。おかげでよりいっそうプログラミングを楽しいと思えるようになりました。

また、会社は顔が見える人たちだけで回っているのではないということも実感しました。はてなのエンジニアといえば伊藤直也さん田中慎司さんが有名ですが、それ以外にも多くの有能なエンジニアによって各サービスは支えられており、さらにエンジニア以外のスタッフも一体となってはてなは成り立っているということがダイレクトに伝わってきました。

ほかの会社を知らないので比較はできませんが、ユーザーにじかに使ってもらえるサービスを Web 上で提供したいというときに、はてなは開発者にとって素晴しい環境を提供してくれる場所であると思います。

はてなインターンに参加しています2008年08月19日 03時35分

現在株式会社はてなのインターンシップに参加しています。期間は全 4 週間で、前半 2 週間で製品レベルのコードを書けるようにし、後半 2 週間で実働中の開発チームに所属し実際のサービス開発に携わるという流れです。

前半の詳しいカリキュラムは「0×0018 till I die ? はてなインターンのカリキュラム」に紹介されていますが、実務に関われるようにするというだけあって密度の濃い内容となっています。特に大規模データ処理は私にとって未知の分野であり、はてなの実データを使った演習が受けられるというだけでも大きな経験となりました。

基本的にはてなでは Perl が用いられますが、私自身の Perl の経験は 6、7 年前にゆいちゃっとを改造し、4、5 年前にオブジェクトの作成をやったくらいで止まっていたので、今回インターンに参加するに当たって再入門として perldoc を読み直しました。といっても目を通したのは各種チュートリアルと構文、データ型、サブルーチン、演算子、関数などの一部だけですが、各課題についていける程度にはなったと思います。ちなみに perldoc を選んだのは、一番入手が簡単 (さらに無料) で信頼性が高い (なんといっても公式) と思ったからです。

また、文法的なことは perldoc を読めばすぐわかるのですが、意外とわからないのがライブラリパスの設定やテストの実行方法。私が見聞きした範囲だけでも私も含めたインターン生 4 人が prove コマンドの存在を口伝で知ったとのことで、言語自体に比べそれを取り巻く環境の情報は共有が遅れているのではないかと思います。perl-users.jp は真っ先に

  • アプリケーションディレクトリ
    • lib
      • モジュール.pm
    • t
      • テスト.t

というディレクトリ構成と use FindBin::libs と prove コマンドと cpan コマンドの使い方を教えてもいいのではないでしょうか。

話をはてなに戻すと、社内は開放的であり、静かではあってもほかの人に話しかけづらいという雰囲気ではありません。見渡せば小規模ミーティングもあちらこちらで行われています。京都は美人が多いですし、Web アプリケーションの作成、またはその裏側に広がる大規模データ処理に興味がある学生はぜひとも参加してみることをお勧めします。第 2 回の応募締め切りは明日 20 日までなので、迷っている方は急いで申し込みましょう。

SICP 読書会 #22008年06月10日 23時23分

yukky さん主催の SICP 読書会、その第 2 回に参加しました。今回はあらかじめ予習範囲を提示し、最初の 30 分間でそこを読み進めた上で、後はもっぱら範囲内の問題にあてるという形式でした。私の分も含め各人の解答は当日のチャットログから参照できます。

開始前の空き時間で最初のほうの問題をやっておいたのですが、それでも時間がぜんぜん足りなくて息切れしてしまいそうでした。予習復習をしっかりしておかないとちょっとつらいかもしれませんね。

丸括弧と角括弧

Gauche では (Scheme では?) 丸括弧の代わりに角括弧も使えるので、cond の条件節に使うと読みやすいと教えてもらいました。確かに読みやすくはなりますが、なんだか美しくないような気がするのは私だけでしょうか。

(define (square x) (* x x))

; b の n 乗を求める
(define (expt b n)
  (cond [(= b 0) 1]
        [(even? b) (square (expt (/ n 2)))]
        [else (* b (expt b (- n 1)))]))

ユークリッドの互除法

最大公約数を求めるアルゴリズムとして有名なユークリッドの互除法ですが、英語では Euclidean algorithm といって、「互いに割る」というようなニュアンスは直接的には含まれてないのですね。

反復的プロセスへの変換

累乗と乗算を求める関数を、再帰的プロセスから反復的プロセス (末尾再帰) に直せという問題が出てきます。いろいろ悩んだすえ、以下のように考えにたどり着きました。

; b の n 乗を求める
(define (expt a b)
  (define (iter b n acc)
    (cond ((= n 0) acc)
          ((even? n)
           ; ここをどう書くか
           )
          (else
           ; ここをどう書くか
           )))
  (iter b n 1))

iter はどういう関数かを考えます。S 式表記から離れますが、acc = 1 のとき exp-iter(b, n, 1) は b^n を返します。n = 0 のとき、iter(b, 0, acc) は acc を返します。これらから考えていくと、iter は iter(b, n, acc) = b^n * acc という関数であることが推測されます。n が偶数のときは n / 2 が整数ですから、

  b^n * acc
= b^(n / 2 * 2) * acc
= (b^(n / 2))^2 * acc
= (b^2)^(n / 2) * acc

という変形が成り立ちます。n が奇数のときは、

  b^n * acc
= b^(n - 1 + 1) * acc
= (b^(n - 1) * b) * acc
= b^(n - 1) * (b * acc)

となります。つまり、

  • n が偶数なら iter(b, n, acc) = iter(b^2, n / 2, acc)
  • n が奇数なら iter(b, n, acc) = iter(b, n - 1, b * acc)

となるのです。後はこれを S 式に戻してやれば以下のように完成します。

; b の n 乗を求める
(define (expt a b)
  (define (iter b n acc)
    (cond ((= n 0) acc)
          ((even? n) (iter (square b) (/ n 2) acc))
          (else (iter b (- n 1) (* b acc)))))
  (iter b n 1))

フィボナッチ数の対数的ステップでの計算

問題 1.19 は線形写像の行列表現を利用してフィボナッチ数を O(log N) のステップ数で求める問題です。(bq+aq+ap bp+aq)T = Tpq (a b)T から行列 Tpq が求められるので、Tp′q′ = Tpq2 より p′、q′ も求められますね (行列の右肩の T転置を表します)。

四元数

なぜか SICP とはあまり関係のない四元数の話も出ました。四元数は応用として 3 次元空間での回転を表現するのに用いられますが、四元数そのものは実 4 次元ですよね。