サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
買ってよかったもの
pod.hatenablog.com
インストールされているコマンドの実行が遅い pip install -e でインストールしたpython製のコマンドの起動が異様に遅かったということがあった。具体的には最近作っていたものなのだけれど。以下の2つはどちらも同じ挙動を示す。 # echo '{"hello": "world"}' > hello.json $ zenmai hello.json $ python -m zenmai hello.json ところが実際に実行してみると python -m 経由で実行したものに比べて、コマンドで実行したものが異様に遅い。どれ位遅いのかというとこのくらい遅い。 time zenmai hello.json hello: world 1.28 real 0.78 user 0.19 sys time python -m zenmai hello.json hello: world 0.
pythonのwsgiref でちょっとしたHTTPを話したい時に pythonでちょっとした調査をしたい時に、何かパッケージを入れるのも面倒な場合に wsgiref だけですませたくなる場合がある。その時のためのmemo。 hello world from wsgiref.simple_server import make_server def app(environ, start_response): status = '200 OK' headers = [('Content-type', 'text/plain; charset=utf-8')] start_response(status, headers) return [b"Hello World"] httpd = make_server('', 8000, app) print("Serving on port 8000.
はじめに makeはmacにもlinuxにもデフォルトであって便利*1。 とは言え、色々とわかりづらいところがある。 便利なところだけ見繕って使うと便利。 個人的なmakefileの使い方は2種類 個人的には以下のような2つの目的でmakefileを使っている。 複数の目的のためのタスクを記述して手軽に実行できるようにする 1つの目的のためにまじめに依存関係を定義して使う成果物を生成する 後者がたぶん本命だけれど。前者で使うことも多い。 複数の目的のためのタスクを記述して手軽に実行できるようにする 利用するコマンドのオプションを省略したい場合に使う。 脳みそのリソースの削減。細かなオプションの意味など後で見返した時に覚えていないことが多いのでメモがわりにmakefileを書く。 依存関係の書き方は以下の様な感じ。 <タスク名や生成されるファイル>: <依存するタスクや依存するファイル> .
はじめに 期待していない挙動を示した時にそもそもgo1.7とgo1.6とで動作が異なるのではないか?という疑いをもった時があった。 ところで手元の環境は全部1.7でわざわざ1.6をbuildするのも面倒と言うような感じ。 本当に些細なコードだったので、goの1.6用のplaygroundがあればそちらを使いたかったのだけれど。みつけられなかった。 特にvmや他の環境を持っていない場合にどうするのが一番楽なんだろう?という話。 dockerを使うことにした dockerを使うことが一番ラクかもしれない。以下にdocker用のイメージがある。alpineがたぶんいちばん小さいだろうということでそれを使うことにする。 https://hub.docker.com/_/golang/ 以下のようなdocker-compose.ymlを書いてあげる。 go1.6: image: golang:1.6
tl;dr panic時ではなくerror時にもfullのstack traceが欲しい pkg/errors が便利 はじめに しばらくgoを書いていて、使い捨てのコードのエラー処理についてどうすれば良いのか考えたりしていた。ここで言う使い捨てのコードというのは1ファイル位で作れそうな小さなコマンドラインのコマンドのようなものを指している。 まともなアプリケーションコードでは考えることが色々ある気がするけれど。使い捨てのコードなら以下を満たしていれば十分だと思った。 終了ステータスが0以外になる エラーの発生箇所が正確に分かる(stack trace) 前者はテキトーに書いても自然に満たす気がする。ここでは後者をどうするかについて書く。 panic時は問題なし。ただしerror時には問題がある ここでいうエラー処理は以下の2つを含んでいる。 panic時の処理 error時の処理 テキト
djangoでヘテロなリストのprefetch djangoでヘテロなリストのprefetch。できないと思ったら普通に出来たのでわりとびっくりしたので記事にしてみた。 ヘテロなリスト? ここでのヘテロなリストと言うのは以下のようなリストを指している。 xs = [A(), B(), A(), A(), B(), C()] つまるところ1つの型のオブジェクトのリストではなく複数の型が混在したリストのようなものを指している。このようなリストは複数のことなるアイテムを要素として持つタイムラインのようなページを作ろうとした時に必要になる。例えば、このようなものをgeneric foreignkeyを使って以下の様に実装するということがあるかもしれない。 from django.contrib.contenttypes.fields import GenericForeignKey from dj
はじめに pythonには非同期用の標準ライブラリとして asyncio というモジュールが用意されている。このasyncioを使う際にevent loopの取り扱いに悩むことがあるかもしれない。どうすれば良いのかを少しだけまじめに考えてみた。 ライブラリ or アプリケーション まず、書こうとしているコードがアプリケーションなのかライブラリなのか判断する必要があるかもしれない。実際に書こうとしているコードが依存関係の終端に位置するつまり現在書かれているコードを使う人が誰もいないというのであればそれはアプリケーションであり、そうでなければライブラリということにして判断して欲しい。 アプリケーションであれば気兼ねなく asyncio.get_event_loop() を使っても良い。一方ライブラリならもう少し気を付けようという方針になるのではないかと思った。 具体的に何が変わるかというと、コ
djangoでの集計は辛いという話 -- ORMは用法・用量を守って正しく使いましょう djangoのORMの機能の不足にぶち当たり辛いという話。別の言い方をすると、ORMは用法・容量守って正しく使いましょうという感じになるかもしれない。 はじめに 以下のような情報を年齢で丸めた値で集計してヒストグラムのようなものを作りたい。 名前 年齢 foo 10 bar 15 boo 20 結果 rank c 1 2 2 1 SQLでは頑張ればどうにかなる 集計をしたい時など何らかの演算の結果で GROUP BY したい時など結構ある。おそらくきっとある。 例えばヒストグラム的なものを作成したい時など。SQLであれば CASEとWHENを書き連ねることを気にしなければどうにかなる。 sqlite> create table person(name string primary key, age in
[django][python] 久しぶりにdjangoのORMのことについて書いてみる はじめに djangoのORMは正直好きじゃない。そもそも挙動が正確には把握しづらくてなんだか覚えにくいと感じる所がある。また、ドキュメントに書かれたとおりの書き方では不足することもあったりして、結局生のSQLを書かなければいけなかったりする場合もある。とは言え、ORMでできることはORMの機能を使ってやったりすると良い。 queryのチューニングについて select_related() と prefetch_related() について queryのチューニングについて書いてみようと思う。queryのチューニングと聞いて真っ先に思い浮かぶのは「N+1クエリーの除去」かもしれない。関連オブジェクトの取得が対象となるオブジェクトの個数だけ実行されるようなもののこと。これには、 select_relat
jsonの順序を保ったままOrderedDictを作る方法はobject_pairs_hookにOrderedDictを指定してあげれば良い import json from collections import OrderedDict from functools import partial loads = partial(json.loads, object_pairs_hook) data = ''' { "x": [1, 2, 3], "y": "foo", "z": {"a": "a", "b": "b"} } ''' print(loads(data)) # OrderedDict([('x', [1, 2, 3]), ('y', 'foo'), ('z', OrderedDict([('a', 'a'), ('b', 'b')]))]) ちなみにjson.loadsのコード
はじめに https://t.co/43GvPaLHo0 angularさんについてこれ空で分かる程度には分かっててほしいと思ったりした。— po (@podhmo) 2016, 1月 12 $parse, $interpolate, $compile これらはどれも文字列のような別の表現を解釈してjs objectを返すような機能を持つ関数達。 内部で使われている事が多いがどのようなものか把握しておくとangular.js自体のコードを読むのが捗るかもしれない。 前提 後々あげられているコードを試すには、 angularをnode.js上で実行する方法 を把握しておく必要がある。コレ使います。 各種API 各関数の説明を加える前に雑なmoduleを作っておく。このモジュールは後で使う。 angular.module("app", []); var inj = angular.inject
はじめに es6を試す環境もほしい。(今回はes2015とか細かい事は気にしない) とりあえず以下の様なことができてほしい es6で作成したコード片のtranspileの結果を手軽に確認できる es6で作成したコード片の実行が手軽にできる ブラウザから試せるrepl 以下のようなブラウザから試せるreplもある Babel repl es6console/ まぁ、今回は手元の環境で試せるようにしたい 手元の環境でes6を試す es6で作成したコード片のtranspileの結果を手軽に確認できる とりあえずes6のコードを書いてそれをcommonjsに変換する事ができるようにする。 色々細かく分かれているので以下を参考にしてほしいものを見繕うと良い。 https://babeljs.io/docs/plugins/#presets setup npm install babel-cli ba
はじめに テストなどを書きたい時にブラウザを立ち上げずに動作チェックなどをしたいことがある。 しかしangular.jsを直接nodeからrequireすると怒られる $ npm install --save angular $ node -p 'require("angular")' ReferenceError: window is not defined at Object.<anonymous> (/home/podhmo/tmp/angular-api-test/node_modules/angular/angular.js:29016:4) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load (module.js:356:
飽きたので途中で掲載。 はじめに gulpの使い方と言う話が出てきた時に以下の2つの場合がある。 gulp(plugin)の使い方 gulp(plugin)の作り方 大抵は前者で、前者はとても簡単。 gulp(plugin)の使い方 以下のようなシェルスクリプトのコマンドをイメージしてみれば良い。 $ src | foo -v | bar -x | boo -y | dst これをjsで行なっているのがgulp。以下のように書くと思えば良い。 gulp.src("./src/*.js") .pipe(foo({"v-flag": true})) .pipe(bar({"x": true}) .pipe(boo({"y": true}) .pipe(gulp.dst("./dist")); ただしgulpのpluginは実際に実行されるaction(これは便宜的な呼び方)ではなく、actio
はじめに この記事はadventerの方のPython Advent Calendar の3日目の記事です。 (qiitaの方にもadvent calendarがあるみたいです) この記事ではpythonの標準ライブラリの jsonモジュール について書くことにしました。advent caledarで何を書くか少し迷ったのですが、誰も知らない自作のライブラリを紹介するといった記事よりは、pythonを使う誰しもが日常的に使っている何かについて、ちょっとだけ詳しく覗いてみるだったり、ちょっとだけ考えてみるというような記事の方が良いのでは無いかと思いました。なので標準ライブラリの中からjsonモジュールを選んでみました。 about json module jsonモジュールはJSON形式の文字列表現とpython object間のserialization・deserializationを担
はじめに 以前に、 miniconfig というライブラリを作っていたことを思い出したのですが。 あらためて見なおしてみると結構便利かもしれません。 miniconfig これはすごく雑に言うと Pyramid というウェブフレームワークの設定などをを読み取りアプリケーションインスタンスを作成する際に使われる Configurator オブジェクトから基礎となる部分を取り出したものです。 pyramidの Configurator はわりとZCA(Zope Component Architecture)に強く依存しているところがあるのですが、それを省いて単体で使えるようになっています。 ここでの Configurator というのは以下の2つの役割を持っています。 settignsという名の辞書に値を埋める 設定(configuration)のための副作用を集める 使い方 基本的には Co
はじめに argparse にcountというactionがあり、これを使うと渡した同一オプションの数をカウントすることができます。 これを使って、例えば、curlやsshなどで見られる -v や -vv の記述に似せたものをやろうという話です。 基本的な考え方は以下です。 defaultは logging.WARN -v オプションは loggingレベルを下げる -q オプションは loggingレベルを上げる logging また、logging はNOTSET,DEBUG,INFO,WARNING,ERROR,CRITICALという順にdefaultのloggingレベルが設定されています。が、これらは単なる数値です。 import logging print(logging.NOTSET) # => 0 print(logging.DEBUG) # => 10 print(log
mithrilで簡単なログイン処理のサンプルを書いた。 目的としては以下の様なこと ルーター(m.route)の使い方を把握する pathの変わるsingle page application作ってみる 複数のcontrollerをwidgetとは異なる形で使う方法調べる 複数の箇所で使える汎用部品のようなものを作成する方法調べる。 あと、知りたかったこと controllerの役割 どちらかと言うとweb frameworkのcontroller view modelとmodelとでui logicとbusiness logicの分離 失敗する可能性があるアクション的な操作はpromiseを返すような感じにすると良さそう
macのpython3環境でpygraphvizをインストールしようとした時のメモ 事前にmacportsでgraphviz-develをインストールしておきます。*1 sudo port install graphviz-devel 前提の環境 $ python -V Python 3.4.2 試しにpip でinstallしようとする 試しにpipでインストールしようとしてみるとpython3には対応していないらしく落ちます。 $ pip install pygraphviz Downloading/unpacking pygraphviz Running setup.py (path:~/venvs/is3/build/pygraphviz/setup.py) egg_info for package pygraphviz Traceback (most recent call la
yapsyを使ってpythonのアプリケーションにpluginシステムを組み込む方法について yapsy yapsyはpluginシステムを組み込むためのライブラリ A simple plugin system for Python applications install pip install yapsy hello world 試しに以下の様なことをやってみる。 各pluginはrun()メソッドを持っているということにする HelloPluginというpluginを組み込む HelloPluginはrun()を呼び出した際に"hello"と出力 ファイル構成 ファイル構成は以下の通り。 . ├── main.py └── plugins ├── __init__.py ├── hello.py └── hello.yapsy-plugin 1 directory, 4 files
asyncioで実行されるタスクの実行順序の制御について asyncioのドキュメント を見ると、asyncio.asyncを使う際には、yield fromを忘れると終了を待たずにつぎの処理が実行される。このため以下の様な不具合があるというようなことが書かれている。 実行順序が保証されない タスクの終了が保証されない open_content,push_content,close_contentという3つのタスクが存在するような状況を考える。 これらのタスクが順番に実行されて欲しい。 @asyncio.coroutine def run(): yield from open_content() # 0 yield from push_content() # 1 yield from close_content() # 2 yield from asyncio.sleep(1) loop.
pythnonのcollectionsにnamedtupleがありますが。コレについて見過ごしてきたことがありました。以下のようなコードがTrueを返してしまいます。 from collections import namedtuple Foo = namedtuple("Foo", "name value") Bar = namedtuple("Bar", "name value") foo = Foo("spam", 42) bar = Bar("spam", 42) print(foo == bar) # => True これは結局、namedtupleは名前の通りtupleでしかないせいです。tupleなので型名を持っていません。したがって、同じ順序で同じ値が渡されていたものは比較でTrueになるというわけです。 それでは、アクセス子として生成される名前も無意味なのでしょうか? F
srcgenが何かに使えそうだと思っているのだけれど。どうしたら便利なのかという答えは出ていない srcgenというパッケージがあって。これが個人的には結構面白い機能を持った ライブラリだと思っているのだけれど。良い使い方というのが見えていない。 srcgenとは srcgen はコード生成のためのフレー ムワークという括りに入るものらしい。 jinja2やmakoなどの一般的なテキスト型のテンプレートエンジンとは種類が異 なり。どちらかと言うとhtmlのdomを手書きするような使用感に近いんだろう か。コンテキストマネージャーを特徴的に使うことによりpython上から異なる 言語のコードを生成するためのコードを出力する事ができる。 出力先の言語として以下の言語に対応している。 c js html python 今回はpythonを使ってみる。 使い方 以下の様にして使う。 from sr
これはpython advent calendar 2012の19日目の記事です。 何についての話? pyramidを使ったseparationの話です。間接参照すばらしい的な話につなげられたら良いです。 (MVC的にはsqlalchemy,mako,pyramid(のURLディスパッチ)を利用してます) ある学生寮向けのローカルSNSの開発 一昔前に流行ったローカルSNSのようなものを作ることになった。 ある学生寮の住人向けに作られるそうだ。そこに所属する学生が書いた日記などをまとめたりなどしたいらしい。 これは、住人の一覧画面の表示に使うview。他にも同様の形のviewがいくつも定義されている。 from pyramid.view import view_config @view_config(route_name="index", renderer="advent:template
このページを最初にブックマークしてみませんか?
『podhmo's diary』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く