読者です 読者をやめる 読者になる 読者になる

恥ずかしながら、golangの多値を返す関数の戻り値を引数に渡した場合の挙動を把握していなかった

はじめに 通常の言語だと、多値とdestructuring(分配束縛)は別物で、単一の構造体をバラす構文が入っているという感じのことが多い(schemaなどではそれとは全く別に多値を返す事ができるけれど。一方でbindingのための構文が別途用意されている)。例えばpyth…

はてなブログの記事をアップロードするコマンドを作った

github.com hatenaはoauth1.0aっぽいのでわりとだるかった。 インストール $ go get github.com/podhmo/hatena/cmd/hatena 使い方 新規投稿と編集を手軽にやりたかった。投稿した時点でaliasを覚えてくれるので編集が楽。 # 新規投稿 $ hatena -alias foo fo…

dictknife,jsonknifeの機能を整理

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

kamidanaのreadmeの生成にkamidanaを使うことにした

github.com kamidanaのreadmeの生成にkamidanaを使うことにした。便利で良かった。ちょっとしたセルフホスティング的な何か(意味的には違う)という感じになり面白かったのでちょっとだけ文章にしてみる。あとjinja2にけっこう便利な組み込みのフィルターが存…

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

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が便利な…

機能も揃ってきたので真面目な例も考えようと思った結果、禁断の果実(eval)に手を伸ばしてみたり

github.com はじめに 1週間くらい触ってきた結果それなりに機能が揃ってきたような気がする。$loadで外部のリソースから値を取ってくる事ができるようになったし。その際にjson pointerで指定した範囲の一部分を取り出すことも出来る。$concatで複数の断片を…

$letを実装しました

github.com 昨日話題にだけだしていて未実装だった$letという記法を実装しました。夢物語的な皮算用ではなくなりました。 予想通り以下が必要になりました。 scope 関数呼び出しとは異なる評価順序の特殊構文 以下の様なコードが動くようになります。 data.y…

yamlのblockスタイルとflowスタイルの違いを楽しんだ

github.com 今日もyaml上の言語のことを考えていたのだけれど。関数(action)呼び出しの部分はflowスタイルと併用すると少し見やすくなるかもしれない。 yamlのblockスタイルとflowスタイルについて yamlにはblockスタイルとflowスタイルの2つのスタイルがあ…

$loadと$concatが仲間に加わりました。

github.com $loadと$concatが仲間に加わりました。これでようやくちょっとは便利な何かとして機能し始めてきたような気がします。これら2つが具体的にはどのような効果を持つのかを少し説明したいと思います。すごく雑にいうと以下の様な感じです。 $load –…

yaml上の言語での戻り値について

github.com yaml上の言語での戻り値について考える事がある。だいたい以下の2つについて考えていた。 Noneが戻り値の関数の扱い 戻り値の解釈の仕方 Noneが戻り値の関数の扱い 通常のpythonの関数でreturnを書かなかった場合にはNoneが返る。 def f(): pass …

$importでpythonのmoduleをimport出来るようにしてみた

github.com 今回はimport出来るようにしてみた。例えば以下の様にして使うことが出来る。そう言えば、前回の記事では使い方を説明していなかった。使い方は単純で zenmai.compile(d, module) という感じで呼び出すだけ。注意点として順序は保持してもらう必…

yaml上で動くtoy言語を作り始めた

yaml上で動くtoy言語を作り始めた。 これ。 github.com 今回はコードを書く以外になるべく文章によるアウトプットを増やしてみようという試みも裏で行うことにした(そんなわけでこの記事を書いている)。 yaml上で動く言語 現在のところはlispのマクロのよう…

marshmallowのコード生成でadditionalPropertiesをサポートするのがだるかった話し

最近作っている swagger-marshmallow-codegen というライブラリでswaggerの additionalProperties に対応するのがだるかったという話。 additionalProperties? additionalProperties というのはjsonschemaの方にもある。このあたりに書いてあるので読めばど…

ちょっとインデントをしたくなった時に便利

context.redirect_stdoutなどの使い方の例にもなるかもしれない。 import sys import contextlib from io import StringIO @contextlib.contextmanager def indent(n): buf = StringIO() with contextlib.redirect_stdout(buf): yield buf buf.seek(0) prefi…

pyramid-swagger-routerと一緒にtoyboxのswaggerのvalidationを使ってみる

相も変わらずtoyboxというリポジトリで作業していた。昨日試しに作ってみたswaggerのinput,outputのvalidationを行うものを昔作っていた pyramid-swagger-router と一緒に使ってみるようにしてみた。ココまで来るとそろそろswaggerに対するnormalizer + iter…

生成したmarshmallowのschemaをwrapしてpyramidから使えるようにしてみた

swaggerからmarshmallowのschemaを生成する機能は昔から作っていて、デフォルトでは definitions 部分だけしか見ないのだけれど。--full というオプションをつけると paths 以下の parameters や responses も見るようになっている。ここで生成したschemaをp…

1ファイルでapi serverを作る用の環境を整えていた

個人用のメモです。 はじめに 手元で色々弄る用に1ファイルでweb serverを作る用の環境を整えていた。1ファイルが良い理由はいろいろな試行錯誤をするための実験をしたいからです。 pythonで使うwebフレームワークとしてはpyramidが好きなのですが、ところど…

1ファイルのアプリでview_configを使う。

誰も特をしないpyramidの話。 pyramidのconfiguration pyramidにはすごく雑にいうと以下の2つのconfigurationの方法がある。 declarative configuration imperative configuration すごく雑に言えば、declarative configurationはデコレーターを使った設定(…

最近pythonでcliのコマンドを作る時にやっていること

最近cliのコマンドを作る時にやっていることをまとめてみる。ここでのコマンドは特にパッケージとして提供されるシェルなどから実行されるコマンドのことを指している。 何が問題? 特にパッケージの提供者とパッケージのユーザーの望みが全く乖離せず一致し…

swagger-marshmallow-codegen でpaths以下も見るようにした

swagger-marshmallow-codegen でpaths以下も見るようにした。あまりきれいとはいえない感じかもしれないけれど。 paths以下を見るということ 今まではdefinitions以下しか見なかったのだけれど。通常swaggerでapiの定義をするときにはpaths以下にも色々書く…

signal handleするコードのテスト

はじめに signalをhandleするコード自体は手軽に書ける。 import signal import sys def on_sigint(signum, frame): print("hmm") sys.exit(1) signal.signal(signal.SIGINT, on_sigint) しかしこれが確実にtrapされたことを確認するテストを書くのはだるい …

swagger-marshmallow-codegenでカスタマイズ出来るようにした

swagger-marshmallow-codegenで簡単なカスタマイズ出来るようにした。 例えば以下の様なことができるようになった defaultで使うschema classをMySchemaに変える 特定の条件を満たした値のときには自分で作った独自のfieldを使うように変える ただこれらはす…

こういうちょっとしたデータの受け渡しどうするんだという話

はじめに 今自分で作っている dictknife というリポジトリについにコマンドを追加してしまった。 色々あるのだけれど。今回は dictknife transform の話。 transform 何かしらの形状の変換をしたいことがある。 例えば、こういう入力を受け取って、 properti…

pyramid-swagger-routerというパッケージを作りました

pyramid-swagger-router というパッケージを作りました。swaggerの定義ファイル(swagger.yaml)からpyramidのviewの定義のコードを生成するパッケージです。 特徴 特徴は、pyramid-swagger-routerという名前でありながら router に値するものが何もないという…

2017年

方針とか目標とか思いを巡らしてみる気になった。 方針 できればこういう風に行動したいという感じのやつ。これは以下の様な感じのものにすることにした。 なるべくupstreamに還元する いままではコードを書いていてちょっとした問題があった時に、面倒くさ…

2016年の振り返り

はじめに 2016年の振り返りということをやってみる気になりました。今まで振り返りのような何かしらの人間味のある活動を避けたいという気持ちがあり。ただただ事実や試行の断片だけを出力していきたいという気持ちがあったのですが。それでは社会との接続が…