Blog

  • Xcode 4 howto: フレームワークの追加

    Xcode 4で既存のフレームワークを追加する方法です。

    1.Project Navigatorを開く
    2.ターゲットのアイコンを選択
     そうするとSummary/Info/Build Settings/Buid Phases/Build Rulesというタブがエディタエリアに表示される。
    3.”Build Phases”を選択
    4.”Link Binary With Libraries”を選択
    5.”+”を選択
    6.ダイアログでフレームワークの一覧が表示される。ここから選択して”Add”
    7.Project Navigatorにフレームワークが追加されます。

    ちなみにAdd Files…でフレームワークのフォルダを直接指定しても追加されるみたい。

  • 地震救援情報まとめ:茨城関連

    ケータイの方はこちらからご覧下さい http://bit.ly/hrmI6N
    できるだけ掲載しますので、追加修正などあれば、 http://twitter.com/h_kurosawa まで、またはコメント欄に記入お願いします。

    茨城県>義援金・寄附金をお寄せいただく場合の窓口ご案内 http://www.pref.ibaraki.jp/important2/20110311eq/20110318_13/

    【茨城県ボランティア募集】
    茨城県のボランティアセンターは県内各地の避難所で食事を準備したりするボランティアのスタッフを募っています。センターでは午前8時半~午後9時までの間電話を受け付けていてボランティアを求めている避難所を紹介しています。029-241-1133

    以下の市町でボランティアを募集中。常総市、鉾田市、笠間市、小美玉市、潮来市、東海村、那珂市、石岡市、常陸大宮市、日立市、行方市、牛久市、鹿嶋市、大洗町、常陸太田市。受入は各市町村在住者のみ。詳細は下記URLまで http://bit.ly/dK1QpQ (@Asahi_Shakai)

    水戸市は災害ボランティア活動対策本部を設置したとのことです。問合せは、市民会館203号室(福祉総務課)又は水戸市社会福祉協議会ボランティアセンター電話029-309-5001/メール syakyo@mito-syakyo.or.jp /受付8:30-18:00

    日赤県支部029(241)4516は、震災義援金を同支部のほか、各市町村の赤十字担当窓口で受け付け。振り込みの場合は郵便局、ゆうちょ銀、常陽銀本店、筑波銀県庁支店、県信組県庁前支店。19日午後5時までに77件約3883万円受け付け(@ibarakishimbun)

    つくば市/物資は直接、避難所に持ち込むのではなく、まず、市災害対策本部(029・854・8522~8526)に電話して、支援できる物資と数量を登録してください。その後、市が必要に応じて支援者に連絡します。つくば市は、ボランティアも、市ボランティアセンター(029・883・1360)に連絡して登録し、調整してから活動するよう呼びかけています。(@Asahi_Shakai)

    総務省:東北地方太平洋沖地震に関するチェーンメール等にご注意ください。 http://www.soumu.go.jp/menu_kyotsuu/important/kinkyu01_000096.html
    ■東北地方太平洋沖地震、ネット上でのデマまとめ http://d.hatena.ne.jp/seijotcp/20110312/p1 限られた情報の中ではデマが蔓延しやすいです。落ち着いて判断・行動してください。

    メディア
    茨城放送 水戸局 1197kHz / 土浦局・県西中継局 1458kHz
    茨城放送Twitcasting http://twitcasting.tv/ibs_radio
    茨城放送Ustream http://ustre.am/vvn0
    茨城放送ニコニコ生放送 http://live.nicovideo.jp/watch/lv43674406
    NHK水戸放送局 http://www3.nhk.or.jp/saigai/jishin/mito/4385_1.html
    HNKに意見送ったら茨城のライフライン等情報が見られる一覧を送ってもらいました。 http://plixi.com/p/83914909
    つくば災害FM(つくば市) http://radio-tsukuba.net/ FM84.2MHz
    (非公式)コミニティFM「FMひたち」 FM82.2MHz http://twitter.com/FM822bot
    FMぱるるん(水戸市、76・2㍋ヘルツ)
    常陸六国.com http://hitachirokkoku.com/

    救援情報
    茨城県内の物資情報は、こちらで相談、共有してください:OKWave http://oketter.okwave.jp/my_page/answer/28593
    筑波大学: つくばエリアの地震被害とライフライン情報共有 http://tsukuba-share.main.jp/
    茨城県版 炊き出しまっぷ、緊急避難場所 http://genokita.sakura.ne.jp/googlemymaps/mymap.php?msid=213124412055050597835.00049e595d94fe1de47e7
    茨城県炊き出しポイントを携帯でも見やすいようにテキスト化しました http://www5.big.or.jp/~ksmagic/jishin/ibaraki.html @Kwkonamagic52氏
    茨城県 | 給水・炊き出し・日用品取得場所一覧 http://japanquake2011filehost.appspot.com/html/u-pyon.com/m/food/ibaraki_food/post.html
    日本透析医会災害情報ネットワーク http://www.saigai-touseki.net/sendsdata/total.php

    インフラ
    Yahoo!宅配 配送状況エリアマップ http://topic.takuhai.yahoo.co.jp/notice/2011/post_18/
    給水所マップ(携帯・スマフォからも利用可) http://kyusuisho.appspot.com/
    高速バスネット http://www.kousokubus.net
    茨城交通 http://www.ibako.co.jp/
    茨城交通バス運行状況 http://www.ibako.co.jp/information.html
    Google 自動車・通行実績情報マップ (データ提供:本田技研工業株式会社)http://www.google.com/intl/ja/crisisresponse/japanquake2011_traffic.html
    災害対策本部発表(ミラー)茨城県 給水情報等 http://saigaitaisaku.r-cms.biz/topics_list4/contents_type=15
    東京電力:停電情報 http://teideninfo.tepco.co.jp/html/08000000000.html
    東京電力:計画停電 http://www.tepco.co.jp/images/ibaraki.pdf
    東京電力 カスタマーセンター 茨城 0120-995-332

    FONのアクセスポイントは現在も完全フリーです。どなたでもネットに繋げるようにしています。なかなか連絡がとれない方、震災情報を知りたい方は使ってください。 http://bit.ly/ecVsuX(@fonjapan)

    医療
    救急医療情報コントロールセンターは24時間対応で診療可能な病院を紹介。029-241-4199
    インスリン入手相談先情報 By日本糖尿病学会 2011-3-14 14時 日立総合病院 荻原健英先生・岡 裕爾先生 連絡先:0294-23-1111 @hmebaeさんのツイートより。

    県精神保健福祉センターは17日から、フリーダイヤル「いばらきこころのホットライン」0120(236)556を毎日開設。午前9時から午後4時まで。日立を除く各保健所でも平日午前8時半から午後5時まで電話相談受け付け(@ibarakishimbun)

    【茨城】被災した日立保健所を除く県内の各保健所でも、被災者のメンタル相談に応じる。平日午前8時半~午後5時。

    県の救急医療情報システム(029・241・4199)が24時間対応で診察可能医療機関を案内。茨城子ども救急電話相談(029・254・9900 プッシュ回線と携帯からは#8000も)は毎日夜間18~23時半に看護師が応対。休日は9~17時にも。(@Asahi_Shakai)

    特設公衆電話
    @NTTRPツイートより。
    特設公衆電話【茨城1/4(東海村)】(13日17時) 東海村役場、石神幼稚園、宿幼稚園、須和間幼稚園、舟石川幼稚園、村松幼稚園、舟石川保育所、村松保育所、百塚保育所、石神小学校、白方小学校、舟石川小学校、中丸小学校、村松小学校、照沼小学校

    特設公衆電話【茨城2/4(東海村)】(13日17時) 東海小学校、東海南中学校、石神コミュニティセンタ、村松コミュニティセンタ、白方コミュニティセンタ、真崎コミュニティセンタ、中丸コミュニティセンタ、舟石川コミュニティセンタ

    特設公衆電話【茨城3/4】(13日17時) ひたちなか市役所、ひたちなか市高野小学校、ひたちなか市佐野公民館、ひたちなか市前渡公民館、ひたちなか市金上ふれあいセンタ、ひたちなか市那珂湊中学校、那珂市役所、日立市役所

    特設公衆電話【茨城4/4】(13日17時) 常陸太田市役所、那珂市役所瓜連支所、常陸太田市役所金砂郷支所、常陸大宮市役所、大洗町役場、茨城町役場、牟田市役所、牟田市役所旭支所、北茨城市役所

    自治体
    茨城県 http://www.pref.ibaraki.jp/important/20110311eq/
    日立市:東北地方太平洋沖地震への対応について http://www.city.hitachi.ibaraki.jp/viewer/urgent.html#53
    日立市の相談所が開設してます。場所:災害対策本部(消防拠点施設 神峰町2丁目)、本庁(市民課ロビー)、各支所 時間:8:30~17:15電話でのお問い合わせは、生活安全課(0294-22-3111 内線340)
    IBARAKI International Affairs Division / TEL: 029-301-2862 9:00AM-6:00PM http://www.pref.ibaraki.jp/bukyoku/seikan/kokuko/kokuko.htm
    ひたちなか市災害等緊急情報 http://www.city.hitachinaka.ibaraki.jp/SKYU/saigai/saigai0314_0800.html

    その他
    原子力施設周辺環境モニタリングデータ http://www.bousai.ne.jp/vis/jichitai/ibaraki/index.html
    日立一高地学部員 茨城県北部の災害情報 http://luxuria.zatunen.com/saigai.html
    原発に関するQ&Aまとめ http://smc-japan.mirror.myapp.jp/
    SAVE IBARAKI http://saveibaraki.at-ninja.jp/hitachi.html
    NAVERまとめ http://matome.naver.jp/odai/2130000980547522301
    茨城子ども救急電話相談18:30~23:30(日曜・祝日は9:00~17:00、18:30~23:30)水戸市メルマガより
    短縮ダイヤル #8000 / すべての電話から 029-254-9900 / ※緊急・重傷は119へ
    茨城県(水戸市・大洗町・県北地方)の現状 http://ameblo.jp/ashitano-gakkou/
    大洗・那珂湊の写真 https://picasaweb.google.com/105933233374974508704/20110316#
    井手よしひろ>2011東北関東大地震 https://picasaweb.google.com/miraipapa/201102#
    がんばっぺ茨城ポスター | 茨城王 http://www.ibaraking.com/archives/2363

    Twitterアカウント
    茨城新聞 http://twitter.com/ibarakishimbun
    茨城放送 http://twitter.com/ibs_radio
    木村犬介 [日立市情報まとめ中] @pavlovdog_JP
    鹿島市 http://twitter.com/kashima_city
    つくば市情報システム課 http://twitter.com/tsukubais
    井手よしひろ:茨城県議会議員 http://twitter.com/ibakengee
    NTT広報室 http://twitter.com/#!/NTTPR
    給水所マップ http://twitter.com/#!/kyusuisho/

    Twitterハッシュタグ
    #save_ibaraki⇒茨城に関する震災ツイート
    #jisin 地震一般
    #hitachis⇒日立市
    #hitachinaka⇒ひたちなか市
    #oarai⇒大洗町
    #takahagi⇒高萩
    #kasumigaura⇒かすみがうら市
    #mito⇒水戸市
    #shirosato⇒城里町
    #Ishioka⇒石岡市
    #takidashi⇒炊き出し情報
    #ibaraki⇒茨城全般

    mixi(ログイン要)
    茨城県ひたちなか市民 LOVE http://mixi.jp/view_community.pl?id=788387
    【茨城の情報まとめ】随時更新しています。 http://mixi.jp/view_diary.pl?id=1688933102&owner_id=21115565

  • 災害時情報リンク集:東北地方太平洋沖地震関連

    Twitter等で流れている災害情報の情報ソースと思われるリンクをリストします。間違いや追加はhttp://twitter.com/h_kurosawaまでお願いします。

    寄付関連
    mixi
    GREE
    DeNA(モバゲー)
    Tポイント 【PC】 http://bit.ly/etWywJ 【MB】http://bit.ly/feeSpL
    Yahoo! http://volunteer.yahoo.co.jp/donation/detail/1630001/index.html
    グルーポン http://www.groupon.jp/cid/7995/dtype/main
    Googleチェックアウト http://www.google.com/intl/ja/crisisresponse/japanquake2011.html
    goo募金 http://special.goo.ne.jp/donation_earthquake/

    安否情報伝言板
    docomo災害伝言板 http://dengon.docomo.ne.jp/top.cgi
    au災害伝言板 http://dengon.ezweb.ne.jp/
    SoftBank災害伝言板 http://dengon.softbank.ne.jp/
    ウィルコム災害伝言板 http://dengon.willcom-inc.com/dengon/Top.do
    イーモバイル災害伝言板 http://dengon.emnet.ne.jp/
    NTT東日本の安否確認伝言板 https://www.web171.jp/top.php または、電話で171
    Google Person Finder 2011 Japan http://japan.person-finder.appspot.com/
    iPhone災害用伝言板アプリ http://itunes.apple.com/jp/app/id425650996?mt=8

    交通
    Tokyo metro 東京メトロ運行情報 http://www.tokyometro.jp/unkou/
    JR東日本 http://www.jreast.co.jp/

    その他インフラ
    Google 自動車・通行実績情報マップ (データ提供:本田技研工業株式会社)http://www.google.com/intl/ja/crisisresponse/japanquake2011_traffic.html
    東京電力 http://www.tepco.co.jp/nu/f2-np/press_f2/2010/2010-j.html
    経済産業省 原子力安全・保安院緊急時情報HP http://kinkyu.nisa.go.jp/kinkyu/2011/03/200-9.html
    日本透析医会災害情報ネットワーク http://www.saigai-touseki.net/sendsdata/total.php
    Ibaraki foreign consultation service call 029-301-2862 English
    みちのく銀行 http://www.michinokubank.co.jp/

    大学入試
    3月12日・13日に実施が予定されていた大学入試(国公私)の対応について http://www.mext.go.jp/b_menu/houdou/23/03/1303579.htm
    茨城大学 http://daigakujc.jp/ibaraki/

    自治体
    市民の皆さまへの仙台市からのお知らせ http://www.city.sendai.jp/
    宮城県 消防機関及び連絡先一覧 http://www.pref.miyagi.jp/syoubou/shoubouhan/fs_list.htm
    宮城県避難情報http://www.pref.miyagi.jp/kikitaisaku/wagayade/hinan_bashoshin/hinan_top.htm
    Iwate Emergency Info / 岩手県 – 県内市町村避難場所 http://www.pref.iwate.jp/view.rbz?of=1&ik=0&cd=28306
    福島県避難所リストhttp://www.bousai.ne.jp/vis/jichitai/fukushima/refuge_frame.html
    Tokyo Emergency Info / 東京都防災ホームページ http://www.bousai.metro.tokyo.jp/mobile/m-emergency/index.html
    つくば市 http://www.city.tsukuba.ibaraki.jp/1330/008380.html
    市原市 http://www.city.ichihara.chiba.jp/
    長野県防災情報 http://www.pref.nagano.jp/kikikan/saigai.htm
    大洗町 http://www.town.oarai.lg.jp/index.html

    メディア
    Ustream: NHK http://ustre.am/vmCj
    Ustream: 日テレ http://ustre.am/vnel
    Ustream: TBS http://ustre.am/kJ3E
    Ustream: フジ http://ustre.am/iEG9
    Ustream: テレ朝 http://ustre.am/vnnn

    NHK radio in several languages. http://h.hatena.com/herbe/243597512623822452
    各地域のFM周波数 http://www.nhk.or.jp/fm/frequency/tvres5/h50303.htm
    radio frequencies http://www.nhk.or.jp/r1/amradio/tvres5/h50302.htm
    NHK公式Ustreamhttp://www.ustream.tv/channel/nhk-gtv
    NHKの各局被災状況まとめ http://www.nhk.or.jp/saigai/jishin/
    日経新聞 http://www.nikkei.com/news/article/g=96958A88889DE0E6EBE2E2EBE3E2E3E0E2E1E0E2E3E3E2E2E2E2E2E2

    その他まとめサイト
    twitterブログ:東北地方太平洋沖地震に関して http://blog.twitter.jp/2011/03/blog-post_12.html
    twitter携帯特設サイト http://twtr.jp/earthquake
    Google災害情報まとめページ http://www.google.co.jp/intl/ja/crisisresponse/japanquake2011.html
    Google ‎2011 Japanese Earthquake and Tsunami(English) http://www.google.co.jp/intl/en/crisisresponse/japanquake2011.html
    地震対策まとめサイト http://mblg.tv/enokiiii/entry/1/
    毎日.jp:東北・関東大地震のライフライン・交通などの情報 http://mainichi.jp/select/jiken/graph/20110311lifeline/
    【緊急掲載】ネットと電話を使う被災地の方との連絡手段まとめ(公的機関、NHKなどのリンク集)
    東北地方太平洋沖地震 @ ウィキ http://www46.atwiki.jp/earthquakematome/
    現状のデマまとめ。 http://www.yukawanet.com/archives/3598689.htm

    ツイッターアカウント
    青森県庁 http://twitter.com/#!/AomoriPref
    NHKニュース http://twitter.com/nhk_news
    NHK広報局 http://twitter.com/NHK_PR
    気仙沼市危機管理課 http://twitter.com/bosai_kesennuma
    IBC岩手放送 http://twitter.com/IBC_online
    総務省消防庁 http://twitter.com/FDMA_JAPAN
    岩手県広聴広報課 http://twitter.com/pref_iwate
    茨城新聞 http://twitter.com/ibarakishimbun
    i時事ドットコム http://twitter.com/i_jijicom
    岩手県知事 達増拓也 http://twitter.com/tassotakuya
    千葉県浦安市 http://twitter.com/urayasu_koho
    ラジオ福島 http://twitter.com/radio_rfc_japan
    朝日新聞社会グループ http://twitter.com/Asahi_Shakai
    茨城新聞 http://twitter.com/ibarakishimbun
    茨城放送

  • Test

    Hello Blogger

  • Adobe MAX Japan 2009/AS3でグラフィックス描画

    Adobe MAX Japan 2009 に参加。
    <!–more–>
    {smartads}

    Commodore64 や AMIGA を Flash の先祖だとして紹介していた講演が興味深い。Adobe のイベントでメガデモを観る事になるとは!ちなみに Ralph Hauwert という Papervision3D という 3D ライブラリの開発者の方である。氏は rePhlex という、いわばビジュアル版シンセサイザのようなものをもっか開発中のようで、こちらも注目である。

    ところで、最近の Flash 環境にはすっかりごぶさたです。今回のイベントがちょうど良いきっかけになったので、超久しぶりに Flash の勉強をやることにします。正味数年ぶりだと思うのでリハビリだなこりゃ。環境は CS3/ActionScript3.0 でいきます。描画周りはそれほど変わってないという認識なので、AS3 がメイン。

    <h2>ActionScript によるグラフィックス描画</h2>
    まずは ActionScript による単純な描画から。完全にスクリプトのみで、描画を行う事が可能。描画機構も AS3 で大きく刷新されたようである。

    以下のコードを新規ドキュメントの 1フレーム目、フレームアクションに記述する。ちなみに AS3 からクリップアクションは記述できなくなった。
    <pre lang=”Actionscript” line=”1″>
    var sp:Sprite = new Sprite();  //SpriteはMovieClip のタイムライン無し版(軽量)
    var bg:Shape = new Shape();  //ShapeはSpriteのaddChildできない版(最軽量)

    //表示リストに追加
    this.addChild(bg);
    this.addChild(sp);

    drawBackground(bg.graphics);  //背景Sprite描画
    drawSprite(sp.graphics);  //前景Shape描画

    // Shapeを移動する(センタリング)
    sp.x = (stage.stageWidth-sp.width)/2;
    sp.y = (stage.stageHeight-sp.height)/2;

    //背景Sprite描画
    function drawBackground(g:Graphics) {
    var m:Matrix = new Matrix();
    m.createGradientBox(stage.stageWidth, stage.stageHeight, 90*Math.PI/180);
    g.beginGradientFill(GradientType.LINEAR, [0x000000, 0x666666],[1.0, 1.0], [0, 255], m);
    g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
    }

    //前景Shape描画
    function drawSprite(g:Graphics) {
    g.lineStyle(4, 0x000000);
    g.beginFill(0xff0000, 0.5);
    g.drawEllipse(30, 0, 100, 100);
    g.beginFill(0x00ff00, 0.5);
    g.drawEllipse(0, 50, 100, 100);
    g.beginFill(0x0000ff, 0.5);
    g.drawEllipse(60, 50, 100, 100);
    g.endFill();
    }
    </pre>
    すると、結果はこうなる:
    <script type=”text/javascript” src=”/js/swfobject/src/swfobject.js”></script>
     <script type=”text/javascript”>
        swfobject.embedSWF(“/wp/wp-content/uploads/2009/02/as30graphicstest1.swf”, “swfEmbedded”, “250”, “250”, “9.0.0”);
        </script>
    <div id=”swfEmbedded”>
          <p>Alternative content</p>
    </div>

    ポイントは軽量な Sprite/Shape の導入、表示に追加するには addChild、描画するには各オブジェクトの graphics プロパティ経由あたり。細かい描画メソッドは、何か見ながら書けばよろしかろう。

    ちなみに this.addChild() している箇所、this を trace すると [object MainTimeline] が返り、root の trace も結果の表示は一緒なんだけど、root.addChild() しても同じ結果が得られなかったのは不明。だけどとりあえずは良しとする。オブジェクトの identity が見られると良いのだけど。

  • WSGIことはじめ

    WSGI (Web Server Gateway Interface) は Django や Google App Engine を始めたくさんの Python Web フレームワークが準拠している仕様で、これについての秀逸なチュートリアルの翻訳。日本語訳が秀逸かどうかは知らないので、怪しい部分は原文にあたって教えてください。

    WSGI ことはじめ
    ====================
    著者(Author): Armin Ronacher
    原文(Original Text): http://lucumr.pocoo.org/articles/getting-started-with-wsgi
    翻訳(Japanese Translation): hkurosawa
    ライセンス(Lisence): http://creativecommons.org/licenses/by-nc-sa/2.0/at/deed.ja
    ====================

    やっと論文も終わって、プロジェクトや記事を書くための時間ができた。
    ずっと書きたかったものの一つが、特定のフレームワークや実装を
    必要としない WSGI チュートリアルなんだ。さあ始めよう。

    wsgi-snake.png

    * WSGI ってなんだ?
    基本的に、WSGI はたぶんキミのしってる CGI よりも低層のものだ。
    だけど CGI と違うのは、WSGI はスケールするし、マルチスレッドでも
    マルチプロセス環境でも動作する、なぜって、これはどう実装されるかは
    ぜんぜん気にしてない仕様だからだ。事実、 WSGI は Web アプリケーションと
    ウェブサーバの CGI、mod_python、FastCGI または wsgiref と呼ばれる
    コアに WSGI を組み込んだ Python 標準ライブラリのスタンドアロンサーバ
    みたいな層の間に位置して、だから CGI とは異なる。

    WSGI は PEP 333 で定義されていて、有名な django や pylons を含む
    様々なフレームワークに適用されている。

    キミがサボって pep 333 を読まないなら、要約はこれだ:
    ・WSGI アプリケーションは呼び出し可能な Python オブジェクト(関数か、2つの引数を取る __call__ メソッドを持つクラス:1 つが WSGI 環境とレスポンスを開始する関数)。
    ・アプリケーションは与えられた関数でレスポンスを開始して、渡される項目が書き出しとフラッシュを意図するイテレータ(iterable) を返さないといけない。
    ・WSGI 環境は CGI 環境みたいなもので、サーバやミドルウェアからいくつかのキーが追加されたものだ。
    ・アプリケーションをラップすることでミドルウェアを追加できる。

    たくさん情報があるからとりあえずは無視して、基本的な WSGI アプリケーションを見ていこう:

    * 拡張版 Hello World
    これは単純だけど単純すぎるってことはない WSGI アプリケーションの例で、
    Hello World! の World を url パラメタで指定して出力できる。

    from cgi import parse_qs, escape
    
    def hello_world(environ, start_response):
        parameters = parse_qs(environ.get('QUERY_STRING', ''))
        if 'subject' in parameters:
            subject = escape(parameters['subject'][0])
        else:
            subject = 'World'
        start_response('200 OK', [('Content-Type', 'text/html')])
        return ['''Hello %(subject)s
        Hello %(subject)s!
    ''' % {'subject': subject}]
    

    見ると分かるけど、 start_response 関数は 2 つの引数を取っている。
    ステータス文字列と、レスポンスヘッダを表すタプルのリストだ。
    ここでもどこでも使われていないから分からないんだけど、 start_response 関数は
    ある物を返す。これは write 関数を返して、ウェブサーバの出力ストリームに
    直接書き込むことができるんだ。これはミドルウェア(これは後で触れるね)を
    迂回してしまうので、この関数を使うのは非道いアイデアだけど、
    デバッグ目的でなら便利に使える。

    だけど、このアプリケーションはどうやって開始する?
    誰もこの関数を呼んでないんだから、ウェブサーバはおろか
    Python だってこれをどう扱っていいか分からない。
    面倒だからここでは WSGI をサポートしたサーバの設定なんかしたくないけど、
    Python 2.5 以降にバンドルされている wsgiref というWSGI の
    スタンドアロンサーバを使うことができる。
    (Python 2.3 か 2.4 用ならダウンロードもできるよ)

    ファイルにこれを追加してみて:

    if __name__ == '__main__':
        from wsgiref.simple_server import make_server
        srv = make_server('localhost', 8080, hello_world)
        srv.serve_forever()
    

    ファイルを実行すると http://localhost:8080/?subject=John では
    Hello John! て出てくるはずだ。

    * パスのディスパッチ
    キミは、たぶん CGI とか PHP なら使ったことがあるよね。ならば、
    大抵はユーザがアクセスできる複数のパブリックなファイル(.pl/.php) が
    あって、それらで何かするということは知ってる。WSGI ではそうじゃない。
    全てのパスを処理するただ一つのファイルがあるだけだ。だから、
    さっきの例のサーバがまだ動いているなら、同じコンテンツを
    http://localhost:8080/foo?subject=John からでも見られる。

    アクセスされたパスは WSGI 環境の PATH_INFO 変数に、
    アプリケーションの実際のパスは SCRIPT_NAME に保存される。
    開発サーバの場合は SCRIPT_NAME は空かもしれないけど、
    http://example.com/wiki に wiki がマウントされていれば
    SCRIPT_NAME 変数は /wiki になるだろう。この情報で、幾つもの
    独立したページをステキな URL で提供することができる。

    この例ではたくさんの正規表現があって、現在のリクエストにマッチさせている:

    import re
    from cgi import escape
    
    def index(environ, start_response):
        """この関数は "/" にマウントされて、hello world のページ
        へのリンクを表示する。"""
        start_response('200 OK', [('Content-Type', 'text/html')])
        return ['''Hello World Application
                   This is the Hello World application:
    continue
    ''']
    
    def hello(environ, start_response):
        """上の例と同様だけど、URL で指定した名前を使う。"""
        # 存在すれば、url から名前を取得する。
        args = environ['myapp.url_args']
        if args:
            subject = escape(args[0])
        else:
            subject = 'World'
        start_response('200 OK', [('Content-Type', 'text/html')])
        return ['''Hello %(subject)s
                Hello %(subject)s!
    ''' % {'subject': subject}]
    
    def not_found(environ, start_response):
        """URL が何もマッチしないときに呼ばれる。"""
        start_response('404 NOT FOUND', [('Content-Type', 'text/plain')])
        return ['Not Found']
    
    # URL を関数に割り当てる。
    urls = [
        (r'^$', index),
        (r'hello/?$', hello),
        (r'hello/(.+)$', hello)
    ]
    
    def application(environ, start_response):
        """
        WSGI アプリケーションのメイン。上から順番に現在のリクエストを
        関数にディスパッチしてからその正規表現は 'myapp.url_args' として
        WSGI 環境に保存して、上の関数がこの url プレースホルダに
        アクセスできるようにする。
        何もマッチしなければ、'not_found' 関数が呼ばれる。
        """
        path = environ.get('PATH_INFO', '').lstrip('/')
        for regex, callback in urls:
            match = re.search(regex, path)
            if match is not None:
                environ['myapp.url_args'] = match.groups()
                return callback(environ, start_response)
        return not_found(environ, start_response)
    

    けっこうあるね。だけど URL ディスパッチがどう動くか分かると思う。
    基本的には、http://localhost:8080/hello/John にアクセスすると
    よりカッコいい URL で上と同じ結果になって、間違った URL を入力すると
    404 エラーのページになる。今度はこれをずっと改善して、
    environ のリクエストオブジェクトへのカプセル化と、
    start_response 呼び出しと返すイテレータのレスポンスオブジェクトへの
    置き替えをしてみよう。これは werkzeug や paste みたいな
    WSGI ライブラリもしていることだ。

    環境に何かを追加することで、僕たちはミドルウェアが通常やっていることができる。
    だから例外をキャッチして、それをブラウザに書き出すものを書いてみよう。

    # トレースバックの取得とレンダリングに必要なヘルパー関数のインポート
    from sys import exc_info
    from traceback import format_tb
    
    class ExceptionMiddleware(object):
        """使用するミドルウェア"""
    
        def __init__(self, app):
            self.app = app
    
        def __call__(self, environ, start_response):
            """例外をキャッチできるアプリケーションの呼び出し"""
            appiter = None
            # 単にアプリケーションを呼び出して、例外をキャッチする以外は
            # 出力を変更しないで戻す
            try:
                appiter = self.app(environ, start_response)
                for item in appiter:
                    yield item
            # 例外が発生した場合、例外情報を取得してレンダリングできる
            # トレースバックの準備をする
            except:
                e_type, e_value, tb = exc_info()
                traceback = ['Traceback (most recent call last):']
                traceback += format_tb(tb)
                traceback.append('%s: %s' % (e_type.__name__, e_value))
                # ここまでで、レスポンスを宣言していないかもしれない。
                # ステータスコード 500 で応答してみて、もう応答済みならば
                # 発生する例外は無視する。
                try:
                    start_response('500 INTERNAL SERVER ERROR', [
                                   ('Content-Type', 'text/plain')])
                except:
                    pass
                yield 'n'.join(traceback)
    
            # wsgi applications might have a close function. If it exists
            # it *must* be called.
            # wsgi アプリケーションには close 関数があるかもしれない。
            # ある場合は呼び出し *しないといけない* 。
            if hasattr(appiter, 'close'):
                appiter.close()
    

    では、このミドルウェアはどうやって使うか?WSGI アプリケーションが前の例みたいに
    application な場合、ラップすれば良い:

    application = ExceptionMiddleware(application)
    

    これで、発生する例外は全てキャッチされてブラウザに表示される。
    もちろん、まさにこのことプラスより多くの機能をやってくれるライブラリは
    たくさんあるからこれをする必要は無いんだけども。

    * デプロイ
    アプリケーションが “完成” したのでこれをどうにかして本番サーバに
    インストールしなきゃいけない。もちろん mod_proxy の後ろで wsgiref を
    使うこともできるけど、もっと洗練された方法だってあるんだ。多くの人は
    WSGI アプリケーションを FastCGI 上で使う方法を好む。flup が
    インストールされていれば、キミがやることは myapplication.fcgi を
    定義するだけだ:

    #!/usr/bin/python
    from flup.server.fcgi import WSGIServer
    from myapplication import application
    WSGIServer(application).run()
    

    apache の設定はこんな風になる:

    
        ServerName www.example.com
        Alias /public /path/to/the/static/files
        ScriptAlias / /path/to/myapplication.fcgi/
    
    

    静的ファイル用の節もあることが分かる。もし開発途中、
    WSGI アプリケーションの中で静的ファイルも提供したい場合には
    いくつかのミドルウェアが利用可能だ。
    (werkzeug、paste と Luke Arno のツールの “static” もこれを提供している)

    * NIH / DRY
    “Not Invented Here(自家製じゃない)”問題を避け、同じことを何べんも繰り返さないこと。
    既存のライブラリとユーティリティを利用せよ!でも多すぎて!どれを使おう!オススメはあるよ。

    ** フレームワーク
    Ruby on Rails が登場してからというもの、みんなフレームワークの話をしている。
    Python にもメジャーなのが 2 つある。1 つはモロモロをすごい
    抽象化した Django と呼ばれているもので、もう 1 つは WSGI にずっと近い
    Pylong と呼ばれているものだ。Django はアプリケーションを配布しないならば
    ヤバいフレームワーク。Web ページを一瞬で作る時。一方で Pylons は
    デベロッパの作業を必要だけどデプロイはずっと簡単だ。

    ** ユーティリティライブラリ
    多くの場合、全部入りのフレームワークは必要ない。それはキミのアプリケーションには
    大きすぎるか、フレームワークで解決するには複雑すぎる。(フレームワークで
    なにを解決してもいいんだけど、フレームワークの「助け」を借りないよりもずっと
    ややこしくなり得るんだ)。

    こんな時のためにいくつかのライブラリがある:
    ・paste — Pylons の舞台裏で使われている。request と response オブジェクトを実装している。
    たくさんのミドルウェア。
    ・werkzeug — pocoo のために書いた最低限の WSGI ライブラリ。unicode 対応の request / response
    オブジェクトと先進的な URL マッパ、インタラクティブデバッガを備える。
    ・Luke Arno’s WSGI helpers — Luke Arno による独立モジュールでの様々な WSGI ヘルパー。

    ** テンプレートエンジン
    ボクがよく使い、推薦するテンプレートエンジンのリスト:
    ・Genshi — 世界最高の XML テンプレートエンジン。でもちょっと遅くて、だから
    本当に良いパフォーマンスが必要なら別なものにしないといけない。
    ・Mako — バカ速いテキストベースのテンプレートエンジン。これは
    ERB、Mason、Django テンプレートのミックスだ。
    ・Jinja — 安全でデザイナー向けでかなり速い、テキストベースのテンプレートエンジン。
    モチ個人的にはこれを選ぶ:D

    * 結論
    WSGI スゲー。簡単に個人的なスタックが作れる。
    複雑すぎると思う場合は werkzeug や paste を見てみれば、
    問題を制限なくずっと簡単にしてくれる。

    この記事が役立つことを望みます。

  • Pythonのtraceモジュールの補記

    Python ドキュメント翻訳プロジェクトの libtrace に取りかかっているのだけど
    説明が少ないのでいくつか試してみたメモ書き。間違っていたら指摘してください。
    (more…)