Archive for ‘ June, 2007

bake.phpを使ってみる(CakePHP修行 #008)


※ 今回からタイトルを変えました。

さてCakePHPのお勉強。前回までのあらすじはこちら。

» CakePHP修行! アーカイブ | i d e a * i d e a

さてScaffoldっちゅうやつを使ってみたい。ちなみに以前Railsのデモ映像を見たときのScaffoldのイメージは「コマンドラインから自動的になんかアプリっぽいものを一発で作ってくれる!」というものです。さて、本当にそうなるのでしょうか・・・。

なお、コードの自動生成はいまいち好きではないので、本格的に作るときはScaffoldを使うつもりはゼロ。ただ、「どんだけ簡単か」は知っておきたいので調査の意味もかねてやってみます。

■ scaffoldってなんだ?

まずはScaffoldのやり方を調べるため、ざっくり検索します。わかったことは次の二つ。

  1. Controllerに$scaffoldっていれればいいらしい。
  2. bake.phpってやつを使えばなんかざっくり作ってくれるらしい(しかしこれがScaffoldという機能かどうかは不明。ま、簡単に作れる機能ということで)。

両方試してみたいのですが、まずは簡単そうな後者をやってみます。

■ bake.phpってなんだ?

※ ここからUNIX初心者っぽい記述が続きます。みんな、僕のことを嫌いにならないでね!

では次にbake.phpにて検索。次のサイトが参考になるっぽい。

» CakePHP Users in Japan Wiki – bake.phpの使用

ここで使用されているコマンドは次のとおり。

bake.php -project /home/user/baketest

まずよくわからないのが、いきなりbake.phpで始まっている点。「php -f 」じゃないの?

次にわからないのは「/home/user/baketest」。ここには何をいれるべきなのだろう?でも「baketestフォルダも勝手に作ってくれます」とあるので、まずはこれでやってみましょう。

で、bake.phpがある/cake/scriptsに移動しておもむろにコマンドラインから次のように打ってみます。

[webadmin@100shiki scripts]$ bake.php -project /home/webadmin/codexcode.com/baketest
bash: bake.php: command not found

エラーがでました。そりゃそうです。

[webadmin@100shiki scripts]$ php -f bake.php -project /home/webadmin/codexcode.com/baketest
Usage: php [options] [-f] <file> [--] [args...]
       php [options] -r <code> [--] [args...]
...

またしてもエラー。これもまぁ、そうでしょう。bake.php自体のオプションをphp -fにかませる方法がよくわからん・・・(すみません、すみません)。

そこで気を取り直して、/usr/bin/phpにパスを通してみます。.bash_profileを書き直し、「. .bash_profile」で読み込みます。これでphp -fはつけなくてよいはず(なにか違う?)。

[webadmin@100shiki scripts]$ bake.php -project /home/webadmin/codexcode.com/baketest
bash: ./bake.php: 許可がありません

なぬ・・・「chmod 744 bake.php」で許可を与えます。そして再度実行。今度はうまくいきました!なんか次のような画面がでていろいろ出来た模様です。

bake_1.gif

↑ なんかテンプレートファイルをつくってくれました。

bake_2.gif

↑ Sambaで見たファイルの構成はこんな感じ。つまるところ、/appと同じものを作ってくれるというわけね。

そのあといろいろ調べたところ、再度以下のコマンドを実行するといろいろな設定をインタラクティブにやってくれるらしい。

[webadmin@100shiki scripts]$ bake.php -project /home/webadmin/codexcode.com/baketest

DBの設定ができたり、MVCの設定ができたり、ということらしいです。最初にイメージしていたものとは大分違いますね・・・個人的に期待していたのは、「DBの設定を読み取って、/app以下のMVCを勝手に作ってくれる」だったのですが・・・。

というわけでここでbake.phpの設定は断念。インタラクティブでひとつひとつ設定できるのはいいですが、いまいち面倒すぎます(具体的にはここで説明されているような処理になります)。

というわけで、せっかく作った/home/webadmin/codexcode.com/baketestはさくっと削除しちゃいます。

では次のエントリーでは$scaffoldをControllerに足していく方法を試すことにしましょう。

CakePHPでSNSっぽいものを作ろうとして挫折するまでのコーディング日記(#007)


さてCakePHPのお勉強。前回までのあらすじはこちら。

» CakePHP修行! アーカイブ | i d e a * i d e a

さていくつか進捗報告。

■ ちょっと調べたこと

ここまでで大枠はわかってきたので空き時間に勉強するように参考文献がないかあたってみました。いくつかの発見をシェア。

書籍は今のところ洋書しかなさそう。下の書籍が見つかりましたがまだそんな段階ではないので購入は保留。

» CakePHP Recipes

ニュース記事は青い人の記事以外にもこれを発見。ただ、2ページ目から会員登録が必要だったので読んでいない。

» CodeZine:CakePHPフレームワークによる快速WEB開発(CakePHP, Cake, PHP, フレームワーク)

ブログでは「CakePHPのおいしい食べ方」なるものが!これは良さそうですが、まだ自分のレベルが追い付いていない予感。数か月たったら(そして挫折してなかったら)読み返す。ちなみにこのブログも取り上げていただきました。感謝!

» CakePHP のおいしい食べ方

あとPDFでCakePHPのさまざまな紹介資料をアップしているサイトも発見。こちらのPDFも読ませていただきました。

» CakePHPの何か

あとはCakePHPはこんなに簡単!ということを示したムービーも発見。Railsの紹介ビデオ同様、インパクトがありますね。

» 10分で作るCakePHPアプリ for Windows – p4life

そして最後にこれは忘れてはいけません。「レファレンスがPDFで読めないかなぁ」と思っていたら読者の方に教えていただきました(コメント欄で教えていただいた皆様感謝!)。これはすばらしいです!早速DLしました。

» hetimaの日記 – CakePHP ドキュメント日本語訳の pdf

■ 青い人からの突っ込みに関して

前回の記事に早速青い人から突っ込みがはいりました。

» Re: CakePHP日記 #006 ディレクトリ構成とDB設計 : akiyan.com

いくつか。

まずはフォルダ構成。完璧に間違えていましたw。webadmin以下のcodexcode.comにCakePHPを入れたので正確には以下のとおりです。

/home/webadmin/codexcode.com
    /app
        /webroot ← DocumentRootに設定。
    /cake
    /vendors
    .htaccess
    index.php
    VERSION.txt

次にDB設計。いろいろ突っ込みをいれてもらい、かなりテンションあがりました。プロにこんな指導受けて感謝感激!きっちりお礼しなくちゃ。いつものやつ(謎)でいいよね、青い人!

結局出来上がったSQLはこちら。

  • Users
  • DROP TABLE IF EXISTS users;
    CREATE TABLE users (
        id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(50),
        email VARCHAR(255) BINARY NOT NULL UNIQUE,
        pwd VARCHAR(255),
        profile TEXT,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL
    );
    INSERT INTO users (name,email,pwd) values ('taguchi','taguchi@foo.com','taguchipwd');
    INSERT INTO users (name,email,pwd) values ('akiyan','akiyan@foo.com','akiyanpwd');
    

    BINARY属性とか知らんかった・・・。便利ね。UNIQUEもつけないと駄目ですな。ちなみにUNIQUEにはNOT NULLを入れたけどそれでいいよね?

  • Posts
  • DROP TABLE IF EXISTS posts;
    CREATE TABLE posts (
        id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        user_id INT UNSIGNED,
        title TEXT,
        body TEXT,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL,
        KEY user_id_created (user_id, created)
    );
    

    こちらは複合インデックスを追加。

  • Friends
  • DROP TABLE IF EXISTS friends;
    CREATE TABLE friends (
        id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        user_id INT UNSIGNED,
        friend_user_id INT UNSIGNED,
        status INT UNSIGNED,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL,
        UNIQUE KEY user_id_friend_user_id (user_id, friend_user_id),
        KEY user_id_status_modified (user_id, status, modified)
    );
    

    こちらも複合インデックスを追加。いやー、勉強になるなぁ。

さてさて、下準備はこんなところですかね。次ではいよいよscaffoldっちゅうやつにチャレンジしてみます。

CakePHPでSNSっぽいものを作ろうとして挫折するまでのコーディング日記(#006)


前回までのあらすじ。

» CakePHP修行! アーカイブ | i d e a * i d e a

さて今日もCakePHPのお勉強。

■ 昨日のは練習ということでオールリセット

青い人に突っ込みをいれてもらったので前回までの作業は練習として全削除。最初からいろいろ設定しなおしました。

» 「CakePHPでSNSっぽいものをつくって挫折するまでのコーディング日記」へツッコミをいれていきます : akiyan.com

作業したことは以下のとおり。

  • ダウンロード、解凍
  • 前回と同様にCakePHPをダウンロード、解凍しました。

  • フォルダ構成の変更
  • なんとなくフォルダ構成を変更しました。/home/webadmin/codexcode.com以下に全部いれて、/app/webrootをVirtualHostのDocumentRootに設定しました。

    変更後のレイアウトはこんな感じ。

    /home/webadmin/
        /app
            /webroot ← DocumentRootに設定。
        /cake
        /vendors
        .htaccess
        index.php
        VERSION.txt
    
  • DB設定(/app/config/database.php)
  • あらためてDB設定。前回と同じ。

  • Permission設定。/app/tmpを777に。
  • ここは青い人もよく忘れるというポイントらしい。全部を777にするのはさすがに横暴だろうと思っていたらやっぱりそうでした。というわけで/app/tmpのみを777に。

■ まずはDB設定

次にSNSっぽいアプリを考えたときの仕様を考えてTable Layoutを作ってみます。そのあとScaffoldをやってみたい(そのあと元に戻すと思うけど)。

では必要そうなテーブルを列挙してみます。とりあえず最小限のもので。

  • Users (ユーザー)
  • まずはUsers。最小限な感じです。写真のアップ、ログイン時間とかはあとで考えよう。パスワードもとりあえず暗号化せずにいっときます。

    DROP TABLE IF EXISTS users;
    CREATE TABLE users (
        id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(50),
        email VARCHAR(255),
        pwd VARCHAR(255),
        profile TEXT,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL
    );
    INSERT INTO users (name,email,pwd) values ('taguchi','taguchi@foo.com','taguchipwd');
    INSERT INTO users (name,email,pwd) values ('akiyan','akiyan@foo.com','akiyanpwd');
    
  • Posts (← 日記。Diariesより語感がいいのでこちらに)
  • ユーザーが書く日記。日記ごとにオーナーがいる感じで。

    DROP TABLE IF EXISTS posts;
    CREATE TABLE posts (
        id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        user_id INT UNSIGNED,
        title TEXT,
        body TEXT,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL
    );
    
  • Friends (友達関係のJoinテーブル)
  • ここは誰が誰の友達かを表すテーブル。ちょっとズルをして青い人に聞きながらつくってみました。

    DROP TABLE IF EXISTS friends;
    CREATE TABLE friends (
        id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        user_id INT UNSIGNED,
        friend_user_id INT UNSIGNED,
        status INT UNSIGNED,
        created DATETIME DEFAULT NULL,
        modified DATETIME DEFAULT NULL
    );
    

まずはこれだけ作ってみました。

ちなみにこうして作ったSQL文はどこかに保存しておいてよいものだろうか?なんとなく/app/config/sqlに入れてもよいような・・・他に入れるべき適切な場所があれば教えてくれぃ → 青い人。

■ 他にやったこと

なんとなく本家サイトからチートシートをダウンロード&印刷。移動中に見て勉強することにします。あとPHPみたいにPDFで全レファレンスがDLできるとかないのだろうか?

■ 次回の予定

Scaffoldを試してみていろいろ画面を見たい。で、そのあとまたリセットして、画面のレイアウトを考えていきたいっす。

・・・今日は以上。深夜にもうちょっとやるかも。あと明日、明後日はちょっと忙しいので次の更新は日曜日か月曜日あたりです。

CakePHPでSNSっぽいものを作ろうとして挫折するまでのコーディング日記(#005)


前回までのあらすじ。

» CakePHP修行! アーカイブ | i d e a * i d e a

はまりそうもないところはかなりはしょっていきます。

さて続き。チュートリアルの続きをどんどん行います。付録Bまで進みました。

ここまでで行ったこと。

cake_005_1.png

↑ 日記の登録、削除、編集ができるようになりました。

cake_005_2.png

↑ Userモデルを導入し、日記の登録に関してはログインが必要になりました。

Userモデルは面倒なので「メールアドレス」「パスワード」「メモ」フィールドのみとしました。

■ 今のところの疑問

さていい感じではありますが、個人的になんかいやな感じがするのは以下の点。

  • やっぱりレファレンスを流し読みしてみよう。全体像がわかりにくくなってきた。
  • インターフェースは手抜きで行こうと思ったけどそのままだとテンション落ちまくり。きれいな画面で作業したいので次の作業は見た目の改修をすることに。
  • 見た目が終わったらログインの挙動を突っ込んで考えたい。パスワードの暗号化、「情報を保存する」オプション、ログイン後のとび先をなんとかしたい。

■ レファレンスを読んでみる

ここらへんにまずは目を通したいと思います。わからないところは基本すっとばしで。インターフェースの変更方法に気をつけてみてみます。

» CakePHP プログラマーズ リファレンスガイド

CakePHPでSNSっぽいものを作ろうとして挫折するまでのコーディング日記(#004)


前回までのあらすじ。

» CakePHP修行! アーカイブ | i d e a * i d e a

今回の顛末。

・・・前回で「エラーキター!」と思ったらエラーじゃなかったです。Diaryモデルのテーブル名はDiariesでよかったみたい。

問題は単にViewがなかっただけでした・・・ちゃんとエラーメッセージ読めよ・・・。

・・・というか、もちょっとはしょって書くようにします。これだとなんか1日10記事ぐらい書いちゃいそう。なんかうざいっすよね。

では次はもちょっと後で。

CakePHPでSNSっぽいものを作ろうとして挫折するまでのコーディング日記(#003)


DBの設定が終わりました。さて次!なお、前回までの様子はこちらから。

» CakePHP修行! アーカイブ | i d e a * i d e a

■ mode_rewriteの確認

mode_rewriteを確認せよ、とあったので確認。httpd.confに書いてあったので大丈夫なはず。

■ Diaryモデルの作成

さてモデルを作り始めます。はたして「Diary」モデルで大丈夫なのか?

/app/models/diary.phpを作成します。どうでもいいけど文字コードはUTF-8でいいのかな。ま、大丈夫でしょ。

<?php
class Diary extends AppModel {
    var $name = 'Diary';
}

これでいいのかな?次にコントローラー。一気にアクションまで追加します。これで動作確認できるはずー。

/app/controllers/diaries_controller.phpを次のように作成。

<?php
class DiariesController extends AppController {
    var $name = 'Diaries';
    function index() {
        $this->set('diaries', $this->Diary->findAll());
    }
}

■ いよいよ・・・確認

さてここまでできたので、http://www.codexcode.com/diariesにアクセスします。どうなるやら・・・。

cake_003_1.gif

↑ エラーでした・・・orz。

えー・・・つか、あれですな。なんか書き込みするんですな。面倒なんでpublic_html以下を全部777に(これって横暴かな?>教えて青い人)。気を取り直してもう一度アクセス!

cake_003_2.gif

おっしゃーーーーーーーーーーーーーーーーーーーーーエラーだ!

ちくしょー・・・きっとdiariesじゃだめなんだな。diarysだな、きっと。英語の複数形厳密にやっていたら大変だもんな、さすがに。

疲れたから休憩。次の記事を待て!(待たなくてもいいよ)。

CakePHPでSNSっぽいものをつくって挫折するまでのコーディング日記(#002)


前回で様子はわかったのでチュートリアルを見ながら、変えられるところは変えていきます。なお、前回までの様子はこちらをどうぞ。

» CakePHP修行! アーカイブ | i d e a * i d e a

■ DB準備

なんかDBが必要っぽいのでMySQLの設定を行います。SNSの日記を作っていきたいのでPostsではなくて、Diariesのテーブルを作ります。

ちなみにPostsはPostモデルと結びつくのは想像できますが、DiariesはDiaryモデルに紐づくのか?Diarysにした方がいいのか?Diariesでうまくいったら感動しそうだからこれでいってみます。

データベースはcodexcodeで。まずはDBの作成とユーザーの設定。

$ mysqladmin -uroot -pXXXXX create codexcode
$ mysql -uroot -pXXXXX
mysql> grant select,insert,update,drop,delete,create,index,alter on codexcode.* to (dbuser)@localhost identified by '(dbpasswd)';

次にテーブルの作成&データのぶっこみ。

/* diaries テーブルを作成します: */
CREATE TABLE diaries (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);
/* それから、テスト用に幾つかの post を挿入します: */
INSERT INTO diaries (title,body,created)
    VALUES ('Title 1', 'Body 1', NOW());
INSERT INTO diaries (title,body,created)
    VALUES ('Title 2', 'Body 2', NOW());
INSERT INTO diaries (title,body,created)
    VALUES ('Title 3', 'Body 3', NOW());

一応確認。

mysql> select * from diaries;
+----+---------+--------+---------------------+----------+
| id | title   | body   | created             | modified |
+----+---------+--------+---------------------+----------+
|  1 | Title 1 | Body 1 | 2007-06-20 12:49:52 | NULL     |
|  2 | Title 2 | Body 2 | 2007-06-20 12:49:52 | NULL     |
|  3 | Title 3 | Body 3 | 2007-06-20 12:49:54 | NULL     |
+----+---------+--------+---------------------+----------+
3 rows in set (0.00 sec)

うまくいっているようです。

次にいよいよ/app/config/database.phpを作って設定します。

  var $default = array('driver' => 'mysql',
                'connect' => 'mysql_pconnect',
                'host' => 'localhost',
                'login' => 'XXXXXXXXXXXX',
                'password' => 'XXXXXXXXXXX',
                'database' => 'codexcode',
                'prefix' => '');

こんな感じかな?同じ設定ファイル内に$testがあったけどそれはそのままでいいのか?また’connect’は’mysql_pconnect’でいいのかな?いまいち違いがわかっていない・・・。

このあとhttp://www.codexcode.com/にアクセス。

cake_002_1.gif

↑ 無事DBが見つかったようです。

さてここまででいいでしょう。次の作業はちょっと休憩のあと。もしかしたら今日はもうやらんかもしれんが。

CakePHPでSNSっぽいものをつくって挫折するまでのコーディング日記(#001)


前回に続き、作業に入ります。

まずは下準備。

■ 下準備

カフェでコーディングしたいのでまずはローカル開発環境をセットアップ。VMWare上のCentOS4にVirtualHostを設定します。Apacheを再起動。

なんとなくドメインはcodexcode.comで。ローカルのhostsも設定完了。

今回作業するのは、/home/webadmin/codexcode.com/public_htmlです。

■ インストール

では何はともあれインストール。CakePHPのサイトからStable版をダウンロードしてCopy。Sambaの設定がしてあるから楽々。途中で寄付するか聞かれますが今はスルー。最後までできたら$100寄付してやるぜ!

とりあえず何したらいいかわからないので次にドキュメントをあたります。

■ 下調べ

とりあえず青い人が紹介していた記事を当たってみます。

» 第1回 CakePHPを使いたくなる5つの特徴|gihyo.jp

・・・読んだ。ActiveRecordとか何いってるかわかんない。あとぶっちゃけ、モデル、ビュー、コントローラーのビューしかわかんない。

とりあえずチュートリアルを読めばよさげな気がするので次に行きます。

» 付録 A. Cake ブログチュートリアル

・・・読みはじめた。変な翻訳が逆に好感度高し。解凍後の処理が書いてあったので一緒にやってみる。

まずは解凍。

/home/webadmin/public_html
    /app
    /cake
    /vendors
    .htaccess
    index.php
    VERSION.txt

になりました。とりあえず http://www.codexcode.com/ にアクセス(ローカルに設定しているのであなたからは見えません)。

cake_001_1.gif

おー、なんかできている。とりあえずPHPは動作しているっぽい。

・・・付録B、Cと読み進めます。Viewのファイル名が.thtmlなのがちょっと気持ち悪い。なんで「.thtml」なんだ?

それから期待していたモデルとコントローラーの違いがわかったような、わからないような・・・やっているうちにわかるだろ、ということで次に行きます。

そしてヘルパーとコンポーネントが出てきた。わからん。まぁ、いいや。今のところ。

たぶんこのあとはリファレンスを読めばいいのでしょうが、面倒だからとばしますw。

チュートリアルではブログシステムを認証付でやっていたのでまぁ、ブログもSNSの日記も同じだろうということでチュートリアルを見ながら作り始めてみます。

キリがいいので記事を分けます。

» CakePHP修行! アーカイブ | i d e a * i d e a

CakePHPでSNSっぽいものをつくって挫折するまでのコーディング日記(#000)


cakephp_top.gif

コーディングは日々やっていないと忘れるので練習もかねて日記を書いてみます。

最近話題のCakePHPでSNSっぽいアプリをゼロから作る過程をレポートしていきます。

なお、個人的にフレームワークというものにいい思い出がないので最初から挫折する気満々ですw。ちょっとでもはまったらやめるつもりなので何回まで続くかわかりません。

でもきっと青い人が助けてくれるのではないかな、とちょっと(=かなり)期待しています。

では今回の企画について。

  • CakePHPを使う。
  • SNSっぽいのを作ります。考えている仕様は後述。
  • 1日1時間程度やりたいと思います。調子にのったら延長。はまったら数分でやめます。
  • 3日以上はまったらやめるw。すぐやめる。即やめる。
  • コーディングが稚拙でもブログで公開していきます。むしろ恥をかく方向で。
  • 万が一、挫折せずに最後までできちゃったら、CakePHPに$100寄付します。

では作ってみたいSNSの仕様について。

  • ログイン、ログアウト。ログインには例の「情報をコンピュータに保存する」をつける。
  • 会員情報登録、編集、削除。写真アップも含む。登録はメールで承認つうやつをやってみたい。
  • 友達招待、登録。
  • 日記登録、削除、編集、お友達日記閲覧。
  • 会員用ページ。

こんなところですかね。基本的にデザインはミニマムっす。気が向いたら適当なジェネレータでロゴぐらいつくるかも。

では今から作業に移りたいと思います。アップは数時間後!

ネイティブっぽく話すためのカタカナ英語


speech_top.gif

先日紹介した「QualityはQuwalityと言うとネイティブっぽい」が一部で評判だったので、以前英会話を習っていた時のメモをひっぱりだして紹介してみる。

発信することで記憶は定着化しますからね。

  • “compare”は”cmpare”。第二音節にアクセントがあるときは最初の母音は忘れる
  • “ancient”は”ankcient”
  • “psychology”は”psykalogy”
  • “family”は”famly”
  • “environmentは”enviroment”
  • “pencil”は”pencl”
  • “follow”は”fallow”
  • “understand”は”underste-nd”
  • “control”は”cntrol”
  • “protest”は”pr ou test”
  • “stanford”は”stan ferd”
  • “actually”は”act shoe wully”
  • “lanuage”は”leingwidge”
  • “i am”は”i yam”
  • “we are”は”we yare”
  • “question”は”kwestion”
  • “absolutely”は”absolootlee”
  • “entrepreneur”は”antra pro newer”
  • “a bundle of”は”a bund love”
  • “popular”は”pa-pular”

以上ですかね・・・結構忘れていた。いかん。それからタイトルに「カタカナ英語」っていれたけど全然カタカナじゃないや、まぁ、いいか。

しかしあらためて見直してみると結構勉強になるなぁ。自分で言ってみて「おぉ、ネイティブっぽい!」って喜んでいた日々を思い出しました。もう一回習おうかなー。

あ、それから習ったのは米語の方です。ブリティッシュ英語はたぶん違うのでご注意を。

それからあくまでメモなので通じなかったらごめんなさい。でもたぶん通じる。