2013-08-02

PyCon APAC 2013で発表できる事になりました

タイトル通りなのですが、採用通知を頂きましたので、今年のPyCON APACで発表できる事になりました。
錚々たる面々が「落選した」と言っている中なので、ホントにこれでいいの?なんてガクブルしていますが、折角の機会なので、実のある発表が出来るようにがんばります。
内容はこんな感じです。



Talk title(Require, Public):
Webセキュアコーディングの基本

Abstract(Require, Public):
Webフレームワーク上でアプリケーションを書いているだけでは、なかなか身につけることができない、脆弱性のメカニズムとその対策方法について、コード例を元に解説します。

Outline(Require):
昨今Javascriptにもビジネスロジックレイヤーが実装されるにしたがってCSRF, Click Jackingなど、WebサーバーとWebブラウザーの両方にまたがるセキュリティを意識せざるを得なくなってきました。
このセッションは、Webフレームワーク上でアプリケーションプログラムを書いたことがあるというレベルの開発者を対象に、XSS, SQL Injectionなどの古典的なサーバーサイドセキュリティ対策に始まり、ブラウザー上の環境も含めたセキュリティについて解説することで、フレームワークが担保する範囲を越えた箇所でやってしまいがちな脆弱性の埋め込みを指摘します。

Topic(Require, Public):
Web-based Systems
その他: Security

Timeslot(Require, Public):
Standard

Intended audience(Public):
Beginning programmer

Language of talk(Require, Public):
Japanese



実は、もう一本CfPを提出していて、こっちが本命だったのですが落選でした。改めて読み直すと訴求できてない書き方だし仕方ないよなあ。
どこかで話せる場所があれば、こいつもやりたいと思います。



Talk title(Require, Public):
アプリケーションの多言語化と地域化

Abstract(Require, Public):
使いたいアプリケーションがあるのに母国語が使えなかったり、表示が母国語ではない場合。
逆に、使っているアプリケーションを他の言語圏の人にも使って貰いたい場合に、どのようにすればいいのか解説します。

Outline(Require):
翻訳リソースファイル (po) がある場合の翻訳の方法。
語順、アプリケーションでの置き換えなどの翻訳リソースファイルの注意点。
言語、ロケール、gettextの基本的な解説と実アプリケーションに適用する方法。
など、これまでいくつか日本語化をしてきた事例を元に解説する。

Topic(Require, Public):
Internationalization

Timeslot(Require, Public):
Standard

Intended audience(Public):
Intermediate programmer

Language of talk(Require, Public):
Japanese

2012-12-15

KottiではじめるPyramid

この記事は2012 Pythonアドベントカレンダー (Webフレームワーク)の15日目エントリです。
今日はマサカリを投げあうモヒカンどもが大好きなPyramidについて書いてみようと思います。どうでもいい話ですが、Pyramid Tシャツがアメコミ的HAHAHAな感じなので、とても欲しいです。

Pyramidにはとても良くできたチュートリアルがあるので、なにはともあれ、こいつをやっつけて下さい。Step by stepの形式でインストールから最初のアプリケーション作成、そして作ったアプリケーションをテストするところまで教えてくれます。さすがはテストカバレッジの高さが当たり前のプロダクトですね。
続いてドキュメントを読みながら、チュートリアルで写経したアプリケーションを改造しつつ、Pyramidが用意しているAPIに習熟するのがよいでしょう。今から始めれば年明けくらいには全部読み終わることができると思います。

で、ここで困るはず。

Pyramidはフルスタックのフレームワークではないので、少なくとも永続化層に関しては、どう作るのか自分で考えないといけません。DjangoとかRailsとかのフルスタックフレームワークにどっぷりはまりこんでいて「とりあえず型通りに作れば、それなりに動く」というのを求めている人には、あまり向かないと思います。

さて、現実に使い物になりうる複雑さを持つアプリケーションを書こうとすると、永続化やキャッシュ、外部サービスとの接続など、他のフレームワークとのGlueを行うことになります。インデックスページには、そういう他のフレームワークと繋ぐためのモジュールも紹介されていますが、これの学習コストが思いの外高くつくので、お手本になるようなアプリケーションが欲しくなってきます。
欲しくなってきましたね?

そこでKottiです。 (いつの間にか日本語のページもできていた)

KottiはPyramid上に構築された軽量CMSです。実際のところ、WYSIWYGエディタ付きのページコンテナ程度に考えておいてもいいです。その分コードサイズは小さくて、全部読んでも1日かからないので、とてもお手頃です。
インテグレートしているライブラリは、永続化層にSQL Alchemy、セッション管理にBeaker、テンプレートエンジンはChameleon、フォームにはDeformを使っています。メール送信の機能もあります。認証、権限管理、キャッシュはPyramidのビルトインが使われています。
コードリーディングするだけで、これだけのお手本が手に入るわけです。
軽量CMSはどんなWebサイトでも一定の需要があるので、そのまま使うのもいいかもしれません。KottiはPyramidの拡張機能でKotti自身を拡張できるので、Kotti上で自分のアプリケーションを書くこともできます。また、Fanstaticが組み込まれているので、同じWSGIサーバーにKottiに並列してアプリケーションを配置することも可能です。

では早速インストールしてみます。

BASH$ virtualenv somevenv
BASH$ cd somevenv
BASH$ bin/pip install Kotti

簡単でいいですね。インターネット接続があって、PyPIが落ちていなければ、ですが。
では動かしてみましょう。

BASH$ mkdir /path/to/somewhere
BASH$ cd /path/to/somewhere
BASH$ curl -LO https://raw.github.com/Kotti/Kotti/master/development.ini
BASH$ /path/to/somevenv/bin/pserve development.ini

アプリケーションコード以外で必要なのは、PasteConfigのファイルが全てです。データベースや、ログ出力先や、SMTPサーバーの設定などは、この.iniファイルに書き、実行時に指定します。どんな設定項目があるかはドキュメントとかコードを見て下さい。
とりあえず、SQLログがうざいので "[logger_sqlalchemy] level = INFO" をWARNあたりにしておくことをおすすめしておきます。あと、"[app:kotti] pyramid.default_locale_name = en" をjaにすると、いろいろ日本語になります。

Webブラウザで http://127.0.0.1:5000/ を叩くとこんな感じのページが出ます。

皆さんおなじみBootstrapです。このページは既にCMSの中なので、自分で編集したりできます。編集にはログインが必要なのですが、ここで使う初回ログインは最初から作られている "admin" ユーザーで、Configファイルの "[app:kotti] kotti.secret = ***" に設定されているパスワードを使って下さい。

後は自力でどうにか。

1日目の@hirokikyも書いている通り、「チュートリアルが終わった後に、何をすればいいのか」というのは、いつになってもなかなか難しい問題です。
私はPyramidの初期学習時にKottiを使ってみる、読んでみることで、習得が早くなったような気がするので、Pyramidが難しいなあと思っている人は、こっちKottiの方から入ってみるのもいいかもしれません。

明日の2012 Pythonアドベントカレンダーは@yamionpがDjangoのclass based viewについて書くようです。class based viewは稀によく使うので楽しみですね。

2011-07-09

Stay alert, trust no "Py3k ready", keep your pdb handy

Python mini Hack-a-thonに行ってきた。
Python3で何か動かすところまでやろうとして挫折したメモ。

ベースの環境はMacPortsのpython32, py32-distribute, py32-virtualenvを使った:
  • python32 @3.2_2+no_tkinter+universal
  • py32-distribute @0.6.19_0+universal
  • py32-virtualenv @1.6.1_0+universal

1. VirtualEnvは大丈夫
virtulenvは動く。というよりも、これが動かないと話にならん。

2. pipコマンドが動くと思うな
たいていは動くんだけど、時折入れられないパッケージがある。
バージョン比較とかをするところでintとstrを比べようとして落ちるケースが非常に多い。
次に多いのはsetup.pyにprint文が入っているケース。
PyPIのインデックスはバージョンごとに分かれている方がいいんじゃないかなあ、と思ったりするわけです。

3. buildoutだめ
http://pypi.python.org/pypi/zc.buildout/2.0.0a1を見るとbootstrap.pyを拾ってきて使えとあるけど、pipと同じようにバージョン比較だの何だのでよく落ちる。
2.0.0a1を使っているはずなのに、途中で1.5.2のeggがインストールされていたりとかrecipeがPython3で動かないとかが当たり前のように起きるので、今のところ全く使えないと思った方がよい。

4. フレームワークはtornadoくらい
「何か」動かすと言っても、素で書いたやつで動かしたって、きょうび意味ないのでWebフレームワークの系統をアレコレ見てみたけど、Zope, Django, Pylons, Werkzeugあたりが全滅状態。 (ここ見るとよい http://python3wos.appspot.com/)
tornadoが動くっぽい所までは見た。全部の機能を動かしたわけではないけど、もともと小さいフレームワークだし対応が早かったんだろうなあ。
逆に言うと重量級のフレームワークが移植されるのは時間がかかること必至なので、マイクロフレームワーク全盛期がPython3の時代になっても続くのかもしれん。
そういう意味ではチュートリアル本もPython3ベースに移行しつつあるけど、なにか作ってみましょうというところで有名どころのフレームワークを使えない状況が続くとなると、兎も角も現時点で使えるフレームワークで書くことになると思うので「ZopeからPythonに入りました」とか「DjangoからPythonを始めました」なんていうクラスタが無くなって、tornadoとか、まだ見ぬマイクロフレームワークとかからPythonに入ってくる人が増えるのかねえ。
増えるわきゃないか。RubyはRailsが1.9で動くようになっているので、ZopeとかDjangoとかが動かないっていう所で、Pythonista人口の今後の変動に影響があるかもね。

5. Jinja2, SQLAlchemyはいける、IPythonがないのが地味につらい
足回りのライブラリは徐々に対応が進んでる感じだった。pytz, Jinja2, SQLAlchemyあたりが動くのは単純にうれしい。
IPythonが動かないので、素のインタプリタを1日使ったのだけれど、例外吐いたりしたときに調べるのが大変だったり、help見るのが面倒だったりして地味につらかった。IPythonは早くPy3k移行が進んでほしい。

6. SQLAlchemyからMySQLに繋がらない
これがトドメ。2-3個ドライバを変えて試したけど全部例外に落ちてしまった。ここ見るといくつか通るはずなんだけどね。statementにstrを期待されているところで、なぜかbytesになっていたり、bytearrayになっていたりで変数置換落ちする。
"Py3k ready"となっていても、実際には3.1までで、3.2じゃ動かなかったりとかそういうのなのか。

という感じで、作業環境をPython3に移行可能かという調べ物は、4時間ほどで頓挫。
失敗した記録として残しておく。

2011-03-31

Merlotをインストールして動かす

Mac OS Xで Merlot を動かすためのメモ。
Installing Merlot のドキュメントに書いてある通りで動くけど、せっかく日本語にしたので開発ブランチを使ってみましょう。
Google CodesにあるMercurialリポジトリをミラーして、VirtualEnvを組んで、buildoutを叩いたらインストール終わり。

一応コマンドリストだけでも書いておく:

$ hg clone https://merlot.googlecode.com/hg/ merlot
$ virtualenv --distribute --no-site-packages merlot
$ cd merlot
$ source bin/activate
$ python bootstrap.py
$ buildout

ここで、なぜかmechanizeのインストールに失敗することがある。エラーを見るにアーカイブをダウンロードしているときのレスポンスヘッダでContent-Lengthが"382313, 382313"みたいな感じでカンマ区切りで2個帰ってくるのがパースできないらしい。
RFC2616を見てみたところ、Content-Lengthヘッダは1*DIGITで書かなきゃいけないので、まあ、お行儀の悪いWebサーバーなのだろうけど、インストールプロセスが止まっちゃうのは困る。
なので、distributeのコードにパッチして無理やり通してしまった。virtualenvだと、こういう時にためらわずできていいね。

--- eggs/distribute-0.6.14-py2.7.egg/setuptools/package_index.py.orig     2011-03-26 15:00:28.000000000 +0900
+++ eggs/distribute-0.6.14-py2.7.egg/setuptools/package_index.py     2011-03-26 15:23:07.000000000 +0900
@@ -566,7 +566,10 @@
             bs = self.dl_blocksize
             size = -1
             if "content-length" in headers:
-                size = int(headers["Content-Length"])
+                try:
+                    size = int(headers["Content-Length"])
+                except ValueError:
+                    size = int(headers["Content-Length"].split(",")[0])
                 self.reporthook(url, filename, blocknum, bs, size)
             tfp = open(filename,'wb')
             while True:

で、パッチしたらもう一度buildoutを打つ。


$ buildout
$ merlot

merlotコマンドを打つと、grokフレームワークの簡易サーバが立ち上がるので、Webブラウザで 127.0.0.1:8080 にアクセスする。基本認証を聞かれるので、admin:adminで突破。このページはgrokフレームワークの管理画面らしくて、ホスティングするアプリケーションを追加、削除するためのもののよう。

"Name and create a new Merlot application" の所に適当に名前を入れて"Create"すると、インスタンスができる。名前はURLのトップディレクトリに使われるので、そこだけ気にすればよさそう。
とりあえずmerlotという名前で作ったことにする。

"Installed Applications" に新しくできたリンクをたどるとMerlotの世界へ。


こんな感じのトップページが来る。
この状態だと、rootディレクトリで打ったadminユーザーの基本認証を引き継いで動いているので、"ユーザー"タブから新しいユーザーを追加して、一旦ブラウザーを閉じてしまう。"ログアウト"はフォームで認証したときにCookieを消すだけなので、基本認証では効かない。次からのアクセスでは基本認証を使いたくないので、URLには 127.0.0.1:8080/merlot を使うこと。
この後は、"クライアント"を作って、"プロジェクト"を作って、"タスク"を作って、"ログ"を記録する。という流れになるんだけど、くわしくは次の記事で。

ところでWindowsを持っていないので動かしていないけど、誰か環境つくって手順もあるなら教えてください。

2011-03-27

Merlotに手を出してみた

第6回Python mini Hack-a-thonに行ってきた。
作っただけで放置しているプライベートプロジェクト某とか、同某とかの再開準備をしようかと思っていたけど、朝出掛けにこんなTweetを見てちょいと使ってみようかという気になったので、バージョン0.1が出たばかりのMerlotというアプリケーションに手を出してみた。"Project Management Software"なので、てっきりBTSを想像していたら、Timing and Estimateに特化したタスク管理ツールで、「クライアント (Client) < プロジェクト (Project) < タスク (Task) < ログ (Log)」という構成でタスクごとに使った時間を収集するようになっている。
Version 0.1で実装済みなのはデータ入力の部分が中心で、特にWorkLogの所はAjax実装とかもあってどんどん入力できる感じになっている (でも、消化時間の計算が入力直後に連動してなかったりするところが若干残念)。レポーティングはスクリーニングが取れるだけでまだまだこれからというところか。各モデルの属性も必要最低限な項目があるくらい。プロジェクトのロードマップもないので、今後どういう方向に拡張していくつもりなのかは、まだよく分からないけど、レポーティングの強化とか他のツールとの連携とかができるようになっていくんじゃないかなあ、と触ってみて思った。
いずれ多数顧客の多数プロジェクトでROIとかを計ろうとかいうことに完全に特化しているので、ニーズがばっちりはまるケースでは、現状のバージョンでも使えるように思える。画面は結構きれいだし。
実装言語はPythonでzope3派生のgrokというフレームワークで作ってあるっぽい。zopeもgrokも今まで使ってなかったので中身の作りを見るのはこれからだけど、poファイルを見つけたのでとりあえず日本語カタログを作って送りつけてみた。メッセージ翻訳周辺のツールはzc.i18nとかPasteScriptとかzc.buildoutで整備されていたので純粋にpoファイルを翻訳することに集中できたのは最近のツールの特徴になるのかなあ。中身のコードはというと、はじめて使うフレームワークだし周辺ツールも使ったことがないパッケージが大量にあるので、まだ全然見られていない。これから調べつつ順次見ていくという事になると思う。パッチとかも書いていくなら本格的にMercurialの使い方を身につけないといかんし。
今日一日で動かすだけはやってみたので、折を見てインストールの方法とか、ジャンプスタートとか、開発環境の作り方とか書いていく予定。今日は速報ということで。

2010-11-23

Mac Book Airを買った

今まで3年近く前に買ったポリカMac Book黒を使ってたんだけど、持ち運ぶ機会が増えたなあと思っていたら、うっかりApple Store Ginzaで気絶したらしく、ふと気付くと手元にMacbook Airがあったり。

MBKを買った時のエントリを見るに、Airの登場を見た上で用途に合わずと切り捨てて買ったようなので、今回は用途に足りたので購入まで行き着いたんだろう。余談になるけど、そのエントリでロケートしてる、同時期にMBK買ったってリンクした人がHTML5の白石さんて事に気付いてちょっと恥ずかしい。その後、全然違う経緯で白石さんの事を知る事になったんだけど、この時は全然知らなかったなあ。

冷静に考えてみるに、仕事変わったりしても、手元で使うコンピュータに対する要件って言うかスタンスは、*nixベースで持ち運べてメディア関係もそこそこ行けるって所から、そんなに変わってない気がする。変わった事はといえば、3年前よりもさらにOffice suiteには触らなくなって、Webブラウザとターミナルだけで済んでしまうようになった事かと思う。会社変わってからは下手すりゃOffice使わない日が半分くらいあるもんなあ。
あと、iPod TouchとかiPhoneを買ったのも大きくて、Webとかメールのチラ見にいちいちパソコン使う事がなくなった。
で、プラットフォーム的な要件は最終的に、iPhoneのバックアップが出来て、じっくりもの書いたりコーディングできればいいや。と言う所まで来てしまっている気がする。
そういう意味では集中できる場所なら何処でも持って行きたいんで、性能と重さのバランスって大事かなあ。その点でWindows+VMとかはオーバーヘッドがまだ出てしまうので、選択肢からは外してしまう。

そこで新しいAirですよ。前の時はあまりのスペックと値段に閉口して全力回避したけど、3年近くを経たMBKと比較すると、解像度が上がり、性能が良くなり、軽くなり、安くなる、という感じで残念感を持たせない、いいアップデートなんじゃないかと思ってしまう訳だ。現行のMBP13と比べてもCPU以外は上に行っちゃったし。とは言っても、持ち運ぶ機会というパラメータがなきゃ買わなかっただろうなあ。ま、こういうのは勢いなんでしょう。

で、3年おきくらいで買い換えている事になるんだけど、次はどういう理由で買うんだろうねえ。
DropboxとかSkyDriveとかiDiskとかあるから容量の問題はあまり起きないし、AWSがあるから本当に重たい処理は外で動かせばいいしで、今のままの用途だとWiMAX内蔵くらいしか思いつかないから、きっと接続性とかになるのかと皮算用的に推測してみる。
iTunes on Cloudみたいなサービスが一般的になっていて、iPhoneが単体運用できるようになってたら、Mac以外の選択肢も現実味があるなあ。

2010-11-05

jQueryをロードするbookmarklet

ときどき、どうしても$("textarea").resizable();したくなったりするときがあるわけで、ブックマークにこんなのを転がしておいて久しい。
javascript:(function(w,d){var%20h=d.getElementsByTagName("head").item(0);var%20appendScript=function(d,h,u){var%20s=d.createElement("script");s.charset="UTF-8";s.src=u;s.type="text/javascript";h.appendChild(s)};var%20c=w.$;if(!w.jQuery){appendScript(d,h,"https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js")}if(c){jQuery.noConflict()}if(!w.jQuery.ui){appendScript(d,h,"https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js")}})(window,document)

2010-03-28

花見にはこれを買え

嫁ガキを東京駅まで送ったついでに弁当屋を除いたら、ふぐひれ酒の缶を見つけたので購入。
ヒーター内蔵で「これでどこでも熱燗!」の一品。
まぁ味はそこそこ程度だし、つぎ酒を楽しめない欠点はあるけど、なにせ暖かいので夜桜花見には良さげ。

2009-11-11

飽きたらさぼるのが続けるコツらしい

家にテレビは一台しかなく、チャンネル係争に巻き込まれるのをよしとしない。と言うと格好良さそうなので、そういうことにしておく。面倒臭いときに無理して続けるとたいてい碌なことがない。ということで数日ぶりに量ってみた。

体重: 77.0kg
BMI: 24.86
バランス年齢: 48歳
昼: 日本海の日替わり定食(三色丼)
夜: 肉じゃが, シーチキンサラダ, 納豆, ごはん, なめこの味噌汁

珍しく夜は一部でおわり。空腹に耐えた一日であった。

2009-11-07

読書タイムすら飲み屋でとるのは病気だと自分でも思う

駅の本屋にふと立ち寄ったら垣根涼介の文庫新刊が出ていたので購入。そのまま一人呑み読書タイムに突入。垣根は登場人物にやさしいよね。よく殺すけどさ。まぁ新刊は切った張ったという系統ではないのでじわじわ飲み読みしてきた。もう少しちゃんとした椅子がある読書バーとかないものか。
ということで、今日も測定のみ。

体重: 76.7kg
BMI: 24.76
バランス年齢: 32歳
昼: 刺身てんぷら定食
夜一部: スパークリング2杯, ワイン6杯, ハモンセラーノ, 豚のトマト煮
夜二部: ご飯, 味噌汁, ひじき煮物, エビチリ

記憶力テストとかだとそこそこ行けるようだ。