てきとう

ワーワーゆうとります

herokuアプリに招待された場合

前提

  • herokuアプリに招待されたよ
  • virtualenvでローカルでチェックする


作業

  • herokuのmy appsページで招待されたアプリのgit repoを確認してgit cloneする
$ git clone git@heroku.com:XXXX.git -o nemui
  • virtualenvつくる
$ mkvirtualenv --distribute nemui
  • 既存のrequirements.txtを元に仮想環境を整える
(nemui)$ pip install -r requirements.txt


もうホントに眠い

doctrine:build-schemaでmysql.sockが見つからない

環境

  • mac OSX Lion
  • ローカル内で稼働


build-schemaに挑戦

$ php symfony doctrine:build-schema

そうしましたら

trying to connect via unix:///var/mysql/mysql.sock in xxx/Doctrine/Connection.php on line 470

との事でしたので/var/mysql/mysql.sockを確認しましたが、そもそも/var/mysqlすらない。
というわけでmysqlmysql.sockの場所を聞いてみた

> mysql status

お返事

UNIX socket: /opt/local/var/run/mysql5/mysqld.sock

という事なのでシンボリックリンク生成。

$ cd /var
$ sudo mkdir mysql
$ sudo ln -s /opt/local/var/run/mysql5/mysqld.sock mysql.sock

これで無事以下の処理が実行できまして

$ sudo php symfony doctrine:build-schema
$ sudo php symfony doctrine:build --model
$ sudo php symfony doctrine:build --sql
$ sudo php symfony doctrine:build --insert-sql

テーブルも作成され、モデルも作成されました。

DEBUG=Falseで見つかるエラーもあるよー

  • こんな現象が起きたので


前回の記事で「セレクト変更したらajaxでデータをひっぱってきて」っていう処理をやってたんですが
そいつらはdjangoで動いていまして。DEBUG=Trueで作業していた時はサクっといったのに
DEBUG=FalseにしたらInternal Server Errorが返ってくるようになってしまいました。
デバッグモードを切ると、余計なエラーが出ないように「サーバーエラーだよ!」って事にしてくれるんですね。

  • デバッグモードを切りつつ、エラーの内容を確認できたら、それはとっても素敵だなって


テンプレート側ではデバックさせたらいいじゃないか藤村君。という訳でsettings.pyのデバッグ定数を

DEBUG = False
TEMPLATE_DEBUG = True

という状態にして、テンプレートでのみエラーを確認できる状態に。
で、FireBugのコンソールで確認しながらajax処理してみたら、エラーを受け取っていました。
その受け取ったエラーに

DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in
position 0: ordinal not in range(128). You passed in
( 'django.forms.forms.BoundField'>)

おおう…。


自分が長い間phpというぬるま湯に浸かりすぎていたせいであって、基本的に他の言語では型指定とかキッチリするスタンスなのは分かっています。
でも今はpythonの方が好きだよ。名前がかっこいいし。

このエラーが出る時は大概pyファイルにおまじないが足りない時なんかに出るそうで、ファイルの頭に

# -*- coding:utf-8 -*-

って入れたら解決する事が多いらしいです。早速pyファイルを確認。入ってる。じゃあなぜ。

  • 原因は痛恨の凡ミス


そもそもformのBoundFieldの所で出ている。今回modelFormを使っているので、modelを確認してみよう。

class Gohan(models.Model):
    CHOICE_OKAZU = (
        ('0', _(u'たまご')),
        ('1', _(u'のり')),
        ('2', _(u'しゃけ')),
        ('3', _('納豆')),
        ('4', _(u'ハム')),
    )
    okazu = models.CharField(_(u"好きなおかず"), blank=False, max_length=1, choices=CHOICE_OKAZU)

あっ、「納豆」の所にunicode指定のアレがない!
という訳で原因はこいつでした。DEBUG=Trueだとよきに計らってくれるのに、Falseだとダメなんですねー。

IEとFFでreplaceWithの動きがアレだよー

selectを変更したらajaxで中身入れ替えるよ、というおなじみの処理。

  • ベースのhtmlはこんな感じ
<select id="manager-type">
<option value="hoge">名誉顧問</option>
<option value="moge">終身監督</option>
</select>

<div id="comment">ここに内容</div>
  • 普通に書いたら
$("#manager-type").change(function(){
    $.ajax({
	url: "http://urldesu.jp",
	cache: false,
	success: function(result){
		$("#comment").replaceWith(result);
	}
    });

こんな感じだと思うのですが、MacのFFで作業してたらサクサク動いていたのに、IEだと中身が全部帰ってこない…。

  • 結果
$("#manager-type").change(function(){
    $.ajax({
	url: "http://urldesu.jp",
	cache: false,
	success: function(result){
		if(jQuery.browser.mozila) {
			$("#comment").replaceWith(result);
		} else {
			$("#comment").empty().html(result);
		}
	}
    });

こうなりました。何がいけないのかねぇ。

PHP5.2と5.3を共存させるまでの道のり

前提

・CentOS5.3でApache2.3.3(たしか)
・元々PHP 5.2.13が入っている
・そこにPHP5.3.3もご一緒したい
・5.2はApache Handlerで、5.3はfastCGI
・バーチャルホストで動かしているmoge.com内は5.2で、hoge.comは5.3で動かしていこうと思う


やっていこう
なんかすごくエラーがたくさん出て困ったけど、なんとかインストールできた。やっぱり困ったらgoogle先生と相談して頑張るのが一番。
時にはしくじる事もある、ちょっぴり悲しい事もある、だけど、なんとかなる。
今回本当に好き…と思ったサイトは
Multiple PHP versions on one webserver
http://blog.dynom.nl/archives/Multiple-PHP-versions-on-one-webserver_20091103_53.html
FastCGI+Apache インストールメモ
http://www.softel.co.jp/blogs/tech/archives/2100
の2ヶ所でございます。本当にありがとうございました。
そうそうfastCGIのインストールもしたんだけど、そのへんは参考サイトさんが既に完璧だから書きません。


1. PHP5.3.3をインストール
最終的に使ったconfigureのオプションはこれ。cgiとして使う場合は「-with-apxs2」を入れないように気をつけましょう。
これ入れてconfigureするとphp-cgiができないみたいです。ハマりどころですな。

./configure \
--prefix=/php-5.3.3 \    //ここはPHP5.3を入れたい場所
--mandir=/php-5.3.3/share/man \    //このへんもよきに計らう
--infodir=/php-5.3.3/share/info \    //このへんもよきに計らう
--with-config-file-path=/php-5.3.3/etc/php5 \    //config fileのパス。多分後からphp.iniで直せる
--with-config-file-scan-dir=/php-5.3.3/var/db/php5 \    //config_file_scan_dirのパス。多分後からphp.iniで直せる
--enable-bcmath \
--enable-ctype \
--enable-dom \
--enable-filter \
--enable-hash \
--enable-json \
--enable-libxml \
--enable-mbstring \
--enable-pdo \
--enable-session \
--enable-simplexml \
--enable-tokenizer \
--enable-xml \
--enable-xmlreader \
--enable-xmlwriter \
--with-bz2=/usr/include \
--with-gd=/usr/include \
--with-mcrypt=/usr/include \
--with-mhash=/usr/include \
--with-mysql=/usr/bin/mysql \
--with-pcre-regex=/usr/local \
--with-readline=/usr/include \
--with-libxml-dir=/usr/include \
--with-zlib=/usr/local \
--with-ldap=/usr \
--with-iconv=/usr/local \ ※エラー出たから追加した
--with-freetype-dir=/usr/include/freetype2/freetype \
--with-pdo-mysql=/usr/bin/mysql ※ここも色々エラーが出た。mysqlの場所とかはwhichしたりfindしたりそれぞれ頑張るように
  • 途中出たエラー

・エラーその1「libiconvがない」
☆解決策…libiconvを入れてリンクパスを通す

# mkdir -p /usr/local/src/libiconv
# cd /usr/local/src/libiconv
# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.10.tar.gz  //貰ってくる場所やバージョンはお好みで
# wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.10-ja-1.patch.gz //色々あってパッチを当ててます
# tar xzf libiconv-1.10.tar.gz
# cd libiconv-1.10
# gzip -dc ../libiconv-1.10-ja-1.patch.gz | patch -p1
# ./configure
# make
# make install
# echo 'include /usr/local/lib/liconv.so' >> /etc/ld.so.conf
# /sbin/ldconfig

で、--with-iconv=/usr/localを追加した次第


・エラーその2 「/usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status」
☆解決策…lltdlがありませんよ、みたいに言われたが、そんなはずはないのでとりあえず探す。

# find / -name 'libltdl'

ってやって探して出てきた場所に移動し、とりあえずconfigureしてmakeしてみる

# cd /usr/share/libtool/libltdl
# ./configure --enable-ltdl-install
# make
# make install

いたけど入ってなかったって事?よくわからないけど無事入った。


2. PHP5.3.3が入ったら
色々とエラーを解消しつつ、無事PHP5.3.3が入ったら

Wrote PEAR system config file at: /php-5.3.3/etc/pear.conf
You may want to add: /php-5.3.3/lib/php to your php.ini include_path
/root/php-5.3.3/build/shtool install -c ext/phar/phar.phar /php-5.3.3/bin
ln -s -f /php-5.3.3/bin/phar.phar /php-5.3.3/bin/phar
Installing PDO headers:          /php-5.3.3/include/php/ext/pdo/

っていうメッセージが出てたのでメッセージに従う

  • php.iniに追加

php.iniのinclude_pathに/php-5.3.3/lib/php追加

include_path = ".:/php/includes:/php-5.3.3/lib/php"
# /root/php-5.3.3/build/shtool install -c ext/phar/phar.phar /php-5.3.3/bin
# ln -s -f /php-5.3.3/bin/phar.phar /php-5.3.3/bin/phar
FcgidInitialEnv PHPRC "/php-5.3.3/lib/"

を追加
そしてhoge.comのvirtualhost内にいくつか足す

<VirtualHost *:80>
    DocumentRoot "/var/www/hoge"
    ServerName hoge.com
    AddType text/html .php
    DirectoryIndex index.php index.html
    AddHandler fcgid-script .php      #ここと
    FcgidWrapper "/php-5.3.3/bin/php-cgi" .php #ここを足した
    <Directory "/var/www/hoge">
        Options -Indexes FollowSymLinks ExecCGI #CGIが実行できるようにしておく
        AllowOverride all
        Order allow,deny
        Allow from all
    </Directory>
</virtualHost>

を追記。5.2の方はAddHandlerしてるphpで動いているのでそのへんは何もしなくていいはず。そしたら

mod_fcgid: can't apply process slot for /php-5.3.3/bin/php-cgi

とエラーが。色々調べて

# chmod 755 /var/log/httpd/

ってやったら動いた


3. 追加した方のPHPpeclでライブラリとか入れていく

# /php-5.3.3/bin/pecl install imagick

って感じで、新しいPHPを追加した場所のpeclを使うのを忘れずにね!
普通に

# pecl install imagick

とかやっても元々入ってたPHPに入っていくばかりです。pearもね。
無事入ったら5.3の方のphp.ini内でextension=imagick.soを追加するよ。
場所がわからなかったらphpinfoで読み込んでいるphp.iniを確認しよう。
extension_dirとか大概のものが確認できる。便利だ。
php.iniの変更自体はできてるのに、追加したextensionだけはなぜかphpinfoで出てこないよっていう時は大抵入ってないよ
findで見つけたimagick.soをphp5.3のextension_dir内にコピーして読み込んで「動かねぇ!」とかやってたけど
よく考えたらpeclPHPごとにあるんだよねって事でインストールしたら動きましたよ。
入っているかどうかをコマンドラインからお手軽に確認したい時は

/php-5.3.3/bin/php -i |grep imagick

とかで確認してみようね。


【おまけ】 pcreが入ってるのに「Compilation failed: this version of PCRE is not compiled with PCRE_UTF8 support」
phpinfoで確認したらpcreはenabled。そうです入ってる事は入ってるんです。
でもPCREがUTF-8をサポートしてないよーっていうことで確認

# pcretest -C
PCRE version 8.20 2011-10-21
Compiled with
  No UTF-8 support
  No Unicode properties support
  No just-in-time compiler support
  Newline sequence is LF
  \R matches all Unicode newlines
  Internal link size = 2
  POSIX malloc threshold = 10
  Default match limit = 10000000
  Default recursion depth limit = 10000000
  Match recursion uses stack

UTF-8をサポートしていないですね。
という訳でpcre-8.20は手動で入れてあったので、再インストールします

# cd pcre-8.20
# ./configure --enable-utf8
# make
# make install

これでもう一度確認

]# pcretest -C
PCRE version 8.20 2011-10-21
Compiled with
  UTF-8 support
  No Unicode properties support
  No just-in-time compiler support
  Newline sequence is LF
  \R matches all Unicode newlines
  Internal link size = 2
  POSIX malloc threshold = 10
  Default match limit = 10000000
  Default recursion depth limit = 10000000
  Match recursion uses stack

入りました。pcreが動きましたね。ところでPCREって「Perl Compatible Regular Expressions」の略なんですけど
パっと見なんか「PreCuRE」って感じに見えるんですよね。不思議ですね。今週は黄瀬やよいさんのじゃんけんに勝ちました。

collationの罠だよー

という訳で罠にハマったわよ。ごきげんよう。


「は」「ぱ」「パ」「パ」などの全角・半角のゆらぎを気にせず検索したい
そんな時はテーブル・カラムにcollationを設定するか、SELECT時にcollationを設定するのはよく知られたお話ね。
「utf8_unicode_ci」は『大文字・小文字,濁点・半濁点』を区別しない
「utf8_bin」は『大文字・小文字,濁点・半濁点』を区別する(バイナリ)
そのへんについての詳細は、優しい人がまとめてくれているわ。
(mysqlのcollateを使って大文字-小文字や全角-半角を無視した検索 http://d.hatena.ne.jp/end0tknr/20100613/1276427626)

select title from node where title = 'ぱ' collate utf8_unicode_ci;
select title from node where title = 'は' collate utf8_unicode_ci;
select title from node where title = 'パ' collate utf8_unicode_ci;
select title from node where title = 'ハ' collate utf8_unicode_ci;
select title from node where title = 'パ' collate utf8_unicode_ci;
select title from node where title = 'ハ' collate utf8_unicode_ci;

これ全部「ぱ」でも「は」でも「パ」でも「ハ」でも「パ」でもセレクトできる訳だけど
(でも「ぱ」と「は」まで可能なのは吸収しすぎよね。そんなに気を使ってくれなくてもいいのに。)
一文字だけに検索する事ってなかなかない事態なのよね。で、みんな多分LIKE検索だと思うの。

select title from node where title like '%ぱ%' collate utf8_unicode_ci;
select title from node where title like '%は%' collate utf8_unicode_ci;
select title from node where title like '%パ%' collate utf8_unicode_ci;
select title from node where title like '%ハ%' collate utf8_unicode_ci;
select title from node where title like '%ハ%' collate utf8_unicode_ci;

と、ここまではパンツだろうがぱんつだろうがパンツだろうきゃりーぱみゅぱみゅだろうが拾ってくれるんだけど

select title from node where title like '%パ%' collate utf8_unicode_ci;

こうなるともーダメ。Empty setよ。だいたい半角で検索しようなんていうのがおかしいと思うんだけど、
そんな理屈が通用しないのが尋常ってやつなのよ。悲しいわね。御無体よね。


どうやらオフィシャルの説明によると(11.5.1. String Comparison Functions http://dev.mysql.com/doc/refman/5.1/en/string-comparison-functions.html

Per the SQL standard, LIKE performs matching on a per-character basis, thus it can produce results different from the = comparison operator:

「LIKEは一文字ごとの比較で、=での比較とは違うから、おんなじ動きをするとは限らないわよ」


ホーリーシットよ。どういう事よ。かなしきマルチバイト諸国よ。
今回はPHPmysqlでやってるから事前に検索値にプログラム側から半角カナを全角カナに変換して
mb_convert_kana('パンツ','KV');ってしておけばいいと思うけど、
これmysqlだけで処理しようとしたらどうすればいいのかしらね!
そんな訳で今日はここまで。今週末は最後の新年会があるのよ。いつまでも新年気分引きずってる場合じゃないから、一区切りつけてくるわ!ちゃお!

PHP5.3と古いCakePHPでDeprecatedが出まくって鬱陶しいよー

cake/libs/congifure.php

if (isset($config['debug'])) {
	if ($_this->debug) {
		error_reporting(E_ALL);
		// 以下を追加する	
		if (error_reporting() > 6143) {
			error_reporting(E_ALL & ~E_DEPRECATED);
		}

を足すといいよ、という検索結果が出てくるものの、やってもやってもうまくいかない
あとは、webrootの.htaccess

php_value error_reporting 22527

っていうのもあったけどやっぱりダメ
最終的に、webrootのindex.php

if (defined("E_DEPRECATED")) error_reporting(E_ALL ^ E_DEPRECATED);

を追加したら大丈夫でした。これ入れたらwebrootのhtaccessにerror_reportingは書かなくてもいいみたいです。