1. クラス変数をメソッドにデフォルト引数として渡す

    class A:
        NAME = "A"
    
        def echo(self, text: str = NAME) -> None:
            print(text)
    
    
    class B(A):
        NAME = "B"
    
    
    B().echo()
    

    この B().echo() は「B」ではなく、「A」を出力します。

    class B(A):
        NAME = "B"
    
        def echo(self, text: str = NAME) -> None:
            print(text)
    

    このように、Bでechoをオーバーライドしたら、出力は「B」になります。デフォルト引数の評価タイミングは少し難しいですね。

    続きを読む

  2. PyramidのViewでPython3の関数アノテーションを使う

    Pyramidの現在の最新安定版であるバージョン1.5.7は、ViewでPython3の関数アノテーションに対応していません。

    この例では、hello関数の戻り値の型がdictであることを関数アノテーションで表しています。

    @view_config(route_name='hello', renderer='json')
    def hello(request) -> dict:
        return {
            'greeting': 'Hello'
        }
    

    これでPyramidを起動してアクセスするとエラーになります。スタックトレースは長いので、この記事の一番最後に書きます。

    現在はまだアルファ版ですが、1.6系を使用することで対応できます。PyPIには上がっていませんが、pipを使用してGitHubから直接インストールします。

    $ pip3 install git+https://github.com/Pylons/pyramid.git@1.6a1 -U
    

    これで完了です。

    デバッグ

    pyramid.config.utilのtakes_one_arg関数の中でinspect.getargspecが呼ばれています。この関数はPython3.0から非推奨になっており、関数アノテーションに対応していません。Python3の場合にのみ、代わりにinspect.getargfullspecを呼ぶことで解決できます …

    続きを読む

  3. UbuntuでChromeのみ解像度が異常の場合に直す方法

    6月10日にGoogle Chromeを更新し、バージョンが43になりました。それからChromeのみ解像度がおかしい。具体的には横2560pxのモニタに最大化して表示しているのに、JavaScriptで確認すると1280pxしかない状態になっていました。つまり解像度が縦1/2、横1/2の、1/4になっていました。この問題は、私が確認した範囲では、Ubuntuでのみ発生していました。15.04と14.04で確認しました。

    これはChromeの起動時にパラメータを与えてやることで解決できました。

    /usr/share/applications/google-chrome.desktopの108行目付近に--force-device-scale-factor=1を加えます。

    変更前

    Exec=/usr/bin/google-chrome-stable %U
    

    変更後

    Exec=/usr/bin/google-chrome-stable --force-device-scale-factor=1 %U
    

    Chromeはウィンドウを閉じただけでは完全に終了しておらず、オプションが有効にならない場合があります。完全にChromeを終了するか、OSごと再起動すると確実です。

    Chromeのベータ版(44)をインストールして試してみましたが、同じように解像度が低くなってしまったので、今後バージョンアップされても、同じ症状が出るのではないかと思います。Chromiumではこの問題にまだ遭遇していません …

    続きを読む

  4. PyramidをuWSGIで動かす

    Pyramidのpcreateコマンドで出力された、development.iniとproduction.iniに以下のブロックを追記します。

    [uwsgi]
    socket = /var/run/myapp/myapp.sock
    pidfile = /var/run/myapp/myapp.pid
    daemonize = /var/log/myapp/myapp.log
    master = true
    chmod-socket = 666
    thunder-lock = 1
    honour-stdin = 1
    

    起動時に--ini-pasteオプションに先ほどのiniファイルを渡します。

    $ sudo uwsgi --ini-paste development.ini
    
    続きを読む


2015 - 2017 (c) 成瀬基樹