サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
pod.hatenablog.com
昨日の記事のついでに色々goでのwebプログラミングに関する初歩的なことをメモしておこうと思った。 net/httpのhello worldから始めてどういうタイミングでどのライブラリが必要になるかのメモ - podhmo's diary 今回はhandlerに依存を持ち込む方法のメモ。 方法は概ね3つ。後はそれらのバリエーション。 グローバル変数として状態を保持 handlerを関数ではなく特定のstructのメソッドとして定義し、そのstructのフィールドに保持 handlerではなくhandlerを返す関数として定義し、routerに登録するのは返されたクロージャにする ちなみにわかっている人にはこのStack Overflowのページを見せれば終了という気もする。 go - How to pass a parameter to my auth middleware to get
真面目にterraformでmoduleを書くようになって知った事をメモしてみる。これは自分用のメモなのであまり丁寧な説明はしない。 知った経緯がmoduleの作成ということであって、terraform moduleに関する機能というわけではない。 具体的には以下6つが知らなかった事柄 countで作成する/しないの制御できること lifecycleのignore_changesで差分の判定条件を調整できること moduleのvariableのtypeにはネストしたobjectのような複雑な型が書けること moduleのvariableのtypeは渡される値の部分型であれば良いということ listにはconcat()、mapにはmerge()でいわゆるmonoidっぽく扱えること terraformにもfor expressionという内包表記的な記述が存在していること countで作成す
go1.13以降、github.com/pkg/errorsから、標準ライブラリのerrorsとfmtを使う形への乗り換えが行われていたり行われていなかったりする1。 乗り換えの方法についてはerrors.Is()やerrors.As()の使い分けに終止している事が多い気がする。それ以外の変更点で気になったことについてメモをしておく。 pkg/errors.Wrap() その前におさらい。 pkg/errors.Wrap() は2つの機能を持っている。 エラーにちょっとした修飾をつける スタックトレースを取得する 前者は fmt.Errorf("%w:", ...) で対応できるようになった。 一応pkg/errorsの実行例も表示しておく。実行例は以下の通り。 %+vでSprintfなどした場合に、ちょっとした修飾付きでスタックトレースを含んだ表現を出力してくれる。これは一般的な言語のp
これはGo Advent Calendar 2020の3日目の記事です。 とりあえずで登録してしまったので、特に肩に力の入った力作などは用意してないです。この記事は、本来のアドベントカレンダーの趣旨に沿った(?)ちょっとした内容の記事にしようと思います。 はじめに断っておくと、あんまり役に立つ内容ではありません。へー、そういうのもあるんだー程度の軽い気持ちで読むことをおすすめします。 goでのweb API用のクライアントライブラリ goでweb API用のライブラリを実装するとき、とくにREST API用のクライアントライブラリを実装してみるときに、パスのネスト構造をそのままstructとして定義する実装をよく見ます。これはstructを一種の名前空間として使うことで名前の衝突を避ける機能、そして実装をちょうど良い粒度で分割するためのアイデアと言えるかもしれません。 例えば、以下のような
時折変換の仕方などを忘れてしまい調べることなどがあるので。個人的なメモ。 JSONの文字列表現の文字列 JSONの文字列表現の文字列。なんて言えば良いんだろ?こういうやつ。 "{\"name\": \"foo\", \"age\": 20}" とりあえず、unicode-escapeを使ってどうにかする。 >>> s = '"{\"name\": \"foo\", \"age\": 20}"' >>> s.encode("utf-8").decode("unicode-escape").strip('"\n ') '{"name": "foo", "age": 20}' Unicodeリテラル こういうやつ。これもunicode-escapeでdecodeしてあげるのが良い。 '\\u3042' 最初がstrならencodeでbytesにする必要がある。 >>> '\\u3042'.enc
この文章は write-blog-every-week Advent Calendar 2019 の 7日目の記事です。 TL;DR (ほぼ)毎週blogを書いている advent calendarへの参加のついでに自分とblogとの付き合い方についてまとめてみた 自分の頭の中を再現することを重要視しているらしい What are you doing? write-blog-every-week? write-blog-every-weekとはその名の通り「毎週blogを書こう」という集まりです。基本的にslack上で活動しています。 このグループの発端は @kojirock5260 さんのこの記事で分かりそうです。 勢いで週一blog書くslackグループを作った 基本的には以下に書かれていることの通りです。 とりあえず細かいルールはなしで 週イチでblog書く。 書けてなければ煽る。
mypyで使えるProtocolが便利という話の例。 structural subtypingをやる際にgoでもほしいと想うことが多かった例がProtocolでは大丈夫なので良いなーという例(今回はそのうちのひとつだけを紹介)。 Protocol? Protocolをいつ使いたくなるかというと、大抵は複数ある何かを同一視したくなった場合。 例えば以下の様な例があげられる。 クラスの継承関係を無視して同様のふるまいを持つものを同一視したいとき ある値を持つものを同一視したいとき 関数とcallable objectを同一視したいとき 同一視した表現を受け取って再帰的に同一視した表現を返したいとき (self-reference) mypyでの型チェックはnominalなので、こういう構造を利用して同一視したい場合にはstructural subtypingが欲しくなる。これ用のinterfa
from nbreversible import code import pandas as pd import numpy as np import seaborn as sns # %matplotlib inline xs = np.arange(1, 10) ys = np.arange(1, 10).reshape(9, 1) m = xs * ys df = pd.DataFrame(m) df 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 1 2 4 6 8 10 12 14 16 18 2 3 6 9 12 15 18 21 24 27 3 4 8 12 16 20 24 28 32 36 4 5 10 15 20 25 30 35 40 45 5 6 12 18 24 30 36 42 48 54 6 7 14 21 28 35 42 49
pythonでもdictに型を付けたいですね。一応TypedDictという型を定義したいという動きになっています。ちなみにまだこの機能はexperimentalになっているので。mypy_extensionsの方に入っています。 import mypy_extensions as mx class Pair(mx.TypedDict): left: int right: int d0: Pair = {"left": 0, "right": 0} # もしくは d1 = {"left": 0, "right": 0} # type: Pai mypy_extensions ついでに寄り道、mypy_extensionsについて、基本的にpythonの型関連の機能は以下の順でnitghtlyからstableというような遷移をします。 mypy_extensions -- experiment
構造化ログ? 通常のloggingライブラリなどで使われるログをテキストログと呼ぶとすると、構造化ログとテキストログには以下の様な違いがある。 テキストログ ログは人が読むもの 通常テキストファイルに出力され、grepなどにより該当するログを見つける 1つのログの単位はテキスト(文字列) (パラメーターを自由に付けたりというのはむずかしい) 構造化ログ ログは機械が読むもの 何らかのアプリケーションにより検索され、何らかのビューから情報を確認する 1つのログは何らかの構造化された表現(e.g. JSON) (パラメーターを自由に付加できる) すごく雑にいうとテキストログと言うのは以下のような出力のものを指してる。 2017-05-20 21:13:44,296 INFO:app:hello 2017-05-20 21:13:44,296 ERROR:app:broken Traceback
.gitattributesをいじって特定のファイルをgithubのPRのdiffの対象から外す方法のメモ。 TL;DR .gitattributes <隠したいファイルのディレクトリ>/* linguist-generated はじめに 例えばコード生成をしたり、利用の過程で複数のファイルを1つにまとめたファイルを作ったりすることがある。これらをrepositoryに含めた際にPRに含まれて邪魔に感じることがある。 今までdiffを隠せるのは、特定のファイルや例えば// Generated by xxxxのような特定のコメントなどが存在するものだけだと思っていた。任意のファイルを対象にできることが分かったのでそれのメモ。 linguist? github.com github上でのファイルの取扱いを決めるコードは公開されている。 Language Savant. If your repo
なんとなく自分の中でのopenAPIについての総括的な行いをしたくなってきた。ちなみに雑感的なものは最近tweetした。ただし今回はその手前でschemaに関する事柄についてまとめてみようと思った。 jsonschemaとOpenAPI Spec ここで言及しているjsonschemaとOpenAPI Specはこれらのこと。 https://json-schema.org/ https://swagger.io/specification/ ただしOAS(OpenAPI Spec)の利用経験的にはOAS3.0.xではなくOAS2.0を利用してのことが多くなるかもしれない。そしてjsonschemaに関してはフルの仕様の話ではなくあくまでOASに関連するものだけ。 strictなschemaとは? strictなschemaとは?というところから端を発して、なぜjsonschemaが辛くな
時折、ちょっとしたスピードアップにhttp(https) requestを並列で投げたい場合がある。aiohttpなどを使っても良いが既存のコードを書き換えるのもめんどくさい。そのようなときの方法のメモ。 concurrent.futuresを使う方法も考えられるけれど。今回はasyncioだけに絞った話。 いわゆるpythonでのhttp requestのデファクトスタンダードはrequestsだと思う。ところでこのrequestsはnon blockingではないのでasyncio上で使おうとすると処理がblockしてしまう。run_in_executor()を使うと処理を外部の環境に移せる。 試しに、run_in_executor()を使ってみよう。動作確認自体は直接のhttp requestではなく、requestを模したfakeの関数を使って行う。以下の様な関数。この処理はtim
最近は設定ファイルだけではなく環境変数で設定を渡すことがけっこうある(コンテナ的な文脈だったり、12 factor app的な文脈だったり色々)。自前で頑張っても良いけれど。自分でコードを書かずに済ませたい。 何か良いライブラリは無いかなと探してみたらあったので使いかたのメモ。 github.com python-dotenv Get and set values in your .env file in local and production servers. tada install $ pip install python-dotenv 挙動 getting startedを読むだけでは挙動を把握できなかったので色々調べてみた。 挙動を一言で言うと、os.environに対してdefault値を与えるもの。 たとえば以下のような.envがあるとする。 .env prefix=hel
昨日あたりにsqlalchemyのautomapの仕組みをつかってgraphqlのschemaを作ろうとしていたのだけれど。その時に使っていたsqlalchemyのautomapの仕組みが期待していたのとちょっと違っていたのでどうしようか考えてみる。 sqlalchemy? pythonで使われているORM mapper的なもの。これ automap? 古くはsqlsoupと呼ばれる、既存のDBの情報を取り出して、ORM用のmodelを良い感じに作ってくれるメタプログラミングを利用したパッケージがあった。このパッケージにあった機能の概念ををsqlalchemyの作者がsqlalchemyに取り込んだもの。使い方はドキュメントを読むと良い。 automapの仕組み automapの仕組みは大雑把に言うと以下のもの。 metadataのreflectを使う reflectによって得られた設定を
asyncioを使っていて、awaitableな関数群で構成されていないコードセットを無理やり非同期化してお茶を濁す時にrun_in_executor()が使われる。 ただしこのrun_in_executor()を使っても上手く処理を別スレッドに逃がせずという事態に陥ることもある。その理由などについてのメモ。 (実験用のコードのgist。分かっている人はこれを見るだけで良いかもしれない) (正確には言えば、しっかりと別スレッドで実行されてはいるのだけれど、特定のコードブロックの実行がCPUを占有して、非同期的に動いている他の処理の待ち受けにすら反応を返さない様に見える状態のこと) run_in_executor()を使ってもブロックしてしまう とりあえず以下の様なコードを見て欲しい。1秒掛かりそうなタスクを2個、2秒掛かりそうなタスクを1個、並行で動かそうとしているが実際の実行時間は4秒に
vgoが有効な環境の場合に相対importがエラーになる 時折、GOPATH外で作業したりするときなどに相対importが使いたくなる。例えば以下の様な構成でxxx packageの関数を利用したい。 . ├── main.go └── xxx └── hello.go 1 directory, 2 files xxx/hello.go package xxx import "fmt" // Hello : func Hello() { fmt.Println("hello") } main.go package main import ( "./xxx" ) func main() { xxx.Hello() } 以前まではGOPATH外で書いたgoのコードでファイルを分けたpackageを読み込んで利用したいときには、このような形で相対importを使うことができた。一方でgoのmod
goはASTの解析が手軽なのが便利。ところでこれにgo/typesの機能を使うととても便利になる。その威力を一番わかりやすく体験できそうな例を思いついたので紹介する。 (実際にはgo/typesの機能の使いかたはこれいがいにも色々ある) go/types? go/typesというのは概ねgoで型情報を扱う時に使うことになるパッケージ。(ちなみにgolang.org/x/tools/go/loader経由でソースコードを読むと自動で使われるので個人的にはloader経由で使うことが多い) importしたパッケージのpathを変える importしたパッケージのpathを変えてみたい。例えばの例なのでテキトウだけれど。fmtパッケージのimportをfmt2パッケージのimportに変える例を紹介する。例えば以下の様なコードが fmt.Println("hello") 以下の様になってくれれ
goでstructの定義を見てあれこれしたいことがある。特にコード生成などの文脈が多い。このような時に巷の記事や情報などではASTをがんばって解析するという方法が紹介されている事が多い。それよりもtypes.Package経由で*types.Objectを触ったほうが便利だよという話。 types.Objectとは? go/typesの中に記述されているinterface。以下のような定義になっている(長いけれど実質使うのはName,Type,Stringくらい(ASTへ反映したいときなどにはPosも使う))。 go/types/object.go(定義は長いし読み飛ばしても構わない) // TODO(gri) Document factory, accessor methods, and fields. General clean-up. // An Object describes a
TL;DR goであんまりfieldにpointerを使いたくない required,unrequiredを表現するときにはpointerを使わざる負えない? unmarshal時に自分でチェックすればやれないこともない はじめに goのJSONへの対応について悩まされる事が多い。色々試行錯誤を繰り返したり何かのツールやライブラリでの捉え方を見てみたりはするのだけれど。これが良いという形を見出だせない。 何が問題なのかというと、goではpointerを多用するとnil dereference panicが起きやすいことで可能ならこれを避けたい(あとstruct自体をfieldにするとzero値で初期化できるのでテストなどで便利というような副作用もある)。一方でpointerを利用しなくてはrequiredのチェックができないということ。 似たような考えや思いは古くからあるらしく例えばqii
疎なfield(ほとんどがnullでごく少数のdocumentだけ値が入る)があったとして。 これに対するindexはsparse indexで十分じゃないかなと思っていたのだけれど。 試してみたらだめなqueryだったという話。 explainの見方 その前にexplainの見方をメモ db.<collection>.find(q).explain("executionStats") winningPlanが採用されたもの(rejectedPlanが非採用) 使われているindexはinpuStageがIXSCANの時のindexName(IXSCAN=index scan, COLLSCAN=collection scan) totalDocsExaminedはindexで絞り込まれたdocument数 nReturnedは返されたdocument数 要はIXSCANになっていればOK
警告を表示したいことがある。例えば、次のversionで廃止予定の関数を使った時の警告など。 こういうときには warningsパッケージを使う。 first step 00warn.py import warnings def foo(): warnings.warn("hmm") return "hai" if __name__ == "__main__": print(foo()) print(foo()) warnings.warn で警告メッセージを表示する。defaultではUserWarningの警告レベルで警告メッセージが出る。同じメッセージは2度表示されない。 $ python 00warn.py 00warn.py:5: UserWarning: hmm warnings.warn("hmm") hai 開発者向けのDeprecationWarning 開発者向けにDe
最近作っている swagger-marshmallow-codegen というライブラリでswaggerの additionalProperties に対応するのがだるかったという話。 additionalProperties? additionalProperties というのはjsonschemaの方にもある。このあたりに書いてあるので読めばどういうものかわかる。 https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#model-with-mapdictionary-properties additionalPropeties 取りうる値がbooleanだけだと思っていたので普通に読み飛ばしていたのだけれど。実際にはobjectも受け取る。 booleanの例は例えば以下の様な形。 defini
json.loadsは使えない 例えば以下の様なデータが在る場合がある。 {"name": "foo"} {"name": "bar"} {"name": "boo"} 通常の方法ではinvalidなJSONなので読み込めない。 import json s = """ {"name": "foo"} {"name": "bar"} {"name": "boo"} """ print(json.loads(s)) エラーになる。json.loadsは使えない。 json.decoder.JSONDecodeError: Extra data: line 3 column 1 (char 17) json.jSONDecoderのraw_decodeを使う 以下の様な関数を定義してあげる。ジェネレーターである必要はあんまりない。 import json from json.decoder im
はじめに たとえばグラフを描画するnotebookをたくさん開いている状態。 ちょっとだけimportしたライブラリに変更があったので実行結果が変わりそうになってしまった。 このようなときに、すべてのipynbファイルを開いてrunallした後にsaveというようなことを手動で行いたくない。 はじめはheadless jupyterのようなものを作ろうとしたけれど。nbconvertで大丈夫だったという話。 nbconvert --execute jupyterにはnbconvertというコマンドもついてくる。 これは、ipynbファイルを別のフォーマット(例えば、pdfだったりhtmlだったりmarkdownだったり)に変換するためのコマンドという認識だったのだけれど。 なんと--executeというオプションがついている。 これを使うことで再実行が可能になる。こういう感じ。 $ jup
djangoのformが辛いという話 はじめに 例えば何らかの処理があるとする。それはある条件にマッチした場合にしか利用できない処理だとする。 T = TypeVar('T') class ActionDispatch(object): def test(self, x : T) -> str: return "A" or "B" or None def get_executor(self, kind : str) -> Callable[[T], None]: return on_a_action or on_b_action もちろん例なので実際には test() はBになり得るし、get_executor() 時にはon_b_actionが返ってくる場合もある。 これを使う処理をapi関数として切り出しておいてみる。以下の様な定義になると思う。 def get_executor(x
2つrepositoryがあり後者の方がmelpaで入るもの。どうやら後者は前者のforkらしい。 tkf/emacs-ipython-notebook: IPython notebook client in Emacs millejoh/emacs-ipython-notebook: Jupyter and IPython 2.x/3.x notebook client in Emacs install package-installで入れる。 M-x package-install ein 注意点としてemacsのversionを上げないとうまくいかない模様。25に上げる必要があった。結構アグレッシブ。 Unknown method kind :around · Issue #219 · millejoh/emacs-ipython-notebook how to use 使い方は以下
最近cliのコマンドを作る時にやっていることをまとめてみる。ここでのコマンドは特にパッケージとして提供されるシェルなどから実行されるコマンドのことを指している。 何が問題? 特にパッケージの提供者とパッケージのユーザーの望みが全く乖離せず一致している場合は問題がない。ユーザーが必要としている機能をパッケージの作者が提供すれば良い。 問題はところどころカスタマイズしたくなるような場合。このようなケースは自分がパッケージの作者でありユーザーである時によく発生するので面白い。パッケージの機能としては含めたくないものの現在のプロジェクトの範疇では必要となる、ただし新たなサブパッケージの様な何かを作る程汎用性があるとは思えないというような場合など。このような時にどうすれば良いのかということについてある程度回答ができるようになったのでまとめてみる。 おさらい 上の問題についてとりあえずpythonでの
はじめに 通常の言語だと、多値とdestructuring(分配束縛)は別物で、単一の構造体をバラす構文が入っているという感じのことが多い(schemeなどではそれとは全く別に多値を返す事ができるけれど。一方でbindingのための構文が別途用意されている)。例えばpythonの例でいうと以下の様な感じ。 vs = (1, 2) x, y = vs 単一のタプルをdestructuringした結果、それぞれの値が変数に束縛されるという形。 これがgolangでも同様だと思っていたのだけれど。実はちょっと違ったという話。 ふつうの分配束縛(のように見える) golangでも多値を返す関数が定義できる(pair)。そしてpythonの例と同様の理屈でdestructuringが行われ、複数の引数を取る関数(add)に渡され使われる(ように見えていた)。 package main import
次のページ
このページを最初にブックマークしてみませんか?
『podhmo's diary』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く