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を使うなって、ことです。

2012年8月27日月曜日

2012/8/26 買ったもの



  • IO DATA 無線LANルータ WN-AG450DGR
    • 5GHz対応。で買った筈が、2.4GHz帯でしか繋がらず。アレ?しかし、前任者 colega CG-WLBARGNL に比べて2倍ぐらい速い感じ。4年の歳月は偉大です。zipproxy要らなくなっちゃいました。
  • CENTURY  裸族のお立ち台USB3.0 CROUS3
    • 録画専用PCの ubuntuの 2.6.35-25-generic カーネル + では認識
    • lenovo のlinuxmint 12 の3.0.0-24-genericでは認識せず。
    • まじでか!
  • 玄人指向 KURO-DACHI/CLONEU3
    • lenovo の 3.0.0-24-genericで無事認識。2台入りも使えます。