2012年11月19日月曜日

Solarized化してみました

Solarized Sphinx ThemeというSphinxのテーマを見て感化されました。

長く見るのに適した配色のほうがいいよな、ってことで職場のSphinxのテーマの配色も、このブログの配色も、みんなSolarizedっぽくしてみました。

・・・JINS PCと一緒で、そのうち飽きる気がしないでもないです。


2012年11月12日月曜日

WELL512a, WELL1024a を Pythonで実装

前回の続きです。

前回のコードは、元にしたプログラムがゲーム用に最適化されちゃっていて、もとの論文と比較しにくかったので、乱数生成部分を書き直しました。

WELL512a と WELL1024a, はC版と同じ結果が返ることを確認しています。
それ以外は、たぶん動くけど未検証なので、コメントアウトしてあります。
(誰か検証してください!)

あと、jumpahead()は、未実装にしました。seed()使って下さい。
本来の意味だと、数学的に離れた位置にジャンプするべきなのですが、
やり方がわからないんで、前はseed()を使ってお茶を濁してました。
これは、かえって混乱のもとなのでやめました。

2012年11月8日木曜日

WELL512aをPythonで実装してみる

擬似乱数生成法「WELL」の512ビット版をPythonで実装してみました!

このアルゴリズムは、まだマイナーのようですが、
有名なメルセンヌ・ツイスタ(Pythonの標準の乱数生成アルゴリズムでもあります)より新しく、より乱数の性質が良いとされているアルゴリズムです。

WELLについては、以下のサイトのメモがまとまっています。
http://lt140.blogspot.jp/2010/05/well.html
http://en.wikipedia.org/wiki/Well_equidistributed_long-period_linear

2012年10月30日火曜日

読解練習:Google App Engine Python SDK Release Notes 1.7.3

GAE/P SDKのリリースノート1.7.3が出てますね。
まだ、1.7.2が翻訳しきれていないのですが、公開します。
例によって訳の正確性は保証できません。


今回は、SearchAPIまわりの整理が多いですね。
後は、Django 1.4 が Pytho2.7でフルサポートされたのが大きめのところですかね。

2012年10月12日金曜日

読解練習:Google App Engine Python SDK Release Notes 1.7.2

GAE/P SDKのリリースノート1.7.2が出てますね。
分量が多くて訳しきれていませんが、公開します(随時更新していきます)。
例によって訳の正確性は保証できません。


今回も、細かい修正が多い感じですね。

2012年8月30日木曜日

読解練習:Google App Engine Python SDK Release Notes 1.7.1

GAE/P SDKのリリースノート1.7.1が出てますね。
日本語に訳してみました。例によって訳の正確性は保証できません。

今回は、細かい修正が多い感じですね。
Googleさんも夏休みモードで、大きい修正はやらなかったのかな?

2012年8月11日土曜日

アイコン解決


アイコン自作するの面倒になったので、再配布可能なアイコンを探して、利用することにしました。

再配布可能なアイコンは、たいていクレジットの表記が必須なのですが、具体的にどう表記すれば良いかを明記している人はほとんどいないような?たぶんホームページへのリンクを付ければよいのでしょうが、正直使いづらい。

そんな中で、ちゃんとクレジットの表記例を載せていて、かつ、アイコンもいっぱいあるのを発見。


Footerにリンク入れれば再配布OK。お金を払ってクレジット表記を消す方法も明記されているので、いろいろ便利。とりあえずこれを使用させていただくことに決定。



後は、CSSを直せば公開できますね!

今は sphinxjp.themes.bizstyle を適当にカスタマイズしたのを使っているのですが、もうちょっと変えたいんですよね。

bizstyle は、スタイルを工夫してどんな色でもだいたい大丈夫にしていて凄いと思います。
でも、個人的には中間色を使って、もう少し表現力を上げたい。
 
そこで、中間色を生成するJinja2のフィルタを作ってSphinxで使いたいのですが・・・。
軽くググった感じでは、Sphinxで使っているJinja2のEnviromentへのアクセス方法がイマイチわからない・・・。orz。

カスタムフィルタを追加すると、Jinja2の表現力ってかなり上がるとおもうんですけれど、
Sphinxでチャレンジしている人はあんまりいないみたいですね。

仕方が無いので軽くソースを追ってみました。
フィルタの追加は、そんなに難しくなさそうなので、今度チャレンジしてみます!


2012年7月12日木曜日

近況の記録:アイコンめー!

MTG-Guildの開発をサボって、Sphinxのテーマいじりをしています。
仕事の効率化になる上に、趣味も兼ねているので、こっちのほうが自然と進みます。

職場の環境がIEメインなのですが、各所でdisられているIEも、Sphinxを使う分にはかなり良いですね。IEだとセキュリティ的に悪名高いVBSが使えます。この悪魔の言語を使うことで、htmlからファイルを直接いじったりbatファイルを起動できたりします。つまり、Sphinxをwikiっぽく使えます。

これは便利なのでぜひ広めよう、と思い
外部に公開する準備をしてきました。


2012年6月29日金曜日

読解練習:Google App Engine Python SDK Release Notes 1.7.0

GAE/P SDKのリリースノート1.7.0が出てますね。
日本語に訳してみました。例によって訳の正確性は保証できません。

先月お披露目になったSearchAPI関連や、Googleのサービスとの連携関連が多いですね。
(差別化を狙っているんでしょうけれど、みんなついていけているのかな?)

あと、NDBの修正も多いのが気になりました。(Guido頑張り過ぎじゃないの?)

2012年6月15日金曜日

Sphinxのファイルの拡張子とか

うーん。Sphinxのファイルの拡張子って、.rstと.txtのどっちが良いんだろう?
Sphinxを仕事で使うようになって、いろいろモヤモヤとしてきたので、整理してみます。


2012年6月11日月曜日

Sphinxで日本語を使う時の注意点のメモ(Windows限定)

自作テーマを社内展開用に整理していたら、文字コードの迷宮に迷い込んでしまいました。
あまり一般的な事例ではないかもしれませんが、どこかの誰かと未来の自分の為に、対策をメモしておきます。

2012年6月9日土曜日

開発進捗(06/06)

MTG-GUILDですが、開発から1年以上たっている割には進捗悪いんです。
余暇を利用して開発しているので、予算0円、納期未定なので、ずるずる進行なのは想定内ではあるのですが・・・。

もうちょっとなんとかしたいので、現状を整理してみました。

2012年5月27日日曜日

読解練習:Google App Engine Python SDK Release Notes 1.6.6

GAE/P SDKのリリースノート1.6.6が出てますね。
日本語に訳してみました。例によって訳の正確性は保証できません。

実験的にではありますが、かねてより噂になっていたSearch APIが使えるようになってますね。

2012年5月16日水曜日

Python で unicode型を 継承した場合のはまりどころ



元ネタはこちらの記事です。

お題:


以下のようなクラスを定義しています。

class TestUnicode(unicode):
    def __init__(self, x):
        print x

このクラスは、キーワードを指定しないとインスタンスを作成できますが、
キーワードを指定してインスタンスを作成するとエラーになってしまうようです。

>>> a = TestUnicode('a')
a
>>> a
u'a'
>>> b = TestUnicode(x='b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'x' is an invalid keyword argument for this function

なぜキーワードの指定の有無で挙動が変わってしまうのでしょうか?


2012年4月25日水曜日

読解練習:Google App Engine Python SDK Release Notes 1.6.5

GAE/P SDKのリリースノート1.6.5が出てますね。
日本語に訳してみました。例によって訳の正確性は保証できません。

バックアップ&リストアのサポートがメイン?
位置情報がヘッダに含まれるのは、スマホ的には表現が広がりそうですね。
あと、詳細不明ですが、環境変数をapp.yamlから設定できるのは、結構いいかも。

2012年4月13日金曜日

Sphinxでhtmlhelpを出力するときの注意点

仕事でSphinxを使いはじめています。
Windowsヘルプ(いわゆるchmファイル)をSphinxから作るときに、文字コード関連でちょっと苦戦しました。

普通にやっているつもりが、文字化けしちゃうんですよね・・・。


結論を書いちゃうと、これでOKみたいです。
  1. conf.pyで、
    language = 'ja'
    という記述を入れておく
  2.  sphinx\themes\layout.htmlを修正する。
    83行目:
        <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
    を、
        {%- if encoding == 'cp932' %}
        <meta http-equiv="Content-Type" content="text/html; charset=shift-jis" />
        {%- else %}
        <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
        {%- endif %}
    に変える。
  3. 日本語パッチのあたったSphinxを使う



2012年4月3日火曜日

GoogleAppEngin(Python2.7)で、NDBによる非同期アクセスをお試し中(その2)


ndbについて、ほとんど何も知らないのに、なんとく格好が良いから使い始めてしまっているのですが、翻訳したり軽く使ったりしている中で、なんとなく中身が見えてきました。

標準のdbモジュールとの差異は、主に以下の3つです。
  • 自動的なキャッシュ機能による処理の高速化
  • プロパティの整理(構造化されたプロパティの使用等)
  • 非同期処理の連鎖や並列実行

2012年3月28日水曜日

読解練習:Google App Engine Python SDK Release Notes 1.6.4

GAE/P SDKのリリースノート1.6.4が出てますね。
日本語に訳してみました。例によって訳の正確性は保証できません。

ちゃくちゃくと、Python 2.7への対応が進んでいるみたいですね。
NDBが一般リリースになったのは少し驚きました。ドキュメントも修正されているところがあるみたいなので、そのうち訳しなおします。(とはいえ年度末・年度始で、しばらく仕事が忙しいんですよね・・・)

2012年3月12日月曜日

読解練習:Python NDB Overview(Experimental版)

NDB APIのドキュメント」の「Python NDB Overview」の章の訳です。

によって訳の正確性は保証しません。
まだ訳の途中ですが、載せてます。

読解練習:The Python NDB API(Experimental版)

SDK のリリースノートにも載っていましたが、NDB APIのドキュメントが、開発者用サイトに載ってますね。

いろいろよさそうなので、ぜひ使いAPIなのですが、ドキュメントの日本語訳が見当たらないんですよね・・・。日本語訳を待っていると、自分のアプリがいつまでたっても完成しない感じなので、googleの自動翻訳(+意訳)で頑張っていくことにしました。正確さはまったく保証できないのですが、イッシーと同じくらい英語が苦手な人はいると思うので、その人の為に、翻訳内容を記録に残していきます。

2012年3月9日金曜日

読解練習:Google App Engine Python SDK Release Notes 1.6.3

SDK1.6.3が出てますよね。

http://code.google.com/p/googleappengine/wiki/SdkReleaseNotes

訳してくださっている方が見当たらなかったので、リリースノートの機械翻訳を雰囲気で意訳してみました。翻訳の正確さの保証はしません!

半分は英語の読解練習の為にやっています。間違いを見つけた方はご指摘くださると助かります。

随時、内容は書き換えていきます。

2012年3月7日水曜日

Eclipse で PEP8のチェックを行う方法


 ウィンドウ(W)→設定(P)→PyDev→エディター→コード解析→pep8.py
にて、「警告」もしくは「エラー」を選択

これでOK.(orz)

【頑張ってunittestに組み込んだのはなんだったんだ・・・。


Windows7 + Eclipse 3.7.2 + PyDev 2.4.0 で動作確認しました。


<環境構築メモ>
Pleades 3.7.2 の Platform(JREあり)をダウンロードして解凍。

ヘルプ→新規ソフトウェアのインストールで、
を追加インストール

2012年3月5日月曜日

webtestで日本語を使うときの注意点

GAE の ローカルのユニットテストにwebtestというパッケージを利用しているのですが、日本語関連でちょっとはまってしまったので、書きます。


from webtest import TestApp
app = TestApp(testtarget_app)
app.get('/')
app.post('/search', {'title': u'sample検索文字列'}

ってやると、エラーは起きないのですが、文字化けします。
非ASCII文字は?に変換されちゃうんですよね。


2012年2月20日月曜日

自動テスト時にPEP8コーディング規約をチェックさせる

unittestを自動テストでまわす時に、PEP8をコーディング規約をチェックさせてます。
この手の規約を守るのは面倒くさいのですが、
Eclipse(PyDev)に特化させることで かなり効率が上がったので、紹介します。

まず、【ここ】を参考にして、PEP8チェックをunittestに組み込んでみました。

それだけだと芸が無いので、テスト結果の出力形式をPyDev用に編集しました。

PyDevは、トレースバックのログから、エラー箇所へのリンクを作りますよね?
これはログの出力結果のパターンから リンクを生成しているように思えたので、PEP8のログを整形してトレースバックログに似せてみました。
(この辺、Pythonは改造が簡単で良いですね)

すると、トレースバックのログと同様に、PEP8に違反したところへのリンクができました!
これで、PEP8違反箇所の修正が、かなり簡単になります。

以下、ソースです

2012年2月13日月曜日

成長の軌跡:PythonでSingleton実装


昔書いたコードを見直しすると、むずむずしてきて面白いですね!
Python で Singletonを実現するためのコードの変遷を書きます。


2012年2月8日水曜日

SyntaxHighlighterを入れてみました

Google先生も古い情報ばかり教えてくるので、探し出すのに結構かかったのでメモ。

設定方法:

SyntaxHighlighter を Blogger で使えるようにするには、
以下のサイトを参考に設定すると良いです。

SyntaxHighlighterのグーグルBloggerでの使い方
http://yksmtmks.blogspot.com/2011/05/syntaxhighlighterblogger.html

SyntaxHighlighter 3.0 on Blogger
http://kenmemo.blogspot.com/2011/05/syntaxhighlighter-30-on-blogger.html

 Yet Another How To Use SyntaxHighlighter in Blogger with Autoloader
http://ywafield.blogspot.com/2011/03/yet-another-how-to-use.html

この一文
SyntaxHighlighter.config.bloggerMode = true;
なくても動くみたいですが、いちおう入れてます。

使い方のメモ:




エンコードはここが便利:
www.netyasun.com/syntaxhighlighter/source-escape.html

英語の読み書きを訓練するのが一番大事な気がする今日この頃です・・・。

2012年2月7日火曜日

GoogleAppEngin(Python2.7)で、NDBによる非同期アクセスをお試し中


以下のサイトで、GAE/PのNDB(Next DB module)モジュールについて知りました。
https://sites.google.com/site/copypesouko/--manyuaru/datastore-plus-tutorial-ja
(ただ、今は【ここ】の情報が最新らしいですね)


全然ドキュメント読めていないのですが、(Python創始者のGuidoがせっせこ作っている)GAE/Pのデータストアで非同期アクセスを行う為のモジュールらしいですね。
(他にもコンテキスト処理?とかいろいろ出来るらしいけれど難しそうなので読んでません)

非同期にアクセスできるようにということは、
  • 複数のテーブルへのアクセスを並列実行できるので、反応を改善できることがある。
    (とはいえ、高価なデータストアに頻繁にアクセスする設計は間違っている気がします)
  •  書き込み結果を待たずにレスポンスを返せる。たとえば、ブログの更新のように、書き込みにほぼ成功するような更新なら、反応を早くできる。
    具体的には、データストアとMemcacheへの更新を並行して実施することで、データストアへの書き込みを待たずにキャッシュを使って更新結果を参照させることができる。
といったような効果を期待できますね!

ただ、この新しいモジュールではkey_nameを使えません(!)


from google.appengine.ext.ndb.model import (Model as _NdbModel,
                                            transactional)


class Model(NdbModel):
    u"""google.appengine.ext.db.Modelの動きを真似るラッピング
        ぶっちゃけ、こんなラッピングはしないほうが良いと思います
    """

    def __init__(self, **kwds):
        _kwds = kwds.copy()
        key_name = _kwds.get('key_name')
        if key_name != None:
            _kwds['id'] = key_name
            del(_kwds['key_name'])
        NdbModel.__init__(self, **_kwds)

    @classmethod
    def get_by_key_name(cls, key_name, **kwds):
        return cls.get_by_id(id=key_name, parent=kwds.get('parent'))

    @classmethod
    @transactional
    def insert_or_fail(cls, id_or_keyname, **kwds):
        u"""挿入して挿入された値を返します。
            キー重複は、何もせずにNullを返します。全然非同期じゃないし、動作未検証です。
        """
        entity = cls.get_by_id(id=id_or_keyname, parent=kwds.get('parent'))
        if entity is None:
            entity = cls(id=id_or_keyname, **kwds)
            entity.put()
            return entity
        return None


  • google.appengine.ext.dbをgoogle.appengine.ext.ndbにすると新しいモジュールでなんとなく動く(だいたいのAPIは上位互換)
  • key_nameとidの区別がなくなって、key_nameを使っていたところはidを使うようにAPIが変更されている
  • 普通にput()とかすると、これまでどおりの処理が行われる(全然非同期じゃない)
  • 非同期処理を行う場合は、
    k1 = Key('モデル名', id)
    f1 = k1.get_async() # これで、値の取得が開始される
    <何か処理をする>
    a1=f1.get_result() # 取得結果を受け取る

    ということらしいです。(key_nameが無くなったことを知るだけで2時間くらい消費してしまった・・・。へこみました)

    確かに、自動でidを振られた場合と 自分でkey_nameを指定した場合で、使うメソッドが違うのは格好が悪いので、このほうが良いですね。

    だから、上の例みたいなラッピングはしないことがお勧めです(!)
    普通にget_by_idで統一しましょう。


2012/02/25 追記:
あれ、でも別にNDB使わなくても、昔から非同期でデータストアにアクセスできるんですね・・・。
GAE/PのAsync Datastore APIの使い方


その他の追加の機能(yeildで非同期アクセスの結果を受け取る書き方や、taskletsとか)や、設計上の不合理、新バージョンを押し付けない、ってのがメインなんですね・・・。


うーん?別にそんなにNDBにこだわる必要もないような?

2012/03/05 追記:
ここの記事見るより、こっちを見ましょう!
http://najeira.blogspot.com/2012/02/google-app-engineapindb.html

2012年1月12日木曜日

GAE Python 2.7のテスト環境の構築について考えてみる

今のGAEだと、

from google.appengine.ext import testbed

とかからで、必要なスタブを読み込んでいけばいいんですね。

プロダクション環境のビッグテーブルを使ってテストしなくちゃいけないほどハードなテストはしないよていなので、GAETestBaseは移植しないことにしました。

gaeunitみたいな、プロダクション環境でテストを動かす仕組みはあったほうが良い気がしますね。
今の案では、

  • ローカル環境:unittest + testbed + webtest + BeautifulSoupでテスト。
  • プロダクション環境:Seleniumでテスト
かな。

Python2.7の環境なら、unittestで、かなりいけるはず。noseとかいらないかもしんない。
webtest と BeautifulSoup は リクエストを投げて帰ってくるレスポンスの内容をテストする為にいるはず。


アプリのバージョンでnamespaceを分けるようにすれば、アプリを公開後もプロダクション環境でテストを走らせることは可能なはず。

ただ、そうした場合、バージョン間のデータのコピーとかを簡単にできるように環境を整えるのと、Seleniumのテスト開始時にデータストアを初期化するような仕組みがほしくなりますね。

んー面倒だから、プロダクション環境でのテストは後回しかな。
TDDで開発するには、ローカル環境でテストできれば十分だし。


2012年1月5日木曜日

GoogleAppEngineでjinja2を使う


jinja2は日本語のドキュメントの出来が良いし、Sphinxでも使えるので、個人的にテンプレートエンジンとしては一択だと思っています。
GAE/P 2.7では一部のサードパーティのライブラリも使えるのですが、そこにjinja2も含まれています。使用する場合は、こんな感じの記述をapp.yamlに加えましょう。

libraries:
- name: markupsafe
  version: latest
- name: setuptools
  version: latest
- name: jinja2
  version: latest

バージョン指定を推す流派もありますが、私は新しいもの好きなのでlatestを推します。問題がおきたらバージョンを指定すれば良いんじゃないかと。

追加するライブラリはjinja2だけでも良いけど、パフォーマンスとかを考えるとmarkupsafeは入れたほうが良いんじゃないかと。
ローカルで動かす場合は、SDKには上記のライブラリはないので、入れとく必要ありますね。
といっても、setuptoolsは入れているでしょうから、
easy_install jinja2
easy_install markupsafe
ってやるだけでしょうけど。

テンプレートを毎回ロードするのが嫌なので、ロードしたテンプレートをグローバルな辞書に登録してキャッシュさせているのですが、jinja2はデフォでキャッシュ機能があるらしいので、あんまり意味ないのかな?
(デフォのキャッシュにはサイズに制限があるそうだけれど、その制限はどれくらいなのか、また、制限を解除できるのかは、もうちょっと調べよう)


あと、全然話は変わりますが、2.5で使っていたGAETestBaseとか、GAEUnitとかは、Python2.7の環境だと動かないみたいですね。参考にしながらテスト用のフレームワークもどきを揃えてみるかなぁ。
そういうのがないと自動テストとかきつくてやっていられないと思うのだけれど・・・、料金改定でみんなGAE/P使ってないのかな?