CakePHP で $Session->read("xxx") がいきなり動かなくなった件

作っているサイトで、突如特定のコントローラ限定で Session が有効にならなくなってしまった。


調べまくったけど全然わからなくてどうしようかと思った。
で、ソースをよく見たら以下の例のようになっていた

ダメな例

<?php

class NewsController extends AppController
{
	// 略
}

正しい例

<?php

class NewsController extends AppController
{
	// 略
}

1行目に空白行が入っているのが原因だった。


偶然、エンターキーを押してしまいその後保存したのだと思う。
たったこれだけでのことで2時間くらい試行錯誤してしまった。
時間の無駄すぎる。

雑誌『Newtype THE LIVE 2008年 07月号』にインタビューが載りました

特撮ファン向けの雑誌『Newtype THE LIVE 2008年 07月号』に、担当したエイプリルフール企画サイトにについてのインタビューが載りました。

『4月1日の円谷プロダクションは「本気」で「遊ぶ」』

企画の意図や制作期間などついて。
プログラムやサーバーなどの話もしたけど、PCユーザー向けの本ではないのでそういうのは載らなかったみたいです。


本に名前が載るのは初めてなのでうれしい。
記念に両親に送ろうと思います :D

アソシエーションさせた他モデルのフィールドを指定してデータ取得する方法がわからない

アソシエーションさせた他モデルのフィールドを指定してデータ取得したいけど、方法がわからなくて悩んでいるというお話です。

テーブル構成の例

以下のようなテーブル構成になっていて、それぞれアソシエーションさせてあります。

  • Entry
    • id
    • title
    • body
    • category_id
    • user_id
    • created
    • modified
  • User
    • id
    • title
    • body
    • blog
    • hobby
    • sex
    • height
    • weight
    • created
    • modified
  • Comment
    • id
    • title
    • body
    • user_id
    • entry_id
    • created
    • modified
  • Category
    • id
    • title


これで $this->Entry->findByid($id) とすると、関連したデータを一発でとれて「すげえええええ」と感動したわけなのですが、「でも、このカラムのデータはいらないんだけど」ということが起きました。

User の特定カラムのデータだけ欲しい

Userからは id と title だけ表示させたいので、他の User データは必要ありません。
例なので項目が少ないですが、実際にはそれぞれもっとカラムを持っているので、データの量が結構あります。
サーバーのメモリが少ないので、余分なものはとにかく取らないようにしてメモリを節約したいというわけです。


取得 field の指定でうまくできないかな? と思い、以下のように試してみました。

$entry = $this->Entry->findById($id, array('User.id','User.title'));

もしくは

$entry = $this->Entry->find('all', array(
	'conditions' => array('Entry.id' => $id),
	'fields' => array('User.id','User.title')
	));

結果↓

Warning (512): SQL Error: 1109: Unknown table 'User' in field list [CORE/cake/libs/model/datasources/dbo_source.php, line 473]

Entry のデータから Userカラムのデータを取るクエリーになってしまい失敗。


指定してデータをとる方法はあるのだろうか。

bindModel して fields に指定すれば一応できた

正しいやり方なのかはわからないけど。

$this->Entry->bindModel(array(
	'belongsTo' => array(
		'User' => array(
			'fields' => array('User.id', 'User.title',),
		))
	)); 
$entry = $this->Entry->findById($id);

Array
(
    [Post] => Array
        (
            [id] => 3
            [title] => たいとる
            [body] => てすと
        )

    [User] => Array
        (
            [id] => 1
            [title] => Yossy
        )
)

こんなの毎回やるのバカバカしいなあ。


これが良さそうなので後で試してみよう

コントローラの index() に引数をつけるとメソッド扱いされてしまう件

久々に CakePHP をいじりを再開してみたら、コントローラの index() に引数をつけるとメソッド扱いされてしまう件にぶち当たりました。


手抜きをして以前のものを使うと、以下のような URL にアクセスするとエラーになります。


↓コントローラの index 。

function index($id=null)
{
	$this->set('task', $this->Task->findById($id));
}

↓アクセスするとこうなります。

Fatal: Confirm you have created the TasksController::777() in file : app/controllers/tasks_controller.php

<?php
class TasksController extends AppController {
   function 777() {
   }
}
?>

Routesを使えばいいらしい

同じような問題に悩んでいた人がフォーラムにいました。

  • indexに対するパラメータ

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1119&forum=8

「/users/*」のアクセスをUsersコントローラのindexアクションを実行するようにRouteを設定します。
4.3. Routes の設定のPagesControllerの例が近いと思います。
http://www.cakephp.jp/doc/ch04s03.html

なるほど。「app/config/routes.php」を以下のような感じにすればいいみたい。

$Route->connect('/Tasks/*', array('controller' => 'Tasks', 'action' => 'index', 'index'));

これで、http://xxx/Task/111 とかにアクセスすると正しく動作するようになった。
でも、http://xxx/Task/infos/ とかにすると 引数で指定したアクション index() に行ってしまうけど。
複数のアクションで使うことは自分ではあまりないのでまあいいかなあ。

デルの『デジタルハイエンドシリーズ2007FP HAS 20インチ TFT液晶モニタ』でポインタが正しく認識されない問題の対策

デルの『デジタルハイエンドシリーズ2007FP HAS 20インチ TFT液晶モニタ』で、マウスのポインタが正しく認識されない問題の解決方法について。


サブモニタとしてデルの液晶を導入しましたが、縦置きして90度回転させたところまでは全く問題なかったのですが、マウスのポインタが通常モニタのままで、死ぬほど使いづらくて困りました。
検索しても解決方法が出ていなくて、公式サイトのFAQをみたら、VGAのドライバに依存します、的なことが書かれていました。
自分は PC で FPS をするゲーマーなので、一番定評のある安定した古い VGA ドライバを使っていました。
これがモニタに対応していないのが原因でした。
最新版のドライバに変更したら、正しくモニタが認識されるようになりました。


とにかく快適すぎて死にます。

自宅をデュアルディスプレーにしました

職場をトリプルディスプレーにしたのに引き続き、自宅をデュアルディスプレーにしました。

購入したのは、デルの『デジタルハイエンドシリーズ2007FP HAS 20インチ TFT液晶モニタ』。
http://www1.jp.dell.com/content/products/compare.aspx/monitors_20_22?c=jp&cs=jpdhs1&l=ja&s=dhs


個人で買うと高かったので、個人事業主にしたら48,000円が38,000円になりました。

写真のように、液晶をサブモニタとして利用。
縦置きにしてブラウザ専用モニタとして使っています。
解像度は、横1,200px × 縦1,600px。


画像を見ての通り、同じサイトを見ても表示される領域が違いすぎます。
人間の目の性能というのはおそろいもので、右くらいの情報量でもあっという間に認識します。
なんていうか、これまでつかっていたのは出口が詰まったシャワーという感じ。
縦置きした20インチのデルモニタは、勢いよく情報が目に飛び込んでくる印象です。
とにかく感動の一言。


価格は38,000円でしたが、すでに2万円くらい回収した気持ちです。
とにかく快適すぎて困る。この感動をどうにかしてみんなに伝えて、縦置きモニタでブラウザをみて欲しい。
快適具合がとにかくハンパないです。