2012/4/7 追記

どうやら私の考えが間違っていたようだ。

ケータイ向けサイトを見るとみんなしてセッションidをgetで引きずり回してた。。。

主な理由はもともとケータイサイト向けに作ってた人達だからだと思うが、
今までケータイ向けサイトに手を出さないできたのでちょっと驚いてる。

でもこれやらないとサファリで最初にアクセスしたときに、cookieに対するデフォルトの設定である
Cookieをブロック」→「知らないサイトや広告のみ」
にひっかかってセッションとか保存できないしなー((たぶん)。

もうちょっと調べてみよう。。。

railsの勉強会に行ってきた

phpをメインで使っているのだが、今後rubyに移行しようと思っており勉強会に行ってきた。

気になった部分について自分の感想とメモ。

railsについて

1.railsの歴史

railsは現在バージョンが3系でありメインバージョンがあがるたびにコードをかなり書き直しているらしい。

Merb(他のrubyフレームワーク)との合流などをしてきたそうだ。

2.railsの特徴

○ rubyを代表するフレームワーク フルスタック

× 遅い メモリ喰う バージョン間の互換がかなりない
(クックパッドの例があるのでユーザが満足するかは別問題)

3.関連サービス

Heroku railsホスティング環境

NewRelic 監視ツール コードの実行時間などまで監視可能 便利そう

4.アンチrails

shinatra 軽量フレームワーク

5.プラグイン

バージョン間の互換がなかったりするので、最初にプラグインを導入したものの後々結局書き換えなければならないということが往々にしてあるので、
何でもかんでもプラグインを入れればいいというわけではないかもとのこと。なるほど。

・コーディングについて

1.テスト

言語という切り口で見るとrubyはテストすることをとても推奨しているように感じる

(そもそもテストはやるもんだろという意見は置いておいて)

テスト/コード = 1 くらいにならないと運用できるとはいえないレベル

(sqliteを見習え!!ということだな!!)

・運用について

1.サーバ

「passenger」

apacheのように簡単に設定でき、楽。

再起動時にダウンタイムがある。(?)

違うこと書いてある記事もちらほら。環境の問題なんだろうなと思いつつ。

http://blog.livedoor.jp/kaznobster/archives/2011-01.html

Phusion Passengerが2.2から3.0で変わったところ - こしごぇ

unicorn

passengerに比べると設定が複雑だが、その分カスタマイズしやすい。

ダウンタイムなしに再起動できるらしい。

unicornでダウンタイムなしに再起動する - rochefort's blog

Unicornのダウンタイムなし再起動は考え無しに使うと危険 – ひげろぐ

色々と勉強になった。

phpmyadminでcsvファイルのインポートエラー

以前もこのテーマで躓いた記憶があるが、今日はそれを踏まえたうえで再発見があったのでメモしておく。

よくある方法?で

1.エクセルでインポートしたいデータを作成
2.csv形式で書き出し
3.書き出したcsvファイルをUTF-8(BOM無し)に変換
4.(一度エクセルで開いて文字化けするか確認、文字化けすればok)
5.phpmyadminで「インポート」からファイルを選択、オプションを以下のように設定

6.実行する

今まではこれで成功していたのだが今回は

CSV 入力のフィールド数が不正です (行: 1)

がでてしまった。

(どうでもいいが、純粋にフィールド数を間違っている人より文字コード等でこのエラーを見てる人のほうが多い気がする)

で、今回はgoogle docsからデータを持ってきていたのでその辺が怪しいのかなと思っていたら、ちょっと違っていた。

docsのデータはセル内で改行を行っており、これが原因だった。

csvを開くと所々ダブルクオーテーションで囲んである文字列があり、「なんか変だな」と思って全ての改行コードを消したらうまくインポートできた。

上図でフィールド囲み記号をなくしてるのに、ものによっては囲み記号があるのはおかしいもんね。

で問題はエクセルの改行コードの削除方法。

これはセル内で改行を行ってる部分に対して置換を行う。

検索対象のところは「Ctrl+j」を押す。

何も表示されないが、これで改行コードが入っているのでこのまま置換を実行するとちゃんと置換される。

で置換されたファイルを再度上に書いてある方法を用いてインポートするとうまくいく。

インポートも一筋縄ではいかないな〜。

gitのout of memory

ソース管理は以前の記事に書いたようにec2上にgitosisを入れてやっている。

最近とてもでかいsqlのダンプファイルをコミットしてたりしたのだが、今日git pullを実行したらout of memoryのエラーが出た。

もともとソース管理用のサーバがec2のmicro instanceで、jenkinsとかredmineとかも入れていたのでいつかインスタンスタイプ変えなきゃなーと思って放置していた。

で、いきなりこの状況になってあわてたのだが、ぐぐったら以下のサイトを見つけた。

アメリカで働くITエンジニアのブログ: git の Out of memory エラー

仕事に取り掛かる前であまり時間を割きたくなかったのでちょうどいいと思ってインスタンスタイプをsmallにした。

あとはサーバ上でgit gcをしてまた動くようになった。

.ssh/configのurlを変えたり、filezillaの設定を変えたりちょっとめんどくさかったがすんなり元に戻ったのでよしとする。

なんかほかにやりようがあったのだろうか?

nginxを入れてみる

今日はちょっと時間ができたのでnginxをサーバに入れてみた。

以下のサイトに書いてあることをまんまやっただけなんだけどね。。。

nginx php - nginx @ ウィキ - アットウィキ

上記サイトではspawn-fcgiを使っているのだけれど、いろいろ調べるとphp-fpmでやってる
というところもある。(というか下記のサイトの一番下にも書いてあるが、php-cgiプロセスがあればいいらしい)

どう違うの?というのは以下のサイトにとっても簡単に書いてある。

Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合] | レンタルサーバー・自宅サーバー設定・構築のヒント

で気になったのは「どっちが早いの?」ということ。

調べると以下が出てきた

http://vpsbible.com/php/php-benchmarking-phpfpm-fastcgi-spawnfcgi/

で、どうやらphp-fpmのほうが早いらしい。

separateとintegrateの違いはよくわからなかったが。。。
(特定のモジュールだけインストールするのがseparate?)

以下には各インストール方法などが載っている。

http://vpsbible.com/php/php-fastcgi-mysql-index/

そのうちseparatedでphp-fpmにしてみようと思う。

で、パフォーマンス比較は以下のサイトのを見てみた

NginxとApacheの比較:NginxはCGIスクリプトを普通では利用できない件 - ドラあり!*ドラゴンに挑むアリの物語 ** Python使いの日々

Nginx+Fastcgi+PHPでサクサク快適サイト構築! - アシアルブログ

同時接続数が増えたときの挙動が違うなー。

ソーシャルゲーム系のサーバにはかなり適してるんだろうなと思う。

もちっと調べて使ってみよう。

UTF-8のBOMにはまる

表題のとおりBOMにはまったので久しぶりに更新。

UTF-8のファイルを扱っているときに、ある自作ライブラリのメソッドを呼び出すとよくわからない文字が出て困っていた。
そのメソッドはAPIを使ってよそから情報を取得するものだった。

で調べてみるとそのよくわからない文字はどうやらBOM(バイトオーダーマーク)らしい。

で、「BOM PHP」とかってググると色々と対策が書いてあるので早速試してみた。

1.返り値にBOMを除去する関数をかぶせてみる

以下のサイトを参考にさせていただき、ここで紹介されている関数に通してみた。

cl.pocari.org - PHP で UTF-8 に付いている BOM を削除する方法

・・・が、だめ。

2.どこでBOMが出力されているのか調べる

頭の中はメソッドの返り値が悪さしてるもんだと思い込んでいたのだが、ここでようやく悪さしているところを探す気になる。

何ということでしょう、ライブラリ自体を読み込んだタイミングでBOMが出力されているではないですか!(翻訳風)

というわけで、ライブラリの文字コードをUTF-8Nにしてから再度実行したらうまくいきましたとさ。めでたしめでたし。

決済APIに対してHTTPステータス200ではなく302が返る

今とあるAPIを使って決済を実装しているのだが、決済部分で表題の問題が発生している。
(※私は結局解決できませんでした)

環境は PHP Codeigniter EC2 ELB(AWSのロードバランサ)

流れは以下のとおり

1.APIを使ってユーザをリダイレクトさせるURLを取得
 この際、決済確定通知用のURLと決済確定後遷移するURL(コールバックURL)を渡す

2.1で受け取ったURLにユーザをリダイレクト

3.ユーザは遷移先の画面で決済を確定もしくはキャンセルする

4.プラットフォーム側は決済確定通知用のURLに決済情報をGETに乗せて通知
 このレスポンスとしてHTTPステータス200のレスポンスを返す必要がある

5.4でHTTPステータス200を確認すると、プラットフォーム側はコールバックURLにユーザをリダイレクトする

で赤字になっている4の場面において、レスポンスが302になってしまう。

調べたところもっとも近い症状がcodeigniterのメーリスに乗っていた。

302 エラーで困ってます (Codeigniter-users) - CodeIgniter日本語化 - OSDN

で、もう症状が近いというかまったく一緒なんじゃないかと。

調査した点は以下のとおり

  1. ブラウザからアクセスすると200を返す
  2. htaccessを消しても効果なし
  3. リダイレクトをしているところもなし

とりあえず上記サイトに乗ってるところは調べたが特に問題なし。

普通にアクセスすると200を返すのに、プラットフォーム側からのアクセスだと
302を返すのがよくわからない。

うーむ。。。