Windows XPで4GBメモリを認識しない

先日メモリ増設で4GBにメモリを増設したのにmemtest86で3455M(3.37GB)としか表示されないことが気になっていたが、Windows XPでも同様に認識されていることがわかった。
ただ、仕事柄サーバー機を利用することが多く、Windows 2003 Standard Editionが稼動しているマシンでは4GBメモリを搭載していて4GBと正しく表示されていたことが気になっていた。
友人のアドバイスに基づいて調べてみたところ、1GB=2,000円時代のメモリ増設を考える(上)に理由が論理的に説明されていたのでご紹介したい。
クライアントOS(PAE(物理アドレス拡張)未対応OS)だと4GBのアドレス空間は、メモリだけでなく、カーネルや各種の周辺機器のI/O(メモリマップドI/O)などのシステム用途にも使われるので、実際にはアドレス空間を最大限利用できないから、認識できる容量が限られる。
ただ、サーバーOSだとPAEに対応しているから、カーネルや各種の周辺機器のI/Oが必要とするアドレス空間を移すことで、空間を奪い合うことなく最大限搭載メモリを利用できる。ただし、4GBのメモリしかサポートできないチップセットでは、この移す場所が確保できないので、結局はクライアントOSで発生していることと同じ現象が起こる。

エラーページに対応する

cakePHPではコントローラー名がURLの一部となるために、存在しないコントローラーに対するリクエストがあるとMissing Controller表示がされてしまう。
blog.katsuma.tvではそのための対応として、app/views/errorにmissing_action.ctp、missing_controller.ctp、missing_view.ctpを配置すればよいことが書かれているが、どのようにコードを記述すればよいかはわからない。
関数を一切設定せずにファイルを作成したところエラーは表示されなくなったが、missing_view.ctpに記載されているメッセージも出なかった。おそらくcontrollerへの記載が必要なんだろうけれど、そのドキュメントが見当たらない。
他のドキュメントも探したが、cake/dispatcher.phpを改造するものなどちょっと強引なものがあったので、もう少しよさそうな方法を探したい。

メモリ増設

この不景気なので、メモリを買って少しは経済に貢献してみました。
増設しようとしたマシン
hp ML110 G2・・・DDR 400対応(1GB搭載 最大4GB)
DELL Inspiron 1300・・・DDR2 533対応(512MB搭載 最大2GB)
ML110はサーバー機だけれども、ファンなどをはずし、メモリもECC対応 256MBだったものをとって、1GBにしてデスクトップ用にしたもの(それでもすこしうるさい)。今回、DDR 400 1GBを3枚購入して、4GBとする。
Inspiron 1300にはDDR2 533というメモリがもうSO-DIMMには存在しなかったので、上位のDDR2 800 1GBを1枚購入して、1.5GBとした。
上海問屋のお値段
DDR 400 1GB(Transcend)・・・2,869円×3=8,607円
SODIMM DDR2 800 1GB(Kingston)・・・1,500円
送料 399円
————————————————
合計 10,506円
DDR2 400よりもDDR2 800の方が単価が48%も安いってどうよって感じですが、DDR2のメモリをDDR対応マシンに載せられないので、DDR3が主流になりつつあるこのタイミングが一番よいと判断した。(これからたぶん値段が高くなるハズ)
にしても4GBで1万円とは、半導体の値段もすごいことになってますね。
(記憶が確かならば、ML110に搭載したサムスンの1GBメモリは確か1万円に少しおつりがくる程度だったように記憶している)
実際にモノが届いて増設した上で、ML110でMEMTEST86を実行してチェックしてみた。
○増設前
L1 Cache 16K 19582KB/s
L2 Cache 256K 17179KB/s
Memory 1023M 1562KB/s 133MHz(DDR266) Single Channel
○増設後
L1 Cache 16K 19582KB/s
L2 Cache 256K 17179KB/s
Memory 3455M 2187KB/s 133MHz(DDR266) Dual Channel(Interleaved)
一応デュアルチャネルの影響か転送速度は40%向上しているが、4GBなのに3.37GBとしか認識しないことと、DDR 266で認識していることに驚いた。
ちなみにInspiron 1300の増設結果
L1 Cache 16K 19704KB/s
L2 Cache 1024K 8674KB/s
Memory 1527M 1093KB/s 148MHz(DDR297) Dual Channel(Asymmetric)
メモリ増設の仕方が、512MB+1GBであることに加えて、DDR2 533+DDR2 800の組み合わせなので、仕方がない。DDR2 800 1GB×2にすればInterleavedになって転送速度はかなりよくなるはずと踏んでいるけれど、今回はケチって1枚しか買わなかったので、このくらいにしておきたい。

SELECT文で条件にあった一覧を取得したい

たとえば、SELECT * FROM users WHERE id=3; を実行したければ、
$this->User->findAll(array(‘id’ => 3));
とすればよい。別のテーブルをSELECTしようとするとUserなんて知らないと怒られるので、
var $uses = array(‘(自モデル)’, ‘User’);
としなければならない。
なお、このSQLを実行するには、findAllByUserId(3)というのも使えるが、汎用性にかけるので、原則findAllメソッドを利用するとよいと思う。(ただ、公式マニュアルによればfindAllメソッドは非推奨となっており、find(‘all’)を使えとある。)
また、SELECT * FROM users WHERE id=3 AND nickname IS NOU NULL; を実行したければ
$this->User->findAll(array(‘id’ => 3, ‘not’ => array(‘nickname’ => null)));
となる。
参考:findAll で IS NOT NULL

Cannot access empty property

Fatal error: Cannot access empty property in /(path)/cake/libs/view/view.php on line 753
というエラーが実行時に出てしまった。
原因は、cake bakeしたときに
Would you like this controller to use any components? (y/n)
[n] > y
Please provide a comma separated list of the component names you’d like to use.
Example: ‘Acl, Security, RequestHandler’
で何も入力しないでEnterを押して元に戻った上でnを押したためにcontrollerに以下のようなコードができてしまったことだった。
var $helpers = array(‘Html’, ‘Form’, ”);

テンプレートを変更する

常にヘッダーとフッターにいつものcakePHPのものが表示されるので、自分なりにカスタマイズしたくなる。snapzに詳細は記載があるが、app\views\layouts\default.ctp (cakePHP 1.2ではctpに変更されている)に記述をすればよい。
$title_for_layout
$content_for_layout
がそれぞれタイトル部、各アクションにおいてテンプレートが出力する部分である。

cakePHPでOpenID対応サイトを作る

【CakePHP】OpenIDをAuthComponentにトッピングしてみる を参考にcakePHPでOpenID対応サイトを作ってみた。
詳しい説明は上記サイトに記載があるので、説明が省略されているところを中心に記載してみたい。
1.
cakePHPをダウンロードする。まだ開発途中である1.2をダウンロード。
2.
コンテンツを展開したいフォルダに解凍して、config にある database.php.default を database.php に変更して内容を編集する。
3.
chmod -R 777 app/tmp/
で権限付与を行う。
4.
app/config/core.php にある
Configure::write(‘Security.salt’, ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’);
のXXの部分をランダムな値に変更する。
5.
以下のSQLを実行してテーブルを作成する。

CREATE TABLE `users` (
`id` int(10) NOT NULL auto_increment,
`nickname` varchar(50) NOT NULL,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`flag` int(1) NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

6.
OpenID component for CakePHP
を参考にしてOpenIDコンポーネントとPHP Open ID Library、EAUT libraryをダウンロードして設定する。
7.
cake/console/cake bake
を実行する
Welcome to CakePHP v1.2.0.7692 RC3 Console
—————————————————————
App : app
Path: /(pathname)/app
—————————————————————
Interactive Bake Shell
—————————————————————
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> M
—————————————————————
Bake Model
Path: /(pathname)/app/models/
—————————————————————
Possible Models based on your current database:
1. User
Enter a number from the list above, type in the name of another model, or ‘q’ to exit
[q] >1
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] > n
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
[y] > n
—————————————————————
The following Model will be created:
—————————————————————
Name: User
Associations:
—————————————————————
Look okay? (y/n)
[y] > y
Baking model class for User…
Creating file /(pathname)/app/models/user.php
Wrote /(pathname)/app/models/user.php
Cake test suite not installed. Do you want to bake unit test files anyway? (y/n)
[y] > n
—————————————————————
Interactive Bake Shell
—————————————————————
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> C
—————————————————————
Bake Controller
Path: /(pathname)/app/controllers/
—————————————————————
Possible Controllers based on your current database:
1. Users
Enter a number from the list above, type in the name of another controller, or ‘q’ to exit
[q] > 1
—————————————————————
Baking UsersController
—————————————————————
Would you like to build your controller interactively? (y/n)
[y] > y
Would you like to use scaffolding? (y/n)
[n] > n
Would you like to include some basic class methods (index(), add(), view(), edit())? (y/n)
[n] > y
Would you like to create the methods for admin routing? (y/n)
[n] > n
Would you like this controller to use other helpers besides HtmlHelper and FormHelper? (y/n)
[n] > n
Would you like this controller to use any components? (y/n)
[n] > y
Please provide a comma separated list of the component names you’d like to use.
Example: ‘Acl, Security, RequestHandler’
> Auth,Openid
Would you like to use Sessions? (y/n)
[y] > y
—————————————————————
The following controller will be created:
—————————————————————
Controller Name: Users
Components: Auth, Openid
—————————————————————
Look okay? (y/n)
[y] > y
Creating file /(pathname)/app/controllers/users_controller.php
Wrote /(pathname)/app/controllers/users_controller.php
Cake test suite not installed. Do you want to bake unit test files anyway? (y/n)
[y] > n
—————————————————————
Interactive Bake Shell
—————————————————————
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> V
—————————————————————
Bake View
Path: /(pathname)/app/views/
—————————————————————
Possible Controllers based on your current database:
1. Users
Enter a number from the list above, type in the name of another controller, or ‘q’ to exit
[q] > 1
Would you like to create some scaffolded views (index, add, view, edit) for this controller?
NOTE: Before doing so, you’ll need to create your controller and model classes (including associated models). (y/n)
[n] > y
Would you like to create the views for admin routing? (y/n)
[y] > n
Creating file /(pathname)/app/views/users/index.ctp
Wrote /(pathname)/app/views/users/index.ctp
Creating file /(pathname)/app/views/users/view.ctp
Wrote /(pathname)/app/views/users/view.ctp
Creating file /(pathname)/app/views/users/add.ctp
Wrote /(pathname)/app/views/users/add.ctp
Creating file /(pathname)/app/views/users/edit.ctp
Wrote /(pathname)/app/views/users/edit.ctp
—————————————————————
View Scaffolding Complete.
app/views/users/login.ctpを追加して以下のように記述する。

<?php
if (isset($message)) {
echo ‘

‘.$message.’

‘;
}
echo $form->create(‘User’, array(‘type’ => ‘post’, ‘action’ => ‘login’));
echo $form->input(‘OpenidUrl.openid’, array(‘label’ => false));
echo $form->end(‘Login’);
?>

8.
以降のコードは【CakePHP】OpenIDをAuthComponentにトッピングしてみる を参考にするとできる。
【動作確認】
http://(cakePHPを配置したパスに到達するためのURL)/users/login
でログインページを出すことができるので、たとえば、
mixi.jp
yahoo.co.jp
www.google.com/accounts/o8/id
などを入力するとそれぞれのサイトのOpenID認証サイトに遷移して、そこで認証がOKだとニックネーム登録画面に遷移して、登録を続けるとDBにユーザー情報が登録できる。
http://(cakePHPを配置したパスに到達するためのURL)/users/
とアクセスすると登録状況を照会できる。
ユーザー認証の画面を作るのは結構面倒だけれど、cakecPHPを使えばここまで簡単にできる。

九十九電気

が民事再生法の適用になってしまったニュースを一昨日知ってびっくりした。
前職では大変お世話になり
8月にはRAID5対応のSATA-IIカードを買ったときに意味不明なカードを無料ですからと手渡されてお世話になり(依然利用用途不明)
ハードディスクを買うといえば九十九だっただけにほんとにコメントのしようがありません。
PCサクセスが自己破産になって
ラオックスは不調で
九十九は民事再生法適用。。。。
ん~これから秋葉原はどうなっていくんでしょうか??

さむい

さむいさむい。
朝は車のフロントガラスが結露し始めるし、夜は寒いし、もう冬はそこですなぁ。
でも最近熱いこと。
それは、「cakePHP」でもWebアプリをバリバリ開発している人にとっては、いまさらって感じかもね。転職してからWebアプリ開発はご無沙汰で、別のフレームワークを触るだけでワクワクしてしまう。
そして「OpenID」。これからサイトごとにアカウントを覚える必要はないかもね。OpenIDを利用したcakePHPのサンプルアプリを作ってみたんだけど、mixiのOpenIDと連携してみたらとっても便利だった。(Yahooはセキュリティポリシー上IPアドレスからのアクセスは不正アクセスとみなしてしまうので、テスト可能な環境を選んでしまう)
LDAPのようにIDとパスワードを入力する際に問い合わせするサイトを自サイトではなくOpenIDのサイトにするという仕組みかと思ったらそうじゃないんですね。まぁその方が安全ちゃぁ安全なんですけど、OpenIDが普及するまでは利用者の戸惑いも多いかもしれませんね。