2010-02-10
symfonyの非公式マスコットが作成されたようです
昨日Twitterでsymfony使ってる人たちのことなんて言うんでしょうね、という話題をid:Fivestarさんがつぶやいてました。
事の発端
symfony使いはsymfonianなのかsymfonistなのかはたまた他にあるのかどれなんでしょう。。。
http://twitter.com/fivestr/status/8836814002
それに対し自分も含めていろんなレスがありました
@fivestr symfonian・・・エイリアンみたいですね。symfonirとかいかがでしょう。
http://twitter.com/n416/statuses/8836898570
.@fivestr symphony→symphonist から、個人的にはsymfonistと思ってますが、http://symfonians.net/ とかもあるし謎ですw
http://twitter.com/hidenorigoto/status/8836949556
@fivestr Googleの検索ヒット数は圧倒的にsymfoniansですね。正直どっちでも良いけどw
http://twitter.com/Kiske/status/8837773708
@fivestr Ethnaの使い手は White Mage
http://twitter.com/sotarok/status/8837027876
その中から鶴の一声が
symfonianという単語を見ていて「しんふぉにゃん」という萌え系マスコットキャラクターとか作れるような気がしてきた
http://twitter.com/yuchimiri/statuses/8841765548
なんと真剣に考えてくれる人が!
@yuchimiri しんふぉにゃんのこと、真剣に考えてるなう!!!
http://twitter.com/kurumax/status/8856066825
そして完成。
http://twitpic.com/128vls - PHP用ウェブアプリケーションフレームワークSymfonyを愛する心が生んだ(自称)萌えキャラ!しんふぉにゃん!!
http://twitter.com/kurumax/status/8862414470
別の方も書き始めているようです。
@kurumax はじめまして。自分も「しんふぉにゃん」を描かせていただいてもよろしいでしょうか?
http://twitter.com/Cinosura/status/8876521813
これだけでユーザの間口が一気に広がった気がします。こういう流れになるともっといろんなイラスト見てみたいと思うのは僕だけでしょうか。
追記
Cinosuraさんが「しんふぉにゃん」書き上げられたようです。←イマココ
http://twitpic.com/12bimo - PHPフレームワーク”symfony”擬人化キャラクター「しんふぉにゃん」を描かせていただきました。
http://twitter.com/Cinosura/status/8882429041
はてダにもアップされてるみたいなのでリンク貼らせていただきました。
2010-01-28
PHP基礎文法最速マスターの補足
id:shin1x1 さんがPerl、Rubyに続いてPHP基礎文法最速マスター | Shin x blogで基礎文法をまとめてくれています。ありがとうございます。空いた時間で書いてみようかなと思っていたら先越されてしまいました。
記事を読んでみてコードブロックの説明を最初読んだときに少し違和感があったので、はてブのコメントで参考資料を補足しておきましたが、他の方からも同様にも指摘されてますのでもう少し補足しておきます。
コードブロックの説明は下記のように書かれてます。
終了タグは「?>」です。HTMLにPHPコードを埋める際は終了タグを使いますが、ライブラリのようにPHPコードのみを記述する際は終了タグを省くことが慣例となっています。
PHP基礎文法最速マスター | Shin x blog
「慣例」だと説明としては弱いですね。。閉じタグをつけない方が好まれてるのにはちゃんと理由があって、Zend Frameworkコーディング規約では次のように解説されています。
PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません。これは必須なものではなく、 終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。
Zend Framework: Documentation
ファイルの最後にある空白文字が出力に影響するケースは下記ブログで解説されてます。
PHPの閉じタグは心の臓に悪いから使わないで - Unknown::Programming
ブログから一部を抜粋しますと、
実際には改行一つだけなら問題は出ない、PHPは閉じタグの直後の改行を消してくれるからね。
問題は改行が二つ以上あった場合だ。これは悲惨なことになる。PHPは閉じタグ以降のデータ(というか範囲外のデータ)は全部HTMLとして出力される仕様なので、改行コードが表示されちゃう事態に。
表示されちゃうっていうのは語弊があるか、元々PHPはHTMLに埋め込むための言語なのでの範囲外の文字列が表示されるのは当たり前の動作だからね。
でもだ、もしrequire_onceして利用するライブラリファイルに改行コードが混入しちゃったりしちゃってたら相当ヤバイ。マジヤバイ。危険。超危険。
PHPの閉じタグは心の臓に悪いから使わないで - Unknown::Programming
このような理由からPHPコードのみからなるファイルでは閉じタグは使わないようにしましょう。
追記
id:ghostbass さんからブコメでUTF-8のBOMについての指摘をいただきました。確かに気づきにくくハマりどころです。ご指摘ありがとうございます−!
UTF-8のBOMにも注意。エディタ上は見えないし、普通にHTML表示をしている分には(終了タグ以降の空白、改行ほどには)あんまりはまらないけどAMFとかのバイナリなプロトコルではまる。
2010-01-26
郵便番号から都道府県を判定する
今作ってるモノに郵便番号から都道府県の判定する必要が出てきたので調べてみました。
Googleで調べてみてわかったこと
郵便番号の上2桁から都道府県を判定してる記事を見つけました。その中に気になる記述が。
最初は、以下のサイトから郵便番号データ全件をダウンロードして、
郵便番号全桁から判断しようと思ったのですが、郵便番号って、1つの郵便番号に複数の住所が紐づいていて、
かつ、その住所が2つの都道府県に跨っているケースがあることが分かりました。
中級プログラマの自宅でPHP ブログ 郵便番号から都道府県を判定するには?
郵便番号が同じでも違う都道府県を指してる場合があるとのこと。ホントかな?と思いながらもう少し調べてるとこんな記事を発見。
おー、ホントにありました。でも記事が2007年なので、もしかしたらデータが更新されているかもと思い実データでチェックしてみました。
実際のデータを使って調査してみる
全国の住所の郵便番号データは日本郵便のページからCSV形式でダウンロードが可能です。
今回は、読み仮名データの促音・拗音を小書きで表記している全国一括のデータ(http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh)を使いました。
データ取得・解凍
$ wget http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh $ lha x ken_all.lzh
文字コード変換
$ iconv -f sjis -t utf-8 ken_all.csv > ken_all_utf8.csv
データ抽出
サクッとawk使って処理してみました。重複している郵便番号と都道府県名だけを抜き出してます。
$ gawk -F, '{print $3,$7}'< ken_all_utf8.csv | tr -d '"' | sort -k 1 | uniq -D -w 7 | sort -u | uniq -D -w 7 > post_pref_list.txt
post_pref_list.txtの中身は下記のようになりました。
4980000 愛知県 4980000 三重県 6180000 京都府 6180000 大阪府 8710000 大分県 8710000 福岡県
2007年から重複しているデータについては特に変更がないみたいです。今回、自分が実装する案件では正確なデータは必要とされていないので郵便番号上2桁で判定するアイデアをいただきました。
$ gawk -F, '{print substr($3,0,3),$7}' < ken_all_utf8.csv | tr -d '"' | sort -u > post2pref.txt
作成したpost2prefファイルをdropbox(http://dl.dropbox.com/u/148481/post2pref.txt)にアップしました。中級プログラマの自宅でPHP ブログ 郵便番号から都道府県を判定するには?で書かれてる表と同じ内容ですね。
実装
判定処理をJavaScriptで実装してみました。
function post2pref(zipcode) { var pref; switch (true) { case /^0(0|[4-9])/.test(zipcode): pref = '北海道'; break; case /^01/.test(zipcode): pref = '秋田県'; break; case /^02/.test(zipcode): pref = '岩手県'; break; case /^03/.test(zipcode): pref = '青森県'; break; case /^1/.test(zipcode): case /^20/.test(zipcode): pref = '東京都'; break; case /^2[1-5]/.test(zipcode): pref = '神奈川県'; break; case /^2[6-9]/.test(zipcode): pref = '千葉県'; break; case /^3[0-1]/.test(zipcode): pref = '茨城県'; break; case /^32/.test(zipcode): pref = '栃木県'; break; case /^3[3-6]/.test(zipcode): pref = '埼玉県'; break; case /^37/.test(zipcode): pref = '群馬県'; break; case /^3[8-9]/.test(zipcode): pref = '長野県'; break; case /^40/.test(zipcode): pref = '山梨県'; break; case /^4[1-3]/.test(zipcode): pref = '静岡県'; break; case /^4[4-9]/.test(zipcode): pref = '愛知県'; break; case /^50/.test(zipcode): pref = '岐阜県'; break; case /^51/.test(zipcode): pref = '三重県'; break; case /^52/.test(zipcode): pref = '滋賀県'; break; case /^5[3-9]/.test(zipcode): pref = '大阪府'; break; case /^6[0-2]/.test(zipcode): pref = '京都府'; break; case /^63/.test(zipcode): pref = '奈良県'; break; case /^64/.test(zipcode): pref = '和歌山県'; break; case /^6[5-7]/.test(zipcode): pref = '兵庫県'; break; case /^68/.test(zipcode): pref = '鳥取県'; break; case /^69/.test(zipcode): pref = '島根県'; break; case /^7[0-1]/.test(zipcode): pref = '岡山県'; break; case /^7[2-3]/.test(zipcode): pref = '広島県'; break; case /^7[4-5]/.test(zipcode): pref = '山口県'; break; case /^76/.test(zipcode): pref = '香川県'; break; case /^77/.test(zipcode): pref = '徳島県'; break; case /^78/.test(zipcode): pref = '高知県'; break; case /^79/.test(zipcode): pref = '愛媛県'; break; case /^8[0-3]/.test(zipcode): pref = '福岡県'; break; case /^84/.test(zipcode): pref = '佐賀県'; break; case /^85/.test(zipcode): pref = '長崎県'; break; case /^86/.test(zipcode): pref = '熊本県'; break; case /^87/.test(zipcode): pref = '大分県'; break; case /^88/.test(zipcode): pref = '宮崎県'; break; case /^89/.test(zipcode): pref = '鹿児島県'; break; case /^90/.test(zipcode): pref = '沖縄県'; break; case /^91/.test(zipcode): pref = '福井県'; break; case /^92/.test(zipcode): pref = '石川県'; break; case /^93/.test(zipcode): pref = '富山県'; break; case /^9[4-5]/.test(zipcode): pref = '新潟県'; break; case /^9[6-7]/.test(zipcode): pref = '福島県'; break; case /^98/.test(zipcode): pref = '宮城県'; break; case /^99/.test(zipcode): pref = '山形県'; break; default: pref = 'unknown'; } return pref; }
まとめ
2つの都道府県が重複している3つの番号だけ例外的な処理を加えれば、もっと柔軟な処理も可能だと思います。正確性を求められないなら今回みたいな実装でよいんじゃないでしょうか。


