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

goで直接reflectを使わずinterfaceを含んだstructをJSONでencode/decodeする方法

この記事はGo Advent Calendar 2021 4の19日目の記事です1。 goのencoding/jsonの機能はそこまで柔軟ではない。どこかで諦めたほうが良い事が多い2。 とはいえ、いろいろなことを柔軟にやってみる方法を検討してみるのは良いことなので検討してみる。 interf…

net/httpのhandlerにdbなどの依存を持ち込む方法のメモ

昨日の記事のついでに色々goでのwebプログラミングに関する初歩的なことをメモしておこうと思った。 net/httpのhello worldから始めてどういうタイミングでどのライブラリが必要になるかのメモ - podhmo's diary 今回はhandlerに依存を持ち込む方法のメモ。 …

net/httpのhello worldから始めてどういうタイミングでどのライブラリが必要になるかのメモ

goを始めたばかりの人の質問に対して以下の様な記事や回答はまれによく見る(自分自身もそのように答えることはままある)。 Goのおすすめのフレームワークはnet/http | フューチャー技術ブログ とはいえ、ある程度煩雑になってくるとライブラリなどを追加した…

fmt.Errorf()でのerrorのwrapはpkg/erorrsのCauseを壊してしまうので注意

どちらか一方に統一されていた場合には困らないが、混在している環境での動作のメモ。 特に、トップレベルでerrors.Cause()を使っている処理が存在していると危険かもしれないという話。 実験 テキトーに以下のようなコードを書いてみる。直接エラーを返すも…

goでfunc()(object, func(), error)のようなファクトリー関数の扱いについてのメモ

何かのファクトリーを統一的に扱いたいみたいなことを考えたときにそれへの対応を考えることがある。 goの場合はそれぞれの状況で自分の手でコードを書いてつなげなくてはいけない。ファクトリーに限らないがこの種のバリエーション自体に言及しているのはwi…

awsのassume roleに対応していなさそうなコマンドはaws stsを使わずともAWS_SDK_LOAD_CONFIG=1を付けて実行すれば良いかも?

以前の記事の続編ということになりそう。 awsのassume-roleに対応していなそうなコマンドを無理やり使う方法のメモ - podhmo's diary ほとんど内容はタイトル通りで、assume roleに対応していないようなコマンドがある。それを使うにはどうすれば良いかとい…

dockerのコンテナ内のファイルを丸ごとホストにコピーしたい

tarとかで持ってくるのが楽なんだろうか?テキトーに標準出力に書き出す感じで。 $ docker run --rm <container> tar -czf - <file> > <dst> ファイルが1つだけならcatでも良いかもしれない。あるいは小さめのファイルのものなら圧縮は不要かもしれない。 例 テキトーにelasticsea</dst></file></container>…

bigquery中のテーブルの列の削除について、RECORD型のフィールドへの注意

(これはメモ。全体的にふわっとしている) スキーマの変更が必要になったときの対応について調べたりなどしていた。 色々方法を眺めて見たところ、alter tableを使った方法が使用感的には個人的には一番しっくり来た1。が、機能が制限されているらしい。 そ…

BigQueryでのSTRUCT型を伴うSELECT文での重複行の削除についてのメモ

まず、前提として、BigQUeryにはunique constraint的な機能が存在しない。なので、あれこれと頑張ってユニーク性を保つ作業をしたくなることがある。テキトーに検索してみてもそういう話のstack overflowの質問やそれへの回答のようなものは見つかる。 Googl…

SQLでWITH句を使ってテーブルにデータをINSERTせずにqueryを確かめたい。あるいはSQLの復習。

主に手抜きのため。bigqueryのドキュメントの実行例で使われていてなるほどなーと思ったのでメモ。 ついでに色々なJOINの利用例を列挙してみる。 WITH句を使って仮想的なtableと見做す WITH句自体は概ねどのような処理系でもサポートしているみたい。これを…

docker上でpip installのcache-dirが効くようにする方法を調べてみた

以下の記事の続き。 pythonのバッチ用のイメージを作りたくなったのでサイズがどれくらいになるか調べてみた - podhmo's diary 調べてみたところ、どうやらbuildkitの機能を使うと行けるらしいという事がわかったので色々調べてみた。 python - Using a pip …

windows上のpythonでカジュアルにopen()したら UnicodeDecodeError: 'cp932' codec can't decode byte が出た話

windows環境での作業でなるほどと思ったのでメモ。 自作のスクリプトをwindows環境で動かしたら動かなかった。以下のようなエラーメッセージが出る。 UnicodeDecodeError: 'cp932' codec can't decode byte 0x81 in position 59: illegal multibyte sequence…

terraformのoutputにnestしたobject型の値も指定できる

以前こんな事を言っていたが、実際に調べたらnestしたobject型も機能したのでその訂正1。 terraformのmoduleを作成するようになって知った6つのことのメモ - podhmo's diary moduleのvariableのtypeにはnestしたobjectのような複雑な型が書けること これは、…

awsのassume-roleに対応していなそうなコマンドを無理やり使う方法のメモ

たまに以下の様な形で実行できないaws用のコマンドが存在する。 $ AWS_PROFILE=<profile> <cmd> 例えばcf-to-tfとかがそう。 github.com カジュアルに使おうとして動かなかった。 $ AWS_PROFILE=playground AWS_REGION=us-east-1 npx @humanmade/cf-to-tf --stack EC2Conta</cmd></profile>…

pipxのススメ

pypa.github.io pipxという名前を聞いてまたpythonの新しいパッケージ管理のツールと思うかもしれないけれど、少しだけ用途が違う。これがほしい場合がある。 pipxは例えばpoetryやpipenvとはちょっと用途が違う。 pipxは日常生活のためのCLIコマンドのため…

pip-chillのススメ

pypi.org pip freeze で出力されるすべてをrequirements.txtに書く1のではなく、依存の一番外側のパッケージだけを出力したい事がある。そういうときにはpip-chillが便利。 実行例 例えば、fastapiを参考に以下の様なrequirements.txtを用意してみる。 requi…

terraformのmoduleを作成するようになって知った6つのことのメモ

真面目にterraformでmoduleを書くようになって知った事をメモしてみる。これは自分用のメモなのであまり丁寧な説明はしない。 知った経緯がmoduleの作成ということであって、terraform moduleに関する機能というわけではない。 具体的には以下6つが知らなか…

pythonでSSE (server side events) の例を作ってみて遊んでみた

今回は、以下の記事の実行をwsgirefだけを使って試してみようと言う趣旨のメモ。 Server-Sent Events の利用 - Web API | MDN お試しで遊ぶ程度の実装なので真面目な実装ではない。 SSE SSEは雑に言うと以下のようなもの コネクション張りっぱなし コネクシ…

GitHub CLIを使ってgithub actionsの実行時間を覗いてみる。(--jsonオプションがworkflowやrunにも欲しい)

github actionsで構成されているCIのスピードアップを図りたくなった。そんなわけでどのactionがどの程度時間が掛かっているかが知りたくなった。 もちろん個別にweb uiを覗いていけばそれぞれの実行時間などを確認する事はできるのだけれど、めんどくさい1…

pythonで7-digitsなマイクロ秒を含んだ文字列をstriptimeでdatetimeオブジェクトにしようとしてハマった話

時刻を文字列表現にするときにマイクロ秒を含んだ表現の場合がある。例えばgithub actionsのログは以下のようなもの。 lint Set up job 2021-05-25T20:31:24.8848799Z Current runner version: '2.278.0' 2021-05-25T20:31:24.8848799Z 部分が時刻の表現。実…

goやpythonで複数のパッケージをmonorepo的に1つのrepositoryで管理する方法について調べていた

調べていたのでメモ。作業結果は以下のリポジトリにある。 github.com どういうときに欲しくなるか? どういうときに欲しくなるかと言うと、複数の関心事のそれぞれに対して複数の環境への共通の対応をしたくなったとき。その上その複数の関心事というのが曖…

enumとdataclassを含んだ値をserialize/deserializeするためにjsonpickleを使う

以前の記事の続き。 enumとdataclassesを含んだ値をテキトーにJSONとしてseiralize/deserializeしたい - podhmo's diary 何も頑張って自作せずともjsonpickleを使えば良いかもしれない。 github.com import dataclasses import enum import jsonpickle class…

poetryで管理されているプロジェクトでeditable installがしたい

まぁまれにある。work-aroundのメモ。 editable install? 通常のpythonのパッケージのインストールは、パッケージ中のファイルをsite-packages以下にコピーすることなのだけど、editable installというのは、直接参照して利用する形式のインストールのこと。…

pythonのargparseのオプションと関数の引数の乖離を実際の処理を呼ばずに確認する方法を考えてみる

argparseをそのまま使うと以下の様な形になる。色々な書き方があるが、個人的にはflag部分はキーワード引数を使った関数定義にして、parse_args()で返ってきた値をそのまま使わずに**paramsで適用する形が好み。 def hello(*, name: str) -> None: print(f"h…

pythonで**kwargsにもう少し細かく型を付けたい

例えば以下の様な関数helloがあるとする。可変長引数を使って定義されている。とてもtrivialな例ではあるけれど説明用なので。。 from typing import Any def greet(prefix: str, *, name: str) -> None: print(f"{prefix}, {name}") def hello(**params: An…

enumとdataclassesを含んだ値をテキトーにJSONとしてseiralize/deserializeしたい

昔に似たようなタイトルの記事を書いていましたが、これとはちょっと違った内容です。 datacalssesのインスタンスを含んだ値をJSONにするときのメモ enumやdataclassesを含んだ値をテキトーにJSONとしてserialize/desserializeしたくなった。パフォーマンス…

resource定義無しのterraform入門

terraformの記述の仕方を調べるための個人的なメモ。resourceを定義しないterraformの設定が書けるようになってからterraformに関する苦手意識が消えた。 teraformはIaCのためのものというのはわかっているものの、terraform自体に不慣れな段階の間はただた…

git diffのようにワード単位で色の付いたdiffが欲しい

ワード単位のdiffが欲しかったのでメモ。 ワード単位のdiff? 以下のようなファイルがあるときに $ ls src src/000person.json src/001person.json 000person.json と 001person.json の差分をdiffで見る1。色付きでみたいときには /tmp/a.diff などに出力し…

goでテスト用にhttpの通信を失敗させたかったのでその方法のメモ

たまにエラー時のハンドリング部分のテストが書きたくなることがありますね。例えば、通信の記録のような操作を書いているときなどに。 こういうときに人為的にエラーを発生させる方法を調べたのでメモをしておこうと思います。 タイムアウト分待つ まずはじ…

goでflexibleな実装の選択のためのちょっとしたパターンのメモ

前回の記事でxormのコードを読んでいたときに、flexibleに実装を選択するためのパターンがあったことを思い出したのでそのメモ。 flexibleな実装の選択? 実装の選択と言っても、DI的な話ではない。デフォルト実装と拡張の実装の間を自由に行き来できるよう…