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 を使う、という人は、日本にはなかなかいないかと思いますが、純粋にプログラミングが好きな人は、是非次の機会に参加してみてください。
関連リンク
その他の参加者によるブログ
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!
何がうれしいか
- バッチ処理を JavaScript で書ける
- ユニットテストを行いやすくなる
- ちょっとしたテストにも便利
月曜は早めに出勤して、仕事用 PC の Cygwin にも入れてみたい。
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 は意外とできる子なので、皆さんも是非使ってみてください。