python

個人的なグラフ描画用のパッケージに機能を追加した

github.com 個人的なグラフ描画用のパッケージに機能を追加した。その前にこのutataneというパッケージが何をするものなのかを整理してみる気になった。 何をするものなのかというと、グラフを描く等に関する忌避感を緩和するためのもの。だるいと思う率を下…

pytestのyieldで指定するfixtureのやつを真似して実装してみた

github.com pythonのyieldで指定するfixtureのやつを真似して実装してみた。意外と簡単にできるし。面白いし。便利な気がする。 yield fixture? pytestのfixtureはsetup/teardownをgeneratorで定義できる。昔はyield_fixtureという名前だったけれど。現在はf…

pytestのfixtureとcontextlib.contextmanagerでの例外の取り扱い方の違い

前回の記事でpytestのfixtureでもteardownが実行されることを確実にするにはtry-finallyで囲む必要があるという風に書いてしまっていた。 特にtestでの利用を想定して作ったわけではないけれど。test時のsetup/teardownのことを考えると、途中のコードが失敗…

個人的なグラフ描画用のパッケージ作りはじめた

github.com 個人的なグラフ描画用のパッケージ作りはじめた。matplotlibのラッパーの様なもの。 元々のモチベーションは以下の記事に書いてある。 グラフ描く簡単な環境作っときたいかも 結局グラフの表示用のコードとグラフを画像として出力する用のコード…

pythonのastモジュールに不満がでたらlib2to3のコードを使ってみよう

はじめに pythonのコードをparseするためにastモジュールが用意されていたりする。 このモジュールはpythonのコードをparseしてvisitor的なものでastをtravarseしてなどと便利ではあるのだけれど。 コメントなどの情報が消えてしまうなどの不満が出ることが…

たくさんのnotebookの内容をコマンドラインから再実行して更新したい

はじめに たとえばグラフを描画するnotebookをたくさん開いている状態。 ちょっとだけimportしたライブラリに変更があったので実行結果が変わりそうになってしまった。 このようなときに、すべてのipynbファイルを開いてrunallした後にsaveというようなこと…

グラフ描く簡単な環境作っときたいかも

グラフ描くの簡単な環境作っときたいかも。要求は以下の2つ。 手軽にグラフが描ける 手軽にグラフを共有できる 前者は例えばjupyter上でだけ表示みたいなのが嫌な感じ。 後者は例えばGUIで表示とかだけなのは嫌な感じ。 まだ結局一番良いと思える方法は見つ…

sqlalchemyのORMじゃない方の機能(expression language api)

使い方忘れることが多いのでメモ。 準備 テキトウにデータを作って準備する。 テキトウにテーブル作成。 CREATE TABLE groups ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT ); CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, group_id …

sqlalchemyのautomapによる既存のDBからのmodelの生成について

昨日あたりにsqlalchemyのautomapの仕組みをつかってgraphqlのschemaを作ろうとしていたのだけれど。その時に使っていたsqlalchemyのautomapの仕組みが期待していたのとちょっと違っていたのでどうしようか考えてみる。 sqlalchemy? pythonで使われているORM…

既存のdbからgraphqlのschemaを生成しようとしてみる

はじめに 既存のDBのURLを渡すと、何か良い感じにgraphqlのベースのapiを良い感じに提供してくれるようにする何かを作ろうとしはじめた。 graphqlはschemaを取るのだけれど、こちらのschemaはgraphベースなのでちょっと困る。 サーバー側の実装をするために…

docutils用にsphinxのliteralincludeのsubsetを作って使ってみる。

literalinclude? sphinxで利用可能なdirectiveの1つ。 以下の様な形で別のファイルに定義した記述をあたかも自身のcode-blockとして記述したかのように使えるもの。 ここはReSTの文章。 .. literalinclude:: <filename.<ext>> ここもReSTの文章。 似たようなものとしてincl</filename.<ext>…

bsonのdump(文字列表現)

人間が確認するためにbsonを文字列にdumpしたいことがある。 bsonはjsonではない bsonはjsonではないのでjson.dumpsは使えない。 import json import bson from collections import ChainMap person = ChainMap({"name": "foo"}, ChainMap({"age": 20}, {"_i…

1つのquery objectに紐づく複数のqueryの管理について

(途中:wip) はじめに pymongoを直で使うのがつらいと感じる事がある。というよりmongodb一般でつらいと感じることがある。主にjoin。 joinを手軽に書けるwrapper的なものがほしいと感じる事がある joinが書けるということ joinが書けるということは1つのque…

最近pythonでmongodb使うなら

普通に使う場合 過去にそれなりに人気のあった(?)mongodb用のライブラリは軒並み廃れている感じがある。3.x系に追随できていない物が多い。pymongoを直接使ったほうがマシな印象。もし非同期を気にしたいならmotorなどは良いかもしれない。 あとまだ新しめで…

テキトウなyamlの値からswagger spec経由でgoのstruct定義のコードを生成してみる

テキトウなyamlの値からswagger spec経由でgoのstruct定義のコードを生成してみる。 使うのはdictknifeとgoaway やること 素となるデータの例を書く(yaml) データからswagger specを生成 swagger specからコードを生成 以下の様な形で変換が行われる。 confi…

docutilsを直接利用してRestからmarkdown(のsubset)を生成するツールを作ってみる

docutils ReSTのためのライブラリ ReST? markdownのようなもの first step docutilsではpublisherと呼ばれるものがもっともトップレベルのapplication。 内部でドキュメントをparseしてnode treeを作成した後に各writerのtranslateで出力される。 reader+par…

jsonからswagger specを生成するコマンドに変更を加えた

github.com 昨日作ったコマンドに変更を加えた。変更点は以下 複数のファイルを渡せるようにした minimapを表示するようにしてみた validationのための --emit=jsonschema を止めた 複数のファイルを渡せるようにした 複数のファイルを渡せるようにした。req…

jsonからswagger specを生成するコマンドをdictknifeに取り込んだ

以前に、jsonからswagger specを生成するツールを作っていたのだけれど。とくにリポジトリを分けておく必要性もなかったのでdictknifeに取り込んだ。 ついでに、swagger独自っぽい雰囲気のしたコマンドはswaggerknifeとして別のコマンドにすることにした。 …

pythonでwarningsパッケージを使った警告の表示のメモ

警告を表示したいことがある。例えば、次のversionで廃止予定の関数を使った時の警告など。 こういうときには warningsパッケージを使う。 first step 00warn.py import warnings def foo(): warnings.warn("hmm") return "hai" if __name__ == "__main__": …

sphinxで雑にコード例と実行結果を表示したい場合

sphinxで雑にコード例と実行結果を表示したい場合がある。コード例はliteralincludeを使うと便利。一方実行結果をどうするのかというのが悩みどころ。 現状はMakefileで出力結果を生成してliteralincludeで埋め込んでいる。 こういう感じ .. literalinclude:…

sphinxのliteralincludeが絶対パスを表示するのが嫌だった

sphinxのliteralincludeが絶対パスを表示するのが嫌だった。 以下の様なmonkey patchをあてるextensionを作ってあげると無理矢理変更できる(わるい) def setup(app): # monkey patch import os.path from difflib import unified_diff from sphinx.directive…

そろそろドキュメントを書き始めることにした

github.com そろそろドキュメントを書き始めることにした。ただまだまだ個人用のつもりなのでまともな文章は書かない。 どうしてドキュメントがほしくなったか? どうしてドキュメントが欲しくなったかというと、このはてなブログの記事だけでは断片的な情報…

modulegraphが上手く動かないのでsys.path_hooksで遊ぶ

modulegraphというパッケージがあり、これでモジュール間の依存関係をグラフにしてみたりできるらしいのだけれど。何だか上手く動かなかった。 残念な気持ちにはなったのだけれど、何か特別なパッケージに頼らずともpythonのimport hookの機能を利用すれば同…

jqが難しい

例えば以下のようなJSONから、以下のような条件で取り出した結果を出力したい .appsのオブジェクトのkey名が辞書順で欲しい ただし、useがfalseのものは含めないようにしたい apps.json { "apps": { "foo": { "use": true }, "bar": { "use": true }, "boo":…

dictknife,jsonknifeの機能を整理

github.com はじめに json,yamlを扱う上で便利そうな機能を含んだ十得ナイフっぽい感じのライブラリを作っていた。それにコマンドをもたせた結果便利になってきたのでどういうときに何を使うかを整理しておく(完全に自分用のメモ)。 dictknife dictknifeとjs…

テンプレートに埋め込む際の環境変数からの情報取得について

github.com github.com jinja2テンプレートに埋め込む際に何だかんだで環境変数からの情報が取得できると便利。なので環境変数から取得する方法について考えたりしてみた。 j2cliの場合 元々kamidanaを作る発端となったパッケージに、j2cli というものがあっ…

結局昨日のロガーの話はパッケージにした

github.com 結局昨日のロガーの話はパッケージにした。100行以下で大変短く良いコード。 ただ、stdoutやstderrに出力するだけで構造化ログを実装したと言ってはだめで、何らかのdata sourceに溜め込んでそれを何らかのビューから覗くぐらいは試した方が良い…

標準ライブラリの範囲で構造化ログで出力するようにしてみる

構造化ログ? 通常のloggingライブラリなどで使われるログをテキストログと呼ぶとすると、構造化ログとテキストログには以下の様な違いがある。 テキストログ ログは人が読むもの 通常テキストファイルに出力され、grepなどにより該当するログを見つける 1つ…

ちょっとしたswagger spec(yaml, json)の取り扱いというか変換というか

過去に自分が作ったやつの使い方について。もう少しマシなものを考えてみたのでメモ。 github.com yaml上のデータから一部分を取り出したい こういうyamlがあるとする。swagger specの一部のようなもの。people,person,name,ageが定義されている。 # definit…

packageを指定してのgoコードの生成に対するgofmt(goimports)について

github.com おそらくニッチな話になってしまっているけれど。メモ。 はじめに goawayを使ってコード生成をしたときの典型的なコードの利用方法は以下の様な形になる。 $ python myscript.py --package=github.com/podhmo/myscript --position=. # 実際にGOPA…

自分用のj2cliをkamidanaという名前で作りはじめた

github.com 何でj2cliを使わないの? 何でj2cliを使わないのかというと、以下の様な理由。 j2cliのforkがいっぱいあってカオス (一番star数が多いforkは)python3.xに対応していない おもったよりも機能が多くない (正直そんなに良いコードに見えない) (init.p…

もうちょっと複雑なpythonでgoのコードを生成する例(わりとよい)

github.com もうちょっと複雑なpythonでgoのコードを生成する例を紹介して見ることにした。具体的にはswagger specを見てgoのstructを生成する処理。 go-swaggerなどswagger specからgoのコードを生成するツールは既にあったりはするのだけれど。これと似た…

pythonでgoを書くためのライブラリを作り始めました

github.com pythonでgoを書くためのユーティリティ的なライブラリを作り始めました。良い名前が見つかったので進捗がありました。 できること できることは少しずつ増えていく予定です。 structの定義 例えば、以下の様な感じでstructを定義できます。 from …

個人的なyapfの設定

備忘用のメモ。 yapfはgofmtのpython版的なもの。autopep8みたいな代替も存在している。 github.com 少しだけ違うフォーマットでつかいたかった。yayapfを作った。消したい。 github.com こういうformatに対応したかった こういうformatに対応したかった fro…

`pip install -e` でインストールしたpython製のコマンドの起動が異様に遅かった話

インストールされているコマンドの実行が遅い pip install -e でインストールしたpython製のコマンドの起動が異様に遅かったということがあった。具体的には最近作っていたものなのだけれど。以下の2つはどちらも同じ挙動を示す。 # echo '{"hello": "world…

テキトウな設定ファイル(yaml,json)から、swagger specを生成して、goのstructを定義してloadしてみる

github.com テキトウな設定ファイル(yaml,json)から、swagger specを生成して、goのstructを定義してloadしてみることにしてみた。 生成されるswagger specとgoのstruct定義は雛形っぽい感じであんまり真面目に作っていない。とりあえず雰囲気だけでも分かる…

PyYAMLで改行含む文字列の出力結果を変えたい(`|` を使いたい)

はじめに 例えば、以下の様なyamlがあった時に、 # sample.yaml article: title: hello body: | Hello. This is my first posting. blah blah blah. ただただyaml.loadしたあとにyaml.dumpするだけのコードで変換すると、以下のような結果になってしまう。 a…

`--driver` オプションでカスタマイズ出来るように直した

github.com --driver オプションでカスタマイズ出来るように直した。例えば前回の記事で @foo を {$get: foo} に変更するためのmonkey patchを試していたけれど。これをまともな形で行うようにするときには --driver 経由で設定するのが正しい。 driverにつ…

世にはびこる辛さの原因の1つは暗黙の参照関係($loadの挙動を変えた)

github.com 現状の$loadのscope 現状の$loadの実装はclosureと同様の形で外側のscopeの値に触ることが出来る。これが実質dynamic scopeのような形になっている。これが微妙かもしれない。 例えば、こういう分からない変数名fooの束縛を持つ環境でloadを実行…

複数の設定ファイルを一気に生成したい

github.com 複数の設定ファイルを一気に生成したかった。zenmaiにその機能を持たせても良かったのだけれど。そうするとdictに対するtransformer的な意味合いとは異なった何かになってしまう。 単純にyamlを受け取って、その値を特定のディレクトリ上に転写す…

zenmai version0.2になった

github.com zenmai version0.2になった。主な変更点は以下。 config loaderとしてのshortcut関数を追加 $inheritの追加 (tomlのサポート) config loaderとして使えるようになったのがおおきな変化。実用的なミニ言語(toy言語)というスタンスで作っていたけれ…

設定ファイルのconcatと設定ファイルの継承と

github.com 設定ファイルのconcatについてのメモ。例えばconcatと言っても以下の3つくらいの段階がある。 単にファイル単位でconcatするだけ JSONの構造を意識しながらトップレベルの要素同士をconcat 自由な位置に所定の要素をconcat 例えば、以下のようなy…

dictknifeでtomlをサポートしてみることにした

github.com loadingの部分を少しだけ整理した。ついでにtomlもサポートすることにしてみた。 concatで変換が行えて便利。 fruits.json { "fruit": [ { "name": "apple", "physical": { "color": "red", "shape": "round" }, "variety": [ { "name": "red del…

zenmaiをpypiにアップロードしました

github.com zenmaiをpypiにアップロードしました。以下でインストールできるようになります。 $ pip install zenmai こちらからは以上です(もう少しreadmeなどを充実させたい)。 詳しい内容は以下を参照してみてください。 pod.hatenablog.com

$whenと$unlessというsyntaxを追加した

github.com $whenと$unlessというsyntaxを追加した。$whenは以下の様な形で書く。 $when $when: <predicate> body: <body> or $when: <predicate> <body> body部分が不要なら省略できる(省略できるのはbody部分にactionの呼び出しがない場合に限る)。 $whenはpredicate部分が真ならbody部分を評</body></predicate></body></predicate>…

設定ファイルがだるい問題についてあれこれ考えたりしてみた

github.com 今回の話しはあまりまとまっていない。頭の中でぼんやりと考えたことのメモ。 似たような設定ファイルが複数ある場合 似たような設定が複数あるような設定ファイルがある。例えば、local,dev,productionという3つの環境での設定ファイルがある場…

今日は$formatと--dataオプションの取り扱いに細かな調整を加えた

github.com 今日は$formatと–dataオプションの取り扱いに細かな調整を加えた。具体的には以下の様な感じ。 $formatの対象を文字列だけから拡張した --data でファイル名だけではなく json referenceを取れるようにした $formatの対象を文字列だけから拡張し…

小さなissueを作ってはcloseを繰り返してた

github.com 細々としたaction(関数)を追加する作業。小さなissueを作ってはcloseを繰り返してた。 例えば以下のようなaction(関数)が追加された counter format get (with default value) 追加されたものたち counter $let: c0: {$counter: 3} c1: {$counter…

出来ないことがあるのは嫌だったので `--data` オプションを追加した。

github.com 今までconfigファイルを受け取ってその値を利用してrenderingするということができなかった。別の言い方をすると静的な参照関係を記述することは出来たけれど、動的な参照関係を記述することができなかった(個別にrootとなるようなファイルを定義…

結局面倒くさくなってjinja2のtemplateをサポートした

github.com はじめに 結局面倒くさくなってjinja2のtemplateをサポートした。なんだかんだでtemplateの機能はすごく便利。とは言えせっかくのdict(yaml)の構造が全て無視され文字列として扱われるというところが微妙といえば微妙。 どうしてtemplateが便利な…