Home > アーカイブ > 2010-12

2010-12

2010年ふりかえり

この記事の所要時間: 519

2010年もいよいよ今日が最後に日になりました。

今年も、Shin x blogやFacebook、Twitter、イベント等々でお世話になり、本当にありがとうございました。

ざっくりですが2010年の活動をまとめてみました。

blogエントリ

2010年に書いたものでPVが多かったものを5つ。

PHP基礎文法最速マスター

初1000はてブ超え!やっぱりこういうネタは強いですね。

iPadでPHP開発ができるか試してみた

興味ある人が多いようです。この夢は今はAirで叶いました:D

約半月で 4,000,000PV を華麗にさばく Google App Engine

なんでも判定ツクールでのGAE実績。今ではもっとケタ違いのアクセスをさばいているサービス事例も聞くので、この程度なら全然問題ありません。

iPadを持ち歩くのにオススメなユニクロバッグ

コンパクトでお買い得なユニクロバッグ。いまはAirを入れてます。

Google App Engineで独自ドメインを使う

GAEでの独自ドメイン。意外に面倒なので手順を載せました。

blogデザイン変更

エントリでは無いですが、blogデザインを変えました。「前の方が良いよー」という嬉しい意見も頂いたのですが、個人的には今のデザインの方が読みやすいので良いかなと思ってます。

つくったもの

hot.hatebu

はてブホットエントリーを集計したりするサービスです。

Google App Engine/PythonでDataStoreを使うサービスを作ろうと思い、作りました。内容は単純ですが、実際に作ってみると勉強になることが多かったです。

なんでも判定ツクール

〇〇判定を簡単に作れるサービスです。Twitterで火が付いて一時は半月で400万PVを記録するなど盛り上がっていました。

これもGoogle App Engine/Pythonですが、アクセスが急増してもGAEが勝手にスケールしてくれるおかげで何の苦労も無くアクセスをさばいくれました。これを体感するとGAEを使いたくなりますね。

ついもーにん!

朝TwitterのReplyでメッセージが届くサービスです。クックパッド社の「開発コンテスト24」に応募するために24時間で作りました。

開発自体はすぐに終わったのですが、アイデア出しとblogエントリ書くなど全体をうまくまとめるのに時間がかかりました。

参加者が随時Twitterで進捗をつぶやいていたので、一緒に開発している感があって楽しかったです。

アゲ本

「35歳からの〇〇」のように年齢がタイトルに含まれる本を探すサービスです。

なんで作ったんだろ。。。

iScreenShot

iPhone(iPod touch、iPad)のスクリーンショットを共有するサービスです。

公開してすぐにはてブニュースに掲載して頂きました。コンテストやったりで開発以外でも色々とやっていました。

やっぱりiPhoneアプリ版が必要だと思うので、開発しようと思ってます。

RT Reader

TwitterのタイムラインでRTされたtweetだけを見るサービスです。

iPhone版ではjQTouchを使ってWebアプリながらiPhoneアプリっぽく作りました。

聞きメール

1×1からiPhoneアプリをリリースしました。

初のiPhoneアプリリリースだったので、手続き系が手間取りました。はじめてAppStoreに並んだ時は感動しました:D

イベント

2010年は2009年に比べてイベント参加がぐっと減ってしまいました。

要因はまあ色々あるのですが、色々なことを考え直すいい機会になったと思います。

発表したのは以下+クックパッド開発コンテストのLTくらいですね。

ネットラジオ

不定期ですが「Webなんたらかんたら」というネットラジオを@msngさんとはじめました。

Web系なネタをゲストを招いてダラダラと話しています。

昔からラジオ好きだったので、気恥ずかしい気もしますが楽しんでやってます。

Podcastもあるので良かったら聞いてみてください。

2010年は

見つめ直す、そして、もがく年でしたね。

思い悩んだり、プライベートで色々あったりで、年初に想定していた活動は思ったようにはできませんでした。

特にイベント系については色々と考えたりしてたので、これはまた別エントリにでも書いてみます:D

その中でも、いくつかのサービスを作ったり、iPhoneアプリが出せたのは良かったです。

2011年は

とりあえずイベントが二つ(1/8の第2回関西アンカンファンレス、4/2のPHP@Osaka(仮))があるのでそれに向けて頑張ります。

イベントについてはまだ模索は続きますが、今年よりは参加すると思います:D

今後も個人的なサービスも作りますが、それより1×1としてのサービスやプロダクトを継続的にリリースしていこうと思ってます。

サービスをリリースするごとにPRの重要性をつくづく感じているので、ここも伸ばしていきたいですね。

では来年もよろしくお願いします!

PHP Advent Calendar jp 2010 まとめ

この記事の所要時間: 539

PHP Advent Calendar jp 2010が終了しました。

shin1x1から、ラストのrnskさんまで、24日間24名が毎日(若干日がずれたり、前後したりしたことはありましたが;-p)PHPに関するエントリをblogに書いていきました。

参加されたみなさん本当にありがとうございました&お疲れ様でした。

技術系Advent Calendarに参加すること自体が今年初だったのですが、やってみて色々感じたことをつらつらと。

感じたこと

担当日の緊張感(締切りのあるblogエントリ)

言いだしっぺなので初日が当番だったわけですが、何がなんでもその日に書かなきゃいけないというのは良い緊張感でした。

blogを書くというのは、なんだかんだ言ってパワーがいるわけです。とくに忙しい時期だと書きたいことはあってもなかなか書き出せない。もし書き出してもなんかしっくりこずにそのままお蔵入りになることがあったりします。

ただ今回に関しては締切りがあるのでとにかく書いてアップします。

やっぱり最後まで仕上げてアウトプットするとスッキリします。中途半端で終わるより精神衛生上良いですね。

ちょうどCakePHP Advent Calendarも参加しており、2日連続でエントリを書くことになったのですが、大変でしたけどちょっと祭り気分で楽しかったです。

担当日が終わった後がちょっと寂しい

担当日が終わって、CakePHP Advent Calendarの分も書き終えた後は、もう自分の番は回ってこないのでちょっと寂しかったです:D

いちおう主催なので担当日表を作ったり、担当の方にリマインドしたりと事務作業的なことをやりつつ、見守る日が続きました。

担当日にアップするには

見ていて感じたのは担当日に書きだす人が多いのかなーと思いました。

もちろんそれは書く人の自由なので担当日にエントリをアップできれば問題無いのですが、担当日*当日*に書かなきゃいけないわけではないので、担当日に予定がある場合は少し余裕を持って前日までに書いてしまって、当日は修正+アップだけにする方が楽ですね。(締切りギリギリのプレッシャーを受けて書くのも悪く無いですけどね:D)

いちおう主催する側としては、担当の方が書いてもらえるまで結構気を揉んで見守ったりしていたので、早めに書いてもらえると嬉しかったりします。

とにかく完走できて良かった:D

これが今の率直な感想です。当日に書けていない日が2日ありましたけど、まあ初回ということでいちおう完走とさせて下さい。

次回があるかは分かりませんが、次は担当日に書けなかったら焼肉奢りとかにしましょう:D

PHP Advent Calendar jp 2010 エントリ

ATNDのコメント欄に並んでいますが、こちらでも一覧にしました。

あらためて振り返ると色々なネタがありますね。PHP言語や関数以外にもライブラリやフレームワーク、マニュアル、php.net、経験話、そしてネタと多様なエントリがありました。

12/1
12/2 shin1x1 PHP シリアライズデータ型(PHP Advent Calendar jp 2010 Day 2) – Shin x blog
12/3 ikeeki 25行で書いたwebテキストメモ。
12/4 terakuma CodeIgniterを試しに使ってもらう手っ取り早い1つの方法(PHP Advent Calendar jp 2010 Day 4)
12/5 redsnow PHPでxmlを簡単に扱う(PHP Advent Calendar jp 2010 Day 4)
12/6 slywalker PHPでEmoji4Unicodeを使ってみる (PHP Advent Calendar jp 2010 Day 6) – 忍び歩く男 – SLYWALKER
12/7 msng PHPを始めたばかりのころ自分なりにやってた工夫と、それこうした方がいいんじゃないのという提案 – 頭ん中
12/8 sotarok 名前空間とautoload、標準的なClassLoaderの実装 – 肉とご飯と甘いもの @ sotarok
12/9 slumbers99 今更きけないあの娘の名前 (PHP Advent Calendar jp 2010 Day 9)
12/10 fm1202 CURLよりfile_get_contents()
12/11 yuyak PHPマニュアルを読み解く – Yuyak Blog
12/12 gusagi (非フレームワークの)PHPで携帯対応( #phpadvent2010 )
12/13 cakephper.ichikaway 「睡眠学習的PHPer生活 (PHP Advent Calendar 2010 13日目)」
12/14 camelmasa ソーシャルなサービスを支援 (PHP Advent Calendar 2010 14日目)
12/15 tohokuaiki proc_openの64kbの壁「slymak、それfile_get_contentsネタやない、proc_openや」
12/16 wokamoto 匿名関数と無名関数 (PHP Advent Calendar 2010 16日目)
12/17 koyhoge PDO_pgsqlでハマった件 (PHP Advent Calendar 2010 17日目)
12/18 heavenshell Introduction of Net_KyotoTycoon_Rest
12/19 hamaco Sabelを試しつつバッチ処理を作ってみる (PHP Advent Calendar jp 2010 Day 19)
12/20 omoon phpで配列を扱う時のあれこれ ( #phpadvent2010 Day 20 )
12/21 ecworks_masap 【PHP/CakePHP】phpadvent2010 Day21「ピュアPHPでも便利なCakePHPを使おう」
12/22 kashioka 0.1+0.7 =? 小数点について(PHP Advent Calendar jp 2010 Day22)
12/23 kanonji phpのDOMDocumentで断片的なhtmlを扱うならxmlとして読み込むのがよさそう(PHP Advent Calendar jp 2010 Day 23++)
12/24 m-takagi Exploring php.net – m-takagiの日記
12/25 rnsk [実験] PHP関数でiPhoneアプリを作ろう!

Merry X’mas!!

Twitter疲れにオススメなiPhoneアプリ「聞きメール」をリリースしました

この記事の所要時間: 233

1×1からiPhoneアプリ「聞きメール」をリリースしました。

「聞きメール」は一言でいうなら、良かったこと悪かったこと、愚痴などなどをキャラクター達に聞いてもらうアプリです。

日々の生活で言いたいあんなことやこんなこと。

みんなに言える話なら良いですが、誰にでも言える話ばかりではないですよね。

楽しい話ならまだしも愚痴系となるとなおさらです。愚痴系は聞いている方も嬉しくはならないので、できたら誰にも言いいたくない。でもやっぱり言ってスッキリしたい。じゃあ穴でも掘って叫んでみようと思っても、コンクリートジャングルでは穴が掘れる地面すら無い。

じゃあ、Twitterで発散しよう!ということでポロッとtweetしてしまうとそれは全世界に発言しているのと同じことで、誰が見ているか分かりません。RTにRTされて見知らぬ誰かから意図しない取られ方をすることもあります。

例えば「誰それが不倫した」などポロッとtweetしたことがワイドショーに取り上げられるかもしれません。。。

そんな時に「聞きメール」。

いつでもどこでも

「聞きメール」ならいつでもどこでも多彩なキャラクター達があなたのどんな話でも聞いてくれます。外部と通信はしませんので電波の届かないところでも大丈夫です。

また電車の中などでも使いやすいようにインターフェイスをメールアプリに似せています。パッと他人が見た時にはメールを書いているようにしか見えないですね。

「聞きメール」入力画面。メールアプリライクです。

あなたの話を知っているのはキャラクター達だけ

あなたの書いた内容は一切外部には送信されませんし、アプリ内にも保存しません。人に言うにはちょっとなーという話でも安心して書いて下さい。

キャラクター達が返すリアクション

書くだけでスッキリすることも多いと思うのですが、「件名」であなたの気分を指定することで、表情とメッセージでキャラクター達が多様なリアクションを返してくれます。

例えばキャラクター「もちぴょん」のリアクション。件名に「サイコー!」を指定すると、こんなにゴキゲンな表情でリアクションを返してくれます。ちょっとおかしなリアクションが返ってくることもありますが、それもキャラクターのご愛嬌ということで。

「聞きメール」キャラクターからの返信。もちぴょんの表情がたまらない:D

もちぴょんに癒されてます:D

実はある程度開発が進んだ段階から自分のiPhoneに入れているのですが、かなりのヘビーユーザーです。

愚痴ばかりを書いているわけではないですが、今言いたい一言(ひとりごとに近いこと)をキャラクター達に聞いてもらってます。

これやってみると分かるのですが、メールを送るという行為をしただけで、結構スッキリします。また件名で欲しいリアクションを入れるので、ほぼ欲しいリアクションが帰ってきます。

予定調和なんですけど、ただ聞いて欲しい時はこれが良いですね。(反論とかされないですしね:D)

ストレスがなにかと多い昨今、あなたの話をなんでも聞いてくれる「聞きメール」、よろしくお願いします!

聞きメール - 1x1 Inc.

第2回関西アンカンファレンスを2011/01/08に開催します

この記事の所要時間: 243

昨年好評を博した関西アンカンファレンスをまたまた開催します。

アンカンファレンスって何?の方は、昨年書いたエントリをご参照下さい。

大阪でアンカンファレンスを12月か1月にやります

前回の模様は以下から。

今回は兵庫県立大学様に神戸キャンパスを会場として提供頂けることになりました。ありがとうございます。

場所はハーバーランドにあります。見学に行ってきたのですが素晴らしい施設で、かなりテンション上がっています!

ビルの入り口はこんなにおしゃれ。

会場はこんな感じ。

窓からはこんな絶景が見られたりします。

概要

開催概要は以下になります。

■ 開催概要
・日時:2011/01/08(土) 10:30 – 18:00(開場:10:00)
・場所:兵庫県立大学神戸キャンパス(神戸ハーバーランドセンタービル23F)
・地図:http://www.u-hyogo.ac.jp/access/campus01.html
・参加費:0円(名刺ホルダーなど若干経費がかかるので、受付にカンパ箱を設置します。あくまで任意ですが、ご協力頂けると助かります。)
・定員:100人

タイムテーブル

10:00 受付開始
10:30-10:45 オープニングセッション
10:50-12:50 午前の部
12:50-13:50 お昼休み
13:50-14:50 午後の部1
14:50-15:50 短め枠
15:50-17:50 午後の部2
17:50- エンディングセッション

発表会場

発表を行う会場は、隣接する2教室に分かれます。2つのセッションが同時に進行するので、聞きたい方、発表したい方に移動して下さい。

発表枠

今回は「1セッション20分(15分発表+5分移動、準備)」となります。

前回の反省を生かして、移動・準備する時間を設けています。

短め枠

発表慣れしていない人や短めの発表がやりたい人向けの特別枠です。10分セッション(8分発表+2分移動、準備)となります。

発表枠の申し込み

もちろんこれは前回と同じく当日にホワイトボードに付箋を貼っていく方式になります。いつ発表するか、どんな発表が出るかは当日のお楽しみ!

発表テーマ

これも前回と同じくIT/Web系の内容なら何でもokです。

ただ、色々なバックグラウンドを持つ方が集まるイベントなので、何かを貶めたり攻撃したりするような内容は避けてくださいね。(みんな大人ですしね!)

申し込み

以下リンクのフォームからお申し込み下さい。

第2回関西アンカンファレンス申し込み

昨年は80名の申し込み枠があっという間に埋まったので、参加希望の方はお早めに。

発表される方もそうでない方も2011年は関西アンカンファレンスから盛り上がっていきましょう!

「半歩先のWebシステム構成」を発表してきました – 俺の話を聞け!

この記事の所要時間: 140

「俺の話を聞け!」という名のイベント(ほんとにイベント名です:D)で発表してきました。

イベントの詳細はこちらから

去年やった関西アンカンファンレスを小規模でやったようなイベントです。できるだけ多くの人に発表の機会をということで、初めての方から発表慣れしている方まで総勢19人が発表を行いました。

参加しての雑感をつらつらと。

  • 会場はクロノスさん。素晴らしい会場でした。ありがとうございます!
    これからもよろしくお願いしますm(_ _)m
  • 事前に聞いていたのに全然手伝えなくてごめんなさいm(_ _)m
  • やっぱりテーマソングはこれ
  • 大事なこと。「人は人、自分は自分」
  • とにかく楽しかった!
  • 発表した人は印象は残りやすいし、発表者同士の親近感もある。やっぱりできるだけやった方が良いと思う。
  • 初発表の人の方がちゃんと準備をしていた。すばらしい!
  • デモ最強。百聞は一見にしかず。
  • 笑いを求めるサガ:D
  • 話題が多岐に渡って面白かった。
  • 逆に話題を絞ってこういう形式のイベントも面白いかも。
  • お菓子はほどほどに。
  • 第2部も第3部も楽しかった!
  • 関西のイベントだと、勉強会やって、飲んで、歌ってをやっても家に帰れるのが嬉しい:D
  • 久しぶりの発表で妙に緊張した。。。でも、やって良かった。

「半歩先のWebシステム構成」

「半歩先のWebシステム構成」というタイトルで発表してきました。

自分の中で気になっている直近で使えそうなものをざっくり並べました。もう実践している人にとっては当たり前のことなのですが、来年はこの辺を意識してやりたいなと思ってます。

Reboot

ちょっと今年は色々あって、こういった活動から少し身を引いていたわけですが、今回のイベントでrebootした気分です。

やっぱイベントは良いですね。

来年は、1/8 や 4/2 など大きめのイベントがあるので頑張りますよ!

Mac+Google日本語入力でATOKショートカットキーで変換する

この記事の所要時間: 039

Mac+Google日本語入力でATOKのキーバインドで変換する方法です。

MacBookAirには、普段使っているATOKではなく、Google日本語入力を入れてるのですが、「CTRL+(u/I/o/p)」で「かな<->カナ<->半角カナ<->英字」といった変換ができず困っていました。

ごまかしごまかしF6-10を使っていたのですが、これまでのクセが抜けず、いらいらしていました。

今日こそ何とかするぞ!と意気込んで調べてみたところ、普通に設定がありました。。。

Google日本語入力の設定を開きます。(画面は英語版です)

keymap styleを「ATOK」に変更すればok。

なんでもっと早く気づかないか。

CakePHP Modelとの付き合い方(CakePHP Advent Calendar 2010 3日目)

この記事の所要時間: 612

CakePHPのModelに悩む人が多いようなので、自分なりの付き合い方(考え方)をご紹介します。

CakePHP Advent Calendar 2010の3日目です。

前日の k1LoW さんのエントリ、参考になりますね。GETのフォームをdata[]でやるとURLがすんごいことになるので、ウチでは別途対応できるライブラリを作ったりしてます。

さて、3日目の今日は書きたいネタは幾つかあったのですが、「君の当たり前に僕らは感嘆させられるんだ」の精神に従って、自分なりのModelの使い方、考え方を書いてみます。

1. 適正なインターフェイスを用意して処理をカプセル化

まず基本的な考え方。

Model(に限らずですが)では、処理単位でインターフェイス(メソッド)を用意して、実装はカプセル化しておきます。

こうすることによって、Modelを利用する側(Controllerや他のModel等)はそのインターフェイス越しに処理を呼び出せば、求める処理が実行され、その結果を得ることできます。

呼び出し側では、求める処理さえが実行されれば良いわけで、その処理自体がどのような実装になっているのかは知る必要がありません。極端な話、求める要件さえ満たせば、処理はどのように行われていても良いわけです。

この処理のカプセル化というのはオブジェクト指向では一般的な考え方ですが、あらためてしっかりとイメージしておくとフレームワークと上手く付き合う方法が見えてくるのかなと思います。

もちろん、これはベースの考え方であって、実際は当然実装も気にしますし、それに応じた呼び出し方も考えます。ただ根底ではこの考え方を意識しています。

2. SQLを直接書いて良いか?

CakePHPが用意しているインターフェイスで簡単に全てのクエリが表現できればそれに超したことは無いのですが、実際のところそうもいかないこともあります。

発行したいSQLはイメージできているのに、それをどうCake風に書けば良いかを悩む、という場面に遭遇した人も多いのではないでしょうか。

もちろんフレームワーク流の書き方を習得する方法も1つなのですが、場合によっては、その処理をメソッド内に閉じ込めておけば、SQLを書いてしまっても良いと思います。

イメージとしては以下。このメソッドを呼び出す側からはregisterという処理を実行してくれれば良いわけで、中でsaveメソッドを呼ぶのか、SQL直書きなのかは関係ありません。

  public function register() {
     $this->query('複雑なSQL書く');
  }

もちろん、これも程度の問題で、基本はModelのメソッドをそのまま使います。ただ複雑なSQL、パフォーマンスが要求されるような箇所では、SQL直書きも許容するということです。

3. belongsTo以外のアソシエーションは使わない

単純なbelongsTo以外のアソシエーションは原則使いません。

複数テーブルのJOINが必要な場合は、DBにViewTable(CREATE VIEW)を作成して、それに対応するModelを作ります。

例えばでは、usersテーブルとuser_classesテーブルをJOINしたViewTableを作ります。

CREATE VIEW v_users AS
SELECT
  u.*,
  uc.name AS user_class_name
FROM
  users AS u
JOIN
  user_classes AS uc ON (u.user_class_id=uc.id)
;

そして、v_usersを利用するModelを作ります。

class VUser extends AppModel {
  public $useTable = 'v_users';
}

VUserモデルでfind()等を実行する場合は、あくまでv_usersという一つのViewTableに対する操作となるので、とても単純です。

さらにViewTableは自分でSQLを書いて作るので、意図したとおりのSQLが発行できます。もしクエリをチューニングするときはSQLレベルで調整できます。

複雑なアソシエーションを覚える、制御する必要が無いので、個人的にはこの方法が気にいっています。

4. アクション毎にModelを作る

Modelには多くの責務があるので、アプリケーションが大きくなってくると1つのModelに処理が増えてきて肥大化する傾向があります。

特にバリデーションなどは画面によって内容が異なる場合もあるので、1つのModelにあらゆる場面での処理を書いていくと複雑になり、メンテナンス性が落ちます。

そこで、処理を分割する、1つのModelの責任を小さくするためにControllerのアクション毎にModelを作成しています。

例えば、UserController#index()ならActionUserIndexというModelを、UserController#edit()ならActionUserEditというModelを作成します。

画面毎の処理はそのModelに書き、共通で利用するような処理はUserモデルに書くというように使い分けています。

もちろん中にはUserモデルをfindするだけで済むような画面もあるので、そういう場合は作らないときもありますが、基本的には作成するようにしています。

これにより画面毎の処理を局所化できるので、特にチームでの開発では効率が上がりました。

5. 例外を積極的に使う

わりと敬遠されがちな例外ですが、積極的に使ってます。例外を使えば、処理の考え方がシンプルになります。

例えば、Modelで何かエラーがあったら例外を投げるようにしています。投げる例外は場面に応じたものを選択しますが、とりあえずエラーなら例外を投げるというルールにします。

また、呼び出し側では、try句の中には正常系だけ書いて、異常系はcatchに書きます。try句の中には正常系処理しか無いので、本来実行すべき処理を追いやすくなります。

もちろん例外を使わず戻り値の規約を作れば同じようなことはできますが、try/catch句のようにPHPの構文で実装の意図を明確にすることができます。

try {
  正常系処理
} catch (NotFoundException $e) {
  異常系処理1
} catch (AppException $e) {
  異常系処理2
}

バランスも大事

フレームワークを使う上で、どこまでフレームワークの仕様に合わせるか、どこからは独自の方法で実装するかというのは悩むポイントですね。

このエントリで紹介した内容はCakePHPの基本的な使い方からは少し外れるものもあります。

ただ、フレームワークを使う目的は、フレームワークを使うことではなく、フレームワークを使って何かを作ることだと思っているので、バランスを取りながらうまく付き合っていきたいですね。

CakePHP Advent Calendar 2010 4日目は、remoreさんです。どんなエントリになるか楽しみですね!

PHP シリアライズデータ型(PHP Advent Calendar jp 2010 Day 2)

  • 2010-12-02 (木)
  • PHP
この記事の所要時間: 559

今年(2010年)は、日本でも技術系コミュニティのAdvent Calendarが流行していますね。

PHP関連だとCakePHP(明日書きます!)やSymfonyOpenPNEなどはあるのですが、PHP単体が無かったので作ってみました。

PHP Advent Calendar jp 2010

Advent Calendarについては、下記リンクが詳しいです。これを書いている段階では、まだ参加枠があるので、どんどん参加して下さい。みんなのちょっとしたPHPネタを書いていきましょう!

というわけで、まず初回(12/2に始めたので、Day1は空席で)のネタは、最近自分の中で流行中のPHPのシリアライズデータ(serialize()/unserialize())について。

シリアライズデータのデータ型

CakePHPのセキュリティホール発覚以降、一部で脚光を浴びたPHPのシリアライズなのですが、シリアライズデータで表現できるデータ型をあらためて調べてみました。

まあPHPのソース見れば一目瞭然ですね。

[ext/standard/var_unserializer.c]

 437   case 'C':
 438   case 'O': goto yy13;
 439   case 'N': goto yy5;
 440   case 'R': goto yy2;
 441   case 'S': goto yy10;
 442   case 'a': goto yy11;
 443   case 'b': goto yy6;
 444   case 'd': goto yy8;
 445   case 'i': goto yy7;
 446   case 'o': goto yy12;
 447   case 'r': goto yy4;
 448   case 's': goto yy9;

ざっくり読んだ感じでは以下な内容でしょうか。

C=CustomObject
O=Object
N=NULL
R=Reference
S=string
a=array
b=boolean
d=double
i=integer
o=Objectっぽいけどなんだろ?
r=Reference
s=string

シリアライズデータで表現してみる

‘b’ = boolean

boolean(論理型)です。

b:の後ろの数値は、1ならtrue、それ以外ならfalseになるようです。

b:1; => bool(true)
b:0; => bool(false)

‘i’ = integer

integer(整数型)です。

i:100; => int(100)

‘d’ = double/float

double/float(浮動小数点数)です。

d:10.123; =>float(10.123)

‘s’ / ‘S’ = string

string(文字列)です。’s’と’S’の違いはよく分かってないのですが、文字列をserialize()すると’s’になります。

s(S):の後ろが文字列のバイト数で、””で文字列を囲みます。

s:3:"abc"; => string(3) "abc"
S:3:"abc"; => string(3) "abc"
s:9:"頑張る"; => string(9) "頑張る"(UTF-8)

‘N’ => NULL

NULLです。

N; => NULL

‘a’ => array

array(配列)です。

a:の後ろは要素数です。あとは添え字、要素によって様々な形式を記載します。

a:2:{s:3:"1st";i:100;s:3:"2nd";i:200;}; => 
array(2) {
  ["1st"]=>
  int(100)
  ["2nd"]=>
  int(200)
}

‘C’ / ‘O’ / ‘o’=Custom Object / Object / Object?

クラスインスタンス(オブジェクト)です。通常インスタンスをserialize()すれば、’O’となります。

O:3:"Foo":1:{s:4:"var1";s:3:"abc";}

‘C’は、シリアライズする対象クラスがSerializableをimplementしている時に付与されます。この場合、シリアライズ、デシリアライズ処理は、PHPデフォルトの処理ではなく、対象クラスのserialize/unserializeメソッドで定義された処理が実行されます。

serializeメソッドではシリアライズしたデータをreturnします。unserializeメソッドでは、シリアライズしたデータが引数で渡されるのでそれをパースしてインスタンス変数にセットします。

C:3:"Foo":29:{a:1:{s:6:"value1";s:3:"abc";}}

‘o’は、内部的にはインスタンスを復元するようなのですが、具体的にどのように記載すれば良いかまだ分かってません><

‘r’ / ‘R’ = Reference

Reference(参照)です。’r’(小文字)と’R’(大文字)でデシリアライズした時の挙動が変わります。

‘R’の場合は、参照型としてデシリアライズされます。

a:2:{s:3:"1st";i:100;s:3:"2nd";R:2;}; => 
array(2) {
  ["1st"]=>
  &int(100)
  ["2nd"]=>
  &int(100)
}

‘r’の場合は、変数に参照先の値がセットされますが、参照型にはなりません。

a:2:{s:3:"1st";i:100;s:3:"2nd";r:2;}; => 
array(2) {
  ["1st"]=>
  int(100)
  ["2nd"]=>
  int(100)
}

参照型変数をシリアライズした際は、参照先の変数も一緒にシリアライズされれば’R’に、参照先変数がシリアライズデータに含まれていなければ、参照先の値がセットされます。(’r’は?)

リソース型やクロージャはNG

リソース型やクロージャは標準のserialize()ではシリアライズできません。

シリアライズデータは見れば分かる

シリアライズデータで身近なのは、セッションデータだと思うのですが、一見複雑そうなシリアライズデータでも開いてみると実は結構読めます。何より変数値はほぼそのまま入っているので、なんとなくでも内容を掴むことができます。

PHPユーザならシリアライズデータを読むことは普通だと思うのですが、初日ということでBasicなネタにしてみました。

では、明日のikeekiさん、よろしくお願いします!

Home > アーカイブ > 2010-12

検索
フィード
メタ情報

Return to page top