Hatena::ブログ(Diary)

kunitの日記 このページをアンテナに追加 RSSフィード

2013/05/21 (火)

[][] CakePHP 2.3.5 のメール送信で文字化けをしたら 13:20  CakePHP 2.3.5 のメール送信で文字化けをしたらを含むブックマーク

CakePHP 2.3.5 のCakeEmailはバグっていて、ISO-2022-JPの特定の文字が入っているメールを送信しようとすると文字化け(というか、特定の文字列以降、その行がざっくりなくなる)します。

既に修正パッチを pull-request して、とりこまれているので、2.3.6 以降では治っていることになると思うんですが、取り急ぎ治したい人は以下のファイルを修正してください。

  • lib/Cake/Network/Email/CakeEmail.php の 1257 行目付近

修正前

        foreach ($lines as $line) {
            if (empty($line)) {
                $formatted[] = '';
                continue;
             } 
             if (!preg_match('/\<[a-z]/i', $line)) {

修正後

        foreach ($lines as $line) {
            if (empty($line)) {
                $formatted[] = '';
                continue;
            }
            if (strlen($line) < $wrapLength) {
                $formatted[] = $line;
                continue;
            } 
            if (!preg_match('/<[a-z]+.*>/i', $line)) {

修正ポイントは・・・

  • ISO-2022-JPの「受」のような特定の文字には「<u」のような文字パターンが含まれるため、「/\<[a-z]/i」という正規表現でそれを拾ってしまっていた</li>
  • このメソッドは第2引数の $wrapLength より長い場合に、その行に対してwrap処理をするためのものだから、$wrapLengthより短いならその行は処理しなくていいはず
  • そもそも「<」にエスケープいらなくね?

そもそも、wordwrap関数をかけてみたり、文字列を $line[$i] というように何バイト目?いうやり方でとってきたりと、マルチバイトで大丈夫か?という処理が行われているので、基本的にメールで送信する1行は 998 バイト以上にしないようにしといたほうがいいです。(998バイト以上になると、いろいろとヤバイ処理を通るので...)

今回はスルーした「その行にタグらしきものが入った場合」についても、おいおい処理内容をチェックして、マルチバイトでも大丈夫にしていこうかなと思っていたり、思ってなかったり...

トラックバック - http://d.hatena.ne.jp/kunit/20130521

2011/10/01 (土)

[][] 受け身ではなく手を動かすイベントの楽しさ 17:53  受け身ではなく手を動かすイベントの楽しさを含むブックマーク

もう10月ですねぇ。いよいよ開催が再来週と迫ってきた PHPMatsuri 2011の リレーブログです。

昨日の @tanakahisateru さんの PHPMatsuri 2010 からの1年を振り返って からバトンをうけて書きます。

このリレーブログ、今まで書かれている内容がかなり熱い内容なので、ぜひご一読を!

PHPMatsuriでできること

PHPMatsuriはセミナーや勉強会と違って参加者が手を動かすことを基本としたイベントです。セミナーや勉強会で自分の知らなかった情報を得るのも楽しいのですが、自分でそれを身につけるにはやはり自分で手を動かすことが一番だと思います。(PHPMatsuriではセミナー形式のセッションも並行で行われますが、それを聞くのも良し、聞かずにもくもくとコードを書き続けるもよし、それは参加するあなたの自由です)

また、普段の仕事では使っていないフレームワークやライブラリを使っていろいろ試すということをとことんできる場だと思います。ここ数年symfomy 1.XやCakePHP 1.Xを使って仕事をしてきた人(自分もそうですが)にとって、Symfony 2やSilex、CakePHP 2.XやLithiumといったこれから主力となりそうなフレームワークでいろいろ試す絶好の機会です。

そして、PHPMatsuriではこれらのフレームワークの開発者が来日→参加するので、ちょっとした疑問でもばんばん聞けてしまうというまたとないチャンスとなります。日本にいながらにしてそれぞれのフレームワークの哲学を開発者本人から聞けてしまうというのは本当にすばらしいことだと思います。

昨年のPHPMatsuri 2010では結構夜遅くまで開発者の方々がメインの部屋に残られていたので、ちょっと勇気をだせばいくらでもお話が聞けると思いますよ。

PHPMatsuriの雰囲気

自分は昨年のPHPMatsuriからの参加で、しかも午前中に別の用事があったため、午後からの参加となったのですが、会場に着いたときになんとも言えない雰囲気にびっくりした覚えがあります。全員がノートパソコンを開いて周りと時には会話をしながらそれぞれがコードを書いている姿は今でも忘れられません。

その中に一度飛び込んでしまえば好きなだけコードを書いていられるというか、それぞれ別のことをしてるはずなのに独特の一体感があってコードを書く人にはたまらない雰囲気だと思います。

結局昨年は部屋にはもどらずずっとメインとなった会場で朝までコードを書いていたのですが、もっと時間があればなぁと思うくらいの充実感でした。

関西で行われる意義

個人的には今回のイベントでうれしいと思うところ。関西出身者としては関西でのイベントが少しでもふえてほしいなぁと思っていて、こういうイベントが関西で行われるってのは本当にうれしい。

PHPMatsuriのように超大物をゲストに呼んでとかになるとスタッフの皆さんが大変ご苦労されていると思うのですが、みんなが集まって一晩中コードを書こうぜ!ということなら場所さえあればできちゃうわけで、是非ともいろんなところで開催されてほしいですね。

来年はまた違う場所で行われるといいですよね。

手を動かしたら発表しよう

PHPMatsuriのいいところは、手を動かした結果をみんなの前で発表する場があるってこと。自分が作ったモノなんてたいしたことないなんて思わずに、ひとまず発表してみるってのがいいと思います。自分が普段当たり前だと思っていることが意外と周りの人からすると当たり前でないことが多いわけで、周りの人も何より自分自身でなにか発見するモノがあると思います。

まずは参加してみよう

だらだらと書きましたが、こんな楽しそうなイベント、チケットを購入すればいつでも潜り込むことができますよ。興味を持った方は是非チケットを購入して参加してみてください。

次は @k1Low さんがいらっしゃる Fusic さんのブログにつなぎます。よろしくお願いします。

トラックバック - http://d.hatena.ne.jp/kunit/20111001

2011/04/10 (日)

[][] Yammer for ガラケー ソース公開 22:07  Yammer for ガラケー ソース公開を含むブックマーク

Twitterでちょこちょこツイートしていたんだけど、震災以後作っていたYammerにガラケーからアクセスするためのゲートウェイとなるアプリケーションのソースをgithubで公開しました。

github - Yammer for Keitai

#いろいろソースを整理したりするつもりだったけど、大江戸Ruby会議から帰ってきて爆睡をしてしまったので、もうそのままでいいやってことでpushしてます...

CakePHPでささっとつくったもので、YammerのAPIをたたいているだけで、そんなにたいしたことはやってないです。

まぁ、今までガラケーでアクセスできなかったYammerがそれなりにつかえるようになるので、自分たち的には便利に使い始めてます。

で、この公開したソースを使ってどのようにサイトを構築するかの手順ですが、さらっと書こうと思ったらなにげにいろいろやらないといけないので、きちんとまとめてあとで書きます。すみません...

[][] Yammer for ガラケー でなにをやってるか? 22:32  Yammer for ガラケー でなにをやってるか?を含むブックマーク

構築手順の説明の前にこのアプリでなにをやっているかを書いときます。

YammerのAPIをたたくためにOAuthを使って権限を取得しないといけないんですが、その取得の流れのURLがガラケーからは現状たたけないので、以下のような流れにしてます。

  1. ユーザにメールアドレスとパスワードをいれてもらう(このときのメールアドレスとパスワードはこの携帯サイトへのログインで使用するためのもので、Yammerのサイトで設定してあるものとまったく別物でかまわない)
  2. 入力してもらったメールアドレス宛にYammerのauthorizeのURLが入ったメールを送信する
  3. そのメールをPCでうけとってもらって、そこに入っているURLにPC側でアクセスして、アプリのアクセス許可をだす
  4. アクセス許可を出すと4桁のverifierが入手できるのでそれを携帯サイト側で入力する

1番目で入力したメールアドレスとパスワードでこのアプリにログインするとYammer APIを使用してメッセージを取得したりできるようになるので、なんかややこしい動きなのはこの権限を取得するところだけになります。

こんな流れになっているので、このアプリに保存される(デフォルトではSQLiteに保存してる)データはこのサイトにログインするためのメールアドレス/パスワードとOAuthで使用する各種キー/シークレットだけです。今のところメッセージやユーザ一覧等はその都度APIでとってきてるので、モバツイみたいにキャッシュして賢くなんやかんややってくれるとかはしてないです。(ユーザやグループの画像はそのまま使うとでかすぎるのでリサイズをする関係上キャッシュしてる形になってます)

アプリのセットアップをするためには携帯からWebアクセスできるだけではだめで、メールを送信して権限設定をするので、サーバからメールが送信できるように設定しておかないといけないです。(今のところそのサーバで外部からメールを受け取れるようにする必要はないです。将来的にはメールを使って画像付きメッセージ投稿とかできるようにするかもしれないので、そのときには必要になると思いますが)

[][] セットアップ手順(不親切版) 23:26  セットアップ手順(不親切版)を含むブックマーク

とりあえず試したいという人がいるかもしれないので、ある程度自力でいろいろできる人向けのセットアップ手順を書いときます。(もっと親切なものは後から書くかもしれない)

サーバを準備する

EC2やNiftyクラウド、さくらVPSとかでサーバを準備してください。注意事項としてはPHPのバージョンは5.2以上じゃないといけないです。

あと、一つ前のエントリで書いたようにメールが外部に送信できるようにしておいてください。

追記
ローカル環境にセットアップして、Firefox+Firemobilesimulatorとかで動作を試してみるってのがいいと思います。

ソースをgithubからとってくる

適当なディレクトリにソースをとってきてください。(例で使っているディレクトリはあくまで例です)

  cd /home/www
  git clone https://github.com/kunit/yammer.git
  cd yammer
  git submodule init
  git submodule update

YammerからOAuthのConsumer Key/Secretを取得して設定する

YammerのAPIをたたくために以下の手順でアプリケーションの登録を行って、Consumer Key/Secret を取得してください。

  • ガラケーでアクセスしたいネットワークのアカウントでYammerにログインする(※注意1)
  • http://developer.yammer.com/api/ にアクセスする
  • その画面の右上の Register Application のリンクをクリック
  • アプリケーションの情報を入力する。Application名は「Mobile Yammer for xxx」の形式にしていると他のものとかぶらないでいいと思う。(※注意2)
  • 入力してsubmitすると Consumer Key/Secret が発行される

(※注意1) YammerのOAuthの権限はネットワーク毎に発行されます。そのためログインしないとアプリケーションの登録作業ができないです。

(※注意2) このアプリケーション登録情報は今のところ後から変更できないっぽいので適当につけると後で泣きをみます

上記の手順で登録した内容を設定ファイルを作成して記述します。

  cp app/config/yammer.php.default app/config/yammer.php

yammer.php で設定するのは以下の4つです。

Yammer.oauth_mail_from
権限設定メールを送信するときのFrom
Yammer.oauth_mail_subject
権限設定メールを送信するときのSubject
Yammer.oauth_key
取得したConsumer Key
Yammer.oauth_secret
取得したConsumer Secret

CakePHPのセキュリティーの基本設定をする

core.phpをコピーしてつくってください。

 cp app/config/core.php.default app/config/core.php

core.phpの以下の2つの値を変更してください。(これはCakePHPの通常のセットアップでやることと同じなので、なんのこっちゃと思った場合は適当にぐぐってください。すみません)

  • Security.salt
  • Security.cipherSeed

テーブルを作成する

以下のコマンドを実行してテーブルを作成してください。実行するとy/nで答えるものが2つ出ますが、それらはEnterを押してデフォルトの答えのままで大丈夫です。

  cake/console/cake schema create

書き込み権限の付与

app/tmp 以下はWebサーバから書き込みができるように権限を変更してください。

  chmod -R a+w app/tmp

Webの公開設定

app/webroot をDocument RootとなるようにWebサーバの設定をしてください。また、.htaccessで設定が上書きできるようにしてください(このあたりはCakePHPの設定と同じです)

ここまでやれば(たぶん)つかえるはず。

...と書いてみたんですが予想通りとてつもなく不親切だなぁ。ファイル展開したらすぐ使えますとかになればいいんだろうけど、いくつかは設定してもらわないといかんし。これでどれくらいの人ができるかってのを様子を見ながらセットアップ手順の簡略化は考えます。

トラックバック - http://d.hatena.ne.jp/kunit/20110410