Post

アプリケーション

2021-10-24 16:05:29

net/httpでつくるHTTPルーター自作入門

はじめに本記事では、Golangの標準パッケージであるnet/httpを用いて、HTTPルーターを自作する方法について解説します。 標準パッケージはあまり多くのルーティングの機能を提供していません。 例えばHTTPメソッドごとのルーティングの定義ができなかったり、URLをパスパラメータとして利用できなかったり、正規表現を利用したルーティングの定義ができなかったりします。 その為、実際のアプリケーション開発ではより高機能なHTTPルーターを導入していることが少なくないのではないでしょうか。 そんなHTTPルーターですが、自作してみると次のようなメリットを享受できます。 net/httpについて...

アプリケーション

Golang HTTP net/http

2021-10-09 22:40:15

textlintとreviewdogを使ってCircleCIでテキスト校正する

概要長文の執筆をする際にテキスト校正を自動化しておきたかったのでやってみた。 構成テキストはGithub上で管理するようにしており、ディレクトリ構成は以下のようになっている。 ├── .circleci │ └── config.yml ├── README.md ├── documents │ ├── はじめに.md │ └── おわりに.md ├── images ├── .textlintrc ├── package-lock.json └── package.json npmパッケージインストール初期設定。 npm init -y textlintとtextlintで使...

アプリケーション

CircleCI npm textlint

2021-10-05 00:43:10

Gitでコミットを分割する方法

Gitでコミットを分割する方法のメモ。たまにやりたくなる。  // 分割したところを指定。対象commitをeditする。 git rebase -i HEAD~5 // 対象commitがunstageされる git reset HEAD~ // 任意の粒度でadd&commit git add ~ git commit ~ git rebase --continue

アプリケーション

Git

2021-06-30 23:23:08

GolangのHTTPサーバーのコードリーディング

概要Goでrouterを作ったときにHTTPサーバーのコードの内部を読んだので、その時のメモ。 github.com - bmf-san/goblin HTTPサーバーのコードリーディング基本形Goに入門したとによく見るであろう形のコード。 色々なものが省略されてこの形になっている。 package main import ( "net/http" ) func main() { http.HandlerFunc("/index", func(w http.ReponseWriter, req *http.Request) { w.Write([]byte(...

アプリケーション

Golang

2021-06-18 19:06:50

自作ルーティングをアップデートした

概要最近、自作ルーティングのgoblinをアップデートしたのでその記録を書き残しておく。 以下は過去ルーティングについて書き残した記事。他にも実装検討フェーズの記事があるが、内容があまり良くないので割愛。 URLルーティング自作入門 エピソード1 URLルーティング自作入門 エピソード2 GolangのHTTPサーバーのコードリーディング Introduction to URL router from scratch with Golang 何が変わったのか?基本的な動作をするバージョンを1.0.0としてリリースしていた。実際に自分で利用する中で、バグを見つけたり、機能の物足りなさを感じて...

アプリケーション

Golang OSS router

2021-06-01 21:46:02

Gitでcommitを分割する方法

概要commitを分割したいときの手順についてメモ。 手順# 分割したいところを指定してrebase。対象のcommitをeditにする。 git rebase -i HEAD~5 # unstageする git rebase HEAD~ # unstageしたものを分割したい粒度で再commitする。 git add & git commit # commitが完了したらrebase --continue git rebase --continue # log確認 git log # force push git push -f origin HEAD これで分割できるは...

アプリケーション

Git

2021-03-17 21:39:16

golang-migrateを使ってspannerのDBマイグレーションをする

概要spannerのDBマイグレーションで、golang-migrateを使ったのでメモ。 使い方dockerで使う想定。dockerではなくバイナリで実行していたが、ホストマシンのopensslのバージョンに依存して動作しない可能性あるようなので、コンテナ実行が無難だと思う。 MIGRATE_VERSION='v4.14.1' docker run -v /migrations:/migrations -v ~/.config/gcloud/:/root/.config/gcloud --network host migrate/migrate:${MIGRATE_VERSION} -pa...

アプリケーション

GCP Golang Spanner

2021-02-08 16:51:08

goのspannerクライアントのReadOnlyTransactionでハマった

概要pkg.go.dev - cloud.google.com/go/spannerでReadOnlyTransactionを使ったときにハマったところについてメモ。 何が起きたか?数万件のデータを複数回のリクエストに分けて処理するようなバッチ処理のコードを書いていた。ReadOnlyTransactionを使った処理を以下のように書いていた。  for { // 〜略〜 // cは*spanner.Client iter := c.ReadOnlyTransaction().Query(ctx, stmt) defer iter.Stop() /...

アプリケーション

GCP Spanner

2020-11-05 00:37:56

認証・認可の基本

概要最近認証サービスの開発に携わっているので今一度基本的なことを再確認しておく意味でまとめる。 Software Design 2020 11月号の認証・認可の特集を参考にしている。 IDと認証・認可の関係性 ID Identity(身元) システム利用のための管理単位 ex. ユーザー、モノ、組織 etc... Identifier(識別子) データとして管理される単位 ex. SasS・SNS・他サービスなどで管理されるユーザーID Attribute(属性) Identifierを構成するそれぞれの情報 ex. Identityが人、Identifierがtaro_yam...

アプリケーション

FIDO IAM LDAP OAuth OpenIDConnect SAML SSO 認可 認証

2020-09-29 01:53:39

Golangでインメモリなキャッシュを実装する

概要Golangのインメモリキャッシュのライブラリは良さそうなものが存在するが、軽量でシンプルなもので十分だったので自前で実装してみた。 実装要件 複数のデータを保持することができる。 期限付きのデータをメモリに保持することができる。期限が来たらメモリから破棄されること。 キャッシュへの同時参照、更新を考慮し、データのロックが意識されていること。 初期設計※github.com - bmf-san/go-snippets/architecture_design/cache/cache.goに置いてあるが、転載。 最初に思いついた感じで実装したもの。 package main import...

アプリケーション

Golang キャッシュ

2020-09-15 00:31:41

Go CodeReviewCommentsのまとめ

概要github.com - CodeReviewCommentsを読んでメモしておきたいことをまとめる。 Comment Sentences コメントの終わりはピリオドで終わるようにする。 golang.org - commentary Copying 別のパッケージから構造体をコピーするときは、予期しない参照に気を付ける。 メソッドがポインタの値に関連付けられているならTではなく*Tを使うようにする。 Crypt Rand 鍵の生成にmath/randを使ってはいけない。crypto/randのReaderを使う。 文字列として扱いたい場合は16進数かbase64エンコードする。...

アプリケーション

Golang コードレビュー 

2020-09-11 01:40:01

JWTとは

概要JWTについて調べたことをまとめておく。OAuthやOpen ID Connectなど実際の利用事例については触れない。 JWTとはJWT(JSON Web Token)は、JSONデータ構造を用いたURLセーフなClaim(JWTを用いたJSONオブジェクトはClaim Setと呼ばれる)を表現するフォーマット。JWTでは、デジタル署名またはメッセージ認証コード(MAC)を用いたJWS(JSON Web Signature)、あるいは暗号化を用いたJWE(JSON Web Encryption)が利用される。 JWT、JWS、JWEのそれぞれのRFCは下記の通り。ietf.org - r...

アプリケーション

JWT

2020-09-08 03:05:50

gRPCとはーGolangでgRPCに入門するー

概要GolangでgRPCに入門する。 gRPCとはgRPCとは、Googleが開発したRPC※実現のためのプロトコル。HTTP/2の利用を前提としている。 gRPCではGoogleが開発しているProtocol BuffersというIDL(インターフェース定義言語)でAPI仕様を定義するシリアライズフォーマットを使用する。 gRPCの通信方式にはHTTP/2の仕様に則った4つのパターンがある。 Unary RPCs 1リクエスト1レスポンス Server Streming RPCs 1リクエスト複数レスポンス サーバープッシュ(HTTP/2の仕組みで、コンテンツをサーバーからプッシュす...

アプリケーション

Golang gRPC マイクロサービス HTTP/2 RPC

2020-08-11 16:43:20

Golang×chromedp×slack botでslackの絵文字自動生成ボットをつくってみた

概要Golang×chromedp×slack botでslackの絵文字自動生成ボットをつくってみた。 作ったものslackでbotにパラメータを付けたメンションを飛ばすと画像を生成してくれるだけのもの。内部的には、パラメータを元にcanvasで画像を生成、ヘッドレスブラウザでスクショを撮って画像を保存、slackに投稿、といった感じ。 github.com - emoji-generator-slack-app 使い方等はREADMEを見ればなんとなくわかるはず... 週末にハッカソン的ノリでつくったため、バグが残ってしまっている...https://github.com/bmf-san/...

アプリケーション

Golang Slack chrome chromedp emoji slack-bot

2020-07-19 17:51:47

vscodeでgoのLanguage Serverを有効にしたらコード定義元ジャンプができなくなった

概要vscodeでgoのLanguage Serverの設定を有効にしたらコード定義元へのジャンプができなくなってしまったので原因を調査した。 settings.json "go.useLanguageServer": true, 結論go.modがプロジェクトのルートに存在している必要がある。 cf. stackoverflow - How to properly use go modules in vscode? vscodeでフォルダを開くときに、こうではなく、 . ├── app ├── go.mod こう開くようにしないとパスが良しなに解決されないせい...

アプリケーション

Golang gocode gopls Language Server vscode

2020-06-26 18:56:52

PHPでUMLを自動生成してくれるツールーphUML

概要クラス設計の外観を把握したい時にUMLを自動生成してくれるツールが欲しかった。phpstormなら標準でいい感じにdiagramを生成してくれる機能があるらしいが、vscodeに入信してしまったのでいい感じのツールを探すしかない。 phUMLぐぐると色々ツールはあるのだが、簡単に使えそうなやつを探してみた。 github.com - MontealegreLuisphumlドキュメント 本家?github.com - jakobwsthoff/phumlはメンテ終了しているようなのだが、探してみると上記のfork版のようなやつが見つかった。 スターは少なくてあまり使う人いないのかな・・?と...

アプリケーション

PHP

2020-01-26 23:57:08

GolangでgoblinというURLルーターを自作した

概要GolangでURLルーターを自作したので実装するまでの過程をメモしておく。 準備URLルーターを実装する際に行った下準備をまとめる。 データ構造とアルゴリズムURLをどのようにマッチングさせるか、というロジックについて検討する。 多くのライブラリでは、データ構造として木構造がよく扱われているので、どんな種類の木構造を採用するかを考えてみた。 文字列探索に特化した木の中で、時間的・メモリ的計算量がよりベストなものを選定しようとすると、基数木というのが良さそうに見えるので最初はそれを採用しようとしていたのだが、実装が難し過ぎて挫折をした。 もう少し身近でシンプルなものをということでトライ木を...

アプリケーション

Golang URLルーティング

2019-12-15 21:47:32

URLルーティング自作入門 エピソード2

概要この記事はURLルーティング自作入門 エピソード1の続きで、Makuake Development Team Advent Calendar 2019の15日目となります。 URLルーティングを自作する前回の続きです。 ルーターを自作するにあたり、ルーターがどういった処理を行うのかデータ構造の観点から考えてみます。 ルーターがどんなInputを受け取って、どんなOutputを返すのか、動的なルーティングの場合の例を図示してみました。 URLのパス部分をInputとして受け取り、パスとマッチするデータを判定してOuputして次の処理につなげる、というのルーターの役割です。 どのようにパスの...

アプリケーション

HTTP URLルーティング

2019-12-14 23:20:25

URLルーティング自作入門 エピソード1

概要この記事はMakuake Development Team Advent Calendar 2019の14日目の記事です。 趣味で駆け出し※URLルーティング自作マンをやっているので、URLルーティング自作界隈※に入門したい人に向けた記事となれば幸いです。 ※駆け出しというキーワードが今年はWeb界隈で流行り?ましたね。私は去年末からURLルーティング自作を始めたので駆け出しだと思います。※そんな界隈があるのかは知らないが、世界は広いのでたぶんある。 駆け出しURLルーティング自作マンの軌跡見るに耐えないものではあるが、色々試行錯誤した過程を晒しておきます。 記事 URLルーティングを...

アプリケーション

HTTP URLルーティング

2019-11-03 11:03:15

GolangのHTTPサーバーのコードリーディング

概要この記事はQiita - Go6 Advent Calendar 2019の20日目の記事です。 GolangでHTTPサーバーを立てるコードの詳細を追ってコードリーディングします。 参考実装コードリーディングしていく実装はこちら。 package main import ( "net/http" ) func main() { mux := http.NewServeMux() handler := new(HelloHandler) mux.Handle("/", handler) s := http.Server{ Add...

アプリケーション

Golang net/http