Born Too Late

Yuya's old tech blog.

Python4PHPer 第2回講習会に行ってきた

2010-01-31 22:49:21

PHP-users のメーリングリストへの告知がきっかけで行って参りました。予想をはるかに越える、素晴らしいイベントだったので、その凄さを簡潔に紹介。

主催者が凄い

主催者である桑田氏は過去に、RubyKaigi、PHP Conference、YAPC など様々なイベントにおいて講演を行っている。Web サイト kuwata-lab homepage においては、Python 向けのテンプレートエンジン pyTenjin を始め、多数の開発者向けプログラムを提供している。根っからのプログラマーという印象。

間口の広さが凄い

タイトルの通り、PHP ユーザーを対象とした講習会であり、プログラミングはある程度できることが求められるものの、「Python に関しては全く知らない」という人でも参加できるようにプログラムされている。それでいて、最後には Google App Engine 上で、Big Table を利用したプログラムを動作させるところまで行く。

反面、ある程度 Python が書ける人に取っては、退屈な部分もあったかもしれない。講習会前に 3 日ほど予習していただけの私でさえ、最初の数時間は既に覚えた文法のおさらいがほとんどという感じ。

ただ、桑田氏の、プログラミング一般や、Python 言語仕様に関する理解は凄まじいものがあり、「オブジェクト指向の仕組み」や、「メソッドの名前解決の優先順位」などの、興味深い話も聴けるので、Python がある程度書ける人にも、十分楽しめる内容だったことでしょう。

スケジュールが凄い

10:00 ~ 21:00 という予定で、実際にはそれも少しオーバー。それだけの長時間を、桑田氏ひとりで進める。もちろん休憩はあるものの、全員心地よい疲労感とともに講習会を終えたことと思います。

テキストが凄い

講習会は、桑田氏自作のテキストをベースに進められる。その量、PowerPoint で 200 ページ超。Python と PHP を比較しながらの解説も大変わかりやすい。

コストパフォーマンスが凄い

上記のテキストを始め、準備にはかなりの時間が割かれていることと思われますが、それでも参加費は 1 人 500 円と格安。元が取れないわけがない。

また、女性、カップル、中学生以下は無料となるそうです。

まとめ

初心者にもやさしく、全員が一定の目標を達成に到達でき、主催者がともに喜んでくれる、楽しい講習会でした。そんなわけで、次回も是非参加したいと思っています。
(ですが、次回はもうちょい早めに終わって、懇親会とかもあればと思っていたり。)

仕事で Python を使う、という人は、日本にはなかなかいないかと思いますが、純粋にプログラミングが好きな人は、是非次の機会に参加してみてください。

関連リンク

その他の参加者によるブログ

JavaScript をコンソール上で実行する

2010-01-30 18:49:04

JavaScript というと、通常は Web ブラウザ上で動作するスクリプト言語として有名ですが、実はコンソール上で動作させることもできます。それを可能にするのは、Rhino という Java で実装された JavaScript エンジンです。

インストール

Debian, Ubuntu ならインストールは超簡単。

$ sudo apt-get install rhino

以上。もちろん Java の実行環境が必要ですが、ここでは割愛。

書いてみる

メモ化されたフィボナッチ数列。strict オプションもあります。

$ vi memoize.js
#!/usr/bin/rhino -strict

var fibonacci = function (n) {
  return n < 2 ? n : fibonacci(n - 2) + fibonacci(n - 1);
};

var memoize = function (func, memo) {
  memo = memo || {};
  var _func = function(arg) {
    if (typeof memo[arg] === 'undefined') {
      memo[arg] = func(arg);
    }
    return memo[arg];
  };
  return _func;
};

fibonacci = memoize(fibonacci);

for (var i = 0; i < 10; i += 1) {
  print(i + ': ' +fibonacci(i));
}

動かしてみる

実行権限を与えれば、通常のプログラムのように実行することができます。

$ chmod +xr memoize.js
$ ./memoize.js
0: 0
1: 1
2: 1
3: 2
4: 3
5: 5
6: 8
7: 13
8: 21
9: 34

もっと手軽に動かしてみる

Rhino を直接起動することで、対話式インタプリタとしても使えます。Ruby でいう irb ですね。

$ rhino
Rhino 1.7 release 2 2009 05 12
js> '!onihR olleH'.split('').reverse().join('');
Hello Rhino!

何がうれしいか

月曜は早めに出勤して、仕事用 PC の Cygwin にも入れてみたい。

MySQL で学級委員を選出する... それも全クラスで

2010-01-23 15:36:19

ある学校の、生徒の名前と、その所属クラスを記入した、以下のようなテーブルがあるとします。なお、これらのデータは擬似個人情報データ生成サービスにより出力されたもので、全て架空です。

mysql> SELECT * FROM students;
+-----+---------------------+---------------------------------+---------------------+----------+
| id  | name                | kana                            | roman               | class_id |
+-----+---------------------+---------------------------------+---------------------+----------+
|   1 | 大森 比呂美         | オオモリ ヒロミ                 | Oomori Hiromi       |        1 |
|   2 | 長野 紗矢           | ナガノ サヤ                     | Nagano Saya         |        1 |
|   3 | 杉浦 円             | スギウラ マドカ                 | Sugiura Madoka      |        1 |
~~~
| 198 | 寺本 禎             | テラモト タダシ                 | Teramoto Tadashi    |        5 |
| 199 | 高橋 満雄           | タカハシ ミツオ                 | Takahashi Mitsuo    |        5 |
| 200 | 柴山 謙一           | シバヤマ ケンイチ               | Shibayama Kenichi   |        5 |
+-----+---------------------+---------------------------------+---------------------+----------+
200 rows in set (0.00 sec)

5 クラスあり、どのクラスも 40 名、総勢 200 名の学校です。

さて、それぞれのクラスから 1 名ずつ、学級委員長を選出するとします。当然立候補者はおらず、推薦のなすりつけ合いになることでしょう。そこで、全クラスとも、抽選で学級委員を選出することになりました。

それぞれのクラスでクジを作るのもいい考えですが、我々エンジニアは、MySQL によるソリューションを行うべきでしょう。というわけで以下の SQL を実行。

SELECT
  class_id,
  SUBSTRING_INDEX(GROUP_CONCAT(name ORDER BY RAND()), ',', 1) AS name
FROM
  students
GROUP BY
  class_id

この SQL から得られる結果は以下の通り。

+----------+---------------+
| class_id | name          |
+----------+---------------+
|        1 | 戸田 有沙     |
|        2 | 大森 一行     |
|        3 | 金山 清志     |
|        4 | 藤木 啓一     |
|        5 | 岩渕 雅彦     |
+----------+---------------+
5 rows in set (0.00 sec)

そして、この SQL は、常にランダムな抽出を行うので、当然結果は毎回異なります。例えば以下のように。

+----------+---------------+
| class_id | name          |
+----------+---------------+
|        1 | 高見 幸子     |
|        2 | 森川 里菜     |
|        3 | 塩崎 凛乃     |
|        4 | 高畑 栄三     |
|        5 | 柴山 謙一     |
+----------+---------------+
5 rows in set (0.00 sec)

また、選出された学級委員の名前だけではなく、生徒番号やフリガナ等の情報も紐付ける必要がある場合は、以下のように少々複雑になります。自己結合を使います。

SELECT
  sub.class_id,
  sub.student_id,
  students.name,
  students.kana,
  students.roman
FROM
(
  SELECT
    class_id,
    SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY RAND()), ',', 1) AS student_id
  FROM
    students
  GROUP BY
    class_id
) AS sub
LEFT JOIN
  students
ON
  sub.student_id = students.id
+----------+------------+------------------+------------------------------+-------------------+
| class_id | student_id | name             | kana                         | roman             |
+----------+------------+------------------+------------------------------+-------------------+
|        1 | 32         | 湯川 信明        | ユカワ ノブアキ              | Yukawa Nobuaki    |
|        2 | 78         | 金丸 紗良        | カナマル サラ                | Kanamaru Sara     |
|        3 | 111        | 熊倉 美千子      | クマクラ ミチコ              | Kumakura Michiko  |
|        4 | 150        | 吉田 長次郎      | ヨシダ チョウジロウ          | Yoshida Choujirou |
|        5 | 167        | 日比野 善之      | ヒビノ ヨシユキ              | Hibino Yoshiyuki  |
+----------+------------+------------------+------------------------------+-------------------+
5 rows in set (0.00 sec)

この抽選作業を MySQL で実現する上で、あまり日の当たらない (と、少なくとも私は考えている) 関数が 2 つほど活躍しています。それらについてはまたの機会に紹介しようと思っています。こんな、MySQL クックブックの隅にも載らないような SQL は何人の役に立つかはわかりませんが、GROUP_CONCAT は意外とできる子なので、皆さんも是非使ってみてください。