memo

なぜちょっとした作業をやるときにMakefileを書いてしまうのか

はじめに なぜちょっとした作業をやる時にMakefileを書きたくなってしまうのかということについて頭を整理してみることにした。 ちょっとした作業? その前にちょっとした作業とは何かということについて触れることにする。ちょっとした作業というのはぱっと…

makefileのforeachのハマりどころ

タスクランナーとしてのmakeのN回目。あんまり深追いしたくはないという気持ちもありつつ。 以前書いたようにmakefile中ではbashの関数などの定義ができない。そんなわけでdefineとcallを使う。これはこれで便利。ただforeachまで使おうとするとちょっとハマ…

emacsで正規表現で置換する場合に入力する値のメモ

emacsで正規表現で置換する場合のメモ。ついついescapeなどの対応関係を忘れてしまうので。 例 int(xxx)をxxxに変換する M-x replace-stringでminibufferで入力する場合 int(\([^)]+\)) -> \1 ちなみに文字列で渡す場合には全部にescapeが要る。 (replace-re…

go言語でローカルで定義した関数で再帰する話

go言語でローカルで定義した関数で再帰したいと思うことありますよね。ちょっと横着してクロージャに環境をキャプチャすることを任せてしまってそのコンテキストで木などを再帰的に辿りたいみたいな場合などに。 そんなわけでgoでもローカルで定義した関数上…

structの生成にfactory的な関数を用意しておくと埋め込みに変えたときに特に嬉しいという話

はじめに structの生成にfactory的な関数を用意しておくと埋め込みに変えたときに特に嬉しいという話。これはもしかしたらニッチな話かもしれない。あるいはgoの本のどこにでも書いてある一般的な話かもしれない。今日goのコードを書いていてなるほどなーと…

x/sync/errgroupの亜種みたいなものを考えたりしていた

突然ですがx/sync/errgroupはとても便利です。ちょっと並行で外部リソースにアクセスしたいときなどはsync/WaitGroupで書いてエラーの扱いを自分で頑張るよりerrgroupに任せた方が楽です。 g, ctx := errgroup.WithContext(ctx) // ここでのf0,f1,..などはgo…

go/types内で特定のobjectの保持しているメソッドの一覧を取得する方法

go/types内で特定のobjectの保持しているメソッドの一覧を取得する方法のメモ。 以下を知っておけば良い。 scope.Lookup(name)でtypes.Objectが取れる structと定義されているmethodの一覧の組はtypes.Namedというstructで管理されている types.Namedから全…

最近goでCLIのコマンドを作るときの雛形のメモ

たまにどう書くか忘れて調べたりするので自分用の雛形をメモしておく。 kingpin だいたい自分でCLIのコマンドを作る場合には以下のようにしている。 使っているのはkingpin。とは言えこのパッケージにこだわりがあるというわけではなく。goのコマンドライン…

go言語のASTの全てのコメントは、*ast.File以下の子孫ノードから集める事はできないという話

*ast.File はファイル中のすべてのコメントを持っている goでASTを取り出すと、通常はファイル単位で扱うことになる。この時の値の型は *ast.File。ここで対応するファイル中のすべてのコメントは ast.File のCommentsフィールドにある。コメントは *ast.Com…

goのast.Fileからファイル名を取得する方法

*ast.File からファイル名を取得したい goのファイルのimportなどの情報を取得するのに、直接 go/* のpackageを使うよりも golang.org/x/tools/go/loader を使うのが手軽。 pkgname := "golang.org/x/tools/refactor/rename" c := loader.Config{} c.Import(…

packageからfilepathを推測する方法あるいはその逆

packageからfilepathを推測する方法などをまとめておきたかった。 (ついでに個人的な信仰からホームディレクトリは~になっている) packageからfilepath package main import ( "go/build" "os" "os/user" "path/filepath" "strings" "github.com/pkg/errors"…

golangの現在のファイルのimport関係に即したTypeStringの表記を作る

TypeString? go/typesにQuqlifierという型がある。これと一緒にTypeStringという関数がある(いずれも、GOROOT/src/go/types/typestring.goに定義されている)。これらは型情報付きの表記をするために使われる。 type Qualifier func(*Package) string // Type…

goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた

goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた。基本的には綺麗に小さく分割するが正解であるし。そうするべきなのだけれど。それ以外の方法を考えたのでメモしておく。あとから見直してもちょっとトリッキーだと思うので常用する…

goでのslack通知(mail通知)のコードについて考えたりしていた

goでのslack通知(mail通知)のコードについて考えたりしていた。とりあえずの段階ではdispatcherという構造で管理するのが良さそうという感じにはなった。 ただ、色々な階層でのテストなどのことを考えるともう少し考えることがありそうな感じがしている。 di…

今年作ったgithubのrepositoryを調べる

もしかしたら今年も作ったrepositoryを振り返えったりするかもしれないので。そのメモ。 今年作ったパブリックなrepositoryの一覧を手に入れる方法について。 setup 残念ながら依存関係があるので以下のインストールが必要。 pip instlal httpie jqfpy 今年…

dabbrev-expandが手元のarchの環境で期待通りに動かない理由を調べた

(これはとても個人的なメモというか備忘録です) dabbrev-expandが手元のarchの環境で期待通りに動かない理由を調べた(付け加えておくと、手元のarchの環境が悪いのであってarchが悪いわけではない)。 はじめに 最近、自分の使っているemacsのdabbrev-expand…

context managerの`__enter__()`の呼び忘れを防ぎたい

はじめに context managerの__enter__()の呼び忘れを防ぎたい # こちらは正しい __enter__()が呼ばれている。 def ok(): with f(): do_something() # こちらはだめ def ng(): f() # 警告を出したい 方針 これはおそらくあんまり方法がなくって。gcに回収され…

メソッドを置き換えたmockをもう少しstrictにしてみたい

メソッドを置き換えたmockをもう少しstrictにしてみたい。mockのpatchなどでobjectを置き換える時に属性の存在まではspecやspec_setで対応できるのだけれど。メソッドのsignatureまで含めて置き換え前のものと同じかどうか確認したい。 例えば、存在しない属…

標準ライブラリの範囲でpythonでweb APIのmock serverが欲しくなった場合

mock serverが欲しい web apiのmock serverが欲しくなることがある。結構その場その場で欲しくなる機能というのが微妙に違ったりするので毎回そらで手書きする事が多い(本当は上手に抽象化できるのかもしれないけれどできていない)。今回の機能は以下の様な…

emacsでjqをJSONファイルのformatterとして使う

emacsでjqをJSONファイルのformatterとして使う。方法は2つ。 shell-command-on-regionを使う formatter専用の関数を作る shell-command-on-regionを使う M-|にshell-command-on-regionという関数がbindされている。これに引数を与えてあげると、現在選択さ…

marshmallow-polyfieldを使ってoneOf的な構造のdataを扱う

はじめに 例えば、以下のよう1つのfieldに複数の形状の値が入ることがある。そして、その形状を決めるためにtypeなどfieldを含まれているJSONがあるとする。 以下の様な感じ(下の例では、personとgroupという2つの形状がobに入る可能性がある)。 { "ob": { …

marshmallowで相互排他的なfieldを定義する方法

はじめに こういうJSONを許したい。 { "left": { "name": "foo", "value": 100, } } あるいはこう。 { "right": { "name": "foo", "value": 100.0, } } left,rightというfieldの内どちらか1つだけ値が入るデータをvalidとしたい。例えば以下はダメ。 {} これ…

jqの出力をパイプでつなげた時の挙動(slurpとunbuffered)について

about jq jqはjsonの整形に使われる。通常は以下のようなvalidなJSONを入力にする data.json { "name": "foo", "age": 20 } 整ったフォーマットで出力される。 $ cat data.json | jq . { "name": "foo", "age": 20 } diffなどを取る時には、-Sを使ってキーで…

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

グラフ描くの簡単な環境作っときたいかも。要求は以下の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 …

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

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

最近pythonでmongodb使うなら

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

統計的学習の基礎という本を読み始めた

統計的学習の基礎という本を読み始めた。英語読みたくないという精神で日本語の物を買った。 書いてある内容自体は何となく理解した気にはなるものの納得した感はまだあんまりない感じかも。解析的にはという修飾がついているところなど、ろくに計算や確認な…

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

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

dictknife,jsonknifeの機能を整理

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