ここ数年、日本では、新聞や雑誌の売り上げが減っています。既存の仕組みで利益を得ながらも、新しい取り組みを模索して行かなければならない現状はとても大変だと思われます。米国でもインターネットの台頭で、老舗の新聞社が廃刊に追い込まれています。(参考 – メディア・ハブを「廃刊」で検索)
日本では、新聞戸別宅配制度が普及しているため廃刊になるほど急激には落ち込んでいないようですが、緩やかに減少はしています。米国は国土が広いためか、日本ほど戸別販売の仕組みが普及していないので急激な落ち込みに至っているようです。そのため日本に比べると新聞社や通信社はインターネットを使う仕組みを研究・開発しています。
特に、ニューヨーク・タイムス、ロイター通信は、プログラマ向けにニュース用API(スポットライトAPIと言いますReuters Spotlight)を公開しています。昨年私が調べていたときは、ニューヨーク・タイムスは日本語に対応していませんでしたが、ロイター通信のニュース用APIが日本語に対応していたので、http://sornews.info/というドメインを取得してデモプログラムを実装してみました。
sorenws.info – SORNEWS – Reuters Spotlight と PHP でニュースのデモ

sornews.infoでは、海外の新聞社や通信社がどのような取り組みをしているのかや、Spotlightの簡単な概要説明を日本語で書いています。将来日本でもこのような取り組みが行われるかもしれないのでソフトウェア開発をしている私に取っては非常に興味深い仕組みでした。
httpd.confのDirectoryIndexを変更しても、index.htmlとindex.phpの評価順序が変更されなかったので評価順序を調べてみました。バーチャルホストで運用している際に、評価順序としては、以下のようになります。
- VirtualHost ディレクティブ内で定義した、Directoryディレクティブ内の、DirectoryIndex
- /etc/httpd/conf.d/php.conf に記述されたDirectoryIndex
- /etc/httpd/conf/httpd.conf に記述されたサーバデフォルトのDirectoryIndex
CentOS5でphp環境をyumでインストールした場合、以下のような/etc/httpd/conf.d/php.confが追加されます。この設定ファイルにより、PHP5のモジュールがロードされ、Apacheはphp拡張子を理解できるようになります。また、URLでディレクトリアクセスした場合には、DirectoryIndexで定義された、index.phpを確認し、ある場合はindex.phpを実行し、無い場合は、HTTPステータス404をクライアントに返却するようになります。
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
LoadModule php5_module modules/libphp5.so
#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps
そのため、以下のようにhttpd.conf のDirectoryIndexの最後にindex.phpを追加して、html拡張子を先に評価しようとしても、
DirectoryIndex index.html index.html.var index.php
実際には、php.conf側のDirectoryIndexが先に評価されるため、以下のような定義と同様になるようです。
DirectoryIndex index.php index.html index.html.var index.php
CentOS5の場合は、index.htmlとindex.phpの評価順序を変更したい場合は、httpd.confのDirectoryIndexにindex.phpを追加するのではなく、php.conf側で以下のように指定したほうがよいのかもしれません。
DirectoryIndex index.html index.php
cakePHP1.2 では、bootstrap.php が起動後、必要なPHPファイルが読み込まれフレームワークの初期設定が完了します。その後、cake/dispatcher.php がコントローラの呼び出し処理(Dispatcher#_invoke)を行います。この時に、以下のようなif文でscaffold変数が判定されることで、scaffold機能が呼び出されます。
if ($controller->scaffold !== false) {
App::import('Core', 'Scaffold');
return new Scaffold($controller, $params);
}
PHP には、!==演算子があり、$a !=== $b の場合、$a が $b と等しくないか、同じ型でない場合に TRUE を返します。
cakePHP のコントローラは、AppController クラスを継承します。$scaffoldは、AppController クラスの親であるControllerクラスでbool型として定義されています。そのため、アプリケーション開発者が各自作成するコントローラで$scaffoldを再定義時すると、var $scaffold = NULL;を記述した事と同じになり、上記if文の分岐判定を通るようになります。
始めてcakePHPを学んだときは、変数定義をしただけで、何故scaffold機能が読み込まれるのか疑問でしたが理解できました。
<?php
class ParentController {
var $scaffold = false;
}
class MyController extends ParentController {
var $scaffold; // NULLが入る.
}
$obj = new MyController();
if ($obj->scaffold !== false) {
echo "scaffold is "; var_dump($obj->scaffold);
} else {
echo "scaffold is "; var_dump($obj->scaffold);
}
?>
Java 言語だと型の定義などが含まれるのであまりきれいではありませんね。
public class MyController extends ParentController {
public Boolean scaffold;
public static void main(String [] args) {
MyController mc = new MyController();
System.out.println(mc.scaffold);
}
}
class ParentController {
public Boolean scaffold = Boolean.FALSE;
}