FuelPHP勉強会東京 vol.3に参加してきた
月の最後の日をPHPで簡単に知る方法
集計系の処理のプログラムを開発していると、その月の最後の日を求める必要がちょくちょくあったりしませんか? 私はあります。さてそういう時にどうやって求めるでしょう。答えは一発↓
<?php $d = date('Y-m-t');
これだけですw
書式「t」って何ですか?
恥ずかしながら date() 関数の書式に使える「t」の存在を今日まで知りませんでした。意味としては以下になっています。
t : 指定した月の日数。
t は DateTime クラスにも使えます。
例えば今年の各月に対して最終日を求めるのには、以下のようにします。
<?php $d = new DateTime(); $year = 2012; foreach (range(1, 12) as $month) { $d->setDate($year, $month, 1); echo $d->format('Y-m-t') . "\n"; }
従来はどうやっていた?
t フォーマットを知る前の従来のセオリーはこうでした。
- その月の最初の日(1日)を求める
- それに "+1 month" する
- それにさらに "-1 day" する
コードで書くとこんな感じ。
<?php $d = new DateTime(); $d->setDate($d->format('Y'), $d->format('m'), 1); $d->modify('+1 month -1 day'); echo $d->format('Y-m-d');
「あにみた!」ができるまで
6月5日(火)にAMNは新サービス「あにみた!」をリリースしました。あにみたは、アニメの各話単位でソーシャルチェックインできるサービスです。
「なぜソーシャルマーケティングのAMNが?」みたいな反応が結構ありますが、今回のあにみたはエンジニア主導で企画・開発されたサービスでして、私も含めアニオタ率の高いAMNエンジニアとしては至極当然の流れだったりします。
アニメの各話単位でチェックインできるサービスが欲しかった
そもそもの発端は、昨年の11月1日に開催された、AMN新サービスのアイディア出し社内ブレストミーティング、通称「AMN Developer Day (ADD)」でした。そこでAMNエンジニア全員で20以上のサービスアイディアを出し合った訳ですが、その中の一つに私が提案した「アニメの各話ごとにチェックインできるサービス」というものがありました。
これは自分の経験として、TwitterやFacebookでTVアニメの感想をつぶやいた時に思いもよらない反応があったことが何回かあって、この機能に特化して自分のポストをアーカイブしつつ、ソーシャルメディアに流せるサービスがもしあれば、自分はハードに使うだろうなぁと考えたのがそもそものきっかけでした。
AMNとしてバズらせるサービスを作りたい
新サービスの話はその後しばらくは水面下に潜っていたのですが、AMN CTOの福田さんが作った昨年末の「私の漢字2011」がうまく話題になったこともあって、エンジニア主導でインパクトのあるサービスを立ちあげようという話になりました。開発リソースとしてその時点で最も融通がきいた石山さんがメイン開発者となることが決まって、本人に一番作りたいサービスを決めてもらったところ「アニメチェックイン」をやりたいということで、「あにみた!」の開発が本格的にスタートしたのでした。
開発者の頑張り
石山さんはここ数ヶ月「あにみた!」の開発をほとんど一人で行なってきました。私達周囲のエンジニアは、コンセプトや仕様を決める議論には深く参加してきましたが、曲がりなりにもサービスとしてリリースできるところまで来たのは、ひとえに石山さんの頑張りによるものです。AMNのプレスリリースにも石山さんのコメントが載っていますが、自らが使って楽しいサービスをゼロから作るという経験は、モチベーションの維持に大変重要だったようです。
デザインワークはピチカートデザイン
「あにみた!」のデザインワークは白坂翔さん率いるピチカートデザインさんにお願いしています。そこはかとなく猫テイストなデザインコンセプトは、可愛くも有りほのぼのでも有り、皆大変気に入っています。どうもありがとうございます。
「あにみた!」のインフラ構成について
調べた人には簡単に分かることですが、「あにみた!」は全面的にアマゾンウェブサービスのEC2上で動いています。正にクラウドさまさまと言ったところです。
現状のインフラ構成は
- m1.large の Webフロントエンド
- m1.large 3台の MongoDB バックエンド
となっています。このうち3台の MongoDB サーバは AMN の広告配信サービスと共有しています。サービスイン前に負荷テストを行ったところMongoDB の負荷は本当に微々たるものだったので、相乗り可能と判断して共有することにしました。ソフトウェア構成要素としては
となっています。
負荷が問題となるとしたら、現状ではまず最初にネックになるのが Web フロントエンドだと考えられます。その部分はセオリー通りスケールアウトできるように作っていますので、滅茶苦茶ブレイクしない限りは、今のところは負荷問題は気にしなくて良いと思っています。
「あにみた!」の今後について
「あにみた!」をリリースして半日ほど経ちましたが、どうやらこちらの想定以上に多くの人に使っていただけているようです。ただこちらの想定外の使用方法のニーズが多くあることも、様々な反応を追いかけていて分かって来ました。ベータリリースということで、予定している機能で実装されていないものもまだまだたくさんありますし、ユーザの方々からの要望もたくさんいただいています。
より多くの人に満足いただけるように、今後もどんどんサービスを発展させて行きたいとエンジニア一同考えていますので、どうか期待しつつお待ち下さいませ。
エンジニアtypeの法林さんの新企画で対談してきました
jusやLLイベント等で比較的よくつるんでいる @hourin こと法林浩之さんが、エンジニアtypeでやっている連載で、対談形式の新シリーズを始めました。光栄なことにその第1回目に呼んでいただいたので、4/17(火) に2時間ほど二人で色々喋ってきましたが、その内容が本日記事として公開されました。
- “生涯プログラマー”を目指す20代に、ベテランエンジニアが贈る3つのメッセージ【対談:法林浩之×小山哲志】 - エンジニアtype
- “生涯プログラマー”を目指す20代に、ベテランエンジニアが贈る3つのメッセージ【対談:法林浩之×小山哲志】 - エンジニアtype
裏話を少しすると、最初の企画では、私の技術遍歴を時系列で紐解いて、その流れの中の技術的ターニングポイントを見出しつつ、そこからエンジニアとして生き抜くヒントを見つける、といった内容でした。以前に @IT に寄稿した以下の記事ぽいものかなぁと考えていました。
さて当日になりまして、法林さんといつも喋っている感じで、色んなところに話が飛び回りつつも、楽しく対談が進んでいったわけなのですが、当初の目論見の「技術的ターニングポイントからヒントを見つける」という想定ではうまく着地できない雰囲気になって来ました。
結局その日は、編集の小禄さん・ライターの白谷さんに方向性も含めてお任せするということになって、お開きになりました。後日お送りいただいた記事案では、当日話した内容から3つのメッセージを抽出して、それを中心に対談したという形でまとめられていました。あの雑多な会話の中からの再構成という見事なお手前でした。
さて肝心の内容ですが、直接の知人からの反応はなかなか良いようです。特に評判がいいのは以下の「心の折れ具合」に関連する部分ですね。
小山 ほかのことをやってる時、何か厳しい状況にぶち当たるでしょ。すると、心がポキンと折れて、逃げたくなったりするじゃないですか。でもコードを書いている時は、つらいことがあってもなかなかあきらめなかったんですよね。その時、この仕事が好きなんだと実感しました。
http://engineer.typemag.jp/knowhow/2012/04/203_2.php
これは、以前に井上陽水がラジオ番組の対談で語っていた
人間は、結局自分がそうしたいと自然に思うことをやるように出来ているので、自分の心をよく観察すると良い。
というような内容を、何故か自分はずっと覚えていて、上記の「心の折れ具合」はそこから発想した比喩だったりします。
PEAR::Mail_mimeで日本語ファイル名の添付ファイルを送る方法
世の中もう大体 UTF-8 で OK かなと思ったら、メールの添付ファイル名はそうでもないっぽいです。UTF-8 + URLエンコードで添付した日本語ファイル名が正しく読めないメール環境があったので、ISO-2022-JP + base64 にしたら大丈夫でした。
これをするのにPEAR::Mail_mimeだと、ややこしい引数を渡さなければいけないのでそれのメモ。以下のソースは UTF-8 で書かれていることを前提にしています。
<?php require_once 'Mail.php'; // PEAR::Mail require_once 'Mail/mime.php'; // PEAR::Mail_mime $textbody = '日本語の本文。'; $filename = '日本語添付ファイル名.txt'; $filedata = '日本語添付ファイルの中身'; // 文字コードを ISO-2022-JP に変える mb_convert_variables('ISO-2022-JP', 'UTF-8', $textbody, $filename); // 各 mime パートの構築 $mime = new Mail_mime; $mime->setParam('text_charset', 'ISO-2022-JP'); $mime->setParam('text_encoding', '8bit'); $mime->setTxtBody($textbody); $mime->addAttachment($filedata // data ,'application/octet-stream' // content-type ,$filename // attached file name ,false // isfile ,'base64' // encoding ,'attachment' // disposition ,'' // charset ,'' // language ,'' // location ,'base64' // n_encoding ,'base64' // f_encoding ,'' // description ,'ISO-2022-JP' // h_charset ); $subject = '日本語表題'; $jis = mb_convert_encoding($subject, 'ISO-2022-JP', 'UTF-8'); $encsubj = mb_encode_mimeheader($jis, 'ISO-2022-JP', 'B'); $recpts = 'example@example.jp'; $headers = array( 'From' => 'webapp@example.jp'; 'To' => $recpts, 'Subject' => $encsubj, ); $headers = $mime->headers($headers); $body = $mime->get(); // メール送信には SMTP を直接使うのが好きw $mail = Mail::factory('smtp', array('host' => 'localhost')); $mail->send($recpts, $headers, $body);
ABC 2012 Springで写真を撮りまくった
先週の土曜日 2012年3月24日に「Android Bazzar and Conference 2012 Spring」(abc2012s)が東大本郷で開催されました。上の写真はそれとはあまり関係なく、会場となった工学部2号館の東側で行われていたビル工事現場です。かっこいい。
ABCのスタッフをやるのは前回のABC 2011 Summerに続いて2回目で、事前の準備をやる余裕はあまりないですが、当日だけでいいならと当日スタッフとして登録しています。前回、自分が担当になった震災セッションで例のごとく登壇者写真を撮りまくってたら(Flickrのセット)、それが案外好評だったようで、今回は記録班として写真を撮る専門な役割になってしまいました(笑)。
ABCといえば、屈指のセッション同時並行トラック数で有名です。今回も11トラック+バザール(展示)2会場という構成で、まぁ全部のセッションを撮影するのは土台無理と諦めつつ、できるだけたくさん会場を回ってセッションを撮影しようと心掛けました。
東大安田講堂内は当初は撮影禁止だったのが、ぎりぎりになって撮影OKになって、天井からシャンデリアがぶら下がっている素晴らしい講堂内の写真が撮れたり。
当日の天気は、開始時は小雨、途中でちょっと強い雨になって、その後晴れる、というあまりイベント日和な天気ではありませんでしたが、それでも 2,000 人以上の方々にご参加いただけたようです。
小雨が降る中、メイン会場の工学部2号館と安田講堂の間を何度も往復したわけで、終わってみると結構疲れました。でも楽しかったので、きっとまた次回の ABC も当日スタッフ登録をすると思います。
当日、私が撮影した写真のflickr setは以下です。