『ステートフルJavaScript』――JavaScriptを堅牢に築くパーツの世界

2012/09/07 17:10:38

ステートフルJavaScript ステートフルJavaScript ――MVCアーキテクチャに基づくWebアプリケーションの状態管理

Alex MacCaw (著)、 牧野 聡((翻訳)
オライリージャパン
2012年6月
ISBN-10: 487311554X
ISBN-13:978-4873115542
2940円(税込)


■JavaScriptを堅牢に扱いやすくするための本

 JavaScript関連の本を読むときに気を付けなければならないこと。「この本は、どの立ち位置なのか?」「何が言いたいのか?」を知ること。

 これらをきちんと理解して読まないと、とんでもない回り道をするはめになる。サーバサイドからクライアントサイドまで、JavaScriptがカバーする範囲は幅広いからだ。

 さて、本書の立ち位置はというと、カルーセルやアコーディオンのような、見た目を変化させるjQueryプラグインの紹介は一切ない。ユーザーインターフェイスを求めている人向けの本ではない。

 サブタイトルには「MVCアーキテクチャに基づくWebアプリケーションの状態管理」とある。ぼんやりとでも、この意味が分からなければ、読み解くことは難しい。ここでもあえてMVCの説明はしない。MVCの話が出るということは、「フレームワークの解説か」と思いきや、それも違った。もう少し細かいパーツの世界、フレームワークを構成する部品についての話である。

 つまり、JavaScriptを堅牢に扱いやすくするための本だと思えばいい。本書は、「フレームワーク」という大きな世界観を構成する小さな部品について書かれている。これは、JavaScriptで世界を築くための道しるべとなる。

■目次

  • 1章  MVCとクラス
  • 2章 イベントと監視
  • 3章 モデルとデータ
  • 4章 コントローラと内部状態
  • 5章 ビューとテンプレート
  • 6章 依存性の管理
  • 7章 ファイルの操作
  • 8章 リアルタイム Web
  • 9章 テストとデバッグ
  • 10章 アプリケーションのデプロイ
  • 11章  Spineライブラリ
  • 12章  Backboneライブラリ
  • 13章  JavaScriptMVCライブラリ

 前半はパーツ寄り、後半はライブラリの紹介だ。このコラムでは前半部分、その中でもアーキテクチャよりのトピックを拾いながら考察を深めよう。

■Class is difficult to use

 アーキテクチャ寄りの話では、関数型言語的側面からJavaScriptを攻略するのが最近の流行である。しかし、本書では、JavaScriptをオブジェクト指向言語として扱う。不易流行。

 まずは、クラスの考察から本書は始まる。

 JavaScriptはプロトタイプに基づく言語であり、それゆえにネイティブなクラスの実装というものは存在しません。しかしクラスの性質をエミュレートするのは容易です。

 JavaScriptでクラスを扱うのは難しい。オブジェクト指向言語では当たり前にある、クラスにアクセス制限を与えることでさえ、容易ではない。アクセス制限は、匿名関数の空間を閉じ込めることで、プライベート変数やプライベートメソッドを実現する。カプセル化を実現するためだけでも、知っておくべきことは多い。

 本書のサンプルから、もう少しかんたんな例を見よう。

var Person = function(name){
    this.name = name;
}

var alice = new Person('alice');
var bob = Person('bob'); // undefined!!

 JavaScriptは、細心の注意をもって記述する。こんなシンプルなコードが new演算子1つで変わる。new をつけない Person('bob') を実行するとどうなるだろう? 変数 bobが undefinedになるだけではすまされない。恐るべきことに、このコードはnameというグローバル変数を生み出してしまう。

 なぜか?

 new演算子は、コンテキストであるthisをインスタンス固有のオブジェクトに設定する。しかし、new演算子がなければ、単なる関数呼び出しでしかない。 関数呼び出し時のthis は windowオブジェクトを指す。つまり this.name は window.nameとなり変数nameはグローバル変数となる。それが邪悪な行為であることは言うまでもない。

■Event is easy to use

 JavaScriptのイベントと聞いて、何を思い浮かべるだろうか? まっ先に思い浮かぶのは、マウスのクリックや、入力エリアの値が変更されたときに連動した動きなどだろう。そういったユーザー操作のイベントは別の本に任せておこう。

 JavaScriptでは、プログラマが任意のタイミングで好きなイベントを発生できる。そして、そのイベントを自在に受け取れる。この仕組みがJavaScriptを輝かせる。イベント駆動のプログラムがかんたんに組めるメリットは、先ほどのクラスを作るためのデメリットを相殺する。

 イベントベースのプログラミングは、アプリケーションのアーキテクチャを疎結合化できるという点で非常に強力です。

 パブリッシュ/サブスクライブと呼ばれるメッセージ交換パターンは、プログラム間の依存性を低め、オブジェクトの独立性を高める。イベントというトリガーを自分自身のなかに持つことができるからだ。イベントベースのオブジェクトは他者から直接、呼び出されることなく状態が変化する。そのメリットが理解できなければ本書を読むのはまだ早い。

 かつてのMVCパターンはページが軸であった。1つのリクエストは、1つのページを表示することが当たり前の世界であった。StrutsなどのMVCアーキテクチャはページ単位を基本とする。せいぜいフレームやパネルという単位で疎結合であれば十分であった。

 Ajaxは世界を変えた。Ajax全開のアプリケーションでは、時としてDOM要素の1つ1つが、MVCの最小粒度になる。コンポーネントですら依存関係を持つことは許されない。Wicketやclickのようなコンポーネントベースのフレームワークの出現がそれを物語る。もはやMVCはページ単位ではない。主役の座はコンポーネントである。

 あるボタンを押すことや、ちょっとしたマウス操作をきっかけに、何かが変わる。そんな要件を満たすためにパブリッシュ/サブスクライブパターンがかんたんにできる言語は強力な武器となる。複雑な動作をするコードは「なんか、よう分からんけど、動いたからいいか」ではダメだ。

 本来、疎結合なプログラム、堅牢なプログラムは言語に依存しない。この本にはMVCアーキテクチャを実現するために考えるべき要素がたくさん詰まっている。特定の言語を抜きにして触れるのも面白い。

■How to build software

 JavaScript本を読むと、小さなテクニックの断片が目立つ。油断すると、ブラウザごとの差異やちょっとしたTipsをたくさん知ることがJavaScriptを勉強することだと勘違いする。そして、それをどれだけ知っているかが優秀なJavaScripterであるかのような錯覚をする。

 プログラム言語を学ぶとは、そんなことではない。「べからず集」を覚えることがプログラムではない。

 ロジックをいかに組むか――オブジェクト指向だけでなく関数型言語やファーストクラスオブジェクトを理解するとがJavaScriptの真の学習であるはずだ。本書が、プログラムとは何かを考えるきっかけの1つになればと思う。

『フリーなスキル』コラムニスト はがねのつるぎ)

『たのしい開発 スタートアップRuby』――なぜRubyistたちはあれほど楽しそうなのか

2012/08/24 14:32:31

Manual_2 たのしい開発 スタートアップRuby

大場寧子、大場光一郎、五十嵐邦明、櫻井達生(著)
技術評論社
2012年7月

ISBN-10: 4774151661
ISBN-13: 978-4774151663
2604 円(税込)

■なぜRubyistに惹かれたのか

 Rubyへの心変わりは誰の影響だっただろうか。

 業務と関係なければ、勉強しなくていいと思っていたはずだった。アジャイル系コミュニティに参加したしばらくあと、地域Rubyコミュニティに迷い込み、いつしか彼らと楽しくお酒を飲むようになっていた。

 アジャイル系コミュニティの人々が仕事について・技術について話している姿は楽しそうだった。

 彼らはRubyistでもあった。彼らの姿に惹かれ、僕もRubyを学び始めた。

 そうして門を叩いた地域Rubyコミュニティの人々も、アジャイル系コミュニティと同様に、技術について話している姿は輝いていた。

 そして、他の言語コミュニティとは、暖かさが違っていた。その暖かさに触れ、僕も彼らの仲間になりたいと思うようになった。

 なぜ僕は彼らに惹かれたのか。本書の中にその答えはあった。

■Ruby入門書というよりは、Rubyist入門書

 本書は、それまでのRuby入門書、いや、言語全般の入門書とは趣が異なっているRuby入門書というよりも、「Rubyist入門書」といった方が正しいだろう。

 本書の構成は次のように成り立っている。

  • Chapter1 「たのしい開発」を求めて
  • Chapter2 Rubyの基礎知識
  • Chapter3 Rubyを使ってみよう
  • Chapter4 Ruby on Railsとは
  • Chapter5 Railsを触ってみよう
  • Chapter6 Rubyの文化
  • Chapter7 自動化されたテスト
  • Chapter8 アジャイル開発とRuby
  • Chapter9 Rubyのコミュニティ
  • Chapter10 とある企業のRuby導入事例
  • Chapter11 「たのしい開発」の答え

 言語仕様についてではなく、Ruby on Railsや自動テスト、アジャイル開発やコミュニティについてなど、Rubyを取り巻く世界全体について書かれている。そしてRubyの文化は、これらの要素が合わさることでできている。

■Rubyの自由さ

 そもそもRuby自体が、自由度の高い言語である。Rubyは自分のやりたいことを直感的に表現できる言語であると、著者らは述べている。

 さらに、Ruby on Railsが進化の速いフレームワークであり、アプリケーションの自動テストを作っておかなければ、バージョンを上げることもままならないと述べている。そうした背景があり、RubyやRailsによるアプリケーション開発では、自動テストを作ることが当たり前となった。

 つまり、Railsを取り巻く世界では、自動テストの文化も発展していく。RSpecやCucumberなどはその典型であろう。その思想はいまや他の言語にも伝わりつつある。

 また、そうした自動テストツールにアプリケーションが支えられることで、要件が変わったりすることにも柔軟に対応できるようになった。

 結果として、Railsが

 プロセスやツールよりも、人と人の対話を
 包括的なドキュメントよりも、動くソフトウェアを
 契約交渉よりも、顧客との協調を
 計画に従うことよりも、変化への対応を

という、アジャイルマニフェストに従うことが容易になり、Rubyの自由さをより体現している。

■Rubyが楽しい理由

 このようなRubyの自由さ、プログラマを大切にする価値観の構成要素はこうして生まれていく。

 その結果、新しい技術に挑戦するプログラマにとっても、世界を変えようとするベンチャー企業にとっても、お客様に対する価値を最大化したいと願う受託開発プログラマにとっても、Rubyの開発そのものが楽しくなっていったのだろう。

 さらに、そうした開発を楽しむ人々がコミュニティに集って情報交換をしたり一緒に学んだりするのだ。コミュニティが楽しいに決まっている。企業もコミュニティを支援することで、その企業には優秀なエンジニアも集まってくるようになる。すると、その企業も盛り上がっていく。

 この流れはこれからも続いていくのだろう。だから著者たちは本書のカバーでこう宣言しているのだろう。「これからRubyはもっと楽しくなる」と。

■楽しい開発を目指そう

 では、どうすれば楽しい開発への一歩を踏み出せるのだろうか?

 著者らはこう述べている。

 やりたいこと、やりたくないこと、自分がどうしたいのか、どうしたらうれしいのか。それらに素直に目を向け、受け入れることが「楽しい開発」につながります。

 まずは著者らの言うとおり、そうした自分の想いを見つめ受け入れる。その上でRubyを学びたいとなれば、本書を皮切りにRubyについて1つずつ学んでいけばよいのではないだろうか。

 残念ながら、本書だけでRubyを使ったアプリケーションを作れるようにはならない。それは、本書であまりに広範な話題を扱った結果であり、文化を伝えるためには必要なことだったのだと思う。その代わり、本書の巻末で著者らはRubyを学ぶ道筋を示している。その道をたどっていけばよい。

 楽しい開発を目指そう。

『What a wonderful world』コラムニスト たのっち)

『リーダブルコード』――君からはコードのにおいがしないが、君のコードはにおう

2012/08/10 19:19:31

Manual_2 リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

Dustin Boswell (著)、Trevor Foucher (著)、角征典 (翻訳) 
オライリージャパン
2012年6月

ISBN-10: 4873115655
ISBN-13: 978-4873115658
2520 円(税込)

■このコード、なんだかにおうよ

 「コードのにおい(code smell)」という言葉がある。なんとなくこのコードは良くないぞ、バグを含んでいるか、あるいは将来にバグを引き起こしそうだぞ、という兆候のことだ。

 未熟、怠慢、無知などの理由によって生まれた駄目コードからは、往々にしてこの「コードのにおい」が漂ってくる。多くの責務を抱え込んだクラス、巨大で分岐の多い関数、繰り返し現れる同じ処理(それぞれちょっとだけ違ったりすると最悪)。しかし、書いた本人はたいてい「自分のコードが臭い」などとは、夢にも思わずに書いている。何が臭くて、その結果どのような良くないことが起きるかを学ぶ機会がなかったからだ。

 一方、良いコードはびっくりするほどシンプルなことが多い。変数やメソッドには分かりやすい名前がつき、処理の流れは見通しよく整理されていて、重複部分はすっきりと分割して再利用されている。

 同じ「コード」だというのに、この違いは何だろう? プログラマに「コードのにおいを嗅ぎ取る能力」があるかどうかだ。よいプログラマであろうとするならば「自分の書いたコードが臭い」なんてことには耐えられないはずだ。しかし、「何が臭いのか」を知らなければ、臭くないコードを書くこともできないだろう。

■においの見張り番

 本書「リーダブルコード」は、そんな「におうコード」のサンプルをたくさん収録している。

 コードのにおいを嗅ぎ取る能力があるプログラマにとっては、思わず鼻をつまみたくなるようなサンプルコードを載せ、それがなぜいけないか、そのコードのどこがにおうかを丁寧に解説し、そして「におわないコード」になるようにリファクタリングするまでの流れを、においの種類別に何度も見せてくれる。

 簡単な例を引用してみよう。

if/else 文のブロックは、並び順を自由に変えることができる。例えば、以下のように書くのと、

if (a == b) {
    // 第1のケース  
} else {
    // 第2のケース  
}

以下のように書くのは同じことだ。

if (a != b) {
    // 第2のケース  
} else {
    // 第1のケース  
}

 これまであまり深く考えなかったかもしれないけど、この並び順には優劣がある。

p.86 7.2「if/else ブロックの並び順」より

 

 「えっ、何か違うの??」

 そう思った人は、ぜひ本書を手に取って「なぜ優劣があるか」を学んでほしい。

 ちなみにこのページには、このコードがどう「におう」のかをユーモラスにあらわしたイラストがついている。このイラストは、普段から「におわない」コードを書いているプログラマにとっては、本文を読む前にニヤッと笑えることだろう。そうでないあなたも、ぜひ本文を読んでこのサンプルコードの「におい」を嗅ぎ取れるようになり、そしてこのイラストで笑えるようになってほしい。

■においがつかない無臭コードだ!

 本書の帯には「周囲の皆が喜んで使ってくれるような、リーダブルなコードを書く方法を楽しく解説!」とある。

 現実のあれこれと同様、「臭い」コードを「みんなが喜んで使ってくれる」とはとても思えない。チームで開発していたり、コードを公開したりしているプログラマの皆さんは、ぜひ本書を読んで、「臭くない」コードを書く技術を身に付けてほしい。

 そしてすでに「臭くない」コードを書けるプログラマのみなさんも、やっぱり本書を読んで「うんうんあるある」とうなづくだけの簡単なお仕事をしてみてほしい。

 もしかしたら、意外と知らなかったり忘れてたりしたことを発見するかもしれないし、そうでなくても、たくさんのユーモラスなイラストを眺めるだけでも楽しい時間が過ごせる。先ほど引用したp.86では「自分のペット紹介」で笑えるし、p.16「超硬い金属のクギを打ちつける棒状のもの」、p.174「あれでいいかもね」などが特に気に入っている。

■においは元から絶て

 世の中から臭いコードを減らすことは、回り回って皆さんの、そして私の仕事を楽しく快適にすることに直結する。本書がきっかけで「臭いコード撲滅運動」が盛り上がり、どんどん「臭いコード」と「臭いコードを書くプログラマ」を駆逐していくのが、今から楽しみである。

『Wife Hacks ~仕事と家族とコミュニティと~』
コラムニスト kwappa)

『iOSアプリケーション開発入門』――「iOSアプリの1本でも作っておきたい」エンジニアの指南書

2012/08/03 14:00:51

Manual_2 iOSアプリケーション開発入門

新居雅行(著)
技術評論社
2012年7月

ISBN-10: 4774151564
ISBN-13: 978-4774151564
3129 円(税込)

■自作アプリの経験はありますか?

 スマホ業界の勢いはますます加速している。この流れに乗って、スマホ業界への転職を考えているエンジニアもいることだろう。そして、スマホ開発企業は、「業務か自作での、アプリ開発経験」を採用基準とするところが多い。

 Titanium MobileやPhoneGapといった、ネイティブコードを触らずともクロスプラットフォームでアプリ開発できるプロダクトも登場している。私自身、Titanium Mobileを使ってiOSアプリをリリースしたことがある。

 しかし、今のところ仕事としてスマホアプリ開発に携わるなら、大半の現場ではiOSならObjective-C、AndroidならJavaで書くことを求められる、と感じている。

 本書は、スマホ業界に挑もうとする人にとっての先導役といえるだろう。

■書上のハンズオンセミナー

 著者 新居雅行氏は、iOSアプリ開発の講師業もしている。そのためか、実際に本書の内容を試すと、まるで著者のハンズオンセミナーを受けているような感覚でアプリ開発を体験できた。

 iOSでの各種オブジェクトの使い方とそのサンプルコードが載っているような本とは明らかに一線を画しており、実践的な開発を学べる本である。

 本書で扱う内容は次のとおり。

  • Chapter1 iOSアプリケーション開発者を目指そう
  • Chapter2 iOSアプリケーション開発の流れ
  • Chapter3 画像ファイルを表示するビューアを作ろう
  • Chapter4 スクロールする画像ビューアを作ろう
  • Chapter5 クラウド住所録を作ろう(ネットワークアクセス編)
  • Chapter6 クラウド住所録のインタフェースを作ろう(iPhone編)
  • Chapter7 クラウド住所録のインタフェースを作ろう(iPad編)
  • Chapter8 電子ブックビューアを作ろう
  • Chapter9 カメラと画像の顔検出機能を利用する

■実践的なアプリ開発トレーニング

 私にとって、一番の読みどころは、Chapter 5~7の「クラウド住所録を作ろう」だった。

 この章では、Amazon Web ServiceのSimple DBを使って、住所録アプリ開発を行うのだが、その中でネットワークアクセスやSAXによるXMLパースについて取り上げている。ここで取り上げている内容が、Web APIを使ったアプリを作る際に大いに役立つのではないかと思う。

 実際はオープンソースのDOMパーサライブラリやiOS5から標準で使えるようになったJSONパーサを使うことになるかもしれない。それでも、この章の内容を理解していれば、さほど苦しまずに開発していけるのではないか。

 また、本書ではiOS5から利用できるようになった「ストーリーボード」というGUIデザイナを用いた開発も紹介されている。iOSにおけるモダンな開発手法を学びたい人にとっても、参考となる1冊だろう。

■スマホ業界に挑む、最初の一歩

 一方、本書で取り上げていないことも数多くある。例えば、ローカルデータベース(SQLite)の扱い方やユニットテストの扱い方、バージョン管理(Git)の扱い方などだ。これらについて学ぶ場合は、別の書籍やWeb上の情報を参考にする必要がある。

 とはいうものの、これからiOSアプリ開発を学ぼうというエンジニア向けの書籍としては、初めからこれ以上の量を扱うのは苦しいとは思った。上記のような技術は、Objective-Cでの開発にある程度慣れてからでないと理解が難しいかもしれないからだ(私自身、かつてローカルデータベースを扱うあたりでObjective-Cの学習に挫折したことがある)。

 本書は、これからスマホアプリ開発を学びたい、もしくはそれを仕事にしたいと考えるエンジニアにとってよい助けになることだろう。

What a wonderful world』コラムニスト たのっち)

『Mobageを支える技術』――1日35億PVを支える、ソーシャルゲーム技術の全貌

2012/07/24 15:26:22

Manual_2 Mobageを支える技術 ~ソーシャルゲームの舞台裏~

DeNA(著)
技術評論社
2012年6月

ISBN-10: 4774151114
ISBN-13: 978-4774151113
2919円(税込)

■現在進行形で、ソーシャルゲームを支えている技術

 本書は、1日35億PVの巨大システムを支える技術とノウハウについて、これでもかというほど贅沢に書いた書籍である(もっとも、1日35億PVをさばくノウハウが必要なエンジニアはそれほど多くはないだろうが……)。

 わたし自身、今年にWeb企業へ転職し、現在はソーシャルゲームの開発に携わっているので、大変面白く読めた。

 フィーチャーフォン向けのWebアプリケーションの開発ノウハウなど、スマートフォン全盛のこの時代にはそぐわない内容のように思える章もいくつかある。しかし、ソーシャルゲームでは依然としてフィーチャーフォンのユーザーが多く、こういったノウハウは今、まさに現在進行形でソーシャルゲームを支えている技術である。そういった意味で本書は、現実に即した内容であるといえるだろう。

 実際、本書に書かれているノウハウのいくつかは、わたしがソーシャルゲームの開発において直面した問題であった。

■目次

 本書は、4つのパートで構成されている。

  • Part1 ソーシャルゲーム開発技術
  • Part2 ソーシャルゲーム運用技術
  • Part3 ソーシャルゲーム開発効率技術
  • Part4 ソーシャルゲーム分析技術

 ご覧のとおり、かなり幅広い内容を扱っている。一方、構成が分かりづらい個所もあった。例えば、RESTfulなAPIの設計についての説明は、なぜか「MySQLとの付き合い方」の章に入っている。

■肝はデータマイニング

 ソーシャルゲームの運用にとって、サーバ運用や開発ノウハウも重要なのだが、実際にビジネスとしてのソーシャルゲームの命運を握っているのは、データマイニング技術である。

 ソーシャルゲームは日々、ユーザーの動向などの膨大なデータを分析し、UIやパラメータなどについて、1日単位で細かいチューニングを行う。

 そういった観点から、Part4「ソーシャルゲーム分析技術」は興味深く読んだ。

 Part4は、データマイニングついて、いくつかの技術が紹介している。ただ、データマイニングは、技術もそうだが、「データをどうとらえるか」という判断が最も重要なので、DeNAがどういう観点でデータを分析しているのか、という話題があれば、もっと良かったと思う。

■まとめ:ソシャゲ、Web業界に興味のあるエンジニア向け

 ソーシャルゲームやディー・エヌ・エーが提供するプラットフォームに関わる人でない限り、技術書として本書を使いこなせるエンジニアはそれほど多くはないだろう。

 ただ、話題の業界に所属する人が、その知見をふんだんに詰め込んだ本なので、ソーシャルゲームに興味のある人や、Web業界を指向するエンジニアにとっては面白く読める本であると思う。

 昨今なにかと話題になることの多いソーシャルゲーム界隈。中の人も、そうでない人も、本書を読めばその一端を垣間見ることができると思う。

『効率的なWebアプリケーションの作り方』――PHPerよ立て、立てよPHPer

2012/07/13 15:58:25

Manual_2 効率的なWebアプリケーションの作り方 ~PHPによるモダン開発入門

小川雄大(著)
技術評論社
2012年5月

ISBN-10:4774150827
ISBN-13: 978-4774150826
2919円(税込)

■中身が素晴らしいので、外見をdisる

 最初に言っておこう。本書は、PHPでWebアプリケーションを開発する人間にとって、とても大きな価値を持つ本である。

 今はただの「PHPer(ぺちぱー)」であっても、この本を読んで「Programmer」にステップアップする可能性は十分にある。だからこそ思う、もっと適切なタイトルがあったのではと。

■大事なのは「効率」ではなく「モダン」

 本書は、PHPによるWeb開発を仕事にしていて、なおかつ

  • MVCに沿ったクリーンなコード
  • フレームワークを活用した開発スタイル
  • オブジェクト指向の基本と応用
  • Gitによるバージョン管理

といったトピックを完ぺきに実践できていない「PHPer」のための本である。サブタイトルである「モダン開発」にも入門できるし、「プロの現場」で起きていることも体験できるし、「最新PHPプログラミング」の動向も知ることができる。

 だからこそ、だからこそ! 「効率的な」ではなく、サブタイトルの「モダン開発」の方を、強くアピールしてほしかった。

 いわゆる「PHPer」に必要なのは「効率」ではなく「モダンな開発スタイルの知識と実践」なのだから。

■ところで、ぺちぱーとは

 さっきから書いている「PHPer」という言葉は、PHPをメインに書いているプログラマのことである。類義語として、Rubyなら「Rubyist(ルビイスト)」、Pythonなら「Pythonista(パイソニスタ)」がある。

 しかし、「PHPer」にはやや侮蔑的なニュアンスが混じっているようにも思える。PHPばかりを好み、他のプログラミング言語やアーキテクチャ、モダンな開発スタイルに興味を持たないPHPプログラマを「PHPer」と呼んでいる場面が多い。

 私が最初に体験したWeb開発の現場でも、「クラスってよく分からないから使いたくないんだよね」というPHPerが、業界第3位(当時)のサービスの大部分を開発していた。ご想像のとおり、そびえ立つレガシーコードの山であった……。

 本書が書かれた真の目的は、この文脈での「PHPer」たちが、職業人としての「Programmer」にステップアップする手助けをするためであろう。

■PHPerよ立て、立てよPHPer

 本書は大きく「前半」と「後半」に分割できる。両者にはまったく違った価値があるので、別々に紹介していく。

●後半は「実践編」

 いきなり、後半から紹介する。後半はSymfonyというPHP製Webアプリケーションフレームワークを使い、実際に稼働するWebアプリケーションを開発する、という紙上ハンズオンになっている。フレームワーク上で開発をした経験がない人、それぞれの会社で使われている「オレオレフレームワーク」でしか開発していない人には有益なカリキュラムだ。プロの現場での開発、現場におけるフレームワークの使われ方を体験できる。

 特に「オレオレフレームワーク」上で生活している人は、ぜひ読むだけでなく手を動かしてみていただきたい。OSSとして世界中のユーザーに使われているフレームワークがどんな思想で作られ、どんな機能やポリシーを提供しているのか。「オレオレフレームワーク」しか知らない人には、貴重かつ重要な体験となるはずだ。

●前半は「理論編」

 対する前半は、理論に関する内容が中心。PHPerには不足しがちな「モダン開発」に必要な知識を紹介している。そしてこの「理論編」にこそ、著者からPHPerに向けられた強いメッセージが込められている。

 各章の見出しを見てみよう。

  • Part1 MVC開発の基礎知識
    • 1章 MVC開発の概要
    • 2章 オブジェクト指向
  • Part2 フレームワークを利用する利点
    • 3章 レガシーコードの欠点
    • 4章 リファクタリング・デザインパターン実践
    • 5章 フレームワークを活用する

 これだけの内容を、わずか100ページ弱に詰め込むなんて「無茶しやがって……」としか言えないのだが、典型的なPHPerでは、これらの概念に触れることすらないまま、仕事としてWebアプリケーションを作り続け、レガシーコードの山を高くし続けている事例が多く見られる。

 そんな状況を打破し、1人でも多くのPHPerを一人前に育てよう、という意気込み。これこそが著者からPHPerへのメッセージなのだ。

■「パーフェクト」の血筋

 本書の著者は小川雄大(@fivestr)氏。先日書評した『パーフェクトPHP』の著者の1人である。なるほど、「パーフェクトPHP」を読んで感じた「決意」のようなものが、本書からも感じ取れた。

 先日開催された「Symfony勉強会 #6」では、小川氏のセッションがあったようだ。スライドが公開されていたので、こちらも一読をお勧めしたい。本書が書かれた理由が語られている。ご自身の苦労や失敗、そして学びの経緯は、まさに「PHPer」が「Programmer」になる過程そのものだった。

■「PHPer」がdisられないために

 冒頭でちょっと触れた、「PHPer」という言葉のちょっとネガティブなニュアンスは、本書から学ぶことで打ち消していけるかもしれない。パーフェクトなPHPを書き、モダンな開発手法を身に付けた、disられないPHPerが増えることを願っている。

 そして、主に他のプログラミング言語を使っているプログラマ諸君にも、特に前半「理論編」は一読をお勧めしたい。ちゃんとできてるか? 大丈夫か?

『Wife Hacks ~仕事と家族とコミュニティと~』
コラムニスト kwappa)

『日本語入力を支える技術』――複雑な、あまりに複雑な“日本語入力”の解体新書

2012/04/13 17:29:41

Manual_2

日本語入力を支える技術 ―変わり続けるコンピュータと言葉の世界

徳永拓之(著)
技術評論社
2012年2月

ISBN-10: 4774149934
ISBN-13: 978-4774149936
2699円(税込)


■まるで空気のようなシステム

 この書評を読んでいるあなたが感想をTwitterに書きこもうとする時、日中の仕事でメールを書く時、友人とSkypeでチャットする時、Excel方眼紙に業務システムの設計書を作っている時。

 これらすべての場面で、共通して使用するソフトウェアがある。日本語入力システムだ。
 
 日本人としてコンピュータ上で日本語を扱う場合、このソフトウェアを利用せずに日本語を入力することはあり得ない。しかし、日本語入力システムはその重要性に反して、利用者のほとんどが意識しない。まるで、空気のようなシステムである。

 だが、空気とあなどるなかれ。日本語入力システムには、実は計算機科学の技術の粋が結集されている。

■複雑な日本語処理のすべてをここに書き残した

 本書は、日本特有のソフトウェアの中でも、最も重要性と難易度が高いシステムである日本語入力システムが、どのように設計されて動作しているのかを、実に読みやすく書いた良書だ。

 黎明期から現在に至る日本語入力システムの成り立ち、日本語入力システムの概観、それを実現するために必要なデータ構造の基本的な考え方や言語処理、機械学習のアルゴリズムなど、日本語入力システムのすべてが、本書には書かれている。

■メモリは限りなく少なく、しかし機能は膨大

 日本語入力システムに求められる機能は多い。

 日本語入力システムは、文字入力を必要とするあらゆるソフトウェアと連動して動作する。「入力」と「変換」という2つの機能を持ち、変換候補の一覧をどこに描画するか、という視覚的要素も必要だ。

 変換誤りに対する訂正の手段をどのように提供するか。仮にクラッシュした場合、他のアプリケーションを巻き込まないようにどう設計すべきか――。こうした高機能と変換に必要となる膨大なデータ量を要求されるにもかかわらず、空気のような存在であるがゆえに、メモリ量はできるだけ小さくなければならない。

 見た目のシンプルさや空気感と対照的に、日本語入力システムに求められる要件は複雑で、ソフトウェアとして高難度なものばかりだ。さらに、日本語は文法が複雑で、かつ扱う文字量の多さも半端なく多いため、さらに複雑さに拍車をかけることになる。

■難易度の高い話題を分かりやすく

 データ構造やアルゴリズムに関する章では、数学的な知識や情報処理についての素養が求められる場面もあるが、巻末に付録で説明されているので心配することはない。随所に登場する専門用語も、すべて初出時に定義されている。内容の高度さに比べると本書は驚くほど読みやすく、きちんと時間をかけて読めば誰でもこの本の内容を理解できるだろう。

 第3章以降のデータ構造、アルゴリズムの解説は難しいが、第2章の「日本語入力システムの概観」まではとても分かりやすく、日本語入力システムのエッセンスのすべてが書かれている。興味のある人は、第2章までを読むだけでも価値はあると思う。

 これほど身近に存在するにもかかわらず、その詳細を知る人はほとんどいないであろう日本語入力システム。その深淵の一端を、本書より感じとってもらいたい。

 これまではキーボードからの入力のみであった日本語入力システムは、スマートフォンなどで使用されるタッチパネルや音声入力など、一層の進化が期待されている。今、日本語入力について勉強してみるのもいいだろう。

スマホ案件用の秀逸なドキュメント『jQuery Mobile』

2012/03/23 16:59:51


jQuery Mobile

Jon Reid(著)、 渡邉真人・白石俊平(監訳)、牧野聡(翻訳)
オライリージャパン
2011年12月
ISBN-10:4873115264
ISBN-13: 978-4873115269
1995円(税込)

■どんどん増える、スマホ対応のお仕事

 「2011年はスマホ元年」と言われたように、スマートフォン市場が急成長を続けています。Webサイトや携帯サイトをスマホ対応させている人は多いでしょう。私もその1人です。

 iPhone、Android、Windows Mobileといった多様な端末それぞれに最適化したページを作成することは簡単ではありません。端末の種類を吸収し、どの端末で見ても同じデザインで見せるフレームワークを用いれば、簡単にスマホ対応ができます。jQuery Mobileは、それを実現させるフレームワークです。

■秀逸なオフライン・ドキュメント

 本書は、jQuery Mobileでできることを網羅的にまとめています。公式Webサイトにあるドキュメント内容はほぼすべて掲載しており、かつソースコードだけでなく、スクリーンショットも豊富なので、オフラインのドキュメントとしておすすめできます。

 私は、今年からフリーランスのプログラマとして仕事をしています。スマホ対応サイトを構築するお仕事をもらったので、早速オフライン・ドキュメントとして本書を手に入れました。

●目次

  • 1章 jQuery Mobileをはじめよう
  • 2章 アプリケーションの構造とナビゲーション
  • 3章 ページの要素
  • 4章 テーマの切り替え
  • 5章 jQuery MobileのAPI
  • 6章 jQuery Mobileアプリケーションの実際
  • 付録A 知っておくと役に立つTIPSとjQueryの基礎知識
  • 付録B リファレンス

 以下は、すべてのページの基礎となるソースです。

<!DOCTYPE html>
<html>
    <head>
        <title>jQuery Mobile</title>
        <link rel="stylesheet" href="css/jquery.mobile-1.0.min.css" />
        <script src="js/jquery-1.6.4.min.js"></script>
        <script src="js/jquery.mobile-1.0.min.js"></script>
    </head>
    <body>
        <header><h1>jQuery Mobile</h1></header>
        <div class="content">
                <p>jQuery Mobileのページ</p>
        <footer><h1>Copyright...</h1></footer>
    </body>
</html>

 head部分でjQueryとjQuery Mobileのjsとcssファイルを指定し、body部分でヘッダとフッタ、ならびにページのメイン部分を記述していきます。後は、jQuery MobileならびにHTML5の仕様に合わせて記述していくだけで、簡単にスマホ対応サイトのページを作成できます。

 もちろん、jQueryならではのアニメーションやナビゲーション、ページ間の制御などの設定も可能です。これらの点は、公式Webサイトのドキュメントだけでは分からなかったので個人的には大変ありがたく、実際に仕事で参照しました。

 最も役立ったのは、5章の「初期化イベント」です。仕事で、「ページ遷移の直前に処理を行い、処理を反映した状態で次のページを表示できないか」という依頼がありました。公式Webドキュメントだけでは理解しづらかったのですが、本書のその部分を読み、実装可能であると分かりました。

 例えば、bind()という関数と pagebeforeshow というイベントを用いて、下記のように記述します。

<script>
$("page1").bind("pagebeforeshow", function(event, ui) {
    (何らかの処理を記述)
});
</script>

 こうすれば、「ページ遷移の直前に、遷移先のページで記述された処理を実行し、その処理が反映された状態のページを表示する」ことが可能です。

■本書をおすすめする人

 jQuery Mobileを利用する上で、jQueryの知識は多少必要ですが、簡単なjQueryの使い方を知っていれば十分jQuery Mobileを使えます。

 本書は、プログラマだけでなくデザイナーにとっても非常に読みやすい内容です。フォーム部品など、どういった表現がjQuery Mobileで可能かを本書で確認しつつ、デザイナーとプログラマの間で打ち合わせを行い、サイトを設計・構築していく――本書は、その一助になると思います。

『It’s Party Time!』 コラムニスト あずk)

『Vimテクニックバイブル』――魔法使いに1歩近づくためのテキストエディタ活用術

2011/11/08 17:42:11

Vimテクニックバイブル Vimテクニックバイブル 作業効率をカイゼンする150の技

Vimサポーターズ (著)
技術評論社
2011年9月

ISBN-10: 4774147958
ISBN-13: 978-4774147956
2980円(税込)

■ITエンジニアにとっての聖域、テキストエディタ

 私たちITエンジニアは、日常的にコンピュータに向かって文字を書く。ソースコードに設計書、上司に提出する週報など、1日にコンピュータに打ち込む文字数は計りしれない。

 EclipseやVisual StudioのようなIDE、表計算ソフトやワープロソフト……文字入力にさまざまなツールを用いる。これら文字入力を行うソフトウェアの中で、テキストエディタは最もシンプル、かつ最も手軽に利用するツールである。

 テキストエディタには、さまざまなな機能を求めたい。文字の検索や置換に矩形選択。ある一定の規則に従って文字に色をつけたり、フォントを変えたりするシンタックスハイライトだって欲しい。マクロを組んで、複雑な編集の自動化もしたい。

 テキストエディタの機能の使いこなし次第で、作業効率は劇的に改善する。高度にテキストエディタを使いこなすITエンジニアのディスプレイをのぞくと、まるで魔法でも使っているかのような鮮やかささえある。

 だからこそか、「いかにテキストエディタを使いこなすか」という点で、ITエンジニアたちは独自のこだわりを持っており、時にはそのこだわりが「Vim vs. Emacs」のような宗教論争を巻き起こすことだってある。

 テキストエディタとは、ITエンジニアにとっての聖域なのだ。Vimは、そういったテキストエディタの1つである。

■Vimをもう1つ高いレベルで使いこなす 

 本書は、Vimを効率的に使いこなすためのTips集である。1つ注意しておきたいのは、本書はVim初心者にとっては少し難しい本であるかもしれないということだ。

 Vimといえば、「モードを切り替えて作業する」という他のエディタにはない特徴を持っている。そのため、初心者はまずVimを動作させるためのキーマッピングを学ぶわけだが、本書はVim入門の要素をわずかに説明するのみで、大部分は中~上級者向けのTipsだ。ただ、Vimの入門情報はWeb上で検索すれば山のように存在するので、初心者はそちらを参照すると良いかもしれない。

 本書のターゲットは、ある程度Vimを知っている中級者以上が該当する。私自身はどちらかというとVim初級者の部類に入ると思うが、本書を読んでVimの持つポテンシャルの高さに驚かされた。この本を読めば、Vimを今よりもう1つ高いレベルで使いこなせるようになると思った。

■プラグインの解説も充実

 Vimは、多様なプラグインを導入することで機能を拡張できる。本書は、Vimの標準機能だけではなく、各種プラグインを導入することで得られる機能についても紹介している。

 例えば、Vim上で計算処理を実行するVimClacや、図を描画するためのDrawIt! など。これら多様なプラグインを使いこなせれば、日常の仕事などすべてVimだけで完結させることが可能なのではないかと思わせてくれるほどだ。

プラグインについては、作者自身がたくさん解説している。Chapter 10は、1章まるごと作者自身によるunite.vimの解説で、非常に読み応えがある。

■魔法使いになる

 テキストエディタを高度に使いこなす人を見ていると、華麗なキータイピングと一瞬で出てくるアウトプットが、まるで魔法使いによる魔法のように感じられる。特に、Vimのようにマウスを用いずにキータイピングのみで全機能を扱えるエディタを使いこなす人の指さばきは、映画に登場するハッカーのようだ。

 本書を読み、自分にとって最適なエディタの使い方を習得すれば、そのような魔法使いやハッカーに1歩近づけるかもしれない。

『Titanium Mobileで開発するiPhone/Androidアプリ』――スマホアプリ開発の救世主、Titanium Mobileの理想と現実

2011/11/04 16:47:25

Titanium Mobileで開発するiPhone/Androidアプリ Titanium Mobileで開発するiPhone/Androidアプリ――JavaScriptによるスマートフォンアプリ開発入門

北尾雅人 (著)、増井雄一郎 (監修) 
翔泳社
2011年6月

ISBN-10: 4798123986
ISBN-13: 978-4798123981
3129円(税込)

■この頃ちまたで流行るもの

 最近、街中でスマートフォンを使っている人々を見掛ける。スマートフォンと一言でいっても、それぞれのプラットフォームは異なる。iOS・Android・Windows Mobile、この3つが最もメジャーだろう。

 プラットフォームが異なれば当然、アプリケーションの作り方と開発言語も異なる。同じ機能を実装しようにも、iOSならObjective-C、AndroidならJavaを使って開発しなければならない。同じアプリケーションを2つのプラットフォームでリリースしようとすれば、ほぼ2倍の時間と工数が必要――アプリ開発者にとって頭を抱える問題だった。

 ここで登場したのが、Titanium Mobileである。Titanium Mobileは、iOS・Android・Blackberryに対応した開発環境だ。Titanum Mobileの最大の特徴は、「JavaScriptで書いたソースコードを各プラットフォームに対応したものにビルドする」ことにある。

 まさに、スマートフォンアプリ開発の救世主。本書は、そんなTitanium Mobileのインストールから実際の開発、リリースまでを網羅して解説している。

■実際に手を動かしながら読む本

  • 第1章 Appcelerator Titanium Mobileについて
  • 第2章 開発環境導入とアプリケーションの第一歩
  • 第3章 実践! Twitterクライアントアプリの開発
  • 第4章 ライブラリやデバイスの活用~続・Twitterクライアントアプリの開発~
  • 第5章 GPS活用アプリケーション「食べナビ」
  • 第6章 Titanium Mobile API簡易リファレンス
 

 本書は、開発環境の導入から実際の開発手順まで、まんべんなく押さえてある。また、ソースコードが多く掲載してあるため、実際のコードの書き方やポイントを押さえやすい。実際に写経しながらアプリを作ってみるのが一番だが、「時間を取れない」「環境そろえられない」人は、Githubで公開されているサンプルコードを参考にするとよいだろう。

 1点、注意しておきたいのが、本書の第2~3章で取り扱っているTwitterクライアントがOAuth認証であることだ。現在、スマートフォンアプリのほとんどはTwitterの認証にxAuthを利用している。もし、本書を参考にして作ったアプリを公開するなら、事前に注意しておいてほしい。

 スマートフォンアプリに必要なUIの作り方、各種デバイス(カメラ・GPSなど)へのアクセスについてもサンプルコードがあるため、ここから新しいアプリを作成するヒントを得ることもできる。難易度としては、JavaScriptの文法が理解できているなら問題ないレベルだ。

■Titanium Mobileの理想と現実を味わう

 主にUI周りで、以下のようなソースコードが出てくる。これこそがTitanium Mobileの現実だ。

if(Titanium.Platform.osname === 'android'){
  //処理1
}else{
  //処理2
}

 アプリケーションを実行するOSがAndroidなら処理1を実行、それ以外ならば処理2を実行する。つまり、プラットフォームごとに処理を分けているのである。OS差を意識せずにコードが書ければベストだが、現実はそう甘くない。

 本書のサンプルコードを読む時には、特に「処理を分けるべき部分」に注意を払っておきたい。

 同時に複数のプラットフォームでの動作を目指すのではなく、まずは1つのプラットフォームにターゲットを絞ってソースコードを完成させ、その後に他のプラットフォーム向けのソースコードを記述する形の方が理解しやすいし、つまらないミスが少なくなるだろう。

■プラットフォームと言語の壁を取り払う

 スマートフォンアプリを作成する時は、各プラットフォームに対応した言語で書くことが当たり前だった。だが、Titanium Mobileはその壁を取り払った。JavaScriptを使ってスマートフォンアプリを作成できるという点だけでも、十分にTitanium Mobileの利用を一考する価値がある。本書は、初めてのTitanium Mobile利用に必要な知識を十分に得られる。スマートフォンアプリの“最初の一歩”としてオススメしたい。

■こんな人にオススメ

  • とにかくスマートフォンアプリを作ってみたい人
  • Objective-CやJavaより、JavaScriptの方が自信がある人
  • 複数のプラットフォーム向けにスマートフォンアプリケーションを開発してみたい人

『パーフェクトJavaScript 』――JavaScriptは「勉強しなくてもOK」な言語なのか?

2011/10/25 16:50:02

パーフェクトJavaScript パーフェクトJavaScript

井上誠一郎、土江拓郎、浜辺将太 (著)
技術評論社
2011年9月
ISBN-10: 477414813X
ISBN-13: 978-4774148137
3360円(税込)

■今、どこにでもあるJavaScript

 前世紀、JavaScriptは「ホームページのおまけ」として使われる言語だった。ロールオーバーするアイコン、マウスポインタを追いかける猫、「右クリックは禁止です!」……。うっとうしい仕掛けを回避し、セキュリティを高めるため、JavaScriptはブラウザの設定でOffにするのがネットサーファーのたしなみとされていた時代もあった。Webブラウザでのクライアントサイドスクリプティングでできることなんて、その程度だったのだ。

 あれから十余年。今やJavaScriptはどこにでもある。Webアプリケーションの中核的な動作を担っていることだって少なくない。WebブラウザでJavaScriptをOffにする? あのWebサイトもこのSNSも、まったく閲覧できないじゃないか!

 ダイヤルアップ時代には考えられなかった、現代での「JavaScriptの用途」をおさらいしてみよう。

●Webアプリケーションのフロントエンド

 TwitterやFacebookは、Webブラウザ上でいろんな機能を実現している。更新がリアルタイムで通知されたり、オンラインの友達とチャットができたり、今までの「デスクトップアプリケーション」のようなことがブラウザのウインドウだけで行える。Google Docsに至っては、表計算やワードプロセッサ、プレゼンテーションソフトまでブラウザ上で動くようにしてしまった。

 これらはみんなクライアントサイドスクリプティング、つまりJavaScriptによって実装されている。

●スマートフォンアプリ

 iPhone4Sは、3日間で400万台を販売したらしい。各キャリアの製品情報ページを見ると、いつの間にかタッチパネルのAndroid端末の方が多くなった。電車の中でスマートフォンを使っている光景は、今やちっとも珍しくなくない。

 普及フェイズに入ったスマートフォン向けのアプリケーションを開発する際にも、JavaScriptは重要な役割を担っている。Webブラウザ上ではPCと遜色ない性能でJavaScriptが動作するため、多彩な機能を持ったアプリケーションを実装できる。また、「ネイティブアプリケーション」においても、内部では組み込みのWebブラウザを使い、HTML5+CSS3 +JavaScriptで実装されているケースが増えている。

●サーバサイド・スクリプティング

 Webブラウザやスマートフォンはクライアントサイドでの利用だが、JavaScriptによるサーバサイド・スクリプティングも現在注目を集めている。以前から細々とiPlanetやJaxerといったプロダクトは存在したのだが、Node.jsの登場で状況は一変した。

  Node.jsは、GoogleのJavaScriptエンジンであるV8をバックエンドに使い、サーバサイド用途としても十分なパフォーマンスを達成できるようになった。また、イベント駆動型のアーキテクチャは、C10K問題への解としても期待されている。

 まだまだ開発途上の若いプロダクトだが、すでに商用環境への導入事例もあり、日本でもカンファレンスが開催されるなど、注目度は高い。

■「みんな勉強しなくてもできると思ってる唯一の言語だよね」?

 クライアントのみならず、サーバサイドでも注目を集めるJavaScript。Web系の開発を行う際には、もはや避けて通ることは難しい。つまり、JavaScriptはもはや「Webプログラマのたしなみ」になりつつあるのだ。

 一方、著名なJavaScriptプログラマのDouglas Crockford氏は、こんな恐ろしくも的確な発言をしている。

JavaScript is the only language that people think they can program without actually learning it.

 え、日本語で? OK、筆者の同僚による日本語訳を紹介しよう。 

JavaScript はみんな勉強しなくてもできると思ってる唯一の言語だよね、HAHA

 日本語訳でも恐ろしい。何が恐ろしいって、冗談ではなく一定の真実を含んでいるところが恐ろしい。jQueryとプラグインを導入してちょっとハデめのUIが動いてしまうと、それだけで「JavaScriptプログラミングをした!」と思ってしまう層が、確かに存在するからだ。

■パーフェクトなJavaScriptの追求

 注目度と重要度、ともにJavaScriptは急上昇中である。しかし、イディオムや文化が醸成する前に普及してしまった、という歴史的経緯があるため、残念ながら「勉強しなくてもできると思ってる」プログラマが一部には誕生してしまった。なぜか。それにはいくつかの理由が考えられる。

●入門書と「サイ本」のミッシングリンク

 JavaScriptをきちんと学ぶための参考書は、長らく決定版が存在しない状態だった。数多ある入門書と、言語仕様を詳解した「JavaScript 第5版」(通称「サイ本」)の間には大きな難易度の乖離があり、初心者を中級者~上級者へと押し上げてくれる本は「JavaScript: The Good Parts」ぐらいしか見当たらない状況が長く続いてきた。

 満を持して登場したのが、本書『パーフェクトJavaScript』である。

■信頼と実績の「パーフェクト」シリーズ

 C#JavaPHPに続く、信頼と実績の「パーフェクト」シリーズ。本書もシリーズ名に恥じぬ良書に仕上がっている。

 最も注力しているのが、Part2の「JavaScript言語仕様」だ。入門書ではまったく不足だが「サイ本」では詳細すぎる言語仕様の解説を、的確な密度と難易度でまとめている。プロトタイプチェーンの図示、callとapplyの解説からコールバックのイディオムへの誘導などは、「なんとなく」理解していた筆者のJavaScript習熟度を一気に押し上げてくれたように思う。

 以降、「クライアントサイドJavaScript」「HTML5」「Web API」「サーバサイドJavaScript」と解説が続く。いずれも動作原理に的を絞った内容になっているので、「すぐ使えるサンプル」が網羅されているわけではない。しかし、「JavaScriptプログラマ」として仕事をするのであれば、避けては通れない内容なので、脱初心者のためにもしっかり身に付けておきたい。

■執念と良心

 「パーフェクト」シリーズの既刊同様、「ちゃんとしたプログラミングを教えたい」という執念にも似た記述が、本書にも散りばめられている。柔軟な言語仕様が特徴のJavaScriptは、裏を返せばいくらでも「ゆるふわ」コードや「カオス」コードを書くことができてしまう。P.038のコラムで語られているように、歴史的経緯により「イディオム」が定着しないまま普及してしまったのが一因である。

 筆者の個人的感想としては、「ちゃんとした入門書の不在」も原因の1つだと思っている。本書「2-3-2 varの省略」から少し引用すると……

本書に限らず良心的な本であれば暗黙のグローバル変数を推奨しないはずです。本書も推奨しません。varの記述は省略しないでください。

とある。「パーフェクト」シリーズの魅力がちゃんと受け継がれた「良心的な本」であることの、明確な証拠ではないだろうか。

■まとめ

 JavaScriptは、Webプログラミングに携わるならば避けては通れない言語となった。混沌に打ち勝つには、「正しい理解」が最大の武器になる。

 「正しい理解を提供しよう」という意志を持って書かれた本書の行間には、著者陣から惜しみない「良心」が注がれている。もしあなたが職業プログラマであれば、きちんと理解を深めた上でコードを書くのが「プロとしての良心」ではないだろうか。

 本書から良心を受け取り、武器を身に付け、混沌と戦うプログラマが1人でも増えることを願ってやまない。

『Wife Hacks ~仕事と家族とコミュニティと~』
コラムニスト kwappa)

『iPhoneアプリ設計の極意』――「iPhone、開発、すべての極意」=44

2011/09/27 18:29:51

iPhoneアプリ設計の極意 ―思わずタップしたくなるアプリのデザイン iPhoneアプリ設計の極意 ―思わずタップしたくなるアプリのデザイン

Josh Clark,(著)、深津貴之(監訳)、武舎広幸,、武舎るみ(翻訳) 
オライリージャパン
2011年6月
ISBN-10: 4873115027
ISBN-13:978-4873115023
3570円(税込)

■「人生、宇宙、すべての答え」+2

 「人生、宇宙、すべての答え」をご存じだろうか。Googleで検索すると電卓機能が答えを返してくれる。すべての答えを知りたい人は、ぜひ試してみてほしい。

 ……無事に計算結果は出ただろうか? さて、本書iPhoneアプリ設計の極意』には「iPhone、開発、すべての極意」が出てくるが、計算結果は「人生、宇宙、すべての答え」とちょっとだけ違う。2を足せ。それですべて分かる。

■「デザイン」という言葉にまつわる誤解

 副題「思わずタップしたくなるアプリのデザイン」からも分かるとおり、本書はいわゆる「開発」の参考書ではなく、実際の開発作業を始める前の行程、つまり「デザイン」を扱っている。

 デザインと聞くと、真っ先に思い浮かべるのはアイコンやボタン、スプラッシュスクリーンなど「グラフィックデザイン」ではないだろうか。しかし、英単語「design」では、「設計」という意味合いが強い。つまり、グラフィックだけではなく、画面の構成やユーザーの行動、機能の取捨選択といったものも含めて「デザイン」なのだ。

 本来の意味での「デザイン」をするためは、どんな知識が必要なのか? 本書は、実際にヒットしたアプリやプリインストールのアプリを題材に、「アプリをデザインするためのポイント」を解説している。

■44ピクセルのリズム

 「44ピクセルのリズム」という印象的な言葉が、本書にはたびたび登場する。

 「タップ可能なUI要素の快適な最小サイズは、44×44ポイント」と、AppleはUIデザインのガイドラインで定義している。44×44ピクセル未満のボタンは「タップしにくい」と、ばっさり切り捨てているのだ。ユーザーの快適さがUIデザインの肝である以上、快適さよりも優先すべき事項がない限り、このサイズを守るのがセオリーだろう。

 44ピクセルのUIパーツを並べていくと「44ピクセルのリズム」が生まれる。実際に「44ピクセル」の注釈を入れた「メール」と「計算機」のスクリーンショットを見た時は、見慣れた画面であるはずなのに「なるほど!」と思わずうなった。

 具体例を見ると、「Appleの優秀な開発者たちが試行錯誤の末にたどり着いたマジックナンバー44には、積極的に従う方が良さそうだ」と思えてくる。「人生、宇宙、すべての答え」ほど大げさではないが、「44ピクセルのリズム」がiPhoneアプリ開発において1つの“極意”であることは間違いないだろう。

■愛するものを殺せ

 もう1つ印象的な言葉があった――「かわいい赤ん坊も投げ捨てろ」。

 アプリのアイデアとして出てきた多くの機能案のうち、ほとんどは捨ててしまうべきだというのだ。「限られたリソースの中で、真に価値がある機能を実装せよ」と本書はうたっている。

 ここでいうところのリソースとは、iPhoneのハードウェアリソース(画面、メモリ、CPU)だけではなく、ユーザーのリソース(時間や注意力)も含める。ハードウェア的な制約はもちろんだが、ユーザーのアテンションも貴重なリソースだ。考えてみれば当たり前なのだが、今までなかなか持ちにくかった視点である。

■@fladdictの頭の中

 日本語版は付録として、監訳を担当した深津貴之(@fladdict)氏による「fladdict流のUIデザイン」が収録してる。「TiltShift Generator」や「ToyCamera」などのヒットアプリの作者として知られる深津氏が、架空のiPhoneアプリをデザインしていく過程が詳細に分かる。

 「仮説検証」という思考手法からペーパープロトタイピング、UIのブラッシュアップまで、プログラミングに着手する直前までの流れを紙面で体験できる。この付録だけでも、本書を一読する価値がある、といっても過言ではない。特に、操作の簡単さとミス防止、セキュリティについてバランスを取りながら改善していく「送金画面」には、たくさんの学ぶべき点があった。

■まとめ

 本書に、ソースコードは1行も出てこない。しかし、だからこそ「開発者が知っておくべき知識が詰まっている」と言える。もちろん、アプリの企画や(見た目の)デザインをする人には必須の知識である。iPhoneアプリ開発に携わる人なら、一読しておくべき本だろう。

 iPhone5/iOS5のリリースが秒読みとなっている今、アプリの開発競争はますます過酷になっている。本書の内容は、身に付けておいて損のない「極意」であることは間違いない。

『ビューティフルデータ』――すべてがデータ化される時代に、データの美しさを求め

2011/08/11 15:03:39

ビューティフルデータ ビューティフルデータ

TobySegaran、JeffHammerbacher(編集)、堀内孝彦、真鍋加奈子、苅谷潤、小俣仁美、篠崎誠(翻訳)
オライリージャパン
2011年2月
ISBN-10: 4873114896
ISBN-13: 978-4873114897
3570円(税込)

■データを知ること=世界を知ること

 TwitterやFacebookに撮った写真をアップロードする、Webサイトの口コミ情報を見ながら飲み会のお店を予約する、ダイエットのために毎日体重を記録して変化をチェックする……今や私たちの日常生活で、データに触れない日はありません。オンライン上には無数のデータがあり、誰もが自由にアクセスできます。個人が作成したデータをアップすることも容易になりました。

 本書は、WebやSNSの舞台裏で処理されるデータ、人工衛星やDNA解析といった学術の世界におけるデータ、国勢調査や政治といった私たちの生活に関わるデータなど、さまざまな場面におけるデータの収集や検索、分析などについてのエッセイ集です。

 データがビューティフルであるために、データはどうあるべきか、そしてどう使われるべきか。

 各章の内容は独立しているため、最初から読むのもあり、目次を見て興味のある内容の章を拾い読みするのもありです。今回は、テストエンジニアとして気になった章について、いくつか紹介します。

■データ収集の主役はユーザー

 ユーザーからデータを収集する場合、データを入力するのはユーザーです。そのため、システム作成者ではなく、ユーザーにとって都合がいいやり方を選ぶことが大切です。

 第1章「データの中に生活を見る」では、ユーザーに負担をかけないデータの収集方法について解説しています。例題は、Twitterから現在地データを提供するシステムのデータ入力。さまざまな端末から気軽にデータを入力できるため、また、ユーザーにとってデータ提供が生活の一部になりやすいため、Twitterの事例は身近なものでしょう。

 ユーザーがデータを提供しやすい仕組みは大切ですが、同時にユーザーが「データを提供したくなる動機」も重要です。

 第2章「ビューティフル・ピープル」では、新商品についての意識調査アンケートのフォームを作るエピソードを基に、「1人でも多くの顧客に回答してもらえるようにするための工夫」が語られています。

 「データを提供しよう」とユーザーに思ってもらうためには、ユーザーの年齢層や社会的地位などを考慮しつつ、ユーザーがいちばん喜ぶ特典は何かを考える必要があります。特典とは、何もプレゼントだけではありません。データを提供することで感謝される、データを提供することが楽しみになるというのも、立派な特典です。

 私は、趣味で演奏会へ行った時は必ず、アンケートに答えるようにしています。私自身が市民オーケストラに所属しており、観客からのアンケートを見ることが演奏会の楽しみの1つだからです。演奏についてアンケートをもらえる喜びを知っているからこそ、私もアンケートを返すようにしています。

■楽しみながらデータの価値を上げる

 データは、ただ集めるだけではありません。データを公開することで、ユーザーがそのデータの価値を高めることがあります。

 身近な例でいえば、ブログにコメントやブックマークが付いて注目を浴びること、自分が考え出したTwitterのハッシュタグが拡散して面白いツイートがたくさん集まるようになることなどが挙げられるでしょうか。オープンソースソフトウェアなども、典型的な例の1つでしょう。

 人気ロックバンドRadioheadのプロモーションビデオについて、データと作成ツールを同時公開した事例(第10章「Radiohead『House of Cards』のプロモーションビデオができるまで」)、国勢調査のデータを、ユーザーが好きなテーマ(職業別、出生地別など)でグラフ化できるシステム(第12章「sense.usの設計」)などの具体例を見ていると、ユーザーが“楽しみながら”データをカスタマイズする様子、そのカスタマイズによってデータに付加価値が与えられる様子がよく分かります。

 私も、Twitterでハッシュタグを作った経験があります。その時は、多くの人がお題に沿った楽しいツイートをしてくれました。個々のツイートの内容の面白さに加えて、多くの人が自分の思いつきに乗ってくれたこと、ハッシュタグがどんどん広がっていったこと、「楽しい」「面白い」という感想を寄せてくれたことは、とてもうれしいことでした。このように感じているのが私だけではないことは、今も毎日のように新しいハッシュタグが作られ続けていることからも分かります。

■データに振り回されないように、私たちが考えるべきこと

 一方でデータは、使い方を誤ると人を不幸にしてしまう一面があります。

 誤ったデータの使い方が不幸を招く例としては、企業や公的機関によるデータの隠ぺい・改ざんや個人情報流出といった事件などがまず考えられます。「データの『美しさ』は、それがどう利用されるかで決まる(p.175)」のです。

 データの悪用は言語道断ですが、私たちもデータの使い方について、ある程度の心構えが必要です。データを並べただけで何もかも分かったような気になってしまうことは危険です。

 第13章「データでできないこと」は、データの過信に対する警告ともいえる内容です。感情や先入観をまったく持たない人間はいません。私たち人間はデータに触れる時に必ず、感情や先入観を持ってデータを見て、解釈するのです。そのことを忘れてしまうと、誰かの感情や先入観が作り出したシナリオに巻き込まれ、振り回されてしまいます。

 私にとって、いちばん印象に残ったのが、この第13章でした。私はテストエンジニアなので、テストの結果データを分析することがあります。この時、「私自身の先入観がなるべく入らないようにしよう」と注意してはいます。

 しかし、先入観がまったく入らないようにすることはおそらく不可能でしょう。私だけではなく、分析結果を読む人も、先入観からは逃れられません。その事実をしっかり心に留めて、せめて自分が提示した分析結果について、なぜそのように解釈したのか、説明できるようにしなければならないと痛感しました。

◇◇◇

 現代は、「好むと好まざるとにかかわらず、あらゆるデータが綿密に保管される(p.324)」時代です。冒頭でも述べたとおり、データを誰もが自由に扱える環境なのです。

 だからこそ、「美しいデータ」がどうあるべきか、私たちの誰もが真剣に考える必要があるのではないでしょうか。

『オブリガート ~感謝されるテストエンジニアになる~』
コラムニスト 第3バイオリン)

『Twitter API ポケットリファレンス』――Twitter4J開発者が語るTwitterアプリ開発のコツ

2011/07/29 18:00:15

Twitter API ポケットリファレンス Twitter API ポケットリファレンス

山本裕介(著)
技術評論社
2011年4月
ISBN-10: 477414732X
ISBN-13: 978-47741473219
2477円(税込)

■Twitterのサードパーティアプリが100万件を突破

 先日、Twitterのサードパーティアプリが100万件に達したというニュースがあった。

 FacebookやGoogle+など、数々のソーシャルサービスが覇権をかけて熾烈(しれつ)な競争を続ける中、Twitterの勢いはまだまだ衰えそうにない。Twitterは非常に身近なツールであるし、Twitter APIも大変分かりやすく作られている。そのため、開発者が「RESTfulなアプリケーションを学習するための入門として、取りあえずTwitterアプリを作ってみる」という需要があるように思う。

 本書は、JavaでTwitterアプリを実装する際のデファクトスタンダードともいえるライブラリ、Twitter4Jの作者である山本裕介(@yusukey)氏によるTwitter APIのリファレンス本である。

■「Twitterのすべて」が網羅されているといっても過言ではない

 本書は、「Twitterのすべて」が網羅されているといっても過言ではないと思う。

 第1章では、「Twitterの仕組み」というタイトルでTwitterの基本を説明している。フォロー、リムーブ、ブロックなどの用語の説明から始まり、公式リツイートと非公式リツイートの違いまで。会社の上司などに「Twitterってよく聞くけれど、どういうもの?」と聞かれ、返答に困った人は多いと思う。そのような人は第1章を読めば十分と思われるほどの丁寧さだ。

 第2章ではTwitter APIの基本を説明している。

 Twitter APIは大きく分けて「REST API」「検索API」「ストリーミングAPI」「Webサイト向けAPI」の4種類がある。ここでは、Twitter APIを扱うための代表的なライブラリの説明と、そのセットアップ方法。そしてTwitterアプリ開発の肝である、Twitterとの認証方法について解説している。第2章を読めば、Twitterアプリ開発の勘所はすべて抑えることができるだろう。

■Twitter4Jの作者だからこその、充実した技術解説

 本書の基本構成はTwitter APIのリファレンスであるから、ページの大部分はAPIの説明に費やされている。しかし、各章の先頭に書かれているAPIの概要は、技術的な読み物として純粋に面白い。

 例えばストリーミングAPI(第4章)について、登場の経緯やHTTP接続が切断された際の再接続のアルゴリズムなどは私も大変、勉強になった。

 しかし、Twitter APIの仕様を確認するだけなら、インターネットからさまざまな情報を得ることができる。ただのリファレンス本にとどまらない、本書の真骨頂は、巻末の付録として書かれている「アプリケーション開発のコツ」である。

 これは、著者の山本氏がTwitter4Jの開発で培ったノウハウ集であり、Twitterアプリ開発者なら必ず目を通しておくべき読み物である。

  • ストリーミングAPIを使う
  • 関連ツイート(mention)を控える
  • 非公式ツイートは避ける
  • botの無限ループに注意
  • ハッシュ汚しに注意
  • エラーが返ることを前提とする
  • クラウドプラットフォームとTwitterアプリケーション
  • 1つのメールアドレスで複数のTwitterアカウントを管理する
  • 401エラーが出る場合はクライアントのタイムスタンプを確認
  • レートリミットの回避
  • ダイレクトメッセージの送信制限の緩和
  • gzipでパフォーマンスを向上

 ざっと見出しを列挙してみたが、いかがだろう。Twitterアプリを少しでも実装した経験のある技術者にとっては、非常に気になる見出しなのではないだろうか。

■知識を得たら作ってみればよい

 前述したとおり、Twitter APIは基本的に分かりやすく設計されている。わたしも個人的に学習を兼ねてTwitter botを作ったことがあるが、まったく知識ゼロの状態からいろいろ試行錯誤し、3時間ほどでそれなりに動くものが出来上がった。Twitterアプリの実装は、Webプログラミングの学習としても最適な題材だと思う。

 ある程度プログラミングの素養があれば、おそらく誰でも、手軽にアプリが作れるのもTwitterの魅力であると思う。

 さて、それでは今すぐコンソールを開き、アカウントを取得し、Twitterアプリを作ってみようではないか。そのときに本書が、あなたの大きな力となってくれるはずだ。

『雲(クラウド)の隙間から青空が見えた』
コラムニスト 粕谷大輔)

『良いコードを書く技術』――親父の小言と冷酒は、すぐには効かずに後で効く

2011/07/15 10:00:00

良いコードを書く技術 良いコードを書く技術 
読みやすく保守しやすいプログラミング作法


縣俊貴(著)
技術評論社
2011年4月
ISBN-10: 4774145963
ISBN-13: 978-4774145969
2394円(税込)

■「親父の小言」

 「親父の小言」というものを見たことがあるだろうか。ガンコ親父の口癖や短いフレーズを集めた格言集みたいなものだ。そして、なぜか居酒屋のトイレで見かけることが多い。こちらのブログ記事に画像がある。見覚えがある方もいらっしゃるだろうか。

 「大酒は飲むな」「ばくちは打つな」など、若いうちは「うるさい小言」としか思えないが、人生経験を積んでくると徐々に納得できてくる、というフレーズが並んでいる。元ネタはこの本だそうで、なるほど「小言親父、暁仙和尚」なら言いそうな内容だ。

 親父とは言ってみれば人生の師匠であり、師匠が言うことは大体うるさいものである。若者は経験を積むにつれて、だんだん師匠の真意が分かってくる。

■プログラマにとっての「親父の小言」

 本書『良いコードを書く技術』は、プログラマにとっての「親父の小言」である。

 職業プログラマの皆さんは、コードレビューの場やちょっとしたミーティング、あるいは相談や質問をしたとき、先輩や師匠に「親父の小言」的なことを言われたことはないだろうか。「ここは抽象化できるよね」だったり、「この名前は分かりづらい」だったり、もしくは「ユニットテスト書けよ!」と怒られたり。

 ツッコミを受けると大抵、耳が痛いような気持ちになる。「親父の小言」は、正しいと分かっていても、ちょっとやかましいのである。しかし、いろんなツッコミを受け、何がまずかったのかを学び、吸収していく。そういった体験は、プログラマとしての実力を磨いていくのに必要不可欠だ。

 本書にはそんな、プログラマを育てるための「親父の小言」がまとめられている。目次から大見出しだけ引用してみよう。

  • 第1章 良いコードとは何か
  • 第2章 良いコードを書くための5つの習慣
  • 第3章 名前付け
  • 第4章 スコープ
  • 第5章 コードの分割
  • 第6章 コードの集約
  • 第7章 コードのパフォーマンス
  • 第8章 ユニットテスト
  • 第9章 抽象化
  • 第10章 メタプログラミング
  • 第11章 フレームワークを作ろう

 第3章以降が、本書に収録された「親父の小言」だ。「最適な名前をつけろ」「スコープは必要最小限にせよ」「ユニットテストを書け」など命令形で書くと、より親父の小言っぽさが増してくる。職業プログラマなら、先輩や師匠にこんなことを言われた経験が少なからずあるだろう。

 もしそんな経験がないのであれば、それは達人プログラマであるか、もしくは先輩や師匠が身近にいないかのどちらかだろう。自分が達人プログラマであると自負している人以外はぜひ本書を読んで、本文中に登場する「達人プログラマ」のツッコミを受けてほしい。プログラマが成長するためには、ちょっと耳に痛い「親父の小言」を吸収しなくてはならないのだから。

■普通から中級へ、中級から達人へ

 本書には「普通」「中級」「達人」と3人のプログラマが登場する。3人の掛け合いから本題に入っていくことが多いのだが、「第9章 抽象化」は特に印象的なパートだ。「普通」と「中級」の2人が、達人の指導を受けながらペアでリファクタリングをしていく、という構成になっている。

 プログラマを成長させるためにとても有効な体験が、会話文とコードで書籍に収録されている、というのは素晴らしいことだと感じている。意外と身近な環境で経験することは貴重だったりするので、ぜひ本書で仮想経験してもらいたいと思う。

 また、本書は先輩や師匠など「親父」にもお勧めできる。弟子が書いたコードにその場でツッコミを入れることはさほど難しくないが、きちんと「教える」ためのポイントが網羅されている資料はあまり見当たらない。新人教育のネタとしても本書は役立つだろう。

■ただの小言で終わらないために

 身近に「親父」がいて、自分のために小言を言ってくれるのは、とても幸せなことである。そして、プログラマにとっての「親父」は意外と数が少ない、ということを最近実感している。すぐ近くに小言を言ってくれる先輩や師匠がいない人には特に、本書を強くお勧めしたい。

 また、本書の内容は「親父の小言」同様、良いコードを書くための「指針」である。きちんと「良いコードを書く」技術を身に付けたいのであれば、各章とも専門書や勉強会、あるいは先輩や師匠から、しっかりと深く学ぶ必要がある。本書をインデックスとして活用し、「達人プログラマ」を目指してほしい。

■Links

『Wife Hacks ~仕事と家族とコミュニティと~』
コラムニスト kwappa)

『体系的に学ぶ安全なWebアプリケーションの作り方』――「安全」は開発のプロとしてのたしなみである

2011/06/29 15:51:45

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 体系的に学ぶ 安全なWebアプリケーションの作り方 
脆弱性が生まれる原理と対策の実践


徳丸浩(著)
ソフトバンククリエイティブ
2011年3月
ISBN-10: 4797361190
ISBN-13: 978-4797361193
3360円(税込)

■われわれの生活に根付く「安全神話」

 インターネットが生活の基盤になってから久しい。皆さんは今日もどこかのWebサービスにログインし、ユーザー名やパスワードといった個人情報、あるいはクレジットカードの番号を入力したかもしれない。

 「生活の基盤」である以上、安全で安心して使えるものである、という前提で考えがちだ。しかし、インターネットの先で運用されているWebサービスは、人が作ったプログラムである。人間の仕事である以上、完ぺきであるはずがない。

 これは当たり前の事実であるはずだが、毎日インターネットを使っていると、つい忘れがちだ。そして、何か大きな出来事――それは大体、あまり歓迎できないことだが――によって気付かされる。人間の悲しいところである。

 最近、それを痛感させる出来事が立て続けに起きた。

●PlayStation Network大規模個人情報流出事件

ソニー PlayStation Network 情報流出まとめ - 青いなぁ・・・

 PlayStation Networkに保持されていた、メールアドレスとパスワード、クレジットカード番号を含む個人情報が、合計で1億件以上流出した。衝撃的すぎる事件の原因は「アプリケーションサーバのぜい弱性」と言われている。

 この事件でソニーは大きく株価を落とし、企業価値は大きく損なわれた。

●Evernote XSSぜい弱性事件

Evernote XSS事件のエクスプロイトとその対策過程と顛末 | uuu

Togetter - 「Evernote の XSS 脆弱性に関して mala 氏のつぶやき」

 @bulkneets氏がtwitter上でEvernoteのぜい弱性について指摘したところ、翌日にエバーノートの日本法人から呼び出され(@ockeghem氏と一緒だった)、直接セキュリティコンサルティングを行ってきた、という事件。

 悪意のあるWebサイトでEvernoteに情報を送る「Webクリッパー」を使用すると、XSSぜい弱性によって任意のコードが実行され、Evernoteのデータに不正にアクセスできる、といぜい弱性だったが、素早い対応により大きな被害は出ていないようだ。

●SQLインジェクションぜい弱性でサーバを止めちゃった事件

Togetter - 「巫女テスター(17歳)、システムの致命的な欠陥を発見しサーバーごとシステムをシャットダウンした一部始終」

Togetter - 「巫女テスター(17歳)、欠陥システムをサーバーごとシャットダウンするに至った顛末とその後のお話」

 ペネトレーションテストを委託されたプログラマが、SQLインジェクションのぜい弱性に起因する深刻なセキュリティホールを発見、委託元の対応がのんびりしたものだったことにしびれを切らし、稼働中の本番サーバを止めてしまった、という事件。

 SQLインジェクションによって、クレジットカード番号を含むすべてのデータを不正入手できるという深刻な状況を、「半月後に修正するかどうか検討する」などと悠長な対応で片付けられたら、危険性を知っているエンジニアとしてはとても苦しむだろう。「独断でサーバをシャットダウン」という行為が議論を呼んでいるが、同じエンジニアとして気持ちは痛いほど分かる。

 この手の事件は、これが最初でもないし、最後でもない。しかし、セキュリティリスクはそのままビジネスのリスクに直結するのは間違いない。プロのエンジニアとして、リスクを混入させないための意識と知識が、ますます要求されるようになるだろう。

■プロとしてのたしなみ

 そこで本書の出番である。

●入門書の恐怖

 技術書全般の傾向として、「入門書が多く、専門的な内容になるにつれて数が少なくなる」という特徴がある。専門的な知識が要求される度合いを考えれば当然なのだが、特にWebアプリケーションにおいて、その傾向が顕著であるように感じる。

 「PHPによるWebアプリケーション開発入門!」みたいな本はたくさん存在するが、その中でぜい弱性について大きく取り上げるケースはまれである。入門書の目的は「初心者がWebアプリケーションを開発できるようになること」である。ぜい弱性とその対策に大きな紙面を割くと、初心者が脱落してしまうから致し方ない。

 その本でPHP(など)を学んだプログラマが、やがて仕事してWebアプリケーションを開発するようになるとしよう。ぜい弱性の存在を知らないから、「安全なWebアプリケーションを作ろう」という意識を持たないまま、開発を行う。それが「安全でないWebアプリケーション」をまん延させる遠因になっているのだ。

●プロの開発者ならば

 Twitterやブログ、講演などの手段を通じて、このような状況にずっと警鐘を鳴らし続けてきたのが、本書の著者 徳丸浩(@ockeghem)氏だ。先ほど紹介したEvernote事件にも登場している、Webアプリケーションのセキュリティ方面における第一人者である。

 私が勉強会に参加するようになった2008年、「WASForum Conference 2008」での講演にショックを受けたのを覚えている。それから3年、やっと徳丸氏のの知見が1冊の本にまとまったことがとてもうれしい。

 「体系的に学ぶ」というタイトルどおり、本書は現在知られているWebアプリケーションのぜい弱性について、網羅的にまとめている。ぜい弱性の原因・攻撃手法・防御手法を詳細に解説し、サンプルコードと実証環境で実際に体験できる。

 既存のぜい弱性の原因は(おそらく)すべて取り上げられているので、本書を読めばWebアプリケーションの既知のぜい弱性は防げるはずだ。逆に言うと、本書が解説するぜい弱性を作りこんでしまっていた場合、プロのエンジニアとしては怠慢のそしりを免れまい。

 また、付属のCD-ROMに実証環境が収録されているのもすばらしい。VMWare Playerのディスクイメージが用意されているので、実際に攻撃と防御を体験できる。手を動かすことで、ぜい弱性を作り込むことの恐ろしさを実感できるのが良い。

 さらにもう1つ、第9章「安全なWebアプリケーションのための開発マネジメント」も必読だ。Webアプリケーションの開発プロジェクトをマネジメントする上で、ぜい弱性に対しての理解を持ち、コストを計上、エンジニアに適切な教育を施す。当たり前ではあるが、今まであまり言及されてこなかった視点である。エンジニアの皆さんは、ぜひマネジメント層にも第9章を読んでもらう努力をしてほしい。

●時代は変わる

 インターネットの世界は変化の速度が速いので、新しいぜい弱性はこれからどんどん出てくるだろう。

 例えば、最近注目を集めている「node.js」は、「Websocket」という新しいプロトコルを使ってリアルタイム通信を行っている。しかし、Websocketにはプロトコルレベルでのぜい弱性がある、として、Firefox4ではWebsocketによる通信がデフォルトでオフにされている。

 こういった出来事についてキャッチアップするためにも、既存のぜい弱性に対する学習と対処は、本書のような体系的にまとめられた良書で、“素早く確実に”済ませておこう。先達が切り開いてくれた「知の高速道路」は、有効に活用するべきだ。

■まとめ

 本書は読むこと・手を動かすことを通じ、既知のぜい弱性を体系的に学ぶことができる良書である。プロのエンジニアとして必須の知識が詰まっているので、「必読」と言っても過言ではない。新人研修や社内勉強会の教材として、開発チーム全体で学ぶ必要もあるだろう。

 安全なWebアプリケーションを開発することは、プロの開発者としての責務であり、利用者や会社、ひいては開発者自身の利益を守ることにもつながる。事故が起きる前に、事故を起こす前に、ちょっと立ち止まって学んでみよう。

■Links

徳丸浩の日記

 著者である徳丸氏のブログ。ぜい弱性に関する濃密な情報が発信されているので、ぜひ購読をお勧めする。

CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例 - 徳丸浩の日記

 先日書評した『パーフェクトPHP』に書かれていたCSRF対策へのツッコミ。『パーフェクトPHP』を読んでいれば一読の必要あり。

wasbookのVMをVirtual Boxで動かす | Kwappa研究開発室7

 本書付属のCD-ROMに収録された、体験用VMをVirtual Boxで動かすための手順メモ。

『Javaルールブック』――可読性の高いコードを書くルールを直感的に把握する

2011/06/10 14:43:15

Javaルールブック Javaルールブック 
読みやすく効率的なコードの原則


大谷晋平、米林正明、片山暁雄、横田健彦(著)
電通国際情報サービス (監修)
技術評論社
2011年2月

ISBN-10: 4774145475
ISBN-13: 978-4774145471
2709円(税込)

■コーディングのルールは必要だ。だが、縛りすぎてもならぬ

 チームで開発を行うと、必ず「ルール」が必要になる。よくある規約としては、開発手法を定めた「開発規約」や、どのようなテストをどれだけ行うかを定めた「テスト規約」などがある。

 コードを書く際、どのプログラミング言語にも最低限のルールは存在する。しかし、すべてのエンジニアがそれを熟知しているとは限らない。ルールを知らないエンジニアが書いたコードは、本人にしか理解できないものになる。そのようなコードを1つ許せば、いずれシステム全体が混沌状態に陥り、システムの品質を落としてしまう。

 では、厳密にコードを書くためのルールを決めれば、問題は解決するか?

 必ずしもそうとは限らない。ルールは、時としてコードを書く上で足かせとなる。ガチガチに規約で縛ると、ルールを守るために冗長なコードを書いたり、必要以上の実装を求められたりと、生産性を落とすことになりかねない。実装の自由度を十分に残しつつ、一定のルールを決定することは非常に難しい。そこで、役に立つのが本書である。

■OK? NG? Javaを書く上で注意すべきルールを直感的に把握

 本書はJavaのコードを書く上で注意すべきルールについて、「不適切なコード」と「修正したコード」を並べて解説している。そのため、コードのどこに問題があるか、なぜ不適切なコードなのかが非常に分かりやすい。

 また、すべての規約に星1つ~星5つの評価を付け、星の数でルールの重要度を示している。ある程度のJavaの知識を持つエンジニアにとって、星5つのルールは「無意識のうちに守っている」というレベルだ。しかし、逆にJavaの知識に自信のないエンジニアにとって、星5つのルールはJavaの書き方の基礎を固めるのにちょうどいいだろう。まずは星5つのルールを重点的に読み、それから星数が少ないものへと進めていくと、より良いJavaソースの書き方を身に付けることができる。

■本書の構成

  • 第0章 コーディングの心得5カ条
  • 第1章 ネーミングルール
  • 第2章 プログラミングルール/基礎編
  • 第3章 プログラミングルール/テクニック編

 初めてプログラミングをする人は、ぜひ第0章から読んでほしい。どの言語にも共通するプログラミングの基本的な事項に触れているからだ。「他の言語の経験があるがJavaは初めて」という人は第1章から、ある程度Javaの経験がある人は第2章で自分のコードに悪い癖がないか見直し、第3章へと進むとよい。

■Eclipseショートカットに注目

 本書の中でも特に注目しておきたいのが、巻末のEclipseショートカットの解説である。現在、多くのJava開発プロジェクトでEclipseが導入されている。Eclipseでコードを書く際にマウスでの操作は可能だが、やはりコードをリズムよく書くためにはできる限りキーボードから手を離したくない。「Eclipseを使っている間のマウスに手を伸ばす時間は、人生の無駄」というぐらい、ショートカットを知っているのとそうでないとでは、開発のスピードが格段に変わる。ここに出てくる12項目については、ぜひ覚えておきたい。

 ソースコードは、書くより読む回数の方が多い。システムとして運用する期間が長くなるに従い、読む回数が多くなっていく。そのため、システム開発には「品質」「性能」と同時に、コードそのものの「可読性」も重視される。Javaの経験者はこの本を使って自分のコードを見直すし、自分のコードの癖を見直す。初学者には、Javaを使ってコードを書く時に必要なルールを学び、より良いソースコードを書くための目標としてほしい。

■こんなエンジニアにオススメ

  • 初めてプログラミングをする人
  • 他の言語の経験はあるがJavaで初めてコードを書く人
  • これまでJavaで開発してきたがちょっと自分のソースに自信がない人
  • これからJavaでの開発を始めるプロジェクトのメンバー/リーダー

『Java:The Good Parts』 一流のプログラマになるには言語の“コア”を理解せよ

2011/05/17 13:18:19

Java: The Good Parts  Java:The Good Parts

Jim Waldo(著)
矢野勉(監訳)笹井崇司(翻訳)

オライリージャパン
2011年2月
ISBN-10: 487311487X
ISBN-13: 978-4873114873
2310円(税込)

■言語ごとの特性を理解し、使い分ける人が一流のプログラマ

 あらゆる面で完ぺきなソフトウェアは存在しない。プログラミング言語もソフトウェアである。ゆえに、あらゆる面で完ぺきなプログラミング言語は存在しない。

 人間の言語が現実世界をうまく表現できないのであれば、まず間違いなく、プログラミング言語が現実世界をもっとうまく表現できるとは期待できないだろう。プログラミング言語は現実世界にあるものをモデル化するための抽象概念を提供するが、その言語の表現力は現実世界と言語とを直接対応付けるには不十分なところがある(p111)。

 完ぺきなプログラミング言語は存在しない。ならば、プログラム言語ごとの特性を理解して使い分けるのが、一流のプログラマだと思う。

 現在、使われているプログラミング言語で「実現できること」に極端な差はない。大抵のソフトウェアは他のプログラミング言語に移植できる。

 もちろん、プログラミング言語ごとに得手不得手はあるだろう。私はJava言語をメインのプログラミング言語としている。だが、果たしてそのクセを理解して使いこなしているだろうか? 長所と短所をきちんと把握しているだろうか?

■Java言語の“コア”を知るための本

 本書は、Java言語開発当初から関わったベテランエンジニア Jim Waldo氏が、Java言語の設計思想やJavaの秀でた部分について語るものだ。

 目次を並べてみると、「初学者用の本か?」と思うぐらい基本的な項目が並ぶ。

1章 Javaについて
2章 型システム
3章 例外
4章 パッケージ
5章 ガベージコレクション
6章 Java仮想マシン
7章 JavaDoc
8章 コレクション
9章 リモートメソッド呼び出し(RMI)とオブジェクトシリアライゼーション
10章 並行処理
11章 開発者のエコロジー

 この本では、JPAやDIといった派手なことは解説しない。書かれているのはJava言語の「コアな部分」である。以下、Javaエンジニアとして私が気になった部分をいくつか紹介しよう。

■型システム

 クラスとインターフェイス、その中間にある抽象クラス。Javaの型は3つしかない。

 歴史的に見ると、型はコンパイラがオブジェクトに割り当てる容量を決定するためにコンピューター言語で使われてきた(p8)。

 Javaでは、型システムに別の役割がある。クラスだけでも実装はできる。インスタンス化できないインターフェイスや抽象クラスでは、オブジェクトのサイズを計ることはできない。実装を持つことが可能な抽象クラスと違って、インターフェイスを使えば使うほど、余計なコードをタイプをしなければならない。試行錯誤で実装する時は、インターフェイスがわずらわしいと思うことさえある。

 なぜ、わざわざ実体を持たないインターフェイスを使う必要があるのか。

 オブジェクトに対するインターフェイスは実のところユーザーインターフェイスであり、ここで言うところのユーザーとはプログラマのことである(p11)。

 Java言語は、大規模開発に使われることが多い。インターフェイスは作成した本人を含めて、誰かに使ってもらうプログラムを前提としている。師匠の1人にかつて、「Javaではインターフェイスに向かってプログラムしろ」と言われたことを思い出した。

 Java言語ではクラスは単一継承しかできないが、インターフェイスは複数を1つのクラスに持てる。実装すべきインターフェイスが複数ある場合、同じ名前、同じシグニチャを持つメソッドが存在する場合がある。このことは制約であるがJava言語の限界ではない。視点を変えると1つの設計指針にもなる。何をするべきメソッドなのか、メソッド名で明確にする必要があるからだ。

public interface Family {
    public String getName();
}

public interface Person {
    public String getName();
}

public class PersonImpl implements Family, Person{
    @Override
    public String getName() {
        return "姓?名?";
    }
}

となる場合、getName()はFamilyとPersonのどちらの意味を実装するべきな のだろうか。   

 public String getName() というシグニチャからは名前を返すメソッドであることが分かる。これが人の名前を返すようなメソッドである場合、「フルネームなのか」「姓を返すメソッドのか」「名を返すメソッドなのか」といった曖昧さが生まれる。そのため、getFamilyName() getFirstName()などの名前を検討する。メソッド名は、別の意味を持つ可能性を常に考慮しなければならない。

 これが、method1()といったどうとでも取れるメソッド名をつけてはならない理由の1つでもある。

■例外

 例外は例外として処理するべきである。シグニチャと異なるクラスを返すために使用するべきではない。

 Javaのもともとの目的は、長年にわたって理解可能でメンテナンス可能な、大規模なシステムを書くのを助けること(p.27)

 処理されない例外は、コールスタックにある次のメソッドで処理される。古いJavaの設計では、必ずしも例外を処理する必要はなかった。呼び出し側がどの例外をキャッチしなければならないか、知っておく必要があった。

 例外のメカニズムが変更されたのは、Java1.0の時代だ。スローする例外はメソッドシグニチャに明記しなければならない。スローされた例外は、キャッチして処理するか再スローするかの判断を行う。例外を無視したければ「無視をする」という選択をしなければならない。

 その思想に反する例外クラスがある。「非検査例外」とも呼ばれるRuntimeExceptionだ。このクラスは、仮想マシンや実行しているOSの都合で起こる例外を表現するためにある。システムの土台で起こりうる例外にスロー宣言が必要ならば、すべてのメソッドに例外を記述する必要が出てくる。仮想マシンの例外に対してアプリケーションができることはほとんどない。ゆえにRuntimeExceptionが存在する。

 悪に抵抗しよう。新しいRuntimeExceptionを宣言してはいけない(p.38)。

 フレームワークを多用していると、フレームワークが持つ「新しいRuntimeException」とやらによく出合う。これはある種の“土台”で起こる例外であり、よくできたフレームワークはその例外処理をきちんと行っている。このことを意識して、OSSのソースコードを追いかけていくと、面白い発見が得られるだろう。

■パッケージ

 無名パッケージは名前空間の変獄のようなもので、頭が混乱していたり、固かったり、怠惰なプログラマが書いたコードが、彼らが高度生命体に進化するまで置かれる場所だ。無名パッケージに何かを置くべき正当な理由はない。したがって、そうしてはいけない(p.43)。

 名前空間というものがなぜ存在するのか。パッケージがユニークである必要性はいまさら語るまでもないだろう。

 私がずっとひっかかっていた疑問がある。なぜ、パッケージ名がファイルシステムに依存するのか? なぜ、パッケージ名と同じディレクトリ構成にするのか?

 当初のJava言語では、バージョン管理システムのようなものを組み込みたいという意図があった。そのためには、データベースにソースやバイナリを格納したい。データベースからデータを特定するためには、主キーになるものが必要であった。

 データベースの安価なエミュレータとしてファイルシステムを使うという決定がなされた。

 その決定は「歴史が愚かさを明らかにする」という。現在ではIDEの補助により軽減されたが、根本的な問題は解決されていない。

 本書は、Javaの「負の遺産」を隠さない。Javaという言語の根幹を、丁寧にひも解いていく。

■正しく使うこと

 プログラミングは創作活動だと思う。音楽や絵画を「美しい」と感じるように、プログラムにも美しい世界が存在する。画家は鮮やかな色使いを求め、音楽家は心地よい旋律を探す。プログラマはロジックと機能のために、正しい言語の使い方を覚えたい。

 なぜ、正しい言葉使いが大切なのか。答えはシンプルである。

 言語の表現力を超えてまで言語を酷使すると、間違った設計に繋がるためだ(p.112)。

 作家がよい言葉を捜すように、哲学者が厳密に言葉を定義するように、プログラマはプログラミング言語という言葉を重ねる。

 本書は技術書の中でも気軽に読めて、かつ「言語の哲学」に触れられる。ある程度、Java言語が分かれば、初心者から上級者まで誰が読んでも楽しめる良書である。時間をかけてコーヒーをドリップするように、言葉について考える1冊。

『フリーなスキル』コラムニスト はがねのつるぎ)

『Scalaで学ぶ関数脳入門』――オブジェクト指向プログラマが“関数脳”を手に入れるコツ

2011/04/12 17:23:15

オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門 オブジェクト指向プログラマが次に読む本 Scalaで学ぶ関数脳入門

テクノロジックアート(著)
長瀬嘉秀、町田修一(監修)
技術評論社
2010年11月
ISBN-10: 4774144363
ISBN-13: 978-4774144368
3339円(税込)

■関数型言語への注目が高まっている

 近年、関数型言語への注目が高まっているように感じる。関数型言語自体の歴史は古く、1958年にMITのジョン・マッカーシー氏によって考案されたLISPが最初期の関数型言語だ。LISPは、FORTRANに次いで2番目に古い高級言語でもある。

 いくらか私の主観を交えて言えば、プログラミング言語の主流は、長らくJavaやC#などの「オブジェクト指向言語」だった。CPUの進化の方向性が「高速化」から「並列化」へとシフトしつつある中で、プログラミング言語においても、いかに「並列処理」や「並行処理」を容易に実装するか、という考え方が重視されるようになる。そういった流れに対する1つの方向性として、ここにきて関数型言語に注目が集まっているようだ。

 書籍『言語設計者たちが考えること』においても、C#の生みの親であるアンダース・ヘルスバーグ氏が、「並行性にどう対応していくかの課題に対して、関数型言語がカギになる可能性がある」と述べ、実際にC#にもラムダ式やクロージャなど、関数型言語由来の機能が実装されている。

 そのような流れにおいて、私もシステム開発の現場に関わる人間の嗜(たしな)みとして、オブジェクト指向言語の次のパラダイムといえる関数型言語について学習すべきであると考えるようになった。

■なぜScalaなのか

 現在、世の中にはさまざまな関数型言語が存在する。関数型言語は、変数の書き換えの可否によって「純粋関数型言語(変数の書き換え不可、すなわち定数のみ)」と「非純粋関数型言語(変数の書き換えが可能)」に分類され、それぞれ下記のプログラム言語が存在する。

  • 純粋関数型言語:Haskell、Mirandaなど
  • 非純粋関数型言語:F#、Scala、Lispなど

 このうち、F#やScalaはオブジェクト指向言語と関数型言語、両方の特性を備えている。F#は.NET Framework、ScalaはJVM(Java Virtual Machine)上で動作し、それぞれ.NET FrameworkやJavaのクラスライブラリをそのまま利用できる。そのため、これらの言語は長らくオブジェクト指向言語に携わってきたプログラマにとって、比較的取っつきやすいのではないだろうか。

 本書ではScalaを例に上げ、Javaとの比較を用いるなどしてプログラマの「オブジェクト指向脳」を「関数脳」にシフトさせることを目的としている。

■そもそも、関数型言語における「関数」とは何か

 ここで1つ、私自身の恥ずかしい過去を告白しよう。

 関数型言語を正しく学ぶまで、私は関数型言語における「関数」とは、オブジェクト指向言語や手続き型言語における「メソッド」や「関数」と同義だと思っていた。

 メソッドや関数の組み合わせで動作するのだから、JavaやCだって広義では関数型言語に属するのではないか、そんな風に考えていた時期が私にはあった。そういうことを酒の席で偉そうに語り、場に微妙な空気をもたらしたこともある。

 関数型言語における「関数」とは、本書によると「数学的な意味での関数を基本モジュールとしてプログラムを構成するプログラミングモデル」とある。

 数学における関数には、「f(x)=x^2 + 3x + 2」のように、引数に値を渡して呼び出した際に、「戻り値は引数の値のみに依存する」という原則がある。前述の関数においては、xに1を与えると戻り値は必ず6になる。

 一方、Javaなどにおけるメソッドは、オブジェクトの内部状態や外部のスコープの広い変数などに依存するため、引数に同じ値を与えても必ずしも同じ戻り値が得られるとは限らない。こういう状況を「プログラムにおける副作用」と呼び、Javaなどでプログラムを実装する際には副作用のない設計が理想とされるものの、それは言語仕様レベルで既定されているわけではない。

 関数型言語は、「関数」を「数学的な意味での関数」と捉えるわけだから、副作用を言語仕様レベルで認めていないということになる(一部例外もあるが)。

 関数型言語は、このように、「副作用のないプログラミング」が基本概念の1つとなる。

 もう1つ、関数型言語の基本概念には「関数は値である」というものがあるが、その解説については本書をお読みいただくとしよう。

■「オブジェクト指向脳」を「関数脳」に変える面白さ

 関数型言語における学習のポイントは、前述したように「関数」をどう捉えるか、というところによる。長らく「メソッド」という考え方を体に染み込ませている「オブジェクト指向脳」を、「関数脳」にシフトする工程はとても刺激的で、新しい知識を得る喜びを味わえるだろう。

 本章では順を追って丁寧に、「関数型言語とは何か」を解説してくれる。

 目次を見てみよう。

 第1部 導入編
  第1章 Scalaで関数脳を習得しよう
  第2章 Scalaことはじめ
 第2部 基礎知識編
  第3章 関数型プログラミング
  第4章 コレクション
  第5章 再帰
  第6章 パターンマッチング
  第7章 型
  第8章 並行プログラミング
 第3部 応用技術編
  第9章 メッセージパッシングとアクタープログラミング
  第10章 言語処理プログラミングとパーサーコンビネータ
  第11章 DSL
 付録 Scala入門

 導入編においてScalaの簡単な解説、続いて基礎知識編でじっくりと関数型言語についての理解を深めていき、応用技術編ではかなりディープな世界に触れることができる。個人的に最終章のDSLはエキサイティングだった。この辺りの興奮は、ぜひ本書を読んで体感していただきたい。

 1つだけ注意点を書かせていただくと、本書はScalaを例にとった「関数型言語」の入門書である。付録などでScalaの言語仕様について親切な解説が付与されているが、Scalaという言語そのものを深く追究する本ではない。

 より良いプログラマになるためのプラクティスとして、1年に1つずつ新しい言語を学ぶ、というものがある。今年、何の言語を学ぼうか悩んでいる方は、本書を手に取り、関数型言語のエキサイティングな知識体験を味わってみてはいかがだろうか。

『雲(クラウド)の隙間から青空が見えた』 コラムニスト 粕谷大輔)

『パーフェクトPHP』――disられないPHPを書くためのパーフェクトな指南

2011/04/07 15:40:15

パーフェクトPHP パーフェクトPHP

小川雄大、柄沢聡太郎、橋口誠(著)
技術評論社
2010年11月
ISBN-10: 4774144371
ISBN-13: 978-4774144375
3780円(税込)

■「例えば、PHPを避ける」の衝撃

 Webプログラミングの分野で大きなシェアを持つスクリプト言語、PHP。しかし、プログラマのコミュニティ界隈では「PHPをdisる」ことが、風物詩のように行われている。

 原因の一端は、おそらくIPAの「セキュア・プログラミング講座」というコンテンツだろう。『より良いWebアプリケーション設計のヒント』というページには、公開当時『例えば、PHPを避ける』というかなりショッキングな記述がされていた(現在は修正されて『プログラマが脆弱性をつくり易い環境を避ける』という表現になっている)。

 当時の記述については、こちらのブログ記事が引用して紹介している。安全なプログラミングについての考察もされているので、PHPでプログラミングをしている人にはぜひ一読をお勧めしたい。

■なぜPHPを避けるのか

 さまざまな理由と視点から、PHPはdisられ続けてきた。PHPをdisるブログエントリをまとめた記事を見つけたので、興味のある人は読んでみてほしい。

 私も理由を考えて(そして書いて)みたのだが、あまりにも多すぎて本題から逸脱しすぎたので、割愛することにした。1つだけ書いておくと……

% php -r 'print_r(unpack("c*", "hoge")) ;'
Array
(
    [1] => 104
    [2] => 111
    [3] => 103
    [4] => 101
)

 なぜ1から始まるのかと。

 私が見聞きした中で一番腑に落ちたのが、「PHPはジャンクフード」という批判である。安価かつ短時間で手軽に空腹を満たせるが、将来に自分の健康へしっぺ返しがあるのは間違いない。

■とはいっても、避けてばかりもいられない

 とはいえ、Web開発の現場でPHPが占めている割合を考えると、到底避けてばかりはいられない。TIOBE SOFTWAREという会社が発表したプログラミング言語の人気ランキング(複数の検索エンジンの検索結果から算出したもの)で、PHPは2010年2月で3位、2011年2月で6位にランクインしている。

 検索エンジンから収集したデータなので明確な根拠にはならないが、このデータは「もはや無視できない量のPHPコードやプロダクトが、すでに存在している」ということを示唆している。

■ジャンクフード・プログラミングから抜け出す

 PHPを使うと、手早く安価な「ジャンクフード的に」Webアプリケーションを構築すること“も”できる。しかし、将来の自分の健康を考えると、メンテナンスしやすく、堅牢で、きれいなコードで構築したほうがいいのは自明である。ジャンクフードを食べ過ぎて健康を損なうのは勝手だが、ジャンクフード・プログラミングで生み出された不健康なコードは、やがてチームに、会社に、そして社会にも大きな損失を与えてしまう……かもしれないのだ。

 つまり、ジャンクフード・プログラミングから抜け出し、プロフェッショナルなソフトウェア職人を目指すのであれば、本書のような「健康的なプログラミング」を教えてくる本を読む必要がある。

■「パーフェクトなPHP」を目指せ

 本書『パーフェクトPHP』からは、「健康的なプログラミング」ができるプログラマを増やそう、という決意のようなものが伝わってくる。

 基本的な言語仕様や、PHPの主な用途であるWebアプリケーションの作成、よく遭遇する問題への実践的なレシピなど、初学者にも現場でバリバリコードを書いているプログラマにも役に立つ内容が、高い密度でまとめられている。

 それだけでも十分役に立つ本なのだが、さらに「決意を感じさせる」2つの特徴がある。

 1つは、Webアプリケーションのセキュリティへの言及だ。9章、10章を割いて、Webアプリケーションにはどのような攻撃が行われ、それにどう対処していくべきかが広く、そして深く解説している。健康的な(=脆弱性のない)Webアプリケーションを作り出すためには、必須の知識と言えるだろう。

 もう1つは、随所に挟まれる「コラム」である。現場の最前線でPHPを使っている著者陣によって、ジャンクではない“健康的な”プログラミングをするために必要な知識や心掛けが散りばめられている。知らなくても動くが、「健康的なプログラミングができるプログラマ」になるための重要な知識について触れられているので、これらのコラムにも注目しながら読み進めてほしい。

■まとめ:健康を守って、PHPを書く

 PHPが好きであれば、健康的なコードを書くべきである。PHPが仕事の道具であるならば、やはり健康的なコードを書くべきである。ジャンクフード・プログラミングから脱却し、ちゃんとした「プロの仕事」をするために、本書は強力なガイドになるだろう。

 不摂生はいつか、手痛いしっぺ返しとなって戻ってくる。痛い目にあわないためにも、社会に迷惑をかけないためにも、PHPプログラマであるならば健康的なPHPプログラミング、つまり「パーフェクトPHP」を目指そう。

 ちなみに、本書で紹介されているCSRF対策には徳丸浩さんからツッコミが入っている。セキュリティの章を読み終えたら、併せて参照していただきたい。

■Links

『ビューティフルテスティング』――テスターの美学は「醜いよりも美しい方がいい」

2011/03/30 16:13:16

ビューティフルテスティング ビューティフルテスティング 
ソフトウェアテストの美しい実践


Tim Riley (編集)、Adam Goucher (編集)
大西建児(監訳・翻訳)、 児島修 (翻訳)
オライリージャパン
2010年10月
ISBN-10: 4873114748
ISBN-13: 978-4873114743
3360円(税込)

■テストにおける永遠のテーマから、最新テスト手法まで

 美しいテストとは何か?

 上記の問いについて、テストのプロフェッショナルたちが経験に基づいて語ったものを集めたエッセイ集――それが本書『ビューティフルテスティング』です。

 バグ管理やテストの自動化といった「テストにおける永遠のテーマ」から、ファズテスティングやテスト駆動型開発、アジャイル・テスティングといった、日本でも注目を集め始めた新しいテスト手法の紹介までと幅広く、まさにアメリカのテストの「今」がここにあると言っても過言ではないでしょう。

 本書の内容は、あくまでアメリカのテスト現場に関する話なので、日本の事情とは異なる部分もあります。そのためか、ところどころに違和感を覚える部分がありましたが、そのような部分には、脚注に解説があります。そちらを併せて読めば、違和感はいくらか解消されます。

■あなたの横にいるテストエンジニアは何を考えているのか

 本書は「テスターはお役に立っていますか?」という章から始まります。ここでは、テスターがどんな人たちなのか、何を考えながら仕事をしているのかについて、(皮肉混じりの)ユーモアたっぷりに描かれています。

 「テスターはバグを見つけるのが好き」

 「テスターが生きがいを感じるのは『ひどい』バグ」

 「開発やマネジメントのメンバーがぞっとするようなものがテスターにとっては『ビューティーなこと』」

 などなど。これには開発者もテストエンジニアも思わずニヤリとしてしまうのではないでしょうか(その意味はまったく逆でしょうが)。

 これだけ書くと、「テスターってやつは、なんて性格の悪い連中なんだ!」と思われるかもしれません。しかし、テスターについてはこうも書かれています。

 「周囲から仕事ぶりを評価され、感謝されるからこそ、もうひと頑張りできる」

 テスターも人の子です。ちょっと褒めてもらえるだけで、頑張ろうと思えるのです。

 テストの現場を支える「テスター」という存在を知るために、テストエンジニアはもちろん、テストエンジニアと一緒に働く開発者にもぜひ読んでほしいところです。

■Pythonや乱数ジェネレータって、どうやってテストしているの?

 本書には、さまざまなテストについてのエピソードも掲載されています。例えば、プログラミング言語「Python」(第9章)や、医療系ソフトウェア(第12章)といった、皆さんにとっても身近なもののテストの様子が臨場感をもって描写されています。また、乱数ジェネレータのテスト(第10章)では、ランダムな数値を出力するうえでの「ランダムであること」をどのようにテストするか、何を基準にしてテスト合格にするかという、普段はなかなか気付かない素朴な疑問にも答えてくれています。

 私はテストエンジニアなので、自分が普段扱っているテスト対象については、どのようにテストしているかはもちろん分かります。しかし、それ以外のものはどうやってテストしているのか、意外と知らないことに気付きました。そのため、「ほうほう、あのソフトウェアはそういうところに注意しながらテストしているのか」など、大変興味深く読むことができました。

■コミュニティ活動×テストがアツい

 また、個人的にはコミュニティと連携したテスト(第3章、第20章)というのも気になりました。

 第3章「オープンソースQAコミュニティの構築」では、オープンソースプロジェクトでQAチームを発足させたときのエピソードが語られています。

 オープンソースプロジェクトでは、メンバーの大半がボランティアというチームも珍しくないと思います。この章で取り上げられているQAチームも例外ではありませんでした。

 そのようなチームを回していくためのコツや、リーダーの心構えなど、本書はコミュニティをうまく運営するために大切なことについても言及しています。

  • それぞれのメンバーがプロジェクトに何を期待しているか見極める
  • メンバーには早い段階で小さな責任を与えるべき
  • チームリーダー自身が学ぶ姿をメンバーに見せる

 これらのアドバイスは、QAチームに限らず、どのコミュニティでも使えるものではないでしょうか。私自身、新潟でテストのコミュニティを立ち上げているところなので、この話はとても参考になりました。それと同時に、コミュニティと一緒にテストを作っていくという活動に、とてもワクワクしました。

 このような話を聞くと、「そんなのアメリカだけの話でしょ」と思われる方もいらっしゃるかもしれません。いえいえ、日本にも「ソフトウェアテスト技術交流会(TEF)」という、ボランティアベースのテストコミュニティが存在します。このコミュニティでは、テスト専門書の翻訳や、地域独自のテストツールの作成など、さまざまな活動をしています。

 コミュニティのメンバーはその多くがボランティアですが、ユーザーの目線とテスト対象への深い愛着を持ち合わせた存在です。彼らの力を借りない手はありません。コミュニティと一緒にテストを作っていく。今後、日本でもこのような活動が盛んになっていくかもしれません。

■日本語版の付録「組み込みテスト事情」にも注目

 本書には、日本語版の付録として山浦恒央さんのエッセイも収録されています。私は以前、本書の監訳を担当された大西建児さんとお会いする機会があり、この付録についてのお話を伺いました。

 先にも書きましたが、本書はアメリカのテストの現場のお話です。そのため、日本人にはピンとこない部分もあります。また、日本に多い組み込み系のテストに関する話題がありません。大西さんいわく「だから、日本のテスト事情と、組み込み系のテストに詳しい山浦さんのエッセイを収録したといういきさつがあった」そうです。

 私自身が組み込み系のテストを主に担当していることもありますが、実際にこの付録は読みやすい印象を受けました。私が「日本のテストの現場で働く日本人テストエンジニア」の典型がどうかは分かりませんが、日本のテストの専門書を読み、日本のテストの現場(特に組み込み系)でOJTによって教育を受けた人なら「なるほど」と思えるのではないかと思いました。

■テストを愛する人たちが語る「美しいテスト」

 本書の全体を通して感じたのは、執筆陣の「テストに対する深い愛情」です。彼らが口をそろえて主張することは、「美しいテストとはシンプルで、効率のよいテストである」ということです。

 なんだ、意外と普通で当たり前のことじゃないかと思われるかもしれません。しかし、それがわざわざ強調されるということは、その“当たり前”がまだ実現されていないとも言えます。

 山浦さんのエッセイに、『ソフトウェア・テストの技法』(マイヤーズ著)という本が紹介されています。30年以上ベストセラーとして売れ続けている本と紹介されていましたが、裏を返すと、30年前からほとんどテストの技術が進歩していないということでもあるわけです。

 実際、書店に行ってIT関連の技術書のコーナーを見てみると、開発向けの専門書は本棚いっぱいに並べられ、しかも短期間のうちに新しい書籍が次々と発売され(そして一部は消え)ています。それに引き換え、テストの専門書は本棚の隅っこに申し訳程度にコーナーが設けられていることがほとんどで(小さい書店にはそもそもコーナーがなかったりします)、取り揃えている書籍も開発向けのそれに比べると、数も種類も少ないのです。

 本書には、現在進行形の取り組みについての話題が多く収録されていました。美しいテスト実現への道はまだまだ長そうです。

 そんな長い道のりを歩む力になってくれる、シンプルだけどしびれる言葉を最後にお伝えしたいと思います。

 「醜いよりも美しい方がいい」(第9章タイトルより)

『言語設計者たちが考えること』――プログラミングの世界を作った神々の饗宴

2011/02/23 17:30:00

言語設計者たちが考えること 言語設計者たちが考えること

Federico Biancuzzi、Shane Warden(編集)
伊藤真浩、頃末和義、佐藤嘉一、鈴木幸敏、村上雅章 (翻訳) 
オライリージャパン
2010年9月
ISBN-10: 4873114713
ISBN-13: 978-4873114712
3780円(税込)

■広大なプログラミング言語の世界を作った人々

 本書は、新旧18のプログラミング言語を設計した、20人超の「言語設計者」へのインタビューを集めたものです。原著(英語)は17言語の設計者に対するインタビューですが、日本語版はRubyのまつもとゆきひろ氏へのインタビューを追加しています。

 「言語設計者」と一口にいっても、かなりの幅があります。そもそも「言語」自体、C++やJava、C#といった広く使われている汎用言語から、awkのように比較的用途が限定された言語、あるいはUMLのようにプログラミング言語でないものまで、さまざまです。

 18言語のうち、使ったことがない言語は8つ、名前すら聞いたことがなかった言語は2つあり(APLとForth)、「プログラミングの世界は広大だ」と思い知らされました。

 APLとForthが世に出たのは、1970年代だそうです。インタビュー中に出てくる出来事は当時のものが多かったため、1970年代のインタビューを載せたものなのかと思いながら読んでいました。

 読了後、インターネットでAPLとForthについて調べてみたところ、APL(NARS2000という、比較的新しい実装はあるものの)は最近あまり使われていないようでしたが、Forthは現在でも組み込みなどのレイヤでばりばり現役だと知り、驚きました。

■設計思想、バックグラウンドは十人十色

 世の中にはさまざまなプログラミング言語があり、その存在理由もさまざまです。存在する理由は、時代背景や適用領域によってかなり異なります。

 言語設計者にも、さまざまなタイプがいます。学歴や職歴といった「バックグラウンド」、プログラミング言語が生まれた「背景」や「設計思想」などが、プログラミング言語の性格に色濃い影響を与えています。

 いろいろな言語設計者の「生の意見」が聞けるのは、ソフトウェアにかかわる人間にとっては非常に興味深いです。ここで、「言語」そして「言語設計者」を、いくつかの切り口から分類して考えてみます。

○数学者vs.エンジニア

 計算機科学、情報科学が発展した歴史にも関係すると思うのですが、特に古い言語の設計者は、数学で学位を取得した人が多いようです。新しい言語では、LuaやHaskell設計者のバックグラウンドが数学です。

 一方、Rubyのまつもとゆきひろ氏は、自ら「第2世代の言語設計者」とうたっているとおり、1980年代までに出てきた言語設計者たちとは明らかにバックグラウンドが違うように見えます。なお、彼は「数学が苦手だった」ともいっています。

 UMLのGrady Booch氏は自らを「エンジニア」と呼んでいますし、それ以外でもエンジニア的な発想、「実用性」に重きを置いた方法で言語の設計を行った人は何人もいました。

○汎用vs.特定用途向け

 DSL(Domain Specific Language)とは、特定の用途に特化した言語で、Java、C++、Perlといった汎用プログラミング言語とは反対の概念です。

 本書では、SQLやawkといったDSLを取り上げています。DSLではありませんが、もともと教育用として設計されたBASICも、汎用言語とは一線を画しているといえるでしょう。

 awkの設計者の1人Peter Weinberger氏は、awkが広まるにつれて強まる「汎用言語的な機能追加の要望」に対して、どう対応したかを語っています。「要求を何でも取り入れてしまうと、汎用言語と同じようなことができるものの、ひどく不格好な言語になってしまう」「汎用言語の設計とDSLの設計には違いがある」そうです。

○プログラミング言語のパラダイムシフト

 言語を分類する際、「パラダイム」という観点による分類方法があります。主流のパラダイムが別のものに移ることを「パラダイムシフト」と呼びますが、歴史をひもとくと、プログラム言語のパラダイムシフトとは、「抽象化のレベルを上げる」ことだといってもいいでしょう。

 次のパラダイムシフトがどのような形で起こるのか――プログラム言語を使う立場としては、仕事のやり方に影響が出るため、かなり興味がある事柄です。多くの設計者が「今後は並行性にどう対応していくかが大きな課題」と語っています。この課題について、C#のAnders Hejlsberg氏をはじめ、何人かが「関数型言語がカギになる可能性がある」と指摘しています。

 別のパラダイムシフトとしては、SaaS、SOAのさらなる普及が考えられます。SOAに関してはObjective-CのBrad Cox氏がいろいろ語っていました。

■意見や批判がぶつかる面白さ

 本書を「読みもの」として見た場合、さまざま言語設計者たちが語る「生の言葉」は、それだけでエンジニアにとっては大きな魅力です。前述のとおり、立場やバックグラウンドによって意見が大きく分かれますし、ほかの言語を公然と批判している人も結構います。

 印象的だったのが、C++のBjarne Stroustrup氏がJavaについて語っているくだりです。彼はSun(現Oracle)の大々的なマーケティング戦略を「効果的だった」と認めつつも、ある種の嫌悪感を表明しています。言語が人気を得るかどうかは多くの要素が関係しています。彼がが指摘するとおり、純粋に技術的な観点だけではなく、マーケティングなどの要素も(特に近年では)重要な位置を占めています。

 そのほか、Javaについては「ごてごてしてる」だの「その場しのぎの設計が多い」だの、いろいろな人が意見を述べていて、C#のAnders Hejlsberg氏はType Erasureについてかなり強い形で批判しています。

 一方、JavaのJames Gosling氏やObjective-CのTom Love氏、それ以外にも数人が何かしらの形でC++を批判しています。ほかにもいろいろな批判のし合いがあって、彼らの強い「信念」のようなものを感じました。

 面白かったのはPerlのLarry Wall氏で、彼は数学者でもエンジニアでもなく、音楽などを勉強していたようです。そんな彼の言葉は、個性豊かな言語設計者たちの中でもひときわ異彩を放っていて、彼の章を読み終わった後、再びPerlを触りたくなりました。

■言語という世界を作る「神々」の意見を聞いてみる

 言語設計者は、プログラマにとっては(いろいろな意味で)神のような存在の人たちです。神々が語る言葉は、どれも重みがあり、かつ示唆に富んでいます。日常業務で直接役立つTipsはあまりないかもしれませんが、彼ら神々の理念や思想を自分の中に取り入れることは、長期的に見て血肉になるのではないでしょうか。

 プログラム言語、処理系は、ソフトウェアの基礎となる部分です。これらの理解が浅いことはすなわち、「エンジニアとしての基礎体力がない」ことを意味します。

 日本では(特にSIerでは)「プログラミングは単純な作業」と見なされる場合が多いです。わたし自身、SIerの現場で仕事をした経験がありますが、そこで働くプログラマやSEの大半は、基礎体力が不足しているように見えました。基礎体力がしっかりしているエンジニアもそれなりにいましたが、大半はSIerの社員ではなく、子会社あるいは協力会社(不思議な言葉ですよね)の人々でした。

 この問題についてはここでは深入りしませんが、ソフトウェアにかかわる仕事をしている人は、目の前の業務をこなすだけではなく、さらに一歩踏み出してみるべきではないでしょうか。プログラム言語や処理系の設計思想、「今後どのような方向に進むのか」といったことへの意識は重要です。

 そのとき、神々の言葉が何らかの参考になると思います。

■そのほか、雑感

○多様性と溝

 ここからは個人的な感想になるのですが、先ほど書いたとおり、言語や言語設計者にはいろいろなタイプが存在していて、その間には“溝”ができていることが多いと感じます。

 言語に限らず、世の中には多種多様な技術やレイヤ、業務領域が存在しますが、それぞれの知識やプラクティスが特定部分に限定しているように思えます。「分断化された技術や知識をうまく統合する」ことが、いまの時代に求められているはずです。

 使い古された「ゼネラリストvs.スペシャリスト」という言い方はあまりしたくありませんが、わたしとしてはいわゆる「ゼネラリスト」として、これらの溝を埋めていきたいと考えています。

○続編は?

 歴史的に重要(と個人的に思うもの)であるにもかかわらず、本書が取り上げていない言語としては、以下のものがあります(FORTRAN以外の3つは、わたしが大学の授業で習った経験があります)。

  • C
  • Pascal
  • Lisp
  • FORTRAN

 また、現在広く使われているものの、本書に載っていない言語もあります。

  • PHP
  • JavaScript

 これらが取り上げられていない理由を、あれこれ考えるのも楽しいかもしれません。あるいは、本書の続編でも出るのでしょうか。もし続編が出るとしたら、上に挙げた言語以外に、以下のものを取り上げてもらえると個人的にはうれしいです。

・Scala (設計者:Martin Odersky氏)

 Javaの歴史上、最もインパクトのあった新機能・設計変更の1つとして、Genericsの導入があります。Java 5で取り入れられたGenericsやJavaコンパイラ(javac)などの設計を行ったのがMartin Odersky博士で、Scalaの設計者です。

 わたしのコラムを読んでいる人はご存じかと思いますが、わたし自身、2010年9月からScalaを勉強し始め、最近では個人的なプログラムの多くはScalaで書いています。

 個人的な理由もありますが、「現在最も成功している言語の1つであるJavaの主要機能を設計した彼が、なぜ新しい言語を作ったのか」というトピックは、多くのエンジニアにとって興味深いものだと思います。また、現在Javaを採用しているエンジニアにとっても、重要な示唆を含む内容になるのではないでしょうか。

・SGML(設計者:Charles Goldfarb氏)

 今日のインターネットや情報システムの発展は、HTMLおよびXMLを抜きにして語れないと思いますが、これらの基となったSGMLの成り立ち、設計思想も気になります。SGMLは「複雑」といった理由でXMLに置き換わるのですが、その「複雑な仕様」について設計者が何を語るのか、現在のインターネットをどう見ているのか……ぜひ聞いてみたいところです。

■まとめ

 本書は、ソフトウェアにかかわる人であれば、読んで損はないと思います。読みものとしても興味深いし、いちエンジニアとして、言語設計者の考え方から影響を受けることもあるでしょう。わたしは一度読み終えた後に「そういえば何かこんなことをいっていた人がいたな」と思って読み返しました。今後も、たまに読み返す気がします。

 冒頭で、英語版と日本語版という話が出ましたが、日本語版の文章は若干分かりにくいように思えます(また、分かりにくさは章によってばらつきがありました)。原著を読んでいないので、もともとの英語が難解なのか、それとも日本語訳が分かりにくいのかは断言できませんが。

 全500ページとかなりボリュームはありますが、最初から通読する必要はありません。興味のある章から読んでいくといいと思います。

『海外でも通用するエンジニアになる』コラムニスト 鹿島和郎)

メルヘンなのに本格派すぎる“小悪魔”エンジニアの魔力――『小悪魔女子大生のサーバエンジニア日記』

2011/02/14 17:00:00

小悪魔女子大生のサーバエンジニア日記 小悪魔女子大生のサーバエンジニア日記 ――インターネットやサーバのしくみが楽しくわかる

aico(著)
村井純 (監修)
技術評論社
2011年1月

ISBN-10: 477414522X
ISBN-13: 978-4774145228
2079円(税込)

 2010年夏、サーバ技術を解説したとあるブログが話題になったことを覚えているだろうか。gothedistance氏がブログで紹介したことがきっかけとなり、Twitterやはてなブックマークで話題となった『小悪魔女子大生のサーバエンジニア日記』である。本書はブログを再編集し、「日本のインターネットの父」と呼ばれる村井純氏が監修したものだ。

■やっぱり知っておきたい、サーバやネットワークのこと

 さまざまなシステムを構築するときに、サーバは必要だ。一言にサーバといっても、Webサーバやデータベースサーバ、メールサーバにDNSサーバなど、さまざまなものがある。サーバと各クライアントが接続できるのは、ネットワークのおかげだ。ユーザーがサービスを利用できるのも、ひとえにサーバやネットワークが正常に動作しているからである。

 本書では、これらサーバやネットワークについて、“小悪魔女子大生”ことaico氏が解説している。

■「見た目にだまされた……」

 わたしがこの本を読んだ、最初の感想がこれだった。

 表紙はもちろんのこと、中身についても「イラストが多い」という前情報があったため、「入門書レベルの内容で、エンジニア向けではないのだろう」と思い込んでいた。だが、読んでるうちに理解した。「これは立派な技術書だ」と。

 ネットワーク技術に関する普通の例え話を読んでいたつもりが、いつの間にか本格的な技術論になっていた……なんてことがよくあった。その行程に不自然なところはなく、ウサギやクマに見事に乗せられた。

 メルヘンなウサギやクマの世界に油断していると、一気に電脳世界に連れていかれる。れこそが小悪魔女子大生の魔法であり、いい意味でだまされた。

■小悪魔女子大生と一緒に学ぶ、サーバやネットワークのこと

 本書では以下の内容について、小悪魔的な解説が繰り広げられる。

  • chapter1 インターネットのこと
    TCP/IPの基本的なことや、ルーティングなどネットワークの解説
  • chapter2 DNSって何?
    DNSの役割や正引き・逆引きといった仕組みの解説
  • chapter3 メールのこと
    POPやIMAPからSMTP-AUTHの仕組み、導入される経緯の解説
  • chapter4 WorldWideWebのこと
    WWWの歴史や仕組み、SSL通信の解説
  • chapter5 サーバ管理のこと
    サーバエンジニアのお仕事や、各種暗号化方式の解説

 上記を見ても分かるように、基本として押さえておきたいサーバやネットワークの解説が凝縮されている。chapter1の内容を押さえておけば、最近話題となった「IPv4枯渇問題」のニュースについて、より理解が深まるだろう。また、chapter5の各種暗号化方式についての解説は、ぜひとも押さえておきたいところだ。

■難しいことを、いかに分かりやすく伝えるか

 ITエンジニアにとっては当たり前なことでも、一般ユーザーにとって理解が難しいことは、世の中に数多くある。それらの事柄を「分かりやすく伝える」スキルは、営業職であれ技術職であれ必要だ。難しいことをそのまま伝えても、その技術の必要性や有用性は説けない。その点を、本書は見事にクリアしてみせた。

 確かに、本書にはウサギやクマなどのイラストがあふれている。仕事中にそのまま使えるかといえば「ノー」だろう。だが、本書から読み取った内容を、自分の言葉に置き換えて説明することはできる。

 本書からは、サーバの知識やネットワークの知識だけではなく、技術を伝える手法についても学べる。ぜひ、本書から得た知識を、技術的な知識を持たない人に説明してみてほしい。そこでまた、この本の奥の深さを知ることになるだろう。

■こんな人にオススメ

  • IPv4枯渇のニュースを聞いて「ん? なんのこと?」と思った人
  • 4月からIT業界に飛び込む新卒エンジニア
  • ネットワークやサーバ管理初心者

には特に読んでいただきたい1冊である。本書で広く浅く知識を身に付け、そこからステップアップしてほしい。

 また、LTやプレゼンテーションをするエンジニアにもおすすめできる。小悪魔女子大生はストーリー展開がうまく、彼女のストーリー展開スキルをLTやプレゼンテーションに持ち込めば、かなり有効に活用できるだろう。

 最後に、ユーザー側の人にも読んでもらえれば、と思う。「常時インターネットに接続してWebサービスを利用できる裏側には、このような世界が広がっている」と知るきっかけになれば、Webシステム開発者であるわたしにとっても、うれしい限りである。

壊さなきゃ分からないこともある。壊して学ぶ電子工作――『Make: Electronics』

2011/02/03 16:15:00

Make: Electronics ―作ってわかる電気と電子回路の基礎 Make: Electronics ―作ってわかる電気と電子回路の基礎

Charles Platt(著)
鴨澤眞夫(翻訳)
オライリージャパン
2010年11月

ISBN-10: 4873114772
ISBN-13: 978-4873114774
3150円(税込)

■人は失敗から学ぶ生き物である

 『アプレンティスシップ・パターン』(書評)という本で、「壊してよいオモチャ」(Breakable Toys)というパターンが紹介されている。「ソフトウェア開発の技術を伸ばすには、安心して失敗できる環境を用意し、そのうえで無謀なチャレンジをすることが必要だ」という内容である。

 本書Make: Electoronics 作ってわかる電気と電子回路の基礎』は、「失敗から学ぶ」プロセスを電気と電子の学習に適用するという、ある意味“おきて破り”な本である。まさか「壊してよいオモチャ」パターンを、実世界で物理的に適用する日が来るとは思わなかった。

■フィジカルコンピューティングへの入り口

 ここ数年、「Gainer」や「Arduino」といったマイコンボードのおかげで、電子工作に入門するためのハードルが劇的に下がった。難しい回路設計やハンダ付け、アセンブラやCなどの難解な言語でのプログラミングが必要なくなり、USBポートにつないだマイコンボードに数行のプログラムを転送するだけで、LEDを光らることができるようになった。

 このようなムーブメントは「フィジカルコンピューティング」と呼ばれ、コンピュータ(ソフトウェア)と現実世界を橋渡しする入り口として注目を集めている。わたし自身も何度かイベントで登壇したことがあり、興味を持ってくれる人の多さに驚いたり喜んだりした。2009年末に開催された「DevLOVE2009 FUSION」では「ソフトウェア開発者向け・フィジカルコンピュータ入門」というテーマで、話をさせていただいた。動画が残っているので、興味がある方はわたしのブログをご覧いただきたい。

■「Hello, World!」のその先へ

 フィジカルコンピューティング入門書としては『+GAINER―PHYSICAL COMPUTING WITH GAINER』や『Arduinoをはじめよう』といった定番の名著があり、一方で「手芸」を切り口として電子工作にアプローチした『テクノ手芸』という本もある。

 これらの書籍でフィジカルコンピューティングを体験することは、プログラミングにおける「Hello, World!」に相当する。未体験から“最初の一歩”を踏み出し、自分の手で何か動くものを作り出す。これは、初めてのことに挑戦した報酬として、とても気分が良いものなのだ。

 本書は、「Hello, World!」から次のステップに進むための本だ。フィジカルコンピューティングで電子工作に入門した人が、電気や電子回路について基礎を学ぶことができる。

■壊してよいオモチャ(むしろ壊せ)

 冒頭に書いた通り、本書最大の特徴は「壊して学ぶ」というコンセプトである。

 なにしろ、

  • 実験1:「電気を味わえ!」(自分の舌で9Vの電池をなめてみる)
  • 実験2:「電気を乱用しよう!」(アルカリ単三乾電池をショートさせてみる)

という内容である。たいていの本では「絶対にやるな」と書いてあることからスタートするのだから面白い。

 わたしが中学生のころは、電子部品を壊すなんてとんでもないことだった。中学生の小遣いでは、数十円の部品でも大変な貴重品である。400円もした7セグメントLED(こんなの)を壊したときは、本当に落ち込んだ。

 それから4半世紀。わたしも大人になり、数十円の部品を壊してもショックを受けない程度には小遣いを持てるようになった。しかも、基本的な部品の価格は4半世紀前からほとんど変わっていないのだ! 参考書があったり、部品を気軽に買えるようになったり。いい時代になったものだな……としみじみ思いながら読んでいた。

 閑話休題。とはいえ、壊してばかりでは何も生まれない。書かれている実験をこなしていくうちに、だんだんとトランジスタやLEDの使い方、汎用ICを使ったやや実用的な作例などが登場する。実際に手を動かし、動くものを組み立てることで、飽きずに理解を深めていけるようになっている。

 本文は赤黒2色とフルカラーのページが混在しており、回路図や実体配線図はもちろん、パーツそのものの写真まで掲載されている。何をどこにつなぐかが分からない初心者にとって、お手本があるのは大変心強い。また、本当に危険なことにはきちんと注意書きがあるため、安心して「壊す」ことに専念できる。

■まとめ:電子工作やってみようぜ

 本書は初めて電子工作に触れる人や、「フィジカルコンピューティングをやってみたはいいけれど次にどうしたらいいか分からない」という人を強力にガイドしてくれる。致命的ではない失敗から基礎を学び、本当に作りたいものへ近づく足掛かりにしてみてはいかがだろうか。

 個人的な話で恐縮だが、わたしはこの本の「実験」を、2011年1月に誕生した息子と一緒にやってみる日を心待ちにしている。生まれて初めて「電気を味わった」とき、彼はどんな顔をするだろう?

制約に従いながらもHTTPを自由にするRESTful――『JavaによるRESTfulシステム構築』

2011/01/05 13:00:00

JavaによるRESTfulシステム構築 JavaによるRESTfulシステム構築

Bill Burke(著)
arton(監修)
菅野良二(翻訳)
オライリージャパン
2010年8月

ISBN-10: 4873114675
ISBN-13: 978-4873114675
3360円(税込)

 REST(Representational State Transfer)はアーキテクチャスタイルの1つである。RESTfulとは、RESTの制約に従ってRESTらしい振る舞いをするシステムを指し示す。英語の語感はよく知らないが「RESTらしく」とか「RESTのように」というニュアンスでよいのだと思う。それでは、RESTとは何だろうか。

 Roy Fieldingは、HTTPプロトコル規格の策定に尽力した1人である。彼の著した博士論文の中で、RESTという概念は提唱された。

  • Webがこんなにも普及している理由は何か?
  • Webをスケーラブルにしているものは何か?
  • Webのアーキテクチャを、どのようにして自身のアプリケーションに適用できるか?

 RESTはこれらの問いに端を発し、「Web世界の原理原則」という答えを提示した。

 エンジニアとして、3番目の問いに注目したい。狭義の意味で、RESTはWebアプリケーションに適用した設計スタイルを指し示す。RESTfulとはWebアプリケーションのための作法の1つと理解してもよい。

 RESTでは以下の原則を定義する。

  • アドレス可能なリソース
  • 制約された統一インターフェイス
  • 表現指向
  • ステートレスな通信
  • アプリケーション状態エンジンとしてのハイパーメディア

 RESTfulなシステムを実現するためのJavaの標準APIがJAX-RS(Java API for RESTful Web Services)である。新しい時代のAPIらしく、JAX-RSを使うために実装継承や特殊なインターフェイスは必要ない。基本的な機能はアノテーションで提供される。現在のJavaのパラダイムでは、アノテーションによるメタプログラミングは必須だ。本書はアノテーションプログラムの良質なサンプルとしても活用できるだろう。

 JAX-RSがRESTfulを実現するためにどのような作り込みが必要なのか、本書を紐解きながら順番に見ていこう。

■アドレス可能なリソース

 RESTでは、「リソース」という概念で情報やデータを抽象化し、URIはリソースを指し示すものとして定義する。リソース中には、HTMLドキュメントや画像も含まれ、URIでアクセスする。これを「アドレス可能性」という。URIのないリソースがRESTの世界で存在することは許されない。すべてのリソースはURIで管理される。

 JAX-RSで特定のURIと実装を結び付けるのは難しくない。

@Path("/restsample")
public class RestSample {
	@Path("{id}")
	public String getData(){}

 @Pathアノテーションにより RestSample#getData()というメソッドを「/restsample/任意の文字列」というURIと関連付けた。次に紹介するメソッド選択のアノテーションと組み合わせることにより、/restsample/123というアドレスからRestSample#getData()が呼び出せる。

■制約された統一インターフェイス

 RESTでは、GET、PUT、POST、DELETEなどのHTTPメソッドだけを使ってアプリケーションを構築する。各メソッドは決められた制約を守って実装する。

 GETはページや画像を取得するための読み込み専用メソッドであり、POSTはフォームデータを送信するメソッドだ。ブラウザではGETかPOSTぐらいでしか使うことがない。しかし、AjaxなどのHTTPクライアントを使えば、すべてのHTTPメソッドを扱うことができる。

 PUTやPOST、DELETEはリソースを更新・削除する操作である。HTTPメソッドの中でPOST以外の操作は「べき等」となる。べき等とは「何回、操作を繰り返しても常に同じ結果が得られる」という意味だ。あるリソースを更新するPUTメソッドは、いつ実行しても結果は同じである。すでに更新しているからという理由でエラーを返さない。更新処理は常にリソースを「更新した結果」を返す。同様に削除処理は、いつでも「削除された結果」を返す。これがべき等だ。

 DELETEメソッドは、リソースの削除に行うべきだといわれている。RESTでは、DELETEメソッドをキャンセルの意味で使うことを推奨しない。キャンセルは「状態を更新する操作」である。リソース更新はPUTやPOSTの仕事なのだ。論理削除と物理削除の違いと考えればいいだろう。

 メソッド選択はアノテーションをバインドするだけである。

@GET
@PATH("{id}")
public String getData(@PathParam("id") int id){}

 /restsample/123というURIが、GETメソッドでアクセスできるようになった。戻り値が文字列なので、ブラウザでも結果を表示できるだろう。さらに、@PathParamにより仮引数のidに123という値がインジェクションされる。クエリやフォームデータを取得する@QueryParamや@FormParamやCookieの値を取得する@CookieParamというアノテーションも同じようにに扱える。もちろん、複数のパラメータやマトリクスパラメータも同様にアノテーションを指定するだけでよい。

 メタプログラミングの世界では、アノテーションが行う処理は意識しない。どのようなパラメータでも、対応するアノテーションの種類を指定するだけで値が取れる。これにより、煩雑なCookie取得やパラメータ取得のロジックから解放される。

 しかし、これらは単なるアノテーションである。JAX-RS経由でなくても、通常のクラスとしてインスタンス化、メソッド呼び出しが可能である。JUnitを使い、あらゆる値のテストを自動化することもできる。最終的に、「ブラウザを立ち上げてフォームから入力」というテストは必要ではある。しかし、そこに至るまでの試行錯誤の手間は大幅に軽減されるだろう。

 RESTでは、URIは単なる文字列ではない。サブリソースロケータというURIの断片を持つクラスを使えば、/hogeと/fugaというURI情報を持つ個別のクラスを組み合わせて、/hoge/fugaというURIを動的に構築できる。

 一般的なフレームワークでは、URIはアプリケーション構築時に固定の文字列として定義することが多い。PHPやPerlなどのスクリプト系言語では、物理ファイルの場所に依存することもある。しかし、物理ファイルの置き場所と抽象表現であるURIには直接的なつながりはないはずだ。

■表現指向

 クライアントに渡されるデータはHTMLドキュメントや画像ばかりではない。XML、JSON、YAMLなど、たくさんの形式でデータを受け取る。表現指向ではデータフォーマットは自由に操作できる。

 HTTPには、Acceptヘッダを利用して、欲しいデータをMIMEタイプで指定するコンテンツネゴシエーションという機能がある。Acceptヘッダを使って、XMLやJSONデータなど、自分が欲しい形式でリクエストを投げる。サーバサイドが対応していれば任意のMIMEタイプでリソースが取得できる。レスポンスデータはサーバサイドでMIMEタイプが決定する。これはネゴシエーションであって、クライアントはこの形式のデータが欲しいと要求するだけにすぎない。

 @Consumesは、メソッドが期待する、HTTP入力リクエストのメディアタイプを指定し、AcceptヘッダでリクエストされたMIMEタイプと一致するメソッドを選択する。そして、呼び出されたメソッドは、@Producesが指定するコンテンツタイプでデータを返却する。

@Consumes("application/xml")
@Produces("text/plain")
public String getData(){}

 異なる表現形式をシームレスに扱うにはどうすればよいだろう。XMLを生成するために、

StringBuinder builder = new StringBuilder();
builder.append("");
builder.append("piyo");
builder.append("");

というコードを書いてはいけない。普通はJAXB(The Java Architecture for XML Binding)などのマーシャル、アンマーシャルを支援するAPIを使用する。

@XmlRootElement(name="hoge")
@XmlAccessorType(XmlAccessType.FIELD)
public class Hoge{
	@XmlElement
	private String fuga;

    public String getFuga() { return fuga;}
    public void setFuga(String fuga) { this.fuga = fuga;}
}

というBeanを用意すれば、データ形式の変換はこのようにできる。

// JAXBのコンテキストを取得
JAXBContext context = JAXBContext.newInstance(Hoge.class);

// マーシャルを行うためのクラスを用意
Hoge hoge = new Hoge();
hoge.setFuga("piyo");

// マーシャラーを生成してインスタンスからXMLへ
// マーシャリングしてファイルに書き出し
context.createMarshaller().marshal(hoge, new File("hoge.xml"));

というコードでデータの内容をXMLファイルに保存できる。

 XMLファイルから読み込む場合は、以下のようになる。

/ JAXBのコンテキストを取得
JAXBContext context = JAXBContext.newInstance(Hoge.class);

// アンマーシャラーを生成してファイルから読み込んだXMLを
// インスタンスへアンマーシャリング
Hoge hoge = (Hoge)context.createUnmarshaller().unmarshal(new File("hoge.xml"));

 データの相互変換がシンプルなコードで実現できることにより、表現できるタイプが格段に向上するだろう。

 JAXBもアノテーションベースのAPIである。アノテーションの多用は、ある意味においてプログラムの可読性を下げることにつながる。他のAPIと組み合わせたとき、1つのクラスやメソッドに付けるアノテーションを大量に記述しなければならないケースがどうしても発生する。

 アノテーション付きインターフェイスにより実装とアノテーションは切り離せる。いわゆるアノテーション汚染を回避するためのテクニックの1つとして覚えておきたい。

public interface hoge{
	@GET
	@PATH("{id}")
	@Consumes("application/xml")
	@Produces("text/plain")
	public String getData();	
}

■ステートレスな通信

 RESTがいう「ステートレス」とは状態がないという意味ではない。「一時的なデータはセッションとしてサーバ側で保持しない」という意味である。データはクライアントが持ち、必要に応じてサーバに送信するように設計する。

 セッションをサーバで管理しなければ、クラスタ環境でのセッション同期やレプリケーションなどの困難を避けることができる。サーバマシンの拡張性が容易になるだろう。

 入力項目が多岐にわたり、複数のページ遷移が必要なアプリケーションもある。しかし、Ajaxを使えば、1つの入力フォームで済ませることはできる。あるいは、Web Storageという選択肢もある。RESTfulなシステムは、ページ遷移の考え方そのものを変えるのだ。

 当然、ユーザー認証のようなデータは、セッション側に持たせるべきであるという意見もあるだろう。しかし、OAuthのような仕組みを導入すれば、アプリケーションとユーザー認証は別機能として切り離せる。どのページを表示して、どのリソースの操作を許可するかは、機能を提供するアプリケーションで意識する必要はない。認証・認可をつかさどるアプリケーションに任せるのだ。

■HATEOAS

 最後に、HATEOAS(Hypermedia as the Engine of Application State)という少し変わったキーワードが出てきた。本書では、「アプリケーション状態エンジンとしてのハイパーメディア」と訳されている。これでもまだ分かりにくい。詳細に踏みこもう。

 Webページで画面が遷移するということは「状態が変化する」ということでもある。HATEOASでは、あるリソースの中には次の状態に進む方法を明示すべきなのだとしている。遷移すべきURIは取得したリソースの中にある。それは、何を意味するのだろうか。

 ほとんどのWebページには、次に遷移するためのリンクが埋め込まれている。

/restsample?start=1&size=5

というURIがあるとしよう。このURIは、あるアイテムを5つ表示するというリソースを表現している。次のページを表示する、

/restsample?start=6&size=5

というURIが、どのページに記述されているかを考えれば分かりやすいだろう。

 ほかにも、ショッピングサイトで注文のキャンセル処理を考えるなら、

/order/{id}/cancel
/order/{id}?cancel=true

のようなURIを、注文状態を表示するページなどに用意する。商品の発送が完了すればキャンセル不可となり、キャンセル処理を行うURIは表示されなくなる。許可されたリソースだけをナビゲート可能にすることによって、許可されない処理へ進む状態遷移エラーを軽減するのだ。

 同時に、「注文をキャンセルする処理」というリソースはDELETEされる。アドレスを直叩きしてアクセスしても404 Not Foundが待っているだけだ。レスポンスコードに注目するのもRESTfulの特徴の1つである。

 JAX-RSでHATEOASをサポートする機能はUriBuilderとUriInfoぐらいしかない。RESTfulとは、実装を縛るものではく、設計の指針である。HATEOASもまた、アーキテクチャスタイルという考え方であり、強制されるものではない。しかし、リンクとフォームによってWebがどのように拡大してきたかを考えれば、HATEOASを適用するメリットは存分にあるだろう。

■RESTを知る

 HTTPはリクエストとレスポンスからなる分散協調システムという側面を持つ。RESTを深く知ると、HTTPはブラウザにHTMLドキュメントを表示させるためだけのプロトコルではないことに気付くだろう。

 Strutsに代表されるフレームワークは、1つのリクエストから1つのレスポンスを生成してHTMLドキュメントを表示する。ページ単位で制御するフレームワークは、ページの世界に縛られるのかもしれない。HTTPが生まれて20年近くの月日が流れた。ブラウザでHTMLを表示するときに無意識にページという概念にとらわれてはいないだろうか。1つのリクエスト・1つのレスポンスで1枚のWebページが表示されるという考え方から抜け出せないでいるとRESTfulの本質は理解できない。

 RESTfulという手法は、制約でありながらHTTPを自由にする。RESTは新しいWebの可能性を、わたしたちに見せてくれるだろう。

『フリーなスキル』コラムニスト はがねのつるぎ)

108番目のきのこを生やすのはあなただ! 『プログラマが知るべき97のこと』

2010/12/20 15:00:00

プログラマが知るべき97のこと プログラマが知るべき97のこと

Kevlin Henney(編集)
和田卓人(監修)
夏目大(翻訳)
オライリージャパン
2010年12月

ISBN-10: 4873114799
ISBN-13: 978-4873114798
1995円(税込)

■プログラマと救命胴衣

 学校で、計算機科学や情報処理を学ぶことはできる。しかし、プログラマとして成長する方法や良いコードを書くための心掛け、チームで仕事をするためのプラクティスなどを学ぶことは難しい。きちんとした教育を受けてきた若者であっても、ソフトウェア開発の現場に配属されるのは「救命胴衣を着けずに海に放り込まれるようなもの」(*1)である。

 荒波に飲み込まれずにプログラマとして生きていくためには、生き残り、成長するしかない。成長の方法はさまざまある。仕事の現場で「師匠」に巡り会えれば、正しい方向に進む手助けをしてくれるだろう。職場にいなければ、開発者のコミュニティで師匠を探すこともできる。

 また、先達が書いた本にもよいものがたくさんある。例えば『達人プログラマー』(*2)や『ハッカーと画家』(*3)、『情熱プログラマー』(*4)といった名著からはたくさんの学びを得て、「成長の種」とすることができる。

■プログラマが知るべきのこと

 本書には、そういった「成長の種」――現役プログラマ73人による97本のエッセイが詰まっている。それぞれのエッセイは2~3ページ程度の分量なので、1つひとつを読むだけなら短い時間で事足りる。しかし、内容そのものは、現場で活躍しているプログラマ諸氏の知識や経験を凝集した、とても密度の濃いものである。

 先ほど挙げた名著に対して、この本が持つ大きな価値とは何か。それは、「書かれていることの多様性」だ。プログラマとしての振る舞いや成長戦略、チームや顧客とのコミュニケーション、テストやデバッグの技法、そして実際のソースコードを示した設計の指針まで、ソフトウェア開発の各レイヤを縦断した内容といえる。

 中には矛盾することも書かれている。例えば、あるエッセイでは「IDEの力を使いこなそう」とあり、別のエッセイでは「IDEを閉じてコマンドラインツールに習熟しよう」といった具合。この多様性があるからこそ、エッセイの内容をうのみにするのではなく、よく咀嚼(そしゃく)して血肉にすることが求められる。

■この訳書は原著を超えた

 もう1つ、本書の大きな価値がある。日本語版に寄稿された、日本のプログラマ8人(小飼弾氏、関将俊氏、舘野祐一氏、まつもとゆきひろ氏、宮川達彦氏、森田創氏、吉岡弘隆氏、和田卓人氏)による10本のエッセイだ。監修の和田卓人氏が「監修者まえがき」で「本書(邦訳)は原著を超えている」と胸を張るとおりで、ただの翻訳にはとどまらない新たな価値が加えられている。

 オリジナルの97本に日本語版で追加された10本、合わせて107本のエッセイはどれも素晴らしい内容なのだが、ここで見逃せないのが和田氏による「監修注」だ。エッセイに対する適切なフォロー、難解な語へのサポート、紹介された書籍へのポインタなど、理解を深める手助けが手厚く施されている。ぜひ、脚注にも気を付けながら読んでみてほしい。

■成長の種と「きのこ」

 未来のいつか、プログラマとして直面した問題を解決するために、この本のエッセイが役立つ瞬間が突然やってくるかもしれない。いま読んで理解できなかったことも、数日後、数カ月後、あるいは数年後に突然「ああそうだったのか」と腑に落ちるかもしれない。この本を読むことは、そうした「成長の種」を自分の中にまくことなのだと、読後に強く思った。

 本書のタイトルには「きのこ」の文字が隠されている(分かるかな?)ので、発売前からTwitterなどでは「きのこ本」という愛称で親しまれている(*5)。有志の手でマスコットキャラクターまで描かれている(*6)のも面白い。

 知識や経験を買うことはできない。しかし、知識や経験を凝縮した文章に触れておくことは、プログラマとして生きていくための「救命胴衣」になるのではないだろうか。そして、いつか誰かの「成長の種」になるかもしれないから、あなたが考えた「プログラマが知るべきのこと」を、108番目のきのことして書いてみてはどうだろうか。それが、本書に寄稿するような「あこがれのプログラマ」に近づくための第1歩なのだから。

■Links

O'Reilly Japan - プログラマが知るべき97のこと

『プログラマが知るべき97のこと』和田 卓人(監修)、夏目大(翻訳)

*1:ソースコード、読んでいますか - 記者の眼:ITpro

*2:『達人プログラマー システム開発の職人から名匠への道』アンドリュー ハント、 デビッド トーマス、村上 雅章(翻訳)

*3:『ハッカーと画家 コンピュータ時代の創造者たち』ポール グレアム、川合 史朗(翻訳)

*4:『情熱プログラマー ソフトウェア開発者の幸せな生き方』Chad Fowler、でびあんぐる(翻訳)

*5:Twitter / Search - #97prog_ja

*6:きのこ。

@IT Special 注目企業
@IT Special ラーニング

エンジニアライフ 最新の投稿コラム

@IT自分戦略研究所 新着記事

コラムニスト プロフィール

書評チーム 「ELリーダーズ」

「エンジニアの人生=エンジニアライフ」に役立つ本を紹介します。

本をお探しの方は、インデックスからどうぞ。


2012年11月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

バックナンバー

月間バックナンバー

検索

Powered by TypePad
- PR -
@IT Special 注目企業
インデックス

イベントカレンダー

アクセスランキング

もっと見る

@IT Special ラーニング