Runner in the High

技術のことをかくこころみ

2021年の振り返り

今年もあっという間に終わってしまった... 仕事について まだまだマネージャとしてはペーペーだけれども、1年間マネージャという役職で仕事をやりきったのがこの2021年だった。読んだ本をまとめた記事も書いた。 izumisy.work 具体の仕事のはなしにはなるが…

ITベンチャーのミドルマネージャ初心者として参考になった3冊

izumisy.work マネージャという役職として働くようになってそろそろ2年目が見えてきた。 自分の所属するUniposでは、複数チームが開発組織に並存するようになってから日が浅く(とは言っても1年以上は経っているが)それにともなって各チームをマネジメント…

Earthlyがもつ2種類のキャッシュ機構(inline, explicit)について

izumisy.work 前回はあまりキャッシュについて触れることができなかったので、今回はEarthlyが持つキャッシュ機構だけにフォーカスして書く。 Earthlyにおけるキャッシュ Earthlyは環境に依存しない実行環境を提供するため、キャッシュにおいてもローカルフ…

Earthlyでコンテナ時代のビルド環境を味わう

【これはUnipos Advent Calendar 2021の2日目の記事です】 つい最近、EarthlyというDockerコンテナベースのビルドツールで、自分の開発しているGoのアプリケーションのMakefile/Dockerfile/docker-compose.yamlを置き換えたのでそれを記事にしてみる。 Earth…

Firebase HostingのPreviewチャネルへデプロイしたURLをPRにコメントするGithub Actionsを作る

【これはUnipos Advent Calendar 2021の1日目の記事です】 PRを作ると自動でFirebase HostingのPreviewチャネルにデプロイが行われ、デプロイされたチャネルのURLがコメントされる。コミットが積まれるたびに新しくデプロイされ、コメントのURLも更新される…

os.SameFileでファイルシステムに依存しないパス比較をする

earthly/earthlyに修正のPRを出す過程で知ったのでメモ github.com 例えば /Users/hoge/ccc と /Users/hoge/CCC というふたつのパスがあるとする。 クロスプラットフォームなCLIアプリケーションを作っていたりすると、上記のような2つのパスが「同じ場所を…

なぜElmは0.19のままか、変化すること/しないこと

discourse.elm-lang.org つい先日、数か月ぶりにElmのupdate話がでてきた。 Elmは0.19からほとんどメジャーバージョンアップしていない。最後のリリースは約9か月前にもなる。 この事実だけを知ると「Elmはもう終わったのか」「Evan*1は開発のモチベーション…

docker-composeを使う際のprofiles, networks, volumes

go-cleanarchitectureにdocker-composeを導入した過程で学んだprofiles, volumes, networksの話。 https://github.com/IzumiSy/go-cleanarchitecture/blob/master/docker-compose.ymlgithub.com profiles ざっくり言うと、サービスをグループ化して部分的に…

CloudBuildのキャッシュに便利なgcs-cachingというDockerイメージを作った

github.com CloudBuildではこんな感じで使える。 steps: # キャッシュの保存 - name: izumisy/gcs-caching:latest args: ["store", "./caching-directory", "gs://your-own-build-cache", "./cachekey-file"] # キャッシュの取り出し - name: izumisy/gcs-ca…

m4a(mp4)におけるFPS計算

FPSでググると動画の話ばっかり出てくるが、デコーダを扱うには音声でも秒間フレームサイズが知りたくなることがある。 「秒間」というくらいなので、まずはm4a(mp4)における再生時間データを計算する方法が必要。以下の式がそれにあたる。DurationもTimesca…

GCSのReader実装を拡張してio.Seekerを実装する

という実装のコード片をGithubのissueコメントから拾ったので自分で完成版を作ってみた。 内部的にNewRangeReaderを何度も呼び出しているのでストレージに対するReadの量は増える可能性があるのでそれだけ注意したい。 もしもシーク位置が比較的局所的な仕様…

JMOOCの「クラウドサービス・分散システム」の講座がいい感じ

内容的には自分が過去記事で紹介した「データ指向アプリケーションデザイン」の内容を、もう少しとっつきやすくかみ砕いたような雰囲気。大学での講義を収録したっぽいものなので、ある程度初めての人でも分かりやすいかもしれない。 lms.gacco.org この講座…

Goでfdkaacを用いてm4a/mp4のraw aacなデータをデコードする

github.com fdk-aacとそのgoバインディングのgo-fdkaacを使ってやってみたので、試行錯誤過程のメモ。 ffmpegみたいなツールを用いた変換方法はネット上にゴロゴロしているのに、スタンドアロンなライブラリを使ってデコードをするとなると情報がめちゃくち…

fdk-aacでM4A→WAV変換サンプル実装のビルド方法

izumisy.work 上記の記事のビルドをやっている前提 # libavformatは必須らしい $ sudo apt install libavformat-dev # fdk-aac配下でサンプルがあるブランチに切り替え $ cd fdk-aac $ git checkout decoder-example # m4a-dec.cをビルド # (https://github.…

Ubuntu環境でのfdk-aacビルド方法

github.com リポジトリにはREADMEどころか何も書かれていないのでメモしておく # ビルドに必要なパッケージをインストール $ sudo apt install autoconf libtool # リポジトリをクローン $ git clone git@github.com:mstorsjo/fdk-aac.git # ビルド $ cd fdk…

Golangのあの動的にDIするやつ

名称が分からないが、実際の例で言うとcloudspannerecosystem/yoにあるこういうやつ。 // YOLog provides the log func used by generated queries. var YOLog = func(context.Context, string, ...interface{}) {} これだけ見ると何のために定義されている…

ビジネス・アーキテクチャとシステム・アーキテクチャ

うちのコンサルが「システムアーキテクチャを決めるためには、ビジネスアーキテクチャを先に固めることが必要」と言ったら、お客様が「事業構造の変化が激しすぎてビジネスアーキテクチャを固めることが難しい」と仰った。そうだよなぁ。システムの寿命より…

redigoを使ったPubSubアダプタの実装

自分が開発しているgo-cleanarchitectureの中でドメインイベントのPublisher実装としてredigoを使ったPubSubアダプタの実装を用意したが、思ったよりもredigoを使ったRedisのPubSub周りに関連する実装があまりネットに転がっていなかった。 domainsパッケー…

VimでGitの操作環境を整える

自分はvim-fugitiveとvim-flogを使っている Plug 'tpope/vim-fugitive' Plug 'rbong/vim-flog' fugitiveだけでもgit logは見れるが --decorate や --graph などのコマンドを使っても色がつかないのでコミットログを見ることに関しては若干微妙。 ログを見る…

メルカリShopsの開発組織に関する記事を読んで

engineering.mercari.com メルカリShopsの開発組織に関する記事が興味深かった。ソフトウェアエンジニアがフロントエンド/バックエンド関係なく開発をするというのは、たしかに開発組織の理想形だと思う。 2020年にオークランドで開催されたDeveloperWeek 2…

フロントエンドとしての/サーバーサイドとしての"フルスタック"さ

最近思うがなんとなくフルスタックと一口に言っても、ソフトウェアエンジニアにおける"フルスタック"にはサーバーサイドとしてのフルスタックと、フロントエンドとしてのフルスタックがあるような気がしている。この言い方が妥当かどうかは分からない。 サー…

database/sqlとdatabase/sql/driverの関係性に学ぶインターフェイス設計

golangのdatabase/sqlには設計に関するドキュメントが用意されており、これが興味深い。 ドキュメント自体は非常に短い。以下のリンクでサクッと読める。 golang.org 中でも個人的に印象的なのは以下の説明で、ここからgolangにおけるdatabase/sqlの設計思想…

makeのlengthとcapacityについて、それからbytes.Bufferのアロケーション処理速度について

izumisy.work 上記の記事をstackoverflowで質問したら回答がついた。 stackoverflow.com 結論から言うと自分はmakeの使い方を間違えていて、makeの第3引数にあたるcapacityを省略してスライスを作成するとそこには空データが埋まってしまうとのこと。 なので…

リテラル値でmakeしたらヒープに乗らなくてアロケーションの回数は少なくなるんじゃないか?という実験

goコンパイラの最適化によって、可変長配列であってもリテラル値でlength指定されていればコンパイルする時点で確保するデータサイズが決定し結果的にランタイム時にアロケーションを発生させなくなるのではないかという仮説。 テストコード package app imp…

io.Readerで先頭Nバイトを読み捨てる

package main import ( "io" "io/ioutil" "strings" "os" ) func main() { a := strings.NewReader("123456789") r := io.LimitReader(a, 5) t := io.TeeReader(r, ioutil.Discard) io.ReadAll(t) io.Copy(os.Stdout, a) // 6789 }

ioutil.Discardとio.CopyNでメモリアロケーションせずデータサイズを判定する

ioutil パッケージに Discard という /dev/null 的な io.Writer が用意されている。 最近これを使うタイミングがあったのでメモ。以下のようなコードがあるとする。 package main import ( "fmt" "io" "io/ioutil" "strings" ) func main() { a := strings.N…

net/mailパッケージだけでもメールアドレスのバリデーションはできる

stackoverflow.com こんな感じで使える。 package main import ( "fmt" "net/mail" ) func main() { addr, err := mail.ParseAddress("izumisy.test@example.com") if err != nil { panic(err) } fmt.Println(addr.Address) // izumisy.test@example.com } …

deferで参照している変数のポインタを更新しても参照は変わらないっぽい

こういうやつ type Closer struct{ Value string } func (c *Closer) Close(id string) { fmt.Printf("Closed(%s): %p\n", id, c) } func newCloser(c *Closer) { n := &Closer{Value: "aaa"} fmt.Printf("New: %p\n", n) c = n } func main() { c := &Close…

BlueoothドングルTP-Link UB400をUbuntuで使う

これを買った TP-Link Bluetooth USBアダプタ ブルートゥース子機 PC用/ナノサイズ / Ver4.0 / 3年保証 UB400TP-LINKAmazon デバイス情報を見てみるとどうやら Cambridge Silicon Radio とかいうやつらしい。 at 15:26:52 ❯ lsusb Bus 005 Device 001: ID 1d…

フロントエンドアプリケーションにおいて状態をどこに置くべきか論

後学のために自分の考えていることをまとめてみる。 考えられるパターン これまでの経験から以下4つのパターンがある。 ローカルStateでprop-drillingする ローカルStateかつイベント経由でデータ交換をする グローバルStoreとローカルStateを併用する グロ…