# 日報(2020-08-29) ちょっと便利な go のモジュールをいくつかリリースしました

まず手早く小さな動くコードをつくって、動く事をまもりながらひたすらコードを足していくという態度で何でもつくってます。手早さが最優先でコード良型は意図的に無視してます。手早さにこだわる理由はモチベーションを損ないたくないからです、モチベーションさえあればなんでもできる

そのうちコードの汚さが仇になってコードを足す気にならなくなってきたら、モチベーションが復活する程度にキレイにします。単にキレイにしているだけでリファクタリングやってるわけではないです、必要なだけのユニットテスト用意してないし

作っているサービスがだいたい動き出してきて、そのサービスの存在を前提とする別のサービスに着手しようという場面で、先のサービスを作ってるときに「これって汎用性がありそうだな」って薄々思ってたあたりが実際に共通に必要になることが鮮明になったタイミングで、そういう部分をモジュールにしてます

そういうモチベーション・オリエンテッド(そんな言葉ないので勝手に言ってます)というかリレーショナリティ・オリエンテッド(聞いたことがないです)というか、そんなスタイルでやってていくつか溜まってきた、ちょっと調べて世の中になかったけど必要性はある(自分は必要だったので必要性の存在は証明された Q.E.D.)、汎用性は確実にある(別のサービスを作ろうとして実際に必要になっているので Q.E.D.)サービスをいくつかご紹介させていただこうかと存じます次第です

# persistentint (opens new window)

整数をローカルなストレージに永続化させます。そういうのって key-value な db を使うのが定石なのでしょうけど、システムの登場人物が増えるのが嫌、ローカルストレージへの単純な読み書きは速い、今の値がファイルで直接見えるので見通しがいい、ストレージそのものは lsyncd (opens new window) でスタンバイホストと多重化してある、等々の理由で作ってつかってます
cons はストレージの利用効率が db と比べてかなり悪いのではと予想されるのですが、KByte 単位な小さな話だとおもって気にせずつかってます

# cache (opens new window)

Last Use Lase Delete なだけのプリミティブな interface{} のメモリキャッシュです。"go cache" で検索するともっと賢そうな実装がいくつもでてくるのですが、みな賢そうでちょっとアレなのでとびっきりバカなのを自分でつくりました
アレってどういうことかというと、キャッシュの効率ってシステム毎の事情でなにが効くのか変わってくると思うので、チューニングが必要になった段階で最終的な運用にあわせて超過対応させるのが一番良いとおもうのですよ、その時に賢い実装だと抵抗されて手を焼くのは人間と同じだと思う次第なのです

# fransisalbert (opens new window)

リクエストボディを gin のマッパーをつかわずに生で受け取りたくて書いた関数一個だけのモジュールです、なんでもかんでもごった煮の共通ルーチン集をつくってしまって過去になんども反省していて、さすがにいい年になって悟りを開いて最近ではたった一個でも少なくてもファイルぐらいは分けるような知恵がついてます、歳をとるのにも悪くない所もあるものです

gin のマッパーを使わずにリクエストボディを生で使いたい理由はこんなかんじです

  • stripe の API で、受け取ったリクエストボディを tell quel で渡す必要があるのがあった
  • gin のマッパーで struct にマップすると存在しないメンバを 0 とか "" とかにしてくれて意味が変わってしまう。例えば、server から client に struct を json で渡して、client で変更があったメンバだけ json で返してきても、変更がなかったメンバまでゼロクリアされてしまう

ちなみにモジュール名は、gin ベースのカクテルで唯一飲んだことがあるのがこれだったので...

# hid (opens new window)

これも func が一個だけのモジュールなのですが、hashid をつくるのがちょっとスッキリします


Last Updated: 2021/2/28 3:38:39