2020-01-01から1年間の記事一覧

makeの:=と=を使い分けると便利

正直な話をすると今まで常に := だけを使っていて、= を使うことはあまりなかった。 使い分けると便利な状況が分かってきたのでここにメモしておく。 要約 ちょっとした実験用のタスクランナーとして使っていたMakefileの書き方が変わる1。 今まではこう書い…

pythonのslackclientで非同期タスクを実行したらValueErrorになった話

最近「ちょっとslack botでも書くか」と思う機会があった。そのときに色々思うことがあったのでメモ。 slack botを書く機会があった。どのライブラリを使うのが良い? 現状ではslack自身が出しているライブラリをそのまま使うのが良いのではないかと思う。 g…

スプレッドシートを設定ファイルとして使うライブラリを作ってみた

github.com slackやdiscordなどのbotを作るときに、ファイルを触れない人にも設定をいじってもらおうとしたら、スプレッドシートあたりが無難なのかなと思いました。そんなわけでスプレッドシートを設定ファイルとして使うライブラリを作ってみました。 イン…

pythonの型定義を使ってOpenAPI docを出力してみる。

今回は以前のprotobufの出力を試した記事のOpenAPI doc版。 pythonの型定義を使ってprotobufを出力してみる。 近年のOpenAPIの状況 近年では、openAPIとの付き合い方もだいぶ落ち着いてきて、夢を見た機能を実装し切るというような気持ちのところは減ってき…

goで手軽にencoding/json感覚でdotenvと環境変数を使う方法のメモ

以下2つのライブラリを使うと便利 github.com github.com joho/godotenvは、いわゆる.envファイルをいい感じに読み込んでくれるもの。 caarlos0/envは、encoding/json感覚で書いたstructのタグからいい感じに読み込んでくれるもの。 利用例 例えば、以下の…

コード生成中に、裏側でサービスを立ち上げて、通信してあげればN+1を防げる事に気づいた

github.com コード生成でのN+1? 以前に、コード生成でのN+1問題の発生というような記事を書いた。 コード生成におけるN+1問題とbulk actionとしてのegoist。あるいはMakefileについて この記事では、bulk action的な実行を解として説明をしていた。元々の問…

SQL中のtypoを何としてもコンパイラにチェックしてもらいたかった

github.com 以前に頭の中で考えたりしていたことだったのだけど。真面目に手を動かしてみることにしてみた。まだ作り途中。 考えていたこと 一番気にしたかったのはSELECT文の実行。SQLをそのまま書くのは、実際のqueryを把握しやすくて良いのだけれど、生の…

egoistでモジュールを分割できるようにした

github.com 定義が多くなってくると、1つのファイルで管理するのが厳しくなってくる。そんなわけで、moduleを分割することを考えてみた。似たような機構はいろいろなWAFにも存在する。例えばflaskならblueprint、fastAPIならAPIRouter。 Flask -- Modular A…

コード生成におけるN+1問題とbulk actionとしてのegoist。あるいはMakefileについて。

例えば以下の画像の様な依存関係でコード生成1が行われるとする。入力となるファイルが幾つかあり、例えばjinja2のテンプレートなどで出力先の表現が記述されていて、これによりちょっとしたgoのコードやopenAPI docの一部を生成するというようなタスク。 画…

サブコマンドをincludeで自由に追加できるようにした

github.com サブコマンドをincludeで自由に追加できるようにした。 デフォルトで利用できるサブコマンド 例えば egoist init clikit で生成されるdefinitions.pyは以下の様なサブコマンドを持っている。 describe generate scan usage: definitions.py [-h] …

-hや--helpでのヘルプメッセージの表示は一瞬で終わってほしいと言う話

egoistを作っていて、けっこう気にしているポイントなども記事にしてみることにする。個人的には-hや--helpに時間が掛かるCLIはあまり好きではない。 具体的には0.5sくらいでちょっとストレスを感じ、1.0sを越えると、使うたびに感じるストレスがそのツール…

pythonのクラス定義からUnmarshalJSON()でのvalidation付きのgoのstruct定義を生成する

github.com pythonのクラス定義からUnmarshalJSON()でのvalidation付きのgoのstruct定義を生成してみる。(より細かなバリエーションは https://github.com/podhmo/egoist/tree/master/examples/e2e/generate-structkit にある) なぜUnmarshalJSON()付きで…

egoistで生成するCLI定義のカスタマイズ方法について

github.com 作っていたミニフレームワークの最初のバージョンをリリースしたと言う話という記事を書きました。 goはランタイムというミニフレームワークのプロトタイプをpypiにアップロードした とはいえ、この記事だけだと何が何だか分からなかったので、作…

goはランタイムというミニフレームワークのプロトタイプをpypiにアップロードした

github.com 以下の記事のミニフレームワークのプロトタイプが動くようになったので、0.0.1をpypiにアップロードしました。 goはランタイムという発想のミニフレームワークを作り始めた このプロトタイプに含まれる機能はCLIの定義を手軽にすると言う部分です…

pythonの型定義を使ってprotobufを出力してみる。

この記事の作業の一環で、pythonの型定義の情報を使いprotobufを出力することを試してみた。 goはランタイムという発想のミニフレームワークを作り始めた 基本的にはアイデアスケッチのようなもので、ちょっとしたコード辺を書いてみて、上手く期待する機能…

errorをmapで保持する小さなerrorライブラリを作った

github.com errorをmapで保持するライブラリを作った。いわゆるmultierrorのような複数のエラーをsliceとしてまとめるライブラリは存在するのだけれど、意外とmapで保持するライブラリがなかったので。代わりのライブラリがあるならそちらを使いたい。 なぜ…

goで文字列ベースのenumの定義はこんな感じが良いかもしれない

文字列ベースのenumの定義で良さそうなコードができたのでメモ(iotaを使った数値がベースのものではない)。 文字列ベースのもの 個人的には、特に速度やメモリーなどのことを気にしない場合には、文字列ベースのもののほうが取り回しやすくて良いと思って…

goはランタイムという発想のミニフレームワークを作り始めた

goはランタイムという発想のミニフレームワークを作り始めた。まだ全然完成はしていないけれど、どういう方針で作っているかなどをメモをしておく。 github.com フレームワークと言いつつ、現状ではそこまでいろんなことをやってくれるという感じではない。…

goのflagパッケージは-xxxだけでなく--xxxにも対応していることを知った

-nameというオプションを持つようなコマンドを作ってみるとヘルプメッセージは以下の様になる。 $ go run main.go -h Usage of app: -name string name of person (default "foo") 素直にヘルプメッセージを読むと使えるのは、-name <value> と -name=<value> だけ。 実際</value></value>…

依存を可能な限り少なくして、irisデータセットの散布図を描きたい

グラフを描きたいと思ったときには以下の2つ場合がある 絵が描きたい データを分析したい(EDA) 今回は概ね前者の場合の話。ついでにnumpy,scipy,pandasなどに依存したくない。依存はこれだけ。 $ pip freeze pygal==2.4.0 vega-datasets==0.8.0 依存を可能…

Makefile上でprocess置換を使う方法

TL;DR makeはデフォルトでshが動く。bashなどにしないとprocess置換が使えない。 make中ではprocess置換が使えない? 何も考えずにprocess置換を使おうとするとエラーになってしまう。 $ make 02 python <(python -m prestring.python hello.py) /bin/sh: -c…

dictknifeにshrinkコマンドを追加した

github.com 発端 qiitaのAPIを実行してみるとあるユーザーのストックの情報が取れるらしい(実はストックは公開情報だったんですね)。 https://qiita.com/api/v2/docs#get-apiv2usersuser_idstocks GET /api/v2/users/:user_id/stocks 指定されたユーザがスト…

pythonのgraphql-core上のオブジェクトからSDL (schema definition language) を出力する方法についてのメモ

graphqlのSDL (schema definition language) を出力する方法をメモしてみた。 github.com 個人的なメモなので分かりづらいかもしれない。graphqlに対応したコード生成などを考える上でどの表現だけを残しておけば良いのかなどを気にしたかった。その上でいろ…

普段遣いの言語がpythonとgoの人がrubyを使いたくなるときのこと

備忘録ということでメモしておくことにする。 いつrubyが欲しくなるか? 今現在では日常的に書く言語、つまるところの普段遣いの言語がpythonとgoなのだけれど、時折rubyが欲しくなる。 それがいつかというと、ワンライナーがほしいとき。タイトルを見れば想…

graphqlのdataloader的なもの(bulk query)について考えてみる

そろそろノルマがやばいのでdataloderを支えるような概念について考えてみることにする。 例えば以下のようなコードは3回queryを実行する。 u0 = Users.get(1) u1 = Users.get(2) u2 = Users.get(3) 実際のアプリケーションでは、これらのqueryがコード上の…

goでadditionalProperties:trueのように余分なデータを保持したままJSONをmarshal/unmarshalする良い方法がみつからない

時折、余分なデータを保持したままJSONをmarshal/unmarshalしたくなることがある。例えばwebAPIを利用するときなどに、すべてのフィールドを記述するのは面倒だけれど、新しく増えるフィールドの存在に気づかず欠損してしまうのは避けたいみたいな状況。 内…

goのcologのような色付きのloggingをpythonの標準ライブラリのみで行うためのメモ

goのcologのような色付きのloggingをpythonの標準ライブラリのみで行うためのメモ。 colog? github.com 色付きのログ出力は色々あるけれど。goのcologの表示が手軽で便利そうだったのでこれを参考にすることにした。 このような形で色付きで出力される。 こ…

手軽な実験のためのimport logger;logger.infoが面倒だったのでhandofcatsにprintを追加した

github.com 手軽な実験のためのimport logger;logger.infoが面倒だったのでhandofcatsにprintを追加した。 callstackを取り出してloggerに渡す名前を推測してみたりなどと色々と考えたりもしたけれど、結局保守的な実装に落ち着いた。 handofcats.print hand…

新しいgithub CLI toolのghコマンドが更新チェックをいつ行っているのか気になったので調べた

github.com 最近githubがhubの代わりにghという新しいgithub用のCLIツールを出していました。cli/cliという位置にあるので組織名とリポジトリ名がすごい。特等席。 例えばmacでは以下の様な形でインストールすると、このghコマンドが使える様になる。 $ brew…

mypyでProtocolを使ってmix-inを利用したクラスに型をつける

たまには、他の人の役に立つ記事も書こうということで書いてみる。 例えば、以下のようなmix-inを使ったコードがあるとする。トリビアルな例で特に必要になりそうなコードではないけれど、まぁ説明のためのコードなので許してほしい。 EnumerableMixinはmap(…