ラベル つれづれ の投稿を表示しています。 すべての投稿を表示
ラベル つれづれ の投稿を表示しています。 すべての投稿を表示

2013年2月13日水曜日

Sphinx:検索結果が文字化ける場合の対策

仕事でSphinx使っていて、趣味でSphinxのテーマを作ってます。

Sphinx1.1からは、日本語もちゃんと検索出来るようになったので、
隠していた検索ボックスを表示するようにしました。

Sphinxの検索機能では、

conf.pyでhtml_copy_source = Trueを指定していると、
検索時に検索結果を表示してくれます。

この結果表示は、ソースファイルのコピーを参照して、
そのままhtmlに表示しているので、
ソースとhtmlの文字コードを変えていると、文字化けが発生します。

その対策方法を書きます。

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年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月15日金曜日

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

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


2012年6月11日月曜日

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

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

2012年6月9日土曜日

開発進捗(06/06)

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

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

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月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年2月20日月曜日

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

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

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

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

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

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

以下、ソースです

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で開発するには、ローカル環境でテストできれば十分だし。


2011年12月8日木曜日

Mercurialって日本語大丈夫になったのですね!

Sphinxで書いたドキュメントをバージョン管理していなかった理由は、使いたいと思ったツール(Mercurial)が、日本語のファイル・フォルダ名をうまく扱えなかったことが一番の理由でした。

(バザールは、日本語使えるようですが、シェルエクステンションがいまいちっていう評判を聞くので、おっさん的にきついので・・・)

 ですが、現在の最新バージョンは、日本語でも大丈夫みたいですね。
試しに入れてみた(tortoisehg-2.2.1-hg-2.0.1-x86.msi)のですが、以前はうまく認識できなかったファイルやフォルダも、ちゃんと認識されてますね。

よーし。これなら本格的に使えるぞ!
日本語のパスはダメとか、Windows上で仕事を進めてるとありえなかったんですよ。

本格的にチュートリアル(JapaneseTutorial)とかやってみることにします!


Mercurialを知らない人はこちら→Wikipedia


追記:

あれ? これって、win32mbcsのエクステンションがデフォルトで動くようになっているだけなんじゃ・・・

2011年12月7日水曜日

Sphinxの同期

Sphinx、良いですね。


前にもちょっと書きましたが、テンプレートを自分用に修正して、
htmlからソースのrstファイルをテキストエディタで開くボタンと
htmlを再生成するバッチを起動するボタンを追加してみました。

おかげで、個人用wikiみたいに使えていて良い感じです。

 同じ職場のチーム内で共有したほうが良い資料は、
共有フォルダで公開してます。

rstの同期は、
分散バージョン管理とかでやるのが良いのでしょうが、
mercurialを 勉強するのが 面倒でやれてません。

なので、昔ながらのbatファイル&タスクスケジューラで同期をとっているのですが、
先日、ネットワークにつながっていない状態で不具合を起こしてしまい、
ローカルのrstファイルが削除されてしまいました。

1.共有フォルダにカレントを移す
2.ファイルを全部削除
3.XCOPY

ネットワークにつながっていなかったので、1が失敗し、
ローカルのファイルを削除してしまったわけです。

まぁ、元々の書き方に問題があったわけだし、
分散バージョン管理しろ、ってことなのでしょうが、
今更仕組みを再構築するのもだるいので、
robocopyを使って同期取ることにしました。
これだとファイルの削除も一緒にやってくれるので、安全です。

XPは、robocopyが無かったので、以下のサイトからリソースキットを落としてインストールしました。

WindowsServer2003の英語版リソースキット(XPの日本語でも動くらいしい)


追記:

本件、一生懸命作っていたファイルが削除されてしまった怒りから書いてみたのですが、
どうみても、自分が悪いだけですね。

2011年10月25日火曜日

携帯サイトのセッション管理

携帯電話のセッション管理の面倒さは、ドコモの携帯がクッキーに対応していないことに起因している。(他のキャリアについては、パソコンとほぼ同じと考えていい)
新しい機種やスマホは、当然クッキーに対応しているのだけれど、古いドコモを切って良いのかどうかで迷い中。

ぶっちゃけ自分の携帯は、クッキーに対応しているので、古いドコモはとりあえず切って開発しようかな?
うん、そうしよう。

速さを重視して、データストアにまったく値を保存しないで、memcacheでセッション管理したら、memcacheの寿命が短すぎてまいった。端末のcookieにはセッションIDが残っているのですが、サーバ側はセッションIDやそれに紐づけられた変数が数分で消える。
memcacheのエントリの寿命は2週間を指定しているのに、すぐおちるのは、インスタンスが落ちるのと同じタイミングでmemcacheも落ちるということかな?
みんなcookieに保存するのもありだけど、改ざんテストにコストがかかるし、古いドコモに対応させようとするとURLクエリに保存しきれなくてきついはず。
ってことはやっぱりセッション管理にデータストアを使うしかないのかなぁ。
普通でつまらないけど、仕方ないかな。

Sphinx良いですね

自分の仕事用の手順書をまとめるのに使用してみました。
構造化した感じのwikiをローカルで構築できるので、重宝しそう。

難があるとすると、
1.日本語の扱いが微妙
2.ビルドするのが面倒
3.ビルドしたhtmlからソースを編集できない

1.はパッチがあるので、それを適用すると何となく動きます。
2と3は、気合でhtmlをいじって、なんとかワンクリックでできるようにしてみた。

・・・結構、快適ですねぇ。
だらだら書いてもそれっぽくなるので、文章の内容に集中できるし、
あとから編集するのも楽。
これは広めていこう。

2011年9月6日火曜日

webapp2!

webapp2が、自分の作っているフレームワークとほぼ同じで笑った。
文字列によるハンドラのインポートとか・・・
ハンドラを一度インポートした後使いまわすところとか・・・
セッション管理とか・・・
ほとんどやられちゃってる!

んー。フレームワークまわりは一度放っておいて、業務ロジックを作っていこう。