2012年9月30日日曜日

appengine python27 threadsafe:true

先日、python2.7環境で「動かしただけ」のappengine アプリケーションを、本格的に threadsafe:trueを試してみました。

例によって、情報は足りてるのですが、英語のドキュメントを読んでも今ひとつ要領を得ません。

早い話がこうです。

  • threadsafe:trueにしたら
    • app.yamlは
      • actionsの拡張子はすべて"app"にしなければならない
      • いや?*.pycじゃね?と思うかも知れませんが、カンケーないらし。
    • 個々の*.pyは
      • import webapp2
      • webapp2.WSGIApplicationの変数名を、必ず"app"にしなければならない
        • yamlの*.appってそういう意味????
      • 直接、深いディレクトリの*.pyを起動することは出来ない。
        • ひょっとして、modulename.modulename.app とか書けばいいのか??

PSVITA 「データベースの再構築」

色々体験版を降ろして試してみようかと思ったら、メモリカードの空きがないとか言われて、32GBのカードなのに、残り16MBとかないとかパツンパツン。よく使ったなオレ。

2012年9月20日木曜日

HTMLエスケープ in Python2

HTMLエスケープをせざるを得なくなりました。

urllib.unquoteで出来るよって?違うそれは「URLエンコード」別件です。紛らわしいよHTML業界。

  • HTMLエスケープは、特殊文字とHTMLタグを避けるための小細工
  • URLエンコードは、特殊文字を、HTTP GETクエリストリングを避けるための小細工
小生が今知りたいのは前者です。なぜなら後者は有名だから。
結論から言うと、次のうち幾つか。らしい。


別パッケージを入れなきゃならんのは色々アレなので、

  • from xml.sax.saxutils import escape,unescape

辺りで行ってみようかと

2012年9月16日日曜日

gitに移行するのは、「mercurialの◯◯が嫌いだ!」と言えるようになってからでいいと思うよ

git、使ってますよ。

githubとかgistは使ってるので、どうしても使わざるを得ません。元々はbitbucketで追いかけてたオープンソースがgithubに移行したので仕方なく、でしたが、実際、gistも便利ですしね。

分散バージョン管理、数ありますが、容易度(難易度ではない)で言うと。

bzr? > mercurial >>>>越えられない壁>>>git

いや、実際、判らないですよ。git

出稼ぎ先のスタッフは、mercurialでの運用には、2週間で概ね慣れてくれました。実際簡単です。トータスHGの存在は割り引いて考えるにしても。

小生が使い始めたのはmercurialが0.7まで遡りますが、コマンドライン数回叩いて、納得できましたから。subversionに極力「似せてる」のもポイントですね。 pushは、簡易なデプロイ機能として使えますし、オマケに現地でのパッチをスムーズに吸い上げることが出来る!こりゃ凄い。てなもんでさ。

機能的にはgitでも勿論出来ますが、

問題は、「出来るか否か」ではありません。
「使うことがメリットになるか(厳密には使いこなせるか)どうか」です。
使いこなせない機能は「存在しない」も同じ。

gitの判りにくさの原因の一つは、異なるコンテキストの「省略語の管理」が、表面上同列に扱えてしまうところだと思う。

git push origin remote

とか。せめてこう書いてくれれば解るのですが

git push -b origin -r remote

どこが違うのって?まあそうね。心の準備をさせてよ!ってところでしょうか。

originもremoteも、いずれも暗黙の省略後。「設定した覚え」がないのに使え、って言われてもピンと来ません。 何度か .git/configを手で書き換えたことがあるほどですよ。

まあ要するに、「gitに移行するのは、「mercurialの◯◯が嫌いだ!」と言えるようになってから」でも遅くはありません。

実際、gitのオススメ記事は「mercurialには出来ないけど、gitには出来ます!」的な物言いが多い。気持ちは解ります。小生だって同じ立場ならそうする。でもそれを聞いてもピンと来ません。mercurialに不満がないからね。

最後の、gitの嫌いなところを明記しておきましょう。

git講座のどこを見ても「履歴を綺麗にする」というフレーズが見当たります。「チェンジセットのガベージコレクション」??? 参照してようがいまいが、履歴を削除しちゃいかんだろうと。正直、「仕事」ではやっちゃいかんと思う。どちらが正しいか。という議論をする気は毛頭ありません。これは「正義」の問題なので。オープンソースなら問題ありません。「趣味」だから。※もちろん「趣味」を馬鹿にしてるわけでもない。

2012年9月15日土曜日

app engine python27に移行

訳あって、app engine アプリケーションを製作中。当然pythonです。

で、tumblpyが、python2.7ベースで出来てることもあり、
https://github.com/michaelhelmick/python-tumblpy
ヨクヨク見たら、appengine もpython2.7で稼働できるらしく、
じゃあ移行してみようかと。

結論から言うと、ハマりますね。オフィシャルドキュメントを読んでも散漫でよくわからない。情報量は足りてるのですが。

  • アプリケーションインスタンス設定
    • High Replication Datastoreである必要があります。
    • そんな難しい話じゃなくて、https://appengine.google.com/ のStorage Schemeの欄を参照。
    • 残念ながら駄目だった場合、新規にアプリケーションを作成する必要があります。1個損した気分。
      • 同じ個数をDisable/Deleteそれば、総数は相殺するらしい。
    • ドキュメントには application idに"-hrd"を付けてね!とか書いてあるけど、これは移行するときに、id名の重複を懸念してのアドバイスであって、本質的には「設定」の問題。
      • 新規(Create Application )の場合でのみ、Storage Optionが選択できる。
        • High Replication(default) と Master/Slaveが選べるらしい。
          • 前者がdefaultになってるし、後者はdeprecatedなので、わざわざ選び直す意味はないと思われる。
  • app.yaml
    • runtime: python27
    • threadsafe: false
      • 無論、trueが望ましいと思われるが、実装に依存する可能性もあり、怖気づいたので。
  • wsgiref
    • os.path.dirname(__file__) != "."
      • テンプレートの読み込み等で、カレントディレクトリ前提に書いちゃってる部分は、フルパスを補う必要があり。
    • self.respone.writeの引数に、strしか受け付けない
      • assert type(data) is StringType,"write() argument must be string" AssertionError: write() argument must be string とか面妖なエラーメッセージに化けて迷宮入りします。
      • self.response.write( str(html1) ) とかで解決することはする



2012年9月9日日曜日

自動操作 expect tcl

出稼ぎ先の案件で、サーバ40台更新とかあります。

クラウドな昨今では、少ない方だとは思いますが、インフラ管理が、発注元なので、かなり勝手が違います。要するに、自動化/合理化がしにくいシチュエーションです。

具体的な作業は小生ではありませんが、slogin/sudo合わせて、100回近くパスワードを打ってるのは、端から見て大変過ぎます。見かねて先方に、authorized_key入れていいですか?と聞いたら断られて、代わりにexpectでナントカしてと言われまして。そーいや10年ぐらいまえにも聞いたことあるぞと。

仮にauthorized_keysを入れたとして、リモートの向こうのsudoはどうにもなりません。前の前の出稼ぎでは、root同士でauthorized_keyしてたらしい。やったのは小生じゃないです。ただこれネットワーク管理的にNo Goodであるのは大いに納得できます。

http://en.wikipedia.org/wiki/Expect
http://www.nist.gov/el/msid/expect.cfm
http://sourceforge.net/projects/expect/

元々はtcl/tkの拡張のひとつらしいのですが、tclを知ってる小生は作業時間がとれず、若いのに頼んでみたら、二日で覚えました。若いってのはいいです。

Expectの方法論は簡単で、「人間がする操作を、代わりにやる」というもので、「書き置きしたシェルスクリプトを流し込む」とは真逆です。もちろん、前者は結局は、「expectスクリプト」になるので、効果は似たようなものです。

spawn telnet $arg(0)
expect "login: "
send "$arg(1)\n"
expect "Password: "
send "$arg(2)\n"

ハイ、もう判りましたね的な簡単さ。ただし実際にはもうちょっとコツが要ります。

クラウド時代的にはちっとも流行りじゃないので、割と古い記述しか見つかりません。当時と現在とで違うのは、イタズラへの耐性。最近のslogin/sudoは、プロンプト待ちで、標準入力を一旦捨てるっぽいです。

spawn telnet $arg(0)
expect "login: "
sleep 1
send "$arg(1)\n"
expect "Password: "
sleep 1
send "$arg(2)\n"

頭悪そうに見えますが、諦めましょう。人間が操作する場合を思い出して欲しい。「おっとパスワード入れなきゃ」、と操作にはさまざまなタメがあるはずで、それすら再現してあげる必要があります。「人間のための機械」を操作させるためには、「人間型のロボットが都合がいい」的なアレです。

もうちょっとちゃんとやってる実装も見つけました。https://github.com/cvmiller/expect-lite/blob/b1f3a3596108b88bc8433953dade3a56325e83fa/sudo.tcl

なお、クラウド時代には、こんな中途半端な自動化は恐らく流行りません。
  • バージョンアップは、P2Pを応用して、数100台を数分で。http://torrentfreak.com/twitter-uses-bittorrent-for-server-deployment-100210/
  • 新しいVMを起動時に、S3から最新版を持ってきて勝手にデプロイ
    • 完全自動も出来なくはないが
    • Amazon EC2なら、インスタンスにrootログインが出来るので、外部からスクリプト流し込む。という切り札もなくはない。
そんな世の中ですから。

とはいえ、ちょっと探してみると、なかなか面白い応用があるっぽいです。

小生は、appengine python SDKのデプロイ時に、メイルアドレスとパスワードを入れるのに使ってます。

9/8 買ったもの

アレ、本当は何を買いに行ったんだっけ。
  • ロジクール ワイアレスタッチパッド Logicool Wireless TouchPad TP500


Logicool Wireless TouchPad TP500

2本指スクロールが出来るアレです。実はLenovo G580の内蔵タッチパネルでもそれは出来ていたのですが、本体キーボードすら使ってない運用なので。※ちなみに現在キーボードは、iBUFFALOの無線マウス付き(のマウス抜き)で安定。

小生はポインティングデバイスはトラックボール派ですが、唯一、スクロールだけは指が疲れるのが難点でした。トラックボールはこれまたLogicool TrackMan Wheelなので、ホイールも付いてますが、ホイールより、2本指スクロールのほうが、疲れません。

何故って、タッチパッドなら精密操作が要りません。

2012年9月7日金曜日

tumblrのv1 apiが一部機能終了したらしい

アカウント停止を喰らう前は、
個人的に色々スクリプトを書いて運用してたのですが、
先週あたりから? v1 apiでの投稿が出来なくなりました。
http://www.tumblr.com/docs/en/api/v1

エラーは403 Authorization failedとしか戻らないので、あたかもアカウント停止に見えます。
泡食って、webにログインすると、アカウントは全て無事です。

普通に、記事の取得は出来てるので、アレ(書く)はダメで、コレ(読む)は出来る状態。
また俺なんか目を付けられたか?と思ってましたが、他にも喰らった人が居るらしい。
http://tumblr.cathand.org/post/30927076153/illustail-tumblr
具体的には、v1 apiを使ってるAndroid/iPhoneアプリ等が動かなくなってるという。
#Illustail、小生も使ったことがありましたが。まじでかー。

まあ大分まえからoldで、v2が出てから久しいので、さっさと移行しやがれってことなのでしょう。
http://www.tumblr.com/docs/en/api/v2

よくよく探すと、アナウンスもちゃんとあったらしい。そりゃそうかhttp://developers.tumblr.com/post/28557510444/welcome-to-the-official-tumblr-developers-blog

Androidアプリのうち幾つかで、「投稿できなくなった」ってのは恐らくコレが原因でしょう。
対処方法は、api v2サポートする|してもらうしかありません。

tumblr御謹製アプリは、当然今でも使えますが、問題はAndorid 3で動かないこと。

PHP5.4.6が出てる今更、5.4の新機能について

今更、PHP5.4の新機能を読みました。
http://www.php.net/manual/ja/migration54.new-features.php
いや実は、5.4.xが出てることすら気づかなかったのですが、
厳密にはトレイトをサポートします!とか言ってたころから追ってません。

  • トレイトのサポートが追加されました。
  • 配列の短縮構文が追加されました。$a = [1, 2, 3, 4]; や $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; のように使えます。
  • foo()[0] のように、関数の返り値を配列として扱えるようになりました。
  • クロージャ が $this をサポートするようになりました。
  • クラスのインスタンスを生成するときに、そのメンバーにアクセスできるようになりました (例: (new Foo)->bar())。
  • Class::{expr}() 構文をサポートするようになりました。
  • 二進数フォーマットが追加されました。0b001001101 のように使えます。
  • パースエラー時のパーサからのメッセージや関数コール時の引数が間違っている場合の警告メッセージが改善されました。
  • セッションモジュールで、ファイルのアップロード状況を追跡できるようになりました。
  • CLI モードで動く、開発用のウェブサーバー が組み込まれました。

それ、pythonで出きるYO。

「トレイト」なるキモい構文は、mix-in専用構文だって話らしいので、恐らく内部的には、「クラス定義のインポート」なんでしょうね。故に重複定義は怒られる。らしい。

新機能を見るかぎり、どうやらZendコンパイラしかイジってなさそう。っと言うことは、ダメ言語である、ということは変わってなさそう。「警告メッセージが改善されました」とか、得意気にいうことじゃねーだろ。 そんもの5.3.Xで終わっとけ。

暗黙の型変換をOFFれるようにしやがれ。話はそれからだ。

そーいえば、PHP5.5ではようやく、generatorをサポートするって、話だし、
http://blog.sarabande.jp/post/30716058960
Javaのパクリの後はpythonですかソーデスカ。

似たようなことはイテレータでも出来ますが、イテレータの方が若干頭を使いますね。逆に言語側の実装は楽になるわけです。ジェネレータはまさしく逆。関数の実行を中断して、次回は続きから実行するとか、言語側の実装は4倍は面倒だと思う。

2012年9月6日木曜日

PHP本体は遅くはない。フレームワークが遅い

今サービス中の別件の案件。

小生が、かなりメモリ使用量に気を遣って書いた箇所は、160request /s出ているらしい。
よく判らないが、検索してみると、これって速いほうですね。
apache+mod_phpのオーソドックスな構成。
ハード構成を言えって?それはここで論じたいネタではないので割愛。

「PHPで性能が出ない!」とお悩みの人を色々検索してみると、
最も典型的なのが「WordPressが」とか。
http://kray.jp/blog/wordpress-tuning/
http://stackoverflow.com/questions/8853692/php-is-slower-than-it-should-be

「性能が出ない」でお困りの皆さん。これらの共通点は、超大作フレームワークの利用。これに尽きます。案件にもよりけりでしょうが、昨今では、

  1. とりあえずフレームワークを使って
  2. 短期間で仕上げて
  3. 性能面はクラウドでどうにかする

なんて手法もアリでしょう。

メイン関数を5行で書けます!という触れ込みで、実はincludeの向こうは5万行を毎回ロードしてますとか。特定のフレームワークの話はしてません。ものの例え、でもそれがPHPフレームワークの本質です。

JAVAであれば、悪い発想ではない。メモリに常駐しまくりなんで。故にスタートアップに10秒かかるとしても。それを「言語仕様がJAVAに似てるだけ」のPHPが真似しよう、ってのがそもそもの間違い。

逆に「クラウドじゃないので、湯水の様には増やせません」と言うなら2択です。

  1. PHPを辞めるか
  2. フレームワークを辞めるか(裸のPHPで書けと)

何故って?

  • 「フレームワーク」は、大量のファイルをincludeし、動的コンパイルを繰り返す。
    • 故に、メモリに常駐しないPHPとは、非常に相性が悪い。
    • ちなみに、adobe AMF frameworkは、3Mb食います。
  • APC等で解決するのは、「コンパイルに要するCPUパワー」だけ
    • 実は、PHPの動的コンパイル速度は、かなり速い。


早い話が、どうしてもPHPを使いたければ、

  • 裸のPHPで
  • 総実行300行未満で
  • メモリ使用量は、標準の8Mbから更に減らして1Mbぐらいでやりくり
でなければ意味がありません。さもなければ結局性能で悩まされるんで。
そんなの書いてられないよって?当たり前です。要するにPHPを使うなって、ことです。