Works by

Ren's blog

@rennnosuke_rk 技術ブログです

MacOS で Rancher Desktop(moby)を使用する場合に発生するdockerコマンドのtimeoutを回避する

Env OS: MacOS Sonoma 14.5 arch: x86_64 (cpu: Intel Core i9) Rancher Desktop Version: 1.15.1 Background MacOS に Rancher Desktop をインストールして docker pull や docker login などレジストリへのネットワーク転送が発生する処理を実行した時、ti…

Go HTTPクライアントの前処理・後処理を `RoundTripper` で実装する

Go

Goal Go の http.RoundTripper を使用して、http.Client パッケージのリクエストの前処理・後処理を追加できるようにしてみます。 Background HTTPクライアントを利用した実装において、リクエストやレスポンスに関連した処理を書きたいことはよくあります。…

`/etc/zshrc` は末尾でターミナル別拡張スクリプトを呼び出せる

/etc/zshrc を調べた時のメモ。 TL;DR /etc/zshrc は末尾でterminal別拡張zshrcを呼ぶ macはデフォルトで /etc/zshrc_Apple_Terminal を用意しているので、それが呼び出される /etc/zshrc の拡張スクリプト呼び出し /etc/zshrc は末尾でターミナル別の拡張ス…

golang/go issuesの対象傾向を見る

Go

golang/goのissues傾向を調べるため、パッケージなどprefixごとにどのくらいのissueが作られているのかを簡単&ざっくりですが調べてみました。 # Github API(v3) から愚直にpagingしつつissueを取得します # credentialなしでも叩けますが、rate limitが緩和…

Go Conference 2022 Spring で登壇しました

Go Conference 2022 Springで、下記の資料で登壇しました。 speakerdeck.com Go Conference ってなに? gocon.jp 半年に一度行われるGoのカンファレンスです。 主にGoに関する技術的・組織的な話題についてのトークを聞くことができます。 日本語での登壇が…

【Go】pprofを使用したプロファイリングと可視化

Go

Goの pprof を使うにあたり、調べた内容をメモしました。 Goプロファイリング手順 Goのプロファイリングは大きく以下の2工程に分けられます。 計測(pprofバイナリを作成) 出力(pprofバイナリを可視化) 1. 計測 Goバイナリを実行したときのCPU・メモリ等…

【Go】S3互換local storageとしてMinIOを立ち上げてaws-sdk-go-v2から接続する

MinIOドキュメントに aws-sdk-go を使用したサンプルはあるのですが、 aws-sdk-go-v2 のものはないため備忘録を残しておきます。 MinIO オープンソースのオブジェクトストレージです。 S3互換のため、S3 API経由で接続することができます。 min.io MinIO の…

【Go】aws-sdk-go-v2でio.Seeker未実装streamを使用してS3 objectをuploadする

aws-sdk-go-v2 でS3にオブジェクトをアップロードするには PutObject が利用できます。 引数となる PutObjectInput の Body fieldに、アップロードしたいオブジェクトコンテンツを io.Reader で渡すことができます。 例えば、下記例では bytes.Buffer 型の値…

【Go】io.Pipeのr/wブロック

Go

io.Pipe io パッケージの関数 io.Pipe() は io.Writer を実装した PipeReader 、 io.Reader を実装した PipeWriter ポインタを返します。 PipeWriter.Write() で書き込みを行うと、その内容を PipeReader.Read() で読みこむことができます。 pr, pw := io.Pi…

【Go】Unicode上複数コードからなる文字をruneで扱う場合の挙動

Go

検証環境 Mac OS Catalina 10.15.6 Go1.15.6 tl;dr Unicode上でn個のコードからなる1文字を []rune に変換すると、[]rune スライス長は n になります。 前置き Goにおける文字列型 string の値は、 []byte スライスの値としても扱うことができます。 例えば…

自前のブログからはてなブログに戻しました

あけましておめでとうございます。 2020年初めにブログを(半)自前運用1に移行したのですが、諸々面倒だったのでブログをはてなに戻すことにしました。 自前運用ブログの記事もこちらに移しました。 rennnosukesann.hatenablog.com ついでにデザインテーマも…

【OpenAPI】PrismでOpenAPIドキュメントからモックサーバーを起動する

Prism Stoplight 社が提供する1OpenAPI ドキュメントからモックサーバーを起動するツール。format は OpenAPI2/3 をサポートする。 Usage Install Prism は node 上で実行されるため、node 実行環境を用意してインストールする。 Installation Docker node …

【AWS】IAMユーザーにAWS上のリソースに対するSSL/TLS通信を強制する

AWS

メモ。 特定のユーサーに AWS 上のリソースへの操作権限を与えたいが、操作のためのリクエストは SSL/TLS 通信に限定したい場合がある。例えば、S3 への API 経由のファイルアップロードなどをユーザーに許可する際、それを HTTPS に限定したいときなどがあ…

【Go】Goで形態素解析する - mecab-golang

Go

MeCab とは MeCab: Yet Another Part-of-Speech and Morphological Analyzer 自然言語処理界隈では ChaSen と並び有名な形態素解析エンジン。 形態素解析とは、テキストデータを文法や単語の品詞情報(辞書)を元に言語の最小単位(形態素)へと分割し、各形…

【Go】logパッケージを読む

Go

log パッケージを読みました。 src/log/log.go - The Go Programming Language log Go の log はロギング処理に使用するパッケージ。 log パッケージはテストコードを除けば log.go のみで構成されており、log.go も 400 数行からなるシンプルな構成となって…

【AWS】DynamoDB local でローカル上にAWS DynamoDB 環境を作る

DynamoDB local AWS は、ローカル環境上で DynamoDB を使用したアプリケーションを開発・テストするための DynamoDB local を提供している。 DynamoDB local は以下の手順でデプロイ可能。 DynamoDB local をローカルにインストールする Apache Maven リポジ…

【Go】GoのSQL driver mock `go-sqlmock` を試す

Go

go-sqlmock とは go-sqlmock は Go の database/sql/driver の実装で、DB ドライバの振る舞いをモック化できるライブラリ。 go-sqlmock を使用することで、DB ドライバを必要するロジックと、実際の DB ドライバ以降の処理を分離してテストできる。 go-sqlmo…

【Go】GoでTCPソケット通信を実装する

Go

ソケット通信 ソケット(BSD)- Wikipedia ソケット通信とは、プログラムから見たときのネットワーク通信を抽象化する概念をさす。通信の終端をソケットと呼ばれるオブジェクトとみなし、ソケットに対して何かしらの入力を行うと、もう一方のソケットから出…

【GraphQL】gqlgenでGraphQL serverをGoで構築する

gqlgen gqlgen は Go の GraphQL ライブラリで、GraphQL をインタフェースとして持つ API サーバを Go で構築できる。 gqlgen はコード上に GraphQL スキーマをガシガシ書いていくライブラリとは異なり、 GraphQL ファイルに記述するスキーマ情報からコード…

CentOS7 dockerコンテナのsystemctlを使用可能にする

TL;DR CentOS7docker コンテナで systemctl が使えない コンテナ起動時、--privileged /sbin/init を指定する $ docker run -it --privileged --name centos -d centos:centos7 /sbin/init $ docker exec -it centos /bin/bash 概要 CentOS 7 の Docker イメ…

【Go】net/httpのPath Parameterパース

Go

net/http の handleFunc() handle() に登録できるパスは Path Parameter を認識しない。例えば、他の Web フレームワークのように、下記 /products/:id エンドポイント中の :id を変数として取得することができない。 // :idを変数としてパースできない http…

【Go】Goの並列実行時の競合状態検出

Go

-race オプション Go バイナリ実行時、 -race オプションを指定することで競合状態のテストを実施することができる。具体的には go -race run go -race build のようにコード実行時、バイナリビルド時に指定できる。 ただし実行可能な環境は linux/amd64、fr…

【Go】`runtime` パッケージを使用したモニタリング

Go

Golang のメモリ使用量やゴルーチン数など、実行時ランタイムに関係するステータスを観測するには、 runtime パッケージを使用する。 Memory var m runtime.MemStats runtime.ReadMemStats(&m) // ヒープ上に割り当てられたオブジェクト累積メモリ量 fmt.Pri…

【Go】Go の map の非スレッドセーフ性と排他制御

Go

Go の map はスレッドセーフでない Go の map はスレッドセーフ、もといゴルーチンセーフではない。そのため、複数のゴルーチンからの同時アクセスによって整合性が保たれない状態になることがある。 例えば、以下のように map に対して複数のゴルーチンから…

【Go】goimportsでプロジェクト配下のimport文すべてをパッケージ種類別に整形する

Go

TL;DR 下記コマンドで、カレントディレクトリ配下のすべての .go ファイルの import 文を整形してくれる。 $ find . -print | grep --regex '.*\.go' | xargs goimports -w -local "github.com/your/package" goimports の -w オプションでファイルを直接書…

【Go】Context

Go

Go における Context とは 大事なことは全部 Document に書いてある。おしまい。 context - The Go Programming Language ・・・と言ってしまうと元も子もないので、自分なりに整理してみる。 Go の Context を要約すると、 Web アプリケーションで横断的に…

【Go】APIMATIC で Postman Collection を OpenAPI Specification に変換する

Go

PostmanはOpenAPIと互換性があり、OpenAPI Specification(以下OAS)に沿って書かれたAPIドキュメントはPostmanへimportできる。一方で、PostmanからOpenAPIへのexportはサポートされていない。これはPostmanへのFeature requestとしても挙がっており、そこそ…

【Go】Go のSSA表現形式のダンプとその解析

Go

SSA 形式とは 静的単一代入(static simple-assignment)形式と呼ばれ、コンパイラによって生成される中間表現のこと。 SSA は、各変数への代入が一度のみ行われる式によって構成される。 例えば、以下のような式を含むコードを見ると、一行目のコードが不要で…

【Go】Go 1.14 の重複するメソッドを持つインターフェース埋め込みの許可

Go

proposal/6977-overlapping-interfaces.md at master · golang/proposal Go 1.14 より、重複するメソッドを持ったインタフェースの複数埋め込みが可能になった。 インタフェースの埋め込みは、あるインタフェース A を別のインタフェース B 内で宣言すること…

【Go】Go ModulesのGo依存パッケージ管理

Go

Go 1.11 から導入された Go Modules Go 1.11 より、Go 依存パッケージの解決のための Go Modules の概念が導入された。簡単に言うと、Go 公式でサポートされた npm のようなパッケージバージョン管理ツール。 Go プロジェクト配下に見受けられる go.mod go.s…