2022-03-25 23:55:57
概要DDD本を輪読会で読み終わったので読書メモを残す。
序章
ドメインモデルは”考え方”。知識の再構成と抽象化。表現手段(図でもプログラミング言語でも自然言語でも)は問わない。
モデルの基本的用法
モデルと設計の核心が相互に形成し合う
モデルは、チームメンバ全員が使用する言語の基盤
モデルとは蒸留された知識
ソフトウェアの核心≒ドメインに関係した問題をユーザーのために解決する能力
第1章知識をかみ砕く
効果的なモデリングの要素
モデルと実装の結合、モデルに基づいた言語の洗練、知識豊富なモデルの開発、モデルの蒸留、ブレストと実験の繰り返し
モデルにはビジネスの深い知識が反映されている、...
アプリケーション
DDD
2022-03-21 23:01:33
概要PHPの知識が7.3から止まっているので8.1までの新機能を駆け足でキャッチアップする。
PHP 7.3.x - PHP 7.4.x新機能型付きプロパティ<?php
class Person {
public int $age; // 指定の型だけ代入できるように強制される
public string $name;
}
?>
アロー関数<?php
// これが
$a = 1
$func_7_3 = function($b) use ($a) {
return $a + $b;
}
echo $func_7_3(1...
アプリケーション
PHP
2022-01-01 23:48:34
概要この記事はMakuake Advent Calendar 2021の24日目の記事です。(大遅刻しました・・)ラウンドロビンで負荷分散するロードバランサーをGolangで自作してみるという話です。
ロードバランサーとは何かロードバランサーはリクエストを複数のサーバーへ振り分けて負荷分散する(ロードバランシング)機能を持ったサーバーです。
サービスの可用性を高めてくれるリバースプロキシの一種です。ロードバランサーの種類は大きく分けて2種類あります。アプリケーション層で負荷分散するL7ロードバランサーと、トランスポート層で負荷分散するL4ロードバランサーです。ロードバランサーは、ロードバラン...
アプリケーション
Golang
Load Balancer
Round Robin
2021-10-24 16:05:29
はじめに本記事では、Golangの標準パッケージであるnet/httpを用いて、HTTPルーターを自作する方法について解説します。
標準パッケージはあまり多くのルーティングの機能を提供していません。
例えばHTTPメソッドごとのルーティングの定義ができなかったり、URLをパスパラメータとして利用できなかったり、正規表現を利用したルーティングの定義ができなかったりします。
その為、実際のアプリケーション開発ではより高機能なHTTPルーターを導入していることが少なくないのではないでしょうか。
そんなHTTPルーターですが、自作してみると次のようなメリットを享受できます。
net/httpについて...
アプリケーション
Golang
HTTP
net/http
2021-10-09 22:40:15
概要長文の執筆をする際にテキスト校正を自動化しておきたかったのでやってみた。
構成テキストは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でコミットを分割する方法のメモ。たまにやりたくなる。
// 分割したところを指定。対象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
概要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
概要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
概要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
概要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のインメモリキャッシュのライブラリは良さそうなものが存在するが、軽量でシンプルなもので十分だったので自前で実装してみた。
実装要件
複数のデータを保持することができる。
期限付きのデータをメモリに保持することができる。期限が来たらメモリから破棄されること。
キャッシュへの同時参照、更新を考慮し、データのロックが意識されていること。
初期設計※github.com - bmf-san/go-snippets/architecture_design/cache/cache.goに置いてあるが、転載。
最初に思いついた感じで実装したもの。
package main
import...
アプリケーション
Golang
キャッシュ
2020-09-15 00:31:41
概要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について調べたことをまとめておく。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
概要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の絵文字自動生成ボットをつくってみた。
作ったもの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の設定を有効にしたらコード定義元へのジャンプができなくなってしまったので原因を調査した。
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
概要クラス設計の外観を把握したい時にUMLを自動生成してくれるツールが欲しかった。phpstormなら標準でいい感じにdiagramを生成してくれる機能があるらしいが、vscodeに入信してしまったのでいい感じのツールを探すしかない。
phUMLぐぐると色々ツールはあるのだが、簡単に使えそうなやつを探してみた。
github.com - MontealegreLuisphumlドキュメント
本家?github.com - jakobwsthoff/phumlはメンテ終了しているようなのだが、探してみると上記のfork版のようなやつが見つかった。
スターは少なくてあまり使う人いないのかな・・?と...
アプリケーション
PHP
2020-01-26 23:57:08
概要GolangでURLルーターを自作したので実装するまでの過程をメモしておく。
準備URLルーターを実装する際に行った下準備をまとめる。
データ構造とアルゴリズムURLをどのようにマッチングさせるか、というロジックについて検討する。
多くのライブラリでは、データ構造として木構造がよく扱われているので、どんな種類の木構造を採用するかを考えてみた。
文字列探索に特化した木の中で、時間的・メモリ的計算量がよりベストなものを選定しようとすると、基数木というのが良さそうに見えるので最初はそれを採用しようとしていたのだが、実装が難し過ぎて挫折をした。
もう少し身近でシンプルなものをということでトライ木を...
アプリケーション
Golang
URLルーティング