ありがとう。また会おう。

ゆるいかんじで。かたのちからぬいて。やってます。

「これは罠。PHPでiPhone端末にPUSH通知を送る際の落とし穴」は(一部)罠

最近、今更ながら「数学ガール」にハマっていて、ゲーデル不完全性定理の自己言及っぽい釣りタイトルにしてみました(^_^;)
大学、大学院と数学やってましたけど、
もう数学勉強しなくなってずいぶんたつしキツイかなと思ったんですが
三つ子の魂百までというか、昔取った杵柄というか、読み始めれば以外とすっと入っていけました。
もちろんこの本の構成のうまさと物語の面白さもあると思うんですけどね。おすすめの本です。

という前置きはさておき。
業務でiOS のPUSH通知を扱うことになり、いろいろと調べてていきついた記事が

これは罠。PHPiPhone端末にPUSH通知を送る際の落とし穴 | 株式会社LIG
http://liginc.co.jp/programmer/archives/2355

これだったんですが。
1年以上前のエントリーなので、もしかしたら当時とは状況違うのかも、というところも前置きしつつ。
自分がさらに色々調べた感じ、このエントリーにある

1回の通信で全パケットが5000〜7000バイトを超えるとAPNSから切断される

については、どうやらそのような制限はないのでは、という結論に至りました。

実際、この記事についているブクマコメントやTwitterをみると、少数ながら懐疑的な意見もあった模様。
ただ、それ以上に記事を鵜呑みにして拡散しているものも多く、実際google検索でも上位にヒットするので
ちゃんと真偽を確かめたほうがいいのでは、と思い、この記事を書くに至りました。

で、詳しい数値は一般公開ブログなので記載は控えますが、
ここに書かれてる数字よりかはかなり長いバイト長のパケットを送っても、
現状APNSから切断されるという事象は確認していません。

ただ、じゃあ無制限にゴンゴン送れるのかというと、それもそうでもないようで
このエントリーにも記載されているPHP実装の有名なライブラリ「ApnsPHP」GitHubのIssueにこんな書き込みが。

ApnsPHP too fast for apns · Issue #2 · duccio/ApnsPHP · GitHub
https://github.com/duccio/ApnsPHP/issues/2

要約すると、
「あまりにも速く送りすぎるとどうもエラーになるんで、
1メッセージあたり50ミリ秒くらいインターバルおいたらうまくいくみたい」
というところ。
斜め読みならぬ斜め翻訳なので間違ってたらごめんなさい。。。

で、実際、ApnsPHPの実装も、2012年10月29日の修正で、デフォルトで1メッセージ送ったあとに10ミリ秒sleep入れるようになっていました。
また、上にあげたIssueのコメントに、Apple公式ドキュメントからの引用があり、そこでは
少なくとも秒間9000メッセージは送れるよ、とあります。
この数値から逆算すると、1メッセージあたり10〜50ミリ秒おいた方がいい、てのもそうなのかなという気がする数字。
計算上は約110マイクロ秒くらいでよさそうだが、多少余裕をみているのだろうと思います。

なお、元記事のフルスクラッチのコードでは、5000バイト送るごとに一旦コネクション閉じて再度開く、みたいなことをしていますが
この部分は、PUSH通知送る件数が多いと、パフォーマンスかなり悪くなる要因になると思います。
なので、現時点は、素直にApnsPHPに任せたほうがいいかと思います。

PHPカンファレンス2013行ってきました

どこかの社長さんが「IT勉強会は意味ない」的な事を言って、一時話題になりましたが
個人的にはこういう勉強会というかカンファレンスはいろいろ刺激があって
それだけでも十分に価値あるなぁと毎年思っています。
関係者の皆様、素晴らしい機会をありがとうございました。

で、詳細はきっといろんな人がいろいろ書いているでしょうから
個人的に気になったところだけ、メモ書きレベルですが書き残しておきます。

スライド資料はすでにアップされている方も多いので、タイトルでググればでてくるんじゃないかな(手抜きですまん)

基調講演 PHPの今とこれから2013

JSONライセンスの件、知らんかった。少し前の話みたいだが、現状影響あるのだろうか・・・
PHP5.6 来年6月ごろか。現時点で確定機能は演算子オーバーロードとGMP?

Zend OPcacheの速さの秘密を探ろう

すごくわかりやすかった。
op codeキャッシュの前に最適化フェーズがあるからAPCよりも原理的に早くなりやすいのね。
やってることはgccコンパイラがやる最適化に似てる、がそれらよりはあまり機能はないらしい。
PHP5.4以降でかつAPCのKVS機能使ってないなら、こっちの方がいいかも。

安全なPHPアプリケーションの作り方2013

毎年恒例徳丸さんの発表。
今年も期待を裏切らない素晴らしい内容でした。
HTML5XSS(DOM)は、少し前に別の人の記事で見たけど
文字列連結よりも、ちゃんと真面目にDOM操作関数使って、setAttribute()なりした方がいい。

個人的にはデモで使っていたツール(Burp Suite?だったかな)が気になった。
あと、Windowsでもmacみたいにズームアップするやつ。あれも前調べた気がしたんだが、何だったか忘れた。
また後で調べておこう。

MySQL Adminが見たDevsの常識、DBAは非常識

発表を聞いていると、まだまだDevsとDBAの間の(知識的な)溝は大きそうだなぁ・・・と思いつつ。
いるいる、こういう無茶言うやつ、みたいなね。

で、発表の中で自分もちゃんと理解できてなかった部分。

EXPLAIN文は基本的には実際のSQL(後続のSQL)は実行しないが、相関サブクエリの場合は内部のSQLは実際に実行する
→EXPLAIN文が帰ってこないのはだいたいこのパターン
(昔やらかしたことあるわ、これ・・・)

クエリキャッシュはマルチコアCPUの場合並列性が悪いので使わない方がいい。Ver5.6からはデフォルトオフになった
→これは別の理由でオフのほうがいいというのは聞いたことがあったが、今後はもうオフが望ましいということなのだろう。

Vagrantで作るPHP開発環境 [実践編]

今まさにVagrant使い始めたので、とても勉強になった。電子書籍も今度買おう。
Vagrantfileはシェルで書いてもいいのね。Chef-soloといきなりまぜて使って、おいらもいろいろハマったわ^^;

.vagrant ファイルは .gitignoreに登録するのを忘れずに。

syncd_folder、そうこの機能、最初とりあえず入れた時にすごく便利で感動した。
以前VirtualBoxとかVirtualPCとか使ったことあるけど、
同じPCの中にあるのに、FTP/SFTPでファイルアップとかなんか腑に落ちない感じがしてた。
この仕組みが一番素晴らしいんじゃないかと思う。

フレームワークアップデート

LaravelとPhalconは知らなかった。
Phalconはすごい気になる。PECL拡張実装ならそりゃ早いわな。今度試してみよう。

LT

PHP5.5以上必須のフレームワークCOSMOSってのがあるらしい。こちらも気になる。

退職(転職)します

2013年8月末をもって、2年5ヶ月ほど勤めた会社を退職します。

最終出社はすでに少し前に済ませ、若干有休消化をしていました。

 

こういうエントリー書くなら、社名書くべきかな?とも思ったのですが

(特にまずいこと書くつもりも毛頭無いですが)

個人的なポリシーで、社名は伏せておきます。

あんた誰? 

2000年からIT系エンジニアとして働いています。

2004年からはWeb系開発、特にPHPを8割くらいかな、扱っていました。

なので、PHPはもう10年もお付き合いしてるんですねぇ…

 

エンターテインメント系、特に現職ではソーシャルゲーム開発を生業としていました。

 

回顧

思えばこの会社に入社したのが、2011年4月1日だったのですが

当時その数ヶ月前から転職活動をしていて、

いくつかの会社から内定をいただき、

この会社にお世話になろう!と決めて、お返事をしたのが、3月9日のことでした。

そして、人事担当の方からそれに対しての返信がきたのが3月11日の午前中でした。

その数時間後、あの大地震が発生しました。

 

当時は皆様もまだ記憶に新しいと思いますが

いろいろ混乱の最中にあって

特に就職戦線では、震災を理由に内定取り消しされた学生が結構いて

自分のわりと身近にも実際にいたんですね。

で、自分もこのような状況であったので、内定取り消しの可能性もあるのではないかと

とても冷や冷やしていたのをよく覚えています。

幸い自分は予定通り入社させていただくことになりました。

 

入社後はソーシャルゲーム運用・開発に携わりました。

自分の職歴の中でソーシャルゲームに関わるのは初めてだったので

(実はその前の職場で開発していたことはあったのですが、

諸事情で開発中止になったので、実運用は初めてでした)

開発のスピード感や、現場の熱に圧倒されて

ついていけるか最初の頃は不安だったものでした。

 

この2年強で、プラットフォームはガラケーからスマホ(Web)、

さらにネイティブへとシフトしていく時代の中で

この仕事に携われたこと、

大変なこともたくさんありましたが、振り返るといろいろ学んだことも多く

このような機会に恵まれたことに本当に感謝しております。

 

これから

9月からは渋谷の某社にてエンジニアとして働きます。

新しい環境に飛び込むということで緊張ももちろんありますが

2年5ヶ月ぶり、4度目の転職は楽しみでもあります。

 

渋谷自体は、新卒で入った会社が渋谷だったので

約10年ぶりに渋谷に戻ることになります。

あの頃はまだ副都心線も無かったので、私鉄とJRを乗り継いで通っていました。

先日、所要あって渋谷をちょっとぶらぶらしていたのですが

10年前に務めていた頃によくランチを食べに行った店がいまだに残っていて感動したり

もちろんすでに変わっている店も多々あり。

10年経った渋谷の今昔も楽しみたいと思っています。

 

まとめと謝辞

在職中にお世話になった皆様、ありがとうございました。

なにぶん狭い業界なので、またどこかで顔を合わすこともあるかと思いますので

その際はまたよしなにしていただければ幸いです。

はてダにあった記事をはてブロに移行しました

なんかしばらく見ないうちに、はてブロも正式サービスになって

しかもはてダのリンクがはてなTOPから隠されちまったので

この際なのでえいやっと移行してしまいました。

まぁ大した記事数でもないし。

これからもう少し真面目にブログにもいろいろ投稿していくようにしよう。

xdebug の各種設定がどのコンテキストで変更できるかを調べる

NetBeans + xdebug + Chromexdebug拡張という環境がなかなか良い感じです。
この環境さえ構築できれば、もうvar_dump()要らず\(^o^)/

で、この環境を作る上でひとつハマったことがあったのでメモ。

最初、xdebugでリモートデバッグできるようにini_set()でスクリプトから設定変更*1してみたものの、うんともすんとも言わず。

で、そういえば、xdebugの設定って、それぞれどのコンテキストで指定できるんだっけ?と思い当たり。
公式サイトのドキュメントを当たってみるも、それらしき記述は無し。。。
結構詳しく書いてあるんですけどね、xdebugのドキュメント。英語だけど。

で、結局行き着いたのが、ソースコード

おおむね、PHP_INI_ALL が多いんですが、いくつかの設定値は異なるものがあります。

PHP_INI_SYSTEM|PHP_INI_PERDIR のもの

PHP_INI_SYSTEM のもの

リモートデバッグで僕がはまったのはxdebug.remote_enable でした。
まあ、実現する機能のことを考えたらそりゃそうか、という結論だったわけですが。

*1:正確には、Zend_Applicationを使ってるので、設定自体はZendのiniファイルに書いてますが、実質ini_set()で定義してるのと同じ

Zend_Controllerを(モジュールを使わずに)階層化する

あけましておめでとうございます。
この記事は、「Zend Framework 日めくり Calendar 2012」 (http://atnd.org/events/23579) 2日目の記事です。
前日はsasezaki(@)さんの「Zend Framework その7年 (前編)」でした。

いきなり初日とはうってかわって、思い切り実用的な話に持って行きます。
※以下の記事は、Zend Framework Ver1系の話です。

さて、Zend Framework(以下ZF)でアプリを開発していると
だんだんコントローラが増えてきて、どうにかしたいなぁと思ったことありませんか?
そんな時、ZFのお作法的には
「モジュール機構を使え」
・・・とあるのですが
(参考:モジュラーディレクトリ構造の規約の使用 - Zend_Controller - Zend Framework)
このモジュール機構、ある程度機能がMVC単位で切り離せるならいいのですが
特にModelが綺麗に切り離せることがあまりなく
ちょっと無理があるかなぁ・・・と思うことがあったりします。
(まぁZFはディレクトリ構成を比較的自由に組めるので
モジュール機構を使いつつ、モデルは1箇所に固めて共通で使う
・・・ってこともできますが)

で、そんな大げさなことじゃなくて、もっと単純に
「controllerディレクトリにサブディレクトリ掘れればいいのに」
と思うことありませんか?
実はこれ、ZFのオンラインマニュアルには(たぶん)書いてないんですが、できます!
(書籍だと、「ZendFramework徹底入門」にはちらっとだけ書いてあります)
(前段にも書いたとおり、モジュール機構を使わない前提の場合です)

ディレクトリ名・ファイル名はこんな感じにします。

application/controllers/Hoge/FugaPuuController.php

クラス名は

<?php
class Hoge_FugaPuuController extends Zend_Controller_Action
{
    //(アクションメソッド等を記述)
}

とします。
サブディレクトリに当たる部分はアンダーバー"_ "で区切ります

Viewのパスは、たとえばindexアクションなら

application/views/scripts/hoge/fuga-puu/index.phtml

になります。

そして1つ注意が必要なのが、アクセスするURL。
アクセスするURLは以下のようになります。*1

http://www.example.com/hoge_fuga-puu/index

「hoge/fuga-puu/index」ではありませんので注意が必要です。
「単語の区切りはハイフン"-"、ディレクトリ構造はアンダーバー"_"」で区切ることになります。
この例では、ディレクトリ名「hoge」が1単語でしたが、複数単語になる場合も同じくハイフン区切り
(ファイル名とクラス名はUpperCamelCase)になります。

・・・でもこれ、ちょっとカッコ悪いですよね。
ということで、気になる方は、Routerで定義しちゃうといいと思います。

ZFマニュアルのRouterの項、「RewriteRouter での Zend_Config の使用法
のように、Zend_Config_Ini 形式で書くなら

routes.archive.route = "hoge/fuga-puu/index"
routes.archive.defaults.controller = hoge_fuga-puu

とします。
ちなみに、Zend_Controller_Request_Abstract::getControllerName()で得られる
コントローラ名も、こちらの「hoge_fuga-puu」になります。

これをうまく使えば、日々機能拡張のたびに増えるコントローラを
あまり手数をかけずに整理できると思います。


Zend Framework 日めくり Calendar 2012」、明日は@さん
・・・でいいのかな
・・・です!(言い切っちゃったw)
 

*1:スーパープレ記法の中でURLリンクを無効にする書き方がわからん。。。

謹賀新年2012

あけましておめでとうございます。
本年もよろしくお願いいたします。

振り返ると、昨年はあまりアウトプットも、勉強会参加もできなかったなぁ・・・という思いが。
特に震災直後は一刻イベント減りましたしね。

今年はもう少しこのあたり強化して、特にアウトプットに関しては
できるだけまめにやっていけたらと思っています。
すでに、明日は「Zend Framework 日めくり Calendar 2012」の記事を準備しています。
Zend Frameworkネタはいろいろ書きためているので
日めくりイベントが終わってからも、ちょいちょい書いていこうと思います。
ちなみにこの日めくりイベント、参加者枠まだあいておりますので、ネタをお持ちの方はぜひご参加ください!