枯れた技術と未成熟な技術、でもホントは…

タイトルが長すぎて表示されてないので再掲。『枯れた技術と未成熟な技術、でもホントはエンジニアのセルフマネジメントについてのはなし』
ここ数年感じていることについて、標準的な開発者にとってはすでに常識となっているかもしれないことについて吐きだしたいと思う。


ある種の開発業務の現場では、基本“未成熟な”技術よりも“枯れた”技術が求められる。
Webサーバで言うなら、「Nginx」よりも「Apache」だ。 ※ Nginxもそろそろ枯れた方に入るのかもしれませんが…
それにはもちろん理由があって、それは間違いではない。しかし、本当にそれは間違いではないのだろうか?

ApacheIISとNginx

具体的な数値はググってもらうとして、Apacheといえば世界でもっともよく使われているWebサーバであることは間違いない。その実績はダントツだし、恐らく会社の中にもそれなりのノウハウは蓄積されていることと思う。
もし、Apacheを採用しない理由があるとすれば、それは開発元によるサポート(の義務といった方が適切か?)がない点だろう。それによって、IISを選択するというケースはある。それもまた間違いない。
一方、Nginxを採用する動機は、それが「大量のリクエストを少ないリソースでさばけるから」が多いのではないだろうか?

Apache/IISとNginxとの違い

この違いは、単なる要件の違いではないと思っている。
それはWebを使うユーザ層とボリュームの変化、インターネットが普及したとはいえまだまだコンピュータに関心がある人たちのものだった時代から意識するしないはさておき本当に誰もが使うようになった時代へと移ったことを意味する。すなわち、Nginxを選択するということは今の時代における普遍的な問題(大量のリクエスト)を抱えており、それを解決する必要に迫られているということだ。
Apache/IISであってもその問題に対処する方法はいくらでも(AWSでサーバ台数を増やすとか)あるが、それはまた別軸での未成熟な技術の話となって複雑なので、今回はスルーします。

怖くないですか?

もし自分がインフラに関わっているエンジニアで、Apache/IISを使う(使わないといけない)仕事をしているとしたら、怖くありませんか?
あなたのスキルに価値がないとまでは言いませんが、それを必要としている人は昔からずっと同じことをしている(そして恐らこれからもずっと同じことをし続ける)人たちです。果たして今後も一緒に価値を生み出し続けていけるのでしょうか?生み出せなければもちろん自分の価値も下がっていきます。

私が考えるセルフマネジメント

ずばり、『(たとえ未成熟であっても)新しい技術が必要とされる仕事をすること』
会社から与えられるがままに仕事をこなすことで自然にそれが実現されるなら、それに越したことはありません。あなたはきっと最高の職場にいるのでしょう。もしそうでないのなら、そうなるように自分で行動を起こす必要があります。
これらを意識的にやること、それがセルフマネジメントだと私は考えます。

URL生成Tips

CakePHPでURLを生成するときに“使える”変数・定数


その前に、基本のおさらい。

  • $_SERVER['SERVER_NAME']
localhost
  • Router::url(array('controller' => 'users', 'action' => 'login'), true))
http://localhost/sampleapp/users/login


これも基本でしょという声は華麗にスルーしつつ。

  • FULL_BASE_URL
http://localhost
  • $this->controller->request->base
/sampleapp
  • $this->controller->request->webroot
/sampleapp/

Configureを使う必然性

自分自身、CakePHPが提供するConfigureクラスとPHPネイティブのdefineの使い分けがよく分かってなかったので調べてみた。
CakePHP - Configure::write or define()のgrigriさんの答えでようやく腑に落ちたのでここに引用しておく。

Benefits of using Configure:

* No collisions with other php scripts.
* Can be changed at runtime
* Easy to organize, list, group and persist related settings

Benefits of using php constants:

* Less verbose
* More efficient

携帯端末用プラグインに手を入れました

ガラケー(フィーチャーフォン)についての知識・経験が圧倒的に不足しているため、GitHub - MASA-P/cake_ktai_library: Japanese mobile phone plugin for CakePHPというCakePHPプラグインを導入しようとしました。

1.3系(GitHub - MASA-P/cake_ktai_library at 0.x-1.3)と2.x系(GitHub - MASA-P/cake_ktai_library at 0.x-2.x)とがあったので、後者をダウンロードしてPluginフォルダに置いてみたところ、

Non-static method Lib3gk::get_instance() should not be called statically, assuming $this from incompatible context
※同様のエラーが他二件
Declaration of KtaiComponent::initialize() should be compatible with Component::initialize(Controller $controller)
※同様のエラーが他二件

といったエラーが発生…

[動作環境]

PHPを継続的に使ってきたわけではないので詳しいことは分かりません(ダメ開発者や…)が、エラーメッセージから推察するに言語仕様の変更によるものと思われました。
そのあたりを修正したところ、無事エラーが消え、動作しました!


Folkしたリポジトリにその修正をコミットしておきましたので、必要な方は下記からどうぞ。
GitHub - fullkawa/cake_ktai_library at 0.x-2.x

CakePHPのキャッシュまとめ

CakePHPで利用できるキャッシュ機構についてまとめてみました。
詳細はリンク先参照。

ブラウザキャッシュ

出力したコンテンツをブラウザ側でキャッシュさせる/させないを制御します。
http://book.cakephp.org/2.0/ja/controllers/request-response.html#id11

Viewのキャッシュ(ファイルキャッシュ)

同一リクエスト(コントローラ/アクション/パラメータ)に対するレスポンスをキャッシュします。
もちろん、レスポンスの内容が異なる(例:PC用とスマホ用)場合は違うURLになるようにしなければなりません。
http://book.cakephp.org/2.0/ja/core-libraries/helpers/cache.html
CakePHPアプリケーションの基本的な設計指針 (2) - キャッシュまわり - - 24時間CakePHP


element単位でキャッシュする仕組みもあります。
http://book.cakephp.org/2.0/ja/views.html#id10
http://text.tklabo.net/blog/8/view-cacheの"1.element ( & requestAction ) キャッシュ"参照

Modelのキャッシュ

1リクエストの間だけキャッシュされます。
http://book.cakephp.org/2.0/ja/models/model-attributes.html#cachequeries

CakePHP標準(?)のキャッシュ

CakePHP標準(?)のキャッシュエンジン。キャッシュストレージを指定することでファイル(デフォルト)やメモリに任意のデータをキャッシュします。
CakePHPでファイルキャッシュ、メモリキャッシュを使う | A Day In The Boy's Lifeの"CakePHPでメモリキャッシュを利用する"参照

実行コードのキャッシュ

PHPの実行コードをキャッシュして、コンパイルに要する時間を短縮します。
いろいろなミドルウェアがありますが、APCやeAccelerator等が有名です。
いまさらAPCをインストールして、PHPの実行を高速化してみた ::ハブろぐ

phpDocumentorを使うまでに有効だったリンク

Windows + All-In-One Eclipse + CakePHP の環境でなるべく簡単にドキュメントを作成する方法で結構回り道をしてしまったので、結果的に有効だった最小限のリンクを貼っておく。

なにはともあれ、公式サイト。
http://www.phpdoc.org/docs/latest/for-users/installation/using-pear.html#instructions

合わせて、この記事が大変助かった。
ポイント3つ!phpDocumentor を Pleiades All in One 日本語ディストリビューションで使うための設定!!! – oki2a24

後は、Eclipseの「実行構成」(≠外部ツール)を定義して、一発で実行できるようにしておく。
ポイントは…

  • 「新規>フォルダー>拡張>リンクされたフォルダー」で"PATH\TO\ECLIPSE\xampp\php"を追加すること
  • 「実行構成>PHP CLI アプリケーション>PHPスクリプト」で"/PROJECTNAME/php/phpdoc.php"を指定すること
  • PHPスクリプト変数」は例えばこんな感じ。

-d "PATH\TO\ECLIPSE\xampp\htdocs\PROJECTNAME\app" -t "PATH\TO\ECLIPSE\xampp\htdocs\PROJECTNAME\doc"

カードゲームを作ろう

去年の末に『遠藤雅伸ゲームデザイン講義実況中継』という本を入手して夢中になって読んで、カードゲームを作り始めた。
自分はWebエンジニアなのでどうしてもコードを書きたくなってしまうが、先日ようやく、WordPressでサイトを立てた。今後はこっちをメインに活動しようと思う。
http://open-designed-card-game.info/