忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2026/04/12 02:54 |
買った本リスト 2009/10/09
いつまで続くかわからないが、買った商品を毎回貼り付けていこうかと。
せっかくアフィの張り方もわかったのでとりあえず。
レビューはまあ読んだら書いたり書かなかったり。
まともに書いてたら絶対続かないので適当なことばっかりの可能性大。

 

☆☆☆☆
パトリシアいらねええええええええええ
小神もいらね
メインキャラだけでゆるーくやってください。お願いします。


☆☆☆☆
ついに完結。
まああんまり突っ込んだ話をしはじめられても重くなるだけなのでそれなりに良い落としどころだとは思うんだが、せっかくだからもう一歩ほらこう、あれだ。
そういうのがほしかったような。
ところで結局そのお面は何だったんだ。
 


いいこと言ってるのかもしれないが、それ以前に絵が下手すぎて読むに耐えない。
別に絵が全てなどと言うつもりはないが、それにしても漫画として発表していい最低限のラインというものがあるだろうがと。
 

☆☆☆
何気にシビアな世界観が出たりでなかったり、でも解決法がぬるすぎるのでちょっと脱力。
一番の問題点は掲載誌。場違いにも程があるわ。
 

☆☆☆
一巻からこの人筆力凄いなあと感心することしきりな人。
このシリーズはまだいいんだけど、他の作品がタイトルが適当すぎてなかなか手が出なかった。
最近ようやくバッカーノを読んでみたらやっぱり凄かったので買い貯める予定。
ただ本作は、2のような全てが収束していく感覚があまりなく、普通の連作みたいになっていたのでちょっと残念。
 

☆☆☆
ずーっと延々本筋から外れまくりでいい加減そろそろどうにかしてくれと思ってたがようやく進んでくれたようなそうでもないような。 
 

☆☆☆☆☆
絶望的にヌル痒いこのかんじが大好きだ。
一見仲悪そうで実際それほど良くないところとか。
陽向が実在したら聖人君子過ぎて周りが疲れそうだとかそういうのは考えない方向で。


☆☆☆
面白いか、と言われると首を横に振るしかないんだが、なぜか読むのを止められない不思議漫画。


☆☆☆
これまで積み上げた謎がどうやって収束するのか、と思ったらそのまんま地の文と「説明しよう」とか勘弁してくれ。
いやまあ収束するのは確かでそれなりに良い出来ではあるんだが、なんかこうもう一ひねり足りなかったというか。
つうかあんな出鱈目な攻撃力があるんだったらわざわざこんな回りくどいことをしなくても良かったのでは、と思わないでもない。


今週はちょっと多かったですが、まあ大体毎週このくらいです。
PR


2009/10/09 22:58 | Comments(0) | TrackBack() | 買ったもの
ZF-04:Zend_Feed

Zend_FeedはRSSの読み書きを行うクラスです。
MagpieRSSでRSSを読み込みましたが、MagpieRSS自体が微妙にバグあり状態で更新が止まってしまっているので、今から使用するのはお薦めできません。

Zend_Feedは扱いがやたら簡単なのでさっくりといじってみましょう。
Zend_Feed::importでRSSから読み込みを行い、Zend_Feed::importFileでローカルのXMLファイルから読み込みを行えます。
驚きなのがZend_Feed::findFeedsで、普通のHTMLファイルの<LINK>タグからRSSを探して読み込んでくれるという超便利メソッド。
サイトトップを指定しておけば、きちんとタグを設定してあるサイトならフィードのURLが変わったとしても一切修正の必要がありません。
とりあえず使用。

zend_feed1.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
    
    //Zend_Feed
        require_once('Zend/Feed.php');
    
    //Feedインスタンス
        $feed = Zend_Feed::import(
            'http://yuubiseiharukana.blog.shinobi.jp/RSS/200/');
        //$feed = Zend_Feed::findFeeds(
        //  'http://yuubiseiharukana.blog.shinobi.jp/');
    
    //各要素を取得可能
        print($feed->title);
        print($feed->language());
    
    //イテレータは各エントリに対応
        foreach($feed as $val){
            print($val->title());
        }
    
    //要素の変更
        $feed->title='タイトルを修正';
    
    //修正したRSSを出力
        $feed->send();

取得さえ成功してしまえば各要素には
$feed->title();
$feed->title;

とプロパティでもメソッドでも直接アクセスすることができます。

またフィードの改変を簡単に行うことができます。
$feed->title='タイトルを修正';
というふうに単に値を突っ込むだけで変更することが可能です。
ただ、何故か非対称なことに、メソッドを使って
$feed->title('タイトルを修正')
というふうには書けません。

他所のサイトのRSSフィードを取得して表示したいといった場合、とりあえずHTMLをさっさと表示して、RSSフィード部分をAJAXで自分のサーバにあるRSS取得スクリプトにリクエストを行い、PHPで適当にパースして返すといった方法で簡単にできます。
AJAXによるRSSフィード取得はクロスドメイン問題のせいで難しいので、一旦自サーバに投げてPHPからリクエストした方が楽です。

まあ、貼り付けるだけで簡単取得できるサービスがいっぱいあるんで、それをテンプレに貼り付けたほうがもっと手っ取り早いんですがね。
http://code.google.com/intl/ja/apis/ajaxfeeds/
http://www.moondakota.com/feed/index_s.php
http://zero-hl.ddo.jp/feed2js/build.php

 



2009/10/09 22:23 | Comments(0) | TrackBack() | PHP
CakePHP-03:CakePHPで複数のテーブルを結合

http://yuubiseiharukana.blog.shinobi.jp/Entry/158/の続き?

CakePHPの基本は、ひとつのコントローラにひとつのテーブルです。
つまり、その状態ではリレーショナルをまともに扱うことができません。
複数のテーブルを扱いたい場合、実現には幾つかの手段があります。

単純に結合で話が済む場合は、モデルを記述することで解決されます。

とりあえず結合を使うようなテーブルを作成。
 

CREATE TABLE `books` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) NOT NULL,
 `author_id` int(8) NOT NULL DEFAULT '1',
 `publisher_id` int(8) NOT NULL,
 `price` int(10) DEFAULT '1',
 `isbn` varchar(16) DEFAULT NULL,
 `date` date DEFAULT NULL,
 `created` datetime NOT NULL,
 `modified` datetime DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `index_name` (`name`),
 KEY `author_id` (`author_id`),
 KEY `publisher_id` (`publisher_id`),
 CONSTRAINT `books_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`),
 CONSTRAINT `books_ibfk_2` FOREIGN KEY (`publisher_id`) REFERENCES `publishers` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `authors` (
 `id` int(8) NOT NULL AUTO_INCREMENT,
 `name` varchar(128) NOT NULL,
 `comment` varchar(128) NOT NULL,
 `created` datetime NOT NULL,
 `modified` datetime DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `index_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `publishers` (
 `id` int(8) NOT NULL AUTO_INCREMENT,
 `name` varchar(32) NOT NULL,
 `comment` text NOT NULL,
 `created` datetime NOT NULL,
 `modified` datetime DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `books_supplementations` (
 `id` int(8) NOT NULL AUTO_INCREMENT,
 `book_id` int(8) NOT NULL,
 `supplementation` text NOT NULL,
 `created` datetime NOT NULL,
 `modified` datetime NOT NULL,
 PRIMARY KEY (`id`),
 KEY `book_id` (`book_id`),
 CONSTRAINT `books_supplementations_ibfk_1`
  FOREIGN KEY (`book_id`) REFERENCES `books` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


とりあえず適当に作っただけなので各テーブルにはあまり意味はありません。
各テーブルに何件か適当にデータを入れておきます。

モデルに、他のモデルとの関係を記述していきます。
モデルとして読み込もうとしているBooksモデルの記述は必要ですが、そこからリンクされているAuthorsモデルやBooks_supplementationsモデルはとりあえず記述する必要はありません。

app/models/book.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
    
    class Book extends AppModel {
        
        //自分の名前
            var $name = 'Book';
        
        //books.author_idはauthors.idに外部キー
        //books.publisher_idはpublishers.idに外部キー
        //books.idはbooks_supplementations.book_idから外部キー
        //といった関係を記述しておくとfind等で自動的に結合する
            var $belongsTo = array(
                 'Author' =>array(
                    'className' => 'Author',
                    'foreignKey'=> 'author_id' 
                )
                ,'Publisher' =>array(
                    'className' => 'Publisher',
                    'foreignKey'=> 'publisher_id' 
                )
            );
            var $hasMany = array(
                 'Books_supplementation' =>
                    array(
                        'className' => 'Books_supplementation',
                        'foreignKey'=> 'book_id' 
                    )
            );
    }

記述がめんどくさいんですが、簡単に言うとhasは相手側テーブルから自分に対して外部キーが張ってある、belongsToは自分から相手側に外部キーが張ってあるということです。
Bookモデルの場合、authorsテーブルとpublishersテーブルに対して外部キーが張ってあり、books_supplementationsテーブルから外部キーを張られています。

その後コントローラ内で
$this->Book->find(array('Book.id <>'=>'2'));
などとすると、Bookモデル内の結合条件を勝手に読み取って勝手にJOINなんかを付け加えてSELECTしてきます。

結果のSQLはこんな感じに。
見事に表示できま…一件しか出てこない。

SELECT (略) FROM `books` AS `Book`
 LEFT JOIN `authors` AS `Author` ON (`Book`.`author_id` = `Author`.`id`)
 LEFT JOIN `publishers` AS `Publisher` ON (`Book`.`publisher_id` = `Publisher`.`id`)
  WHERE `Book`.`id` <> 2
   LIMIT 1


そのLIMIT 1は何処から出てきたんだ?

CakePHPの記事一覧


2009/10/30追記

findは結果セットを1件だけ取得するメソッドで、全件取得したい場合はfindAllを使用します。
詳細は次の記事を参照。
コメントでの指摘ありがとうございます。


2009/10/05 20:01 | Comments(2) | TrackBack() | PHP
ZF-03:Zend_Db_Select

Zend_Db_SelectはSELECT文を作成するクラスです。
前回は自力でSQL文を書いていましたが、抽出するカラムや抽出条件などをSQLを直接書くこと無しに作成することができます。

zend_db2.php 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
    
    //Zend_Form
        require_once('Zend/Db.php');
        $form = new Zend_Db();
    
    //DBインスタンス
        $db=Zend_Db::factory(
             'Pdo_Mysql'
            ,array(
                 'host'=>'localhost'
                ,'username'=>'testuser'
                ,'password'=>'testpass'
                ,'dbname'=>'zend_test'
                ,'profiler'=>true
            )
        );
        $db->getProfiler()->setEnabled(true);
    
    //Zend_Db_Selectインスタンス取得
        $select=new Zend_Db_Select($db);
    
    // SELECT * FROM books
        $select->from('books');
    
    // LEFT JOIN author ON author.id=books.author_id
        $select->joinLeft('author','author.id=books.author_id');
    
    // WHERE books.id=1
        $select->where('books.id = ?',1);
    
    // ORDER BY books.id DESC
        $select->order('books.id DESC');
    
    // LIMIT 1
        $select->limit(1);
    
    /*
        メソッドチェーンも可能
        $select->from('books')
            ->joinLeft('author','author.id=books.author_id')
            ->where('books.id = ?',1)
            ->order('books.id DESC')
            ->limit(1);
    */
    
    //取得は何故かメソッドチェーンできない
        $query=$select->query();
        $books=$query->fetchAll();


このようにメソッドを繋げることで、最終的に
SELECT `books`.*, `author`.* FROM `books` LEFT JOIN `author` ON author.id=books.author_id WHERE (books.id = 1) ORDER BY `books`.`id` DESC LIMIT 1
というSQLが完成します。

またZend_Db_Selectはメソッドチェーンに対応しており、コメントアウトしてあるようなかんじで一気にメソッドを組み立てることもできます。
まあここらへんは好きな方で書けばいいでしょう。

ただ、fromやjoinなんかはほいほいメソッドチェーン繋げられるのに、何故か結果の取得だけはメソッドチェーンできません。
$Zend_Db_Select->query->fetchOne()
なんてことができず、一旦queryを発行してZend_Db_Statementオブジェクトを受け取った後fetchしなければなりません。
残念。

今回は固定クエリなのであまりメリットが見えませんが、検索条件が変動する場合などに威力を発揮します。
SQLをわざわざ組み立てる必要がなく、whereメソッドを追加したりしなかったりするだけでいいので作成が楽です。

 



2009/10/02 22:24 | Comments(0) | TrackBack() | PHP
XAMPPのmy.cnfが無くなった?

XAMPP1.7.1を入れたのですが、デフォルト状態だといつものように文字化けが発生します。

"MYSQL 文字化け"でググるとmy.cnfが腐るほど出てくるわけですが、今回文字化けを直そうとmy.cnfを探すも何処にも見あたらない。
いつのまにか設定ファイルがC:\xampp\mysql\bin\my.iniになってました。
いつから変更になったのかよくわかりませんが、とりあえずこれでWindows環境でmy.cnfが見つからないという質問は無くなりそうですね。
まあmy.cnf自体が無くなってるのでやっぱり質問が増えるかもしれませんが。

ちなみに正しい設定ファイル置き場はコマンドプロンプトから
C:\xampp\mysql\bin>mysql -?
で見ることができます。

C:\WINDOWS\my.ini C:\WINDOWS\my.cnf C:\my.ini C:\my.cnf C:\xampp\mysql\my.ini C:\xampp\mysql\my.cnf
というふうになっていました。
前にあるのを優先して読むようなので、うっかり変なファイルがあったら動きがおかしくなったりします。

というわけでmy.iniを編集してみました。
とりあえず[mysqld]セクションに下記追加して文字化け解消。
character-set-server = utf8
collation-server = utf8_general_ci
init-connect=SET NAMES utf8


……と思ったが微妙にうまくいかない。
せっかく設定したcharacter-set-serverがMySQLを再起動するたびに効いたり効かなかったりするんだがなんだこれ。


さて、現在起動しているサービスから起動しているmysqlの状態を確認することができます。
C:\xampp\mysql\bin\mysqld.exe --defaults-file=c:\xampp\mysql\bin\my.cnf mysql

my.cnfなんて無いよ!
なんだよこの起動オプション。

インストール時にいつの間にやらこんな起動オプションが設定されてしまっていたみたいです。
これではせっかくのmy.iniが読み込まれてくれません。
仕方ないのでmy.iniをmy.cnfにコピペしたらあっさり文字化けが直った。

どうしてこうなった?



2009/09/30 20:25 | Comments(2) | TrackBack() | PHP
CakePHP-02:CakePHP再挑戦続き

前回の続き。

app/models/cake_sample.phpを作成します。
中身はとりあえずダミーのCakeSampleモデルを作成しておきます。

models/cake_sample.php

1
2
3
4
5
6
<?php
    
    class CakeSample extends AppModel {
        //自分の名前?
        var $name = 'CakeSample';
    }

その後CakeSampleControllerコントローラ内で$this->CakeSampleって指定すると勝手にCakeSampleクラスがインクルードされて使用されます。
CakeSampleモデルの親クラスAppModelに最初からある程度メソッドが揃っているので、これを使用してDBの中のcake_samplesテーブルが読めるようになるみたいです。

次にコントローラにモデルを読み出す処理を記入。

controllers/cake_sample_controller.php
1
2
3
4
5
6
7
8
9
10
<?php
    
    class CakeSampleController extends AppController{
        
            public function TestAction() {
                //CakeSampleモデルから中身を全部取得
                 $this->set('cake_sample', $this->CakeSample->find('all'));
            }
 
    }

setした変数そのものはビューからその名前で呼び出せます。

views/cake_sample/test_action.ctp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    
    print('<table>');
    foreach($cake_sample as $key=>$val){
        print('<tr><td>');
        print($val['CakeSample']['id']);
        print('</td><td>');
        print($val['CakeSample']['title']);
        print('</td><td>');
        print($val['CakeSample']['body']);
        print('</td><td>');
        print($val['CakeSample']['created']);
        print('</td></tr>');
    }
    print('</table>');

たったこれだけでデータベースの内容が表示できました。

とりあえずどのファイルがどうやって読み込まれるかとか何処に何のインスタンスが出来るかとかが全然分かってないので非常に気持ち悪い。
 
CakePHPの記事一覧


2009/09/28 20:23 | Comments(0) | TrackBack() | PHP
書評:「PHPサイバーテロの技法―攻撃と防御の実際」の問題点



何故か今更購入。
本書は具体的な実装コード、攻撃コードなどがきちんと書かれており、PHPのセキュリティを学習する上で非常に参考になる良書です。
2005年発行なので一部の新しい攻撃には対応していないこともありますが、基本的な考え方は今でも十分通じるものです。

ただ大きな問題点が一つ。
本書ではSQLインジェクション対策のエスケープが一貫してaddslashes()で行われています。
それも無知によるものではなく、データベース独自の関数について言及した上で、

>MySQL・PostgreSQL・SQLite等、文字列のクオーティングについての方言がきつくないデータベースエンジンを利用するのであれば、addslashes()を使うのがベストだと筆者は考えます。

と明言しています。

結論から言うとやっぱりaddslashes()は駄目です。
そもそもSQLiteのエスケープは'なのでこの時点で明白な間違いですが、それ以外にも実際にセキュリティ上の問題が発生する可能性があります。
ここらへんを参考に(というか剽窃レベル)実証コードを書いてみます。

addslashes.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

    //リクエスト代わり
        $_REQUEST['id']="\x95' OR 1=1 #";

    //addslashesします
        $hoge=addslashes($_REQUEST['id']);

    //MySQL
        $db=mysql_connect('localhost','testuser','testpass');
        mysql_select_db('test',$db);

    //SJISのときに問題が起こる
        mysql_set_charset('SJIS',$db);

    //SQL実行
        $sql =" SELECT * FROM test ";
        $sql.=" WHERE ";
        $sql.=" name= '".$hoge."'";
        $ret=mysql_query($sql,$db);
        $data=mysql_fetch_assoc($ret);


まずリクエストに
"\x95' OR 1=1 #"
というよくわからない文字列を与えます。

その文字列をaddslashes()すると、シングルクオーテーションがエスケープされます。
"\x95\' OR 1=1 #"

ところでSJISにおいて\の文字コードは"\x5c"です。
また"\x95\x5c"という文字コードには「表」が割り当てられています。
そこでaddslashes()されたリクエスト文字列は以下のように誤読されてしまいます。
"表' OR 1=1 #"

完成されたSQLは以下のようになります。
SELECT * FROM test  WHERE  name= '表' OR 1=1 #'

SQLインジェクションにあっさり成功しました。
上記はSJISでしか起こらない問題ではあるのですが、そのような穴になりそうな部分をわざわざ残しておく必要もありません。
DB固有のエスケープ関数を使用すべきです。

更に言うと、mysql_set_charset()を使用せず
"SET NAMES SJIS"
を使用した場合、mysql_real_escape_string()を使用したときでさえもSQLインジェクションが起こることがありますがそれはまた別の問題。

ちなみに一番正しいのはO/Rマッパかプリペアドステートメントを使用することです。


ところで本書の同じ場所に、
>magic_quotes_gpc設定との相性が良い
と書いてあるのですがこれはどういう意味なんだろう?
 



2009/09/26 20:18 | Comments(0) | TrackBack() | レビュー
CakePHP-01:CakePHP再挑戦

CakePHP1.2.4.8284
前触ったときはどうにか動く程度になったところでわからずに止めてしまったので再挑戦。

まずはダウンロードして解凍。
RewriteEngineを使用しているのでmod_rewriteを有効にする。
適当なフォルダに丸ごとアップ。
で、フォルダを覗いてみるといきなり動作しています。

個別の設定をしていないのでデフォルト状態であり、DBも設定していないので書き込みなどは行えません。
色々注意が現れます。

Notice (1024): Please change the value of 'Security.salt'
Your database configuration file is NOT present


まずSecurity.saltの設定。
ユーザパスワードをDBに保存するときは当然暗号化を行いますが、その暗号化に利用する値です。
デフォルトだと解読されてしまう可能性があるので適当に変えてしまいます。
app/config/core.phpの150行目あたり、
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
を適当な値に変更しましょう。
うっかり運用開始後に変更してしまうと認証できなくなるので注意です。

次にDBの設定。
app/config/database.php.defaultをdatabase.phpにコピー、DATABASE_CONFIGクラスの各値を適切にセットします。
persistentは持続的接続を使用するかどうか、わからなければfalseのままにしておきます。

あとapp/tmp/フォルダをPHPから読み書き可能にする設定も必要ですが、まあWindowsでは関係ないです。
画面から黄色や赤色が無くなれば設定は終了。次に進みます。


CakePHP最大の欠点として、命名規則がややこしいということがあります。
モデル名をCakeSampleとしたら、コントローラ名はCakeSamplesControllerとしなければならないしDBテーブル名はcake_samplesとしなければなりません。
なんでわざわざ複数形とかキャメルケースとか混乱させるんだ。
というわけでDB用のテーブルとしてcake_samplesを作成します。
 

CREATE TABLE `cake_samples` (
 `id` int(10) unsigned NOT NULL auto_increment,
 `title` varchar(50) default NULL,
 `body` text,
 `created` datetime default NULL,
 `modified` datetime default NULL,
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO cake_samples (title,body,created) VALUES ('タイトル', '本文', NOW());


idとcreatedとmodifiedはCakePHPが要求するので何はなくとも入れておきます。
適当に何件か登録しておきましょう。

次にコントローラを作成します。
コントローラは簡単に言うとURLによる処理の振り分けです。
正直、更新やら分岐やら何処に書けばいいのかよくわかんないんですよね。
まあ適当にやってみます。

まず
http://localhost/CakeSample/TestAction/a/b
にアクセスすると
Error: CakeSampleController could not be found.
みたいなエラーが表示されます。
ぶっちゃけ書いてあるとおりにすればいいだけなのですが、とりあえずファイルとコントローラを作ります。
/app/controllers/にcake_sample_controller.phpを作成、CakeSampleControllerという名前のクラスを作成します。
中身はとりあえず空っぽ。

またエラー。
Error: The action TestAction is not defined in controller CakeSampleController
TestActionを作れ、と言われます。

要するに上記URLのうち、
ルートから最初の部分(CakeSample)がコントローラ名として、その次の部分(TestAction)がアクション名として呼び出されることになります。
実際の中身としては
http://localhost/?url=CakeSample/TestAction/a/b
と同じで、mod_rewriteによって見た目を変更しているだけです。
このような作りはZendFrameworkやSymphonyといった多くのフレームワークで採用されており、URLがわかりやすく検索エンジンにも取得されやすいといった利点があります。

というわけでCakeSampleControllerにTestActionを作成します。
こちらも中身は空。

次はビューのエラー。
Error: The view for CakeSampleController::TestAction() was not found.
エラーメッセージに出てくるとおりに
/app/views/cake_sampke/test_action.ctp
にファイルを作成します。
中身はやはり空。

以上でとりあえずエラーが出なくなりました。
何も書いていないのに、CakePHPのデフォルトで用意されているテンプレートが表示されます。


ちなみにこの後1.2.5をインストールしてみたのですが、一番上に堂々と「Release Notes for CakePHP 1.2.4.8284.」の文字が。
真っ先に気付く場所だろそこ。

CakePHPの記事一覧



2009/09/25 18:51 | Comments(0) | TrackBack() | PHP
OpenPear-03:Acme_IdolMaster

http://openpear.org/package/Acme_IdolMaster

どうにかした


http://openpear.org/package/Acme_MorningMusume
を参考にやってみようと思ったら、privateをextendsしてるせいで同じプロパティが階層別にできてて、そのせいでBASEに__getを書いても値が取得できなくて超困ったので勝手にprotectedにした。
こういうときの作法がどっかにあるのかもしれないけど全然知らないので超俺俺実装。
ということでとりあえず動くようになりました。
もし文法とか駄目だったら誰かが直してくれるでしょう。きっと。

使用はこんな感じ。
ちょっとだけイテレータやメソッドチェーンも使えるようにしてみた。

Acme_IdolMaster.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
    
    //インスタンス作成
        require_once('Acme/IdolMaster.php');
        $imas=new Acme_IdolMaster();
    
    //全メンバーをループ
        foreach($imas as $key=>$val){
            $member_name[]=$val->family_name_ja;
        }
    
    //りっちゃんを取得
        $ricchan=$imas->get('AkizukiRitsuko');
        $ricchan=$imas->AkizukiRitsuko;
        $ricchan=$imas->AkizukiRitsuko();
    
    //りっちゃんのパラメータを取得
        $name[]=$imas->AkizukiRitsuko->get('family_name_ja');
        $name[]=$imas->AkizukiRitsuko->family_name_ja;
        $name[]=$ricchan->family_name_ja();
        
    //りっちゃんのパラメータを変更
        $imas->AkizukiRitsuko->family_name_ja('名前1');
        $ricchan->family_name_ja='名前2';
        $ricchan->set('family_name_ja','名前3');
    
    //りっちゃんを指定
        $imas->select('AkizukiRitsuko');
        $name[]=$imas->get('family_name_ja');
        $name[]=$imas->family_name_ja;
        $name[]=$imas->family_name_ja();
        $imas->set('family_name_ja','名前4');
        $imas->family_name_ja='名前5';
        $imas->family_name_ja('名前6');
    
    //指定解除
        $imas->select();


色々な書き方をしていますが全部同じです。
使用するときは使用法を揃えておいた方がいいと思いますが。
まあ使用するときなんて存在するのかという疑問がありますが気にしない。


んでまあ、作ったのはいいんだが管理者ではないのでリリース権限がないみたい。
使いたい場合はリポジトリから拾ってきてください。


次はAcme_Loveplusでも作ってみようか。
…ていうか、この手のシリーズ中身は同じなんだから纏められたりしないもんかね。

 



2009/09/18 16:17 | Comments(0) | TrackBack() | PHP
作るのめんどい

OpenPear-01:Acme_IdolMaster
で、

>野望だったらもうちょっとどうにかしろよ!

と書いたところ、Openpear中の人から

>あれま 「誰でもコミットできる」と言っている.気になったら「どうにかしろ」じゃなくて自分でどうにかできる.ブログに文句を書く前にコミットをどうぞ.


と言われた。

なんで私がそんなことしなきゃならんのだ?

http://openpear.org/package/Acme_MorningMusume 

>phpcon 2008 での takesako さんの一言から openpear への野望は始まった訳です。


と言ってるんだから、野望というほどのものであれば普通自分でどうにかするだろ、と思ったまでのこと。


ていうかそもそも、それ以前にモー娘。(←何故か変換できる)がよくわからないので触るに触れない。
一番最後の記憶がハッピーサマーウェディングだ。
ちなみに最初の記憶はLoveマシーンで二番目の記憶がハッピーサマーウェディング。



2009/09/15 23:45 | Comments(0) | TrackBack() | PHP

<<前のページ | HOME | 次のページ>>
忍者ブログ[PR]