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すらない。
というわけでmysqlにmysql.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"
- shtoolインストールからのシンボリックリンク作成
# /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
- httpd.conf変更
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. 追加した方のPHPにpeclでライブラリとか入れていく
# /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内にコピーして読み込んで「動かねぇ!」とかやってたけど
よく考えたらpeclもPHPごとにあるんだよねって事でインストールしたら動きましたよ。
入っているかどうかをコマンドラインからお手軽に確認したい時は
/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は一文字ごとの比較で、=での比較とは違うから、おんなじ動きをするとは限らないわよ」
ホーリーシットよ。どういう事よ。かなしきマルチバイト諸国よ。
今回はPHPとmysqlでやってるから事前に検索値にプログラム側から半角カナを全角カナに変換して
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は書かなくてもいいみたいです。