Diary

Diary

日々学んだことをアウトプットする場として初めてみました

Go

Go で是非とも使いたいオプション一覧

Go

Go のコマンドには様々なオプションが存在します。 今回は、現時点でつけておいて損がないのではないかと思ってるフラグを紹介させてもらいます。 まとめ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -trimpath -o ./api2 ./app go te…

go で init 関数などが初期化される順番の整理

Go

go で初期化処理を書くために init 関数を使っている方もいるかと思うのですが、呼び出される順番を 1 回正しく整理しておきたいと思います。 [目次] まとめ 1パッケージのみ 1ファイルのみ 複数ファイル まとめ 複数パッケージ まとめ(再掲) グローバル変…

openapi-generator の作る Go の構造体を使ったら json.Marshal が 10 倍遅くなった

Go

この記事は Go 言語 Advent Calendar 2023 シリーズ 2 の 10 日目の記事です。 openapi から Go のコードを生成するツールとしては、oapi-codegen, ogen などが勢いありますが、今回は openapi generator にまつわる話をします。 このライブラリで生成された…

Golang で Multi-stage builds すると『version `GLIBC_2.34' not found』のエラー

Golang で Dockerfile を Multi-stage builds で作成した際に、 docker run すると『version `GLIBC_2.34' not found』のエラーが出ることがありました。 今回はその原因と解決策について共有します。 事象 環境 Host mac m2 Docker v24.0.7 Dockerfile buil…

GitLab プロジェクトの go get で『The project you were looking for could not be found or you don't have permission to view it.』

まとめ GitLab の Go module には、リポジトリの終わりに .git をつける GitHub の Go module には .git をつけない

context ネイティブ世代の semaphore を使いこなし効率的な流量制御を

Go

典型的な『worker pool』パターンを実装するのに便利な semaphore の紹介です。 チャネルを使った流量制御のパターンと比べ、デフォルトで ctx のキャンセルに対応していることを実動で確認します。 [目次] channel パターン sync/semaphore パターン おまけ…

システムコールを元に HTTP サーバーの解像度を上げる (with Go 実装)

HTTP サーバーってどんな仕組みで動いてるのかずっと気になっていたのですが、 『ふつうのLinuxプログラミング』に説明 + c での実装があったため、その理解を元に適当に Go でやってみました。 ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるg…

パイプの中身をシステムコールレベルで理解・実装する

パイプの中身をシステムコールレベルで理解・実装する 『ふつうのLinuxプログラミング』を読んで勉強させてもらったメモになります。 コードは載ってなかったため自分で実装してみました。 ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べる…

k8s の cpu limit をつけるとアプリが 10 倍遅くなった

Go

k8s の cpu limit をつけることで、実行時間が見事に遅くなってしまったのでその成果発表です。 (参考記事) [目次] 背景 調べたこと k8s が CPU を割り当てる方法 マルチコアの場合 Go のコンテナで動かしてるんですが

Go: panic と recover は goroutine 単位

Go

go での panic recover 基礎 gin のケース goroutine 実行の考慮 おわりに

RDB のプレースホルダーは何を守ってくれるか 〜Go での確認を添えて〜

DB Go

特に深いことは語れないのですが、安全な SQL の呼び出し方を読んで気づきがあったためメモしておきます。 まとめ SQL の構成要素(以下を意識して区別する!) キーワード(予約語): SELECT, WHERE, AND, ... 演算子など: =, >=, ... 識別子: テーブル名、…

CORS について整理しておく

最近は N 年間放置していた徳丸本を真面目に読み進めており、今回はその §3.3 CORS についてのアウトプットになります。 ぜひ皆さんも一緒に読み進めていきましょう。 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版[固定版] 脆弱性が生まれる原理…

go の標準パッケージ sql がコネクションを管理する際の注意点

Go

標準パッケージ sql は一般的な SQL のインタフェースを提供しています。 使用する際は各ベンダーの用意するドライバーと共に使うことが必要で、諸々の使い方は go の wiki にも書いてあります。 今回はこの sql パッケージで注意が必要な点(と自分が今認識…

go の標準パッケージ json がどのようにタグを解釈するかを理解し、独自のタグを設定してみる

Go

json パッケージが最終的に Tag を解釈しているところまでに、以下のような関数呼び出しが発生します。 Marshal > marshal > reflectValue > valueEncoder > typeEncoder > newTypeEncoder > newStructEncoder > cachedTypeFields > typeFields

Go で HTTP 呼び出し時に Context のキャンセルが TCP コネクションに伝播されるまで

Go

go 1.7 で追加された Context には『key, value 形式による情報の伝搬』と『Goroutine の適切なキャンセル』の主に2つの役割があります。 後者の『Goroutine の適切なキャンセル』が便利で、公式ブログでも並行処理パターンとして紹介されているように、各ラ…

minio を使ってローカル実行時に s3 を代替する

minio の詳しい説明は公式に頼りたいところですが、minio とは s3 と互換性のある object storage です(object storage とは)。 今回はこの『s3 と互換性のある』って部分を少し深ぼって、golang の sdk から s3 にアクセスする既存コードを使い、ローカル…

Makefile のすすめ

Go

Go は Makefile との親和性が高いみたく、ちょっと使ってみたので今回はその個人的な紹介です。 どの Go の本にも書いてあるので、gopher なら何かしらみんな使ってるものと思ってます。 目次 Makefile って何よ by Chat-GPT by 詳細 Go 言語 web アプリケー…

Go 言語で CLI ツールを爆速で作る方法

TOC なぜ Go 言語で CLI ツールを作るのか 作り方 サブコマンドを取らない場合 サブコマンドを取る場合 cobra の使用例 urfave/cli 実際にやってみる setup 初期化 サブコマンドの追加 注意点 なぜ Go 言語で CLI ツールを作るのか 以下の 4 点がぱっと思い…

pkg.go.dev にある godoc を強制的に更新する方法

Go

前提 一度は情報を読み込めている tag プッシュしたものを反映させたい 方法 push したタグに対応する ↓ のリンクを開く https://pkg.go.dev/github.com/{user_name}/{repository_name}@{tag_version} {} には以下の情報を入れてください。 user_name: 個人…

もっとよく標準パッケージを使おう!

これは自戒を込めてになるんですが、もっとよく標準パッケージを使おう(知ろう)という話です。 なければ探す。 例をいくつかあげてみます。 URL Encode 基本的な言語には、URL エンコード・デコードをするための標準ライブラリがあるはずです。 Bad val en…

FCM を使って push 通知(iOS, Android)

今回は、push 通知の代表格である Firebase Cloud Messaging (FCM) を使って、プッシュ通知を行いました。 通知させる端末は iOS, Android を対象に、通知を行うサーバーは Go の admin-SDK を使って作成しました。 この記事を見たらなるべく迷わずに通知ま…

特定のサイトからスクレイピングできない

Go

症状 golang で http リクエストを投げてスクレイピングしたい時、特定のサイトでは全く情報が取れない時がありました。 解決策 Header 情報に Agent の情報を入れてあげると解決しました。 req.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone …

ginを用いたルーティング機能

Go

[golang] ginを用いたルーティング機能 ginを用いてサーバーを構築しチャットアプリを作成したので、その際に気をつけたルーティングやその書き方についてまとめておく やったこと Ginを用いたサーバー配信 Ginが静的サイトの配信とAPIサーバーとしての役割…

WaitGroup

Go

WaitGroupについて syncパッケージ syncパッケージには低水準のメモリアクセス同期に便利な並行処理のプリミティブが入っている WaitGroup ひとまとまりの平行処理があったとき、その結果を気にしない、もしくは他に結果を集約する手段があるときに、それら…

並行処理入門

Go

Goにおける並行処理入門 この記事では、Goにおける並行処理を実現するための準備。 次回以降、実際にコードを書いて確かめていきたい。 WHY 並行処理 ムーアの法則が破綻し限界を迎えるにつれ、単純に従来のやり方ではスピードを上げ続けることができなくな…

SQLBoilerで null.String を扱う

Go DB

SQLBoilerで null.String を扱う SQLBoilerを使っていて null.String 型の定義のフィールドにアクセスするのに苦労したのでメモしておく SQLBoilerとは SQLBoilerはデータベースファーストのORマッパーである あらかじめDBを生成しておくと、その定義に基づ…

go で月/日(mm/dd)を表示させる方法

Go

標準の time パッケージを使うと、月の部分が英語表記になってうまくいかない func main() { t := time.Now() fmt.Println(t) // 2021-05-27 01:39:53.69375 +0900 JST m=+0.000173353 fmt.Println(t.Month()) // May fmt.Println(t.Day()) // 27 } Jan, Feb…

Goで日経新聞をスクレイピングして解析したい(1)

Go

日経新聞をGoに代わりに読んでもらいたい! やりたいこと 日経新聞の記事のタイトルを収集する タイトルから単語抽出などを行い、トレンドを掴む 今回は 1 の途中くらいまで書こうと思います。(2 についてはいつかやります!) 企画の背景 社会人が始まって…