symfony propel:buildでのinsertエラー

symfony1.4とmysql5.1の環境でsymfony propel:build-allをしたらエラーで引っかかった

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corres                                                 ponds to your MySQL server version for the right syntax to use near '

data/sql/lib.model.schema.sqlを見てみる

`delete` TINYINT(1) default NOT NULL,

defaultの値がない?


schema.ymlで

defaultValue: ''

としたところが一部クオートがなくなっているようだ

大丈夫なところもあるのに・・・


lib.model.schema.sqlを書き換えて終わり

PHPでmemchacheを使う

peclのチャンネルアップデート

$ sudo pecl channel-update pecl.php.net

memcached-develインストール

$ sudo yum install -y memcached-devel

memcacheライブラリインストール

$ sudo yum install php-pecl-memcache

memcache.soを有効か

$ sudo vim /etc/php.d/memcache.ini
extension=memcache.so

apacheを再起動

$ sudo /etc/rc.d/init.d/httpd restart

後はphp内でnew Memcacheして使っていく

【MySQLパフォーマンス実験1】ジョインしてソートする時は一旦IDにするとこんなに早い!

二つ以上のテーブルにまたがった検索条件などがあって、リレーションテーブルをジョインして
条件指定したりソートしたりすることは良くあると思う。

データ件数が多いとそのままジョインしたのではクソ重いので、IDだけ一旦取ってくるやり方をすると
各段にパフォーマンスが違うのでメモ。


前提
A〜Qの17項目のフィールドがあるテーブルαと
1〜5の5項目のフィールドがあるテーブルβとが有り
フィールドAは主キーとする

データ件数は
テーブルαが102,485件
テーブルβが514,455件


■方法1. テーブルαとテーブルβをジョイン&ソート後一回でデータを取得する

SELECT
フィールドA, フィールドB, フィールドC, フィールドD, フィールドE, フィールドF, フィールドG, フィールドH,
フィールドI, フィールドJ, フィールドK, フィールドL, フィールドM, フィールドN, フィールドO, フィールドP, フィールドQ
FROM テーブルα, テーブルβ
WHERE テーブルα.フィールドA = テーブルβ.フィールド2
ORDER BY テーブルβ.フィールド4;

結果取得にかかった時間は72.3212秒であった


■方法2. テーブルαとテーブルβをジョイン&ソート後、まずはプライマリーキーだけ取得して、個数分だけ単行セレクトする
① プライマリーキーだけ取得

SELECT
フィールドA
FROM テーブルα, テーブルβ
WHERE テーブルα.フィールドA = テーブルβ.フィールド2
ORDER BY テーブルβ.フィールド4;

② ①で取得したプライマリーキーの個数分単行セレクトする

SELECT
フィールドA, フィールドB, フィールドC, フィールドD, フィールドE, フィールドF, フィールドG, フィールドH,
フィールドI, フィールドJ, フィールドK, フィールドL, フィールドM, フィールドN, フィールドO, フィールドP, フィールドQ
FROM テーブルα
WHERE フィールドA = (?で取得したプライマリーキーx);

結果取得にかかった時間は0.9342秒であった


比較をわかりやすくするためにインデックス等は考慮しないようにしたが、
それでも相当な差がつくことはわかった。

ニコ厨向けTwitterクライアント『つぶやきの舞』ベータ版リリースしました

「コメントがないと落ち着かない・・・」


そんなあなた!

お待たせしました。
Twitterのつぶやきがニコニコ動画のようにデスクトップ上に流れるTwitterクライアント「つぶやきの舞」ができました!



え?そんなのお前だけだって?



うっ・・・



とりあえず同意してくれる方が居たら使ってみてください・・・

■ダウンロード
つぶやきの舞 ダウンロード


■インストール
ダウンロードしたairファイルをダブルクリックで自動で入ります。
FlashPlayerやAdobeAIRが入ってないと動かないので、入ってなくて動かない場合は入れましょう。

FlashPlayer ダウンロード

Adobe AIE ダウンロード

■使い方
1.最初にTwitterの認証画面とパスコード入力画面と出ます。
2.認証画面で許可ボタンを押します。
3.表示されたパスコードを認証画面に入力します。
4.つぶやきが流れます。
5.終了するときは右下のアイコンを右クリックで「終了」を選んでください。

■動作環境
FlashPlayerとAdobeAIRがインストールされたWindowsマシン
FlashPlayerやAdobeAIRが動けばMacLinuxでも動くかもしれません。
動作報告募集中!

■更新履歴
2012/09/03 var1.1 Twitterが重い時にフリーズするバグを修正
2012/08/31 var1.0 ベータリリース
 

CentOSでmemcachedを使ってみる

# リポジストリ追加
wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

# memchacheインストール
yum -y --enablerepo=rpmforge install memcached

# 起動設定
/sbin/chkconfig memcached --list
/sbin/chkconfig memcached on
/sbin/chkconfig memcached --list

# memchachedスタート
/etc/init.d/memcached start

# memcachedサーバに接続
telnet localhost 11211

# データ登録
set foo 0 0 4
test

# キー一覧
stats items
STAT items:1:number 1
STAT items:1:age 1958
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
END

# データの確認
stats cachedump 1 10
ITEM foo [4 b; 1346143663 s]
END


※2012/10/16 追記
最新のCentOS6.3だとリポジストリを追加せずともそのままyum installできた

symfony1.2でsqliteを使う際のconfig周りの設定

SQLITE用の設定方法
若干詰まったのでメモ


sqliteのdbファイルはdataディレクトリに置く

database.yml

all:
  propel:
    class:        sfPropelDatabase
    param:
      phptype:  sqlite
      database: %SF_DATA_DIR%/hogehoge.db
      encoding: utf8
      dsn:      sqlite:///home/hogehoge/symfony/data/hogehoge.db

propel.ini

propel.targetPackage       = lib.model
propel.packageObjectModel  = true
propel.project             = symfony
propel.database            = sqlite
propel.database.driver     = sqlite
propel.database.createUrl  = sqlite:///home/hogehoge/symfony/data/hogehoge.db
propel.database.url        = sqlite:///home/hogehoge/symfony/data/hogehoge.db
propel.database.creole.url = ${propel.database.url}
propel.database.encoding   = utf8


database.ymlでdatabaseにdbファイルのパス設定してるから大丈夫だと思ったけどdsnの設定も必要なのね

参考
http://forum.symfony-project.org/viewtopic.php?t=25131&p=92519
http://symfony-jp.blogspot.jp/2007/12/symfonymysqloraclesql-server.html


symfonyって中大規模向けな感じだからsqliteと合わせて使う人って少ないのかなあ