サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
衆院選
budougumi0617.github.io
急に今年は再びキーボード熱が目覚めて新調した。先にAir75 V2も買ったのだけれど、元々ずっとHHKBだったのでやっぱりこの大きさが良い。VIAですぐキー配列も調整できるのでHHKBライクな配列や矢印キー操作に変えている。 Wisteriaキースイッチを使っているけれど打ち心地がとても良い。Aloeキースイッチも別注して試したけれど軽すぎてしっくりこなかった。Air75 V2はCowberryで買って、そちらもとてもよい感じだったので交換用にCowberryを注文してしまうかもしれない。 ただ、そこそこ音はうるさいのでオフィスに行くときはHHKBのType-Sを使っている。 Apple iPad mini 2021 https://amzn.to/3S08Fnd 初売りセールでM1 iPad Airも買ったんだけれどiPad Miniのほうが圧倒的に使用率が高かった。 GoodNoteや
「詳解Go言語Webアプリケーション開発」という書籍を執筆し、2022/07/22にC&R研究所様より発売しました。 全国書店やAmazonで購入できます。本記事では本の内容の紹介や執筆経緯、執筆してみての感想など書きます。 https://www.c-r.com/book/detail/1462 本の内容について 本著は大きく分けて二部構成になっています。 第一部は次のようなテーマにまつわるトピックを中心にまとめました。 他の言語を経験していると不思議になるGoの言語仕様 最近Goを始めた方は知らない過去の経緯や歴史的背景 第二部ではGoを用いたWebアプリケーションのコードをハンズオン形式で解説しました。 テストコードを書き段階的な変更を繰り返しながらAPIサーバの実装を試みています。 Docker Composeを使ったローカル開発環境の構築 github.com/cosmtrek/
意外と知らない人が多いらしいので紹介用として記事にしておく。 モバイルアプリを使うとKindleのハイライトは画像にしてSNSへ共有することができる。また、ハイライトした内容はブラウザ上から「メモとハイライト」を使って一覧することができる。 Tl;DR Kindleでハイライト部分を他人に共有したいことがある モバイルアプリを使えば、ハイライトを画像にしてSNSへ共有することができる。 どんな感じなのかは以下のハッシュタグを見ればわかる https://twitter.com/hashtag/kindlequotes Kindle Cloud Readerにアクセスすれば、ブラウザでハイライトの一覧が確認できる https://read.amazon.co.jp/notebook Kindleアプリの引用制限を気にせずメモを作れる 日本語に対するハイライトの末尾が欠けるのはご愛嬌 Kind
GitHub Actions上でこんな感じにステップの実行を制御する方法をまとめておく。 if condition1 { step1 実行 } else if condition2 { step2 実行 } else { step3 実行 } TD;DR GitHub Actionsでstepに対して条件分岐を書きたかった 条件AのときはStep Aを実行 条件BのときはStep Bを実行 それ以外のときはStep Cを実行 1回のジョブ中にA/B/Cはどれかひとつだけ実行されてほしい stepの実行可否はif構文で制御することができる 実行済みのstepの実行結果はconclusionコンテキストで取得できる これらを組み合わせて擬似的にifelseのような操作を実現できる 検証したActionsの定義は次の通り。 name: ifelse pattern on: push: branc
Goでsingal.Notify関数を使うときは必ずバッファありチャネルを利用しなくてはいけない。 なぜバッファなしチャネルを使ってはいけないのかまとめた。 https://godoc.org/os/signal#Notify TL;DR singal.Notify関数を使うときは必ずバッファありチャネルを利用しなくてはいけない 仕様にも明記されている https://godoc.org/os/signal#Notify シグナル処理はWebサービス開発時にも必要 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/update-service.html https://kubernetes.io/ja/docs/concepts/workloads/pods/pod/ バッファなしチャネルを使うと、シグナルを
今年読了した40冊ほどの本の中で一番よかった「A Philosophy of Software Design」を紹介する。 所感 本書はソフトウェアエンジニアが設計やコーディングを行なうときに何を考えるべきか教えてくれる本だ。 発売から数年経ってから読んだ私が言える立場ではないが、今までの経験の中でモヤモヤしていたりはっきりと理由が言えなかった部分を一気に言語化してくれる本だった。 「アジャイル」、「オブジェクト指向」、「DDD」などソフトウェア設計には「良い」と呼ばれるプラクティスやパターンが多く存在する。 また、「戦術的なエッセンスだけ取り入れてもよくない、戦略的なところから取りくまないといけない」なんてことを耳にすることもある。 では戦略的なプラクティスに取り組めば必ず「良い」のか?必ずしも良いわけではない。 エンタープライズFizzBuzzというリポジトリがある。皆さんご存知のFi
Goのコードを静的解析するとき、自動生成コードをスキップするためのメモ。 TL;DR 自動生成のGoコードか判別したい Goの自動生成コードは定型文を入れるのがマナー // Code generated 好きなコメント DO NOT EDIT https://golang.org/cmd/go/#hdr-Generate_Go_files_by_processing_source 上記定型文を探す正規表現は次のようになる regexp.MustCompile("(?m)^// Code generated .* DO NOT EDIT\\.$") var c = regexp.MustCompile("(?m)^// Code generated .* DO NOT EDIT\\.$") func process(src []byte) bool { return c.Match(src)
個人のAWS環境でTerraformを使ってHTTPS化したサブドメインを定義した。 普段なかなかしないことで忘れてしまうので手順をまとめおく。 TL;DR Terraformを使ってAWS上でHTTPS化したサブドメインを構成したい ルートドメインのホストゾーンをTerrformで作っても登録済みドメインのネームサーバの設定は手動になるので注意する ワイルドカード付きの証明書をTerffaformで生成するときは少しテクニックが必要になる ハマりどころを解決できれば少々の定義で構築できた なお、本記事で利用しているTerraformとAWS Providerのバージョンは以下となる。 HTTPS化したサブドメインを作成したい この記事の前提とやりたいことは次の通り。 前提条件 example.com というドメインをRoute53の登録済みドメインとして登録済み example.comま
GoではJSONを扱うときでもしっかり型定義に当てはめて利用するのが一般的だ。 しかし、外部から受け取ったJSONデータは型に当てはめつつ併せて生データも保存しておきたいときがある。 Defind Typeをうまく使うとシンプルなUnmarshalJSON(data []byte)メソッドを定義できる。 type Event struct { ID string `json:"id"` Type string `json:"type"` Payload Payload `json:"pyload"` // 構造体にマッピングする前のJSONを保存しておきたい Raw json.RawMessage `json:"-"` } TL;DR 外部から受け取るJSONは構造が不意に変わることを想定したいときがある UnmarshalJSON(data []byte)メソッドを使うと独自のJSONパ
誤った並行処理の実装をしていると、stringの比較でもヌルポのセグフォが発生する。 正しく実装していればお目にかかることはないが、とても学びになったのでメモしておく。 TL;DR Goのstringはプリミティブな型でポインタ参照はしていない(ように操作できる) が、誤った並行処理を行っていると、ヌルポのpanicが発生する panic: runtime error: invalid memory address or nil pointer dereference runtime上でstringはstringStruct型で長さと具体的な値へのポインタを持つ https://github.com/golang/go/blob/go1.16.2/src/runtime/string.go#L228-L231 並行処理の実装が誤っていると、長さを有した状態でヌルポインタなオンメモリデータが
@dice_zuさんからhttp.DefaultTransportの正しい(?)コピーのやり方を教えてもらったのでメモしておく。 結論から言うとhttp.DefaultTransport変数にたいしてnet/http#Transport.Cloneメソッドを使うと良い。 これなら新しいGoのバージョンでhttp.Transportに新しいフィールドが追加されても問題ない。 https://pkg.go.dev/net/http#Transport.Clone TL;DR *http.Clientオブジェクトは再利用したほうがよい https://pkg.go.dev/net/http#Client 内部でTCPコネクションのキャッシュを持っているから http.DefaultClientはタイムアウトの設定がされていないので独自定義するのが一般的 http.Transportオブジェクトも
毎日の中で迷いがあったり下した決断で不安になったりすることがあるので手にとった。 決断力の育て方だけでなく、直感力の重要性など多くの学びがある本だった。 所感 少ない文量で表題についてよくまとまっていた。決断力だけでなく、直感力、結果検証がうまくいかない要因など、多くの知見を学べる1冊だった。 「この時代の日本になぜ決断力が必要になるのか?」といった背景から日本の少子化問題を題材にした実践例などトピックがわかりやすいのもよかった。 全体を通してはロジカルな内容になるが「直感」についても触れられていたのが良かった。。以前読んだ別の本でも直感の重要性が述べられていた。 より多くのフィードバックを回して良い経験を積み直感力を鍛えるのも早く決めるために必要なのだと感じた。 どんな本なのか https://www.amazon.co.jp/dp/B00L8FDB0M Amazon書籍紹介より引用。
ISUCON11予選にSpeed of Soundというチームで参加した。最終スコア47,995点で予選敗退だった。 当日のメモややっていたよかったこと、次回に向けて頑張りたいところなどまとめておく。 TL;DR 事前に準備したこと 当日のメモ よかったこと だめだったところ 次回に向けてがんばりたいところ 当日の作業リポジトリはこちら ISUCON11 説明する必要もないかもしれないが、ISUCONとはお題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図る競技のこと。 詳細や魅力については次のリンクの記事を参照のこと。 寿命が縮まる、人生が変わる…8時間耐久でインフラ技術競い合うISUCONの魅力とは?過去優勝者・主催者に聞く https://type.jp/et/feature/13831/ 今年は11回目のISUCONが行われ、私ははじめて参加した。 予選の問
for_each文を使ったTerraformのリソース定義に対してもimportができるよという話。 なお、「どうしてそのようなことをする必要があるのか?」を説明する前置きのほうが長い。 TL;DR terraformで新規に定義を作るときはterraform importから始めるのが良い 複数の開発環境などで柔軟に利用できるリソースを定義する場合は`文を使う https://www.terraform.io/docs/language/meta-arguments/for_each.html for_each文を使ったリソース定義にimportするときは配列表記を使う 対応するterraformのバージョンは0.13以上ならば問題ないはず。2021年07月時点最新版の1.0.x系でも動作する。 凡人がTerraformで新規リソースを最速で定義する Terraformで新しいリソースを
Goにはいくつかプログラムを終了させる手段が存在する。 プログラムを終了させるときにどれを選べばいいか調べてみた。結論から言うとmain関数内でdeferを使わずos.Exit関数を呼ぶ。 TL;DR Goで意図的にプログラムを終了させることができる処理は次のとおり https://golang.org/pkg/os/#Exit https://golang.org/pkg/builtin/#panic https://golang.org/pkg/runtime/#Goexit main関数内でdeferを使わずos.Exit関数を呼ぶのが一番良いと思う panic関数は終了コードを明示的に決めることができない 一方ですべてのゴルーチンを停止してくれるらしい runtime#Goexit関数をmain関数で呼ぶのは行儀が悪そう Calling Goexit from the main g
C#では対象インスタンスのメソッドの挙動を変えることは出来ないので、別の手段を探していたのだが、rubyでは出来た。 TL;DR RSpec書いたControllerSpecの中でテスト対象のコントローラのメソッドの戻り値をモックオブジェクトに変えたかった。 ControllerExampleGroupで定義されているcontrollerからテスト中のコントローラインスタンスを操作することが可能 Module: RSpec::Rails::ControllerExampleGroup#controller 前提 rspec-rails (~> 3.0.0.beta2)で確認。 テスト対象のコントローラはこんな感じ。 controllerとallowでメソッドの戻り値をすげ替える allowを使えばメソッドの挙動をすげ替えることが出来る。Railsの場合はcontrollerを使えばテスト対
Pull Request(PR)の追加行数を計測して、指定行数以上だった場合はPRにコメントするGitHub Actionsをつくった。 フィルターパターンを設定しておけば、テストコードや設定ファイルの追加行数を無視する。 https://github.com/budougumi0617/action-pr-size-checker TL;DR PRは小さい方がいい https://blog.ploeh.dk/2015/01/15/10-tips-for-better-pull-requests/ 邦訳: https://yakst.com/ja/posts/1625 GitHub ActionsでPRの追加行数を計測するツールを作成した https://github.com/budougumi0617/action-pr-size-checker 設定したファイルパターンを無視するのが特
Goで環境変数を使ってテストを行なうときに便利な関数を作ってみる。 TL;DR テストケースで特定の環境変数を使いたい テストケース終了後は元の環境変数の状態に戻しておきたい os.LookupEnv と os.Setenv を駆使する https://golang.org/pkg/os/#LookupEnv https://golang.org/pkg/os/#Setenv Go1.17からはT.Setenvが入るので、それを使えばよい https://github.com/golang/go/issues/41260 https://github.com/golang/go/blob/ab02cbd29f9b9c76d8f7af0d625ac56fcf8d4e75/src/testing/testing.go#L967-L988 現時点のサンプルコードは以下の通り。 // 環境変数名を
GoのWebアプリコードにNew Relic APMでSpan(Segment)を計測するコードを自動挿入するOSSを作った。 New RelicをGoのアプリケーションへ導入するときに利用をオススメする。 TL;DR New Relic APMは分散トレーシングなどにも対応しているAPM Spanを計測するためには、関数ごとにSegmentの処理を差し込む必要がある 指定ディレクトリ以下にあるGoのコードにFunction segmentsを自動挿入するOSSを作った https://github.com/budougumi0617/nrseg New Relic APM New Relic APMはNew Relic Oneに含まれている分散トレーシングなどにも対応したモニタリングツールだ。 個人でも業務でも使い始めた1のだが、エージェントを挿入すれば簡単にアプリケーションを丸裸にでき
最低限のサービスならば無料でサービスを利用することができ、データ構造やアルゴリズムを学べる。 毎週コンテストが行われて世界中の参加者とレーティングを競ったり、過去問はいつでも挑戦できる。 過去問には実際に企業の採用面接で出されたコーディング課題もあり、コーディングテスト対策としても使われている。 ただし、問題の中には非公式にリークされた採用問題もあるようなのでグレーなサイトという指摘もある。 LeetCode用のCLI LeetCodeも他の競技プログラミングコンテストサービスと同様にブラウザ上のオンラインエディタを使って解答を提出できる。 しかし、入力補完を使ったり、テストコードを書く、あるいはGitを利用して解答を管理しておきたいという気持ちがある。 そのため、LeetCodeにはローカルで解答用のコードを自動生成したり、問題閲覧・提出などの基本操作を行うOSSが複数存在する。 Lee
まだグラフを操作するメソッドしかないが、主に次の点を満たしたくて自作した。 context.Context対応 素直なメソッド呼び出し v1.21.0で増えた新しいエンドポイントをサポートしている https://github.com/a-know/Pixela/releases/tag/v1.21.0 https://docs.pixe.la/entry/get-a-graph-def また、APIクライアントライブラリの作成に合わせてTerraform Providerも更新した。 https://github.com/budougumi0617/terraform-provider-pixela/releases/tag/v0.0.6 Acceptance Testという安心 今回はズルして単体テストはほとんど書いていない。 実際のAPIを叩いてテストしているので「モックが古い仕様の
公式チュートリアルには載っていなかったので、自作Terraform Providerを作るときのユニットテストの書き方をメモしておく。 なお、最初にコメントしておくと今回の記事はかなり説明を省略しているので各Providerにコミットしたことがあるか自作Providerを作った人じゃないとわからなそう… TL;DR TerraformはProvider経由で各種サービスのリソースを操作する https://www.terraform.io/docs/providers/index.html SDKを使えば自作Providerを作ることも可能 https://github.com/hashicorp/terraform-plugin-sdk 公式ガイドに載っていないが、schema.Resource#TestResourceDataメソッドを使うとテストが書きやすい https://pkg.
Goである構造体(例:サードパーティのクライアント)のラッパーを書くときは埋込みフィールドを使うといいよという話。 TL;DR 埋め込みフィールド(embedded field)を使うとラッパー構造体を簡単に実装できる https://golang.org/ref/spec#Struct_types インターフェイスを使った埋め込みフィールドも定義可能 https://play.golang.org/p/FWiWDdozeIl 初期化を忘れると初期化関数を作っておく https://golang.org/doc/effective_go.html#composite_literals ある構造体をラップしたい デコレータパターンのようにある構造体のラッパーを作りたいときがある。 たとえばサードパーティのクライアントをラップして一部のメソッドの動きだけ少し変えたいときだ。 今回は次のような構
「Goらしさ」や「Goに入ってはGoに従え」というけれど、「Goらしい」って一体なんだろう?と考えてみる。 TL;DR 後半は完全に私見の域を出ない&&身も蓋もない結論なので、最初に参考情報だけまとめておく。 「Goらしさ」が何を目指しているのか、何を目指す考えが「Goらしさ」なのか知りたいならば、まず言語思想・設計思想を知るべきだろう。 言語思想についてまとめられている文書は次の情報だ。 Go’s New Brand | The Go Blog Go at Google: Language Design in the Service of Software Engineering https://talks.golang.org/2012/splash.slide#1 https://talks.golang.org/2012/splash.article 一言でいうと「Goらしさ」とは
goreleaserを使うとGo製のCLIのGitHubのリリースページの更新とHomeBrew Tap用リリースも簡単に行える。 さらにGitHub Actionsを使えばYAMLを2ファイル追加するだけでgit tagに合わせて全自動リリースが可能になる。 TL;DR goreleaserはGoのバイナリをよしなにリリースできるツール https://goreleaser.com/ GitHubのリリースページにリリースできる HomeBrew Tapにもリリースできる GitHub Actionsも公式で提供されている Actionsを使えばgit tagをpushするだけで自動リリースできる GoのCLIを自動リリースしたい GoでCLIのインストール方法は(Macの場合)主に次の3つになるだろう。 go getでインストールする GitHubのリリースページなどにあるバイナリをイ
TL;DR regexpパッケージのコンパイル処理はプロセス初期化時などに一度だけ行うのが望ましい https://golang.org/pkg/regexp regexp.MustCompileなど これをチェックするlinterを作った https://github.com/budougumi0617/regexponce gostaticanalysis/analysisutilを使えばすぐできた https://github.com/gostaticanalysis/analysisutil SSAは難しいけどおもしろい! regexpパッケージをコンパイルを使うときのお作法 Goの正規表現を使いたいときはregexpパッケージを使う。 このパッケージの使い方には注意すべき点がある。 https://golang.org/pkg/regexp/ 上記記事の以下の部分が注意点だ。 正
2020年にもなったので、vim-goを卒業して、vim-lsp(gopls)を使ったVimの開発環境を構築する。 TL;DR vim-goを卒業してgoplsとvim-lspを使った開発環境を構築する VimでLSP(とその他プラグイン)を使えば以下のことができる リアルタイムで静的解析の結果をエディタ上に反映する ポップアップで静的解析のエラーを表示する ポップアップで関数定義などのコメントを表示する 定義元へジャンプができる。 package名.などを入力IDEのような補完候補が表示さえる funcと入力してタブを押下するとスニペットが展開される。 &http.Client{}と書いたあと:LspCodeActionで構造体のフィールドをゼロ値で初期化する importをよしなに解決する(goimport) :wによる自動ソースコード整形、およびそのエラー表示 Vim上からテストを実
2020年になって、CircleCIのCI用の公式ベースイメージはcimg/base派生になった。 ただ、2020/06/07現在、Go向けの言語別公式ガイドの中身は古いままである。 cimg/goを使ったGo向けのCircleCIの設定をまとめる。 TL;DR CircleCIで利用するコンテナイメージに次世代版が登場した。 https://hub.docker.com/r/cimg/go 直接使わなくても、Orbsが便利 https://circleci.com/orbs/registry/orb/circleci/go go/mod-download-cachedでキャッシュとGo Modules周りがすぐ解決。 go-junit-reportをgo getしなくてもよい gotestsumコマンドがデフォルトインストールされている GOPATHは変更されているので注意する /hom
Goのテストについていくつかまとめを書いていた。 Goのtestを理解する in 2018 #go Goのtestを理解する in 2019 触れるのを忘れていたhttptestパッケージについてまとめる。 https://golang.org/pkg/net/http/httptest/ TL;DR net/http/httptestパッケージ https://golang.org/pkg/net/http/httptest/ net/http/httptestパッケージはサーバ/クライアント両方のHTTP周りのテストで使う サーバのHTTPハンドラーのテストを書くとき https://golang.org/pkg/net/http/httptest/#NewRequest https://golang.org/pkg/net/http/httptest/#NewRecorder ダミー
次のページ
このページを最初にブックマークしてみませんか?
『My External Storage - My External Storage』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く