Home > フレームワーク Archive

フレームワーク Archive

Yahoo! APIのURLがっ!

「みんなが小説家になるようです。」のあらすじジェネレートが動かなくなっていた。
いろいろ調べると、Yahoo! APIのURLが半年も前に変更されているではないか!
そんなん変えんなよな・・・。
というわけで、修正したら動くようになりました。

以上

google appengineではまったこと3 ~データストアとかモデルとか

夏休んでました。

google appengineはかゆいところに手が届かないなあと感じている今日この頃。例えばDBへのクエリで2つ以上のプロパティに不等号を使えない。


query = Hoge.gql("WHERE foo >= :a AND bar >= :b", a = 1, b = 1)

上はエラーが出る。インデックスが使えなくなるからだと。

あと、ModelにGeoPtPropertyってのがあるわけだけども、ソーティングが(つまり比較が)緯度→経度の順で行われるから矩形領域を検索したりできない。


locA = db.GeoPt(0, 0)
locB = db.GeoPt(10, 10)
query = Hoge.gql("WHERE geo >= :a AND geo <= :b", a = locA, b = locB)

ってやっても緯度が0以上10以下なら検索されちゃう。例えば(5, 150)とか。こういうことをしたいときにどうしたらいいのか、現在検討中。どうしたものか。緯度と経度に分けてプロパティ作っても、最初に書いたように2つ以上のプロパティで不等号使えないし。全部取ってきてから自前フィルタで処理するとかしたら、時間かかってタイムアウト制限に引っかかる気がするし。求む!解決策。

以上

第三回CakePHP勉強会に参加

細かい内容は発表資料とかがすでにアップされてるので、正直な感想を書く。ネガティブな感想を書く。その前にスタッフ側(発表者含む)の人たちには敬意を持っている旨を示しておく。

以下箇条書きで、全体を通して思ったことをスケールをあわせないで書く。
・初心者向け
 発表された内容はレベルが高いとはいえない。CakePHPを触ったことがない、あるいはフレームワークを使ったことがない人向けの話が多かった。よく言えば初心者向け。人数増えてくるとこういう感じになるのかな?勉強会なんだから、回を増すごとにレベルは上がっていくべきと思うんだけど・・・。
・自己暗示
 なんか、「CakePHPは簡単」とか「楽」とかみんないうんだけど、無理矢理テンションあげて言ってるんじゃないだろうか。私はCakePHPはそんなに簡単じゃないと思うし(導入は簡単だと思うけど)、そこまで便利だとも思わない。その辺をちゃんと議論した発表はなかった。失敗談はあったけども。なんとなく宗教じみてる気がした。
・よく分からない
 CakePHPはすごいと言いつつ、「よく分からない」とも言う人が多くておもしろかった。「よく分からない」というのはすごく共感できる。私もよく分からない。仕様も固まってないし、ドキュメントと実装がずれてるし、そもそも日本語のドキュメントがまだまだ少ないと思う。簡単なことは確かに簡単にできるけども、ちょっと手の込んだことをやろうとすると途端にどうしたらいいか分からなくなる。そういうのを助けてほしいんだけども。勉強会で。
・テストの話はよかった
 職業プログラマの人の話はためになる。ただし、個人で作ってるとテストなんてやってられないんだけど・・・。

次回参加するかは微妙だなあ。発表者の顔色を見て判断します。

以上

google appengineではまったこと2 ~全文検索

google appengineには全文検索がないらしい。
「googleなのに!そんな馬鹿な!自分で作るしかないのか!!」
と思ったんだけど、そんなのすでに作ってる人がいるんじゃないかと思い立ち、探してみたら・・・なんと隠し機能ですでに存在しているご様子!ドキュメント化されてないけど!
以下参考リンク
How-to: Full-text search in Google App Engine

というわけで、使い方としてはdb.Modelの代わりにsearch.SearchableModelを使って、検索対象はStringPropertyあるいはTextPropertyにしといたらいいと。検索するときはArticle.all().search(“検索単語”)とすると。db.Modelから切り替えるのはすごい簡単なので、ちょこっとやってみたら確かに検索できた。・・・英語は。英単語のみならば。おそらくスペース区切りでインデックス化してる。前方・部分文字列での検索は不可(リンク先には語幹でも無理と書いてある)。そういうわけで当然、日本語も不可、無理だった。いや、がんばればできるのかもしれないけど。フレーズ検索はできないらしいけど、普通にand検索くらいはできるっぽい。
例えばレコードに
“hoge foo bar”
って入ってるとき。


from google.appengine.ext import db
from google.appengine.ext import search

class Hoge(search.SearchableModel):
   content = db.TextProperty()

def Main(webapp.RequestHandler):
   def get(self):
      hoges_query = Hoge.all().search("hoge bar")
      hoges = hoges_query.fetch(10)

ってやればちゃんと”hoge foo bar”を検索してきてくれる。そういうわけでまあ、使える場面もあるんじゃないでしょうか。
でも日本語で使うためにはやっぱ自分で作るしかないのか・・・!!

追記:
と思ったら作ってる人いた。
http://d.hatena.ne.jp/matsuza/20080419/1208625514
でも形態素か~、Yahooか~。N-gramどっかにないかな。

以上

昔のコード

昔のコードってなんでこんなに意味不明なのか。昔って言っても半年ほど前なだけだけど。CakePHPで作った自動ログイン処理が意味不明すぎて理解するのに小一時間以上かかった。
この処理についてブログに書いてなかったけど、実装があまりに泥臭かったからかなぁ?でもまあ、うまく動いてるっぽいのでそのうち整理して書いてもいいな。もっと利口なやつが世の中にはあるはずと思うんだけど、パッと探しても怪しいものしかない気がした。

PHPのフレームワーク
ではまだCakePHPが優勢っぽいしな。
Quictyは「簡単、簡単!」って謳っている割にはインストールがめんどくさすぎる。

以上

CakePHPではまったこと21(DB初期化のテンプレート)

ひさびさにCakePHPをいじると、やっぱり疲れる。
簡単なところではsaveですでにはまる。
ループの中にsaveを入れると、最後のsaveしか実行されない。前にそんなことを書いた気がするけど書いてなかった。そういう時はcreateしとけば良いっぽいけど、なんか違う気もする。


foreach ($names as $name) {
	$data = array('User' => array());
	$data['User']['name'] = $name;
	
	$this->User->save($data);
	$this->User->create();
}

まあ、今回は新しくDBを作成(初期化)するときのテンプレートをメモっておく。

・MySQL(4.x?)の場合


DROP TABLE IF EXISTS users;
CREATE TABLE users (
	id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name CHAR(100) NOT NULL UNIQUE,
	password CHAR(100) NOT NULL,
	nickname CHAR(32),
	profile BLOB,
	confirm INTEGER DEFAULT 0,
	created CHAR(40) DEFAULT NULL,
	modified CHAR(40) DEFAULT NULL
);

テーブルがある場合は最初に削除してる。
idは自動でインクリメントされるように「AUTO_INCREMENT PRIMARY KEY」を指定、createdとmodifiedはCHAR(40)くらいにしとく。

・SQLite(2)の場合


DROP TABLE users;
CREATE TABLE users (
	id INTEGER PRIMARY KEY,
	name CHAR(100) NOT NULL UNIQUE,
	password CHAR(100) NOT NULL,
	nickname CHAR(32) NOT NULL,
	profile BLOB,
	confirm INTEGER DEFAULT 0,
	created DEFAULT NULL,
	modified DEFAULT NULL
);

DROP文にIFが使えない。これを実行したときにusersテーブルがないとエラーが出るけど、まあ気にしない。
idは自動でインクリメントされるように「INTEGER PRIMARY KEY」を指定、createdとmodifiedにCHARとか指定するとうまくいかなかったような・・・。まあ、SQLiteなんで型は適当でいいはず。

以上

CakePHPではまったこと20(サニタイズ)

おでこのめがねさえあれば毒餃子問題なんてすぐに解決するだろうに、NH○はいったい何をやっとるのか。

サニタイズっていうとデータをきれいにすることですか。
例えばJavascriptを書き込んだらそれがそのまま動いてしまうような掲示板は恐ろしいです。
そういうわけでタグをはずしたりしないとだめなんです。
でCakePHPにもそういうことをしてくれるSanitizeコンポーネントがあります。
use(‘sanitize’)を呼んどいて、あとはSanitize::clean($data)などのスタティックなメソッドを使えばいいです。
そしたらデータをきれいにしてくれる。
でも、自宅ではうまくいったんですが、サーバにアップロードしてみると文字化けした。ううーむ、よくわからん。

というわけで、WEBぷろぐらま~ システム開発エトセトラさんが紹介されている方法をほぼそのままで利用しています。
これは便利。感謝。

以上

CakePHPではまったこと19(デバッグアウト)

だいぶ軽い話。
データベースへの問い合わせログとかのデバッグ情報がajaxとかだと邪魔、っていう話を前にも書いた。
そんときはcore.phpの値を変えるか出力してるところをコメントアウトしてたけど、邪魔なときだけ消すにはコントローラで


Configure::write("debug", 0);

って書いておけばOK。つまり、


function hoge() {
    ・・・
    ・・・
    $this->set("foo", "bar");
    Configure::write("debug", 0);
}

以上

CakePHPではまったこと18(1.2のCookieコンポーネント)

Cookieコンポーネントめ。すごい便利なんですけどね。Sessionコンポーネントと似た感じで使えるし。


if (!$this->Cookie->read('TEST')) {
   $this->Cookie->write('TEST', 'TEST');
}

checkはないみたいなんですけどね。
で、writeの4番目の引数がexpireなんです。3番目は暗号化するかしないか。(デフォルトはtrue:暗号化する)
なもんで


define('COOKIE_EXPIRE', 60*60*24*5);   // 5日有効

$this->Cookie->write('TEST', 'TEST', true, time() + COOKIE_EXPIRE);

みたいにしてたんですわ。
でもぜんぜんクッキーが保存されない。しばらく悩んだ挙句、FirefoxでCookie見ればいいことに気づいた私。見てみたらクッキーあるけど有効期間がセッション中だけになっとる。
なんでこんなことになるんだーと思ってソース見たら、expireの引数に中でtime()足しとった!
うへぇ、と言うことで


$this->Cookie->write('TEST', 'TEST', true, COOKIE_EXPIRE);

で思惑通りになりましたとさ。
あと、標準のままだとクッキーの名前が”CakeCookie[TEST]”になっちゃうので、cake » libs » controller » componentsにあるcookie.phpの


var $name = 'CakeCookie';

を適当に変更しました。
ちなみにSessionで使われるクッキーもほっとくと”CakePHP”になっちゃうけど、これはapp » configのcore.phpに設定項目があります。

あと、CakePHPで作ったといえばこれ↓。
みんなが小説家になるようです。(α版)
なんという宣伝か。

以上

みんなが小説家になるようです。

すごい今さら感があるのですが、
みんなが小説家になるようです。(α版)
を作ってみました。
まあいわゆる↓のサイトにインスパイアされたとでも言うんでしょうが、すげえ遅まき。
「やる夫が小説家になるようです」(http://urasoku.blog106.fc2.com/blog-entry-244.html)

○特徴
1.「カードを使ったお話作り」を自動生成してくれる。
2.カードの意味がすぐ分かる。
3.各項目とかあらすじを保存できる。
4.あらすじのテンプレート(種)を自動生成してくれる。
5.類語辞典がついてる。
以下未実装だが実装予定
6.人名事典がついてる。
7.面白あらすじ投票ランキング(未実装)

とまあこんな感じ。
まだまだα版感たっぷりですが、・・・・
みんなで小説書こうぜ!

以上

Home > フレームワーク Archive

Search
Feeds
Meta
 合計:000240
 今日:0112 昨日:0128

Return to page top