Carpe Diem

備忘録

2020-01-01から1年間の記事一覧

ポインタを図で理解する

Go

概要 Goのポインタを図で理解することで ダブルポインタとは Goは全て値渡し ポインタレシーバと値レシーバの違い がどういうことかを理解でき、参照渡しの時に x = y だと更新されず *x = *y だと更新される理由が分かります。

structのメモリ割り当て

Go

概要 Goにおけるstructのメモリ構造を知ることでフィールド順序に対する意識が変わったり、なぜunsafe.Sizeof(string)が16bytesでunsafe.Sizeof(slice)が24bytesになるかが理解できます。 環境 Go 1.15.6 darwin 20.1.0 x86_64 各型のメモリ割り当て unsafe.…

GoでShutdown Hook

Go

背景 以前Graceful shutdown機能の使い方を紹介しました。 christina04.hatenablog.com これによって処理途中のリクエストが残っていても、きちんと完了するまで待ってからプロセスを終了してくれます。 しかしPubSubのPublish()のような非同期処理であれば…

継続的プロファイリング

背景 過去にいくつかpprofの使い方を紹介しましたが、実際に運用する上では以下の課題があります。 何かしら問題が発生して初めてプロファイリング開始するという後手になりがち 問題の再現が難しく、再び発生するまで様子見という流れになりがち プロファイ…

GCPのCloud PubSubで考慮すること

概要 GCPのCloud PubSubはメッセージング基盤として非常に有用です。 ただし利用する上で考慮すべきことも多々あるのでまとめておきます。 パラメータに関しては主にGoのクライアントライブラリをベースに説明します。 環境 Go 1.15.2 google-cloud-go v0.72…

データ暗号化で考慮すること(鍵編)

概要 前回の続きです。 christina04.hatenablog.com 今回は暗号化における鍵(共通鍵)について説明します。 前提知識 鍵とは 鍵とはとても大きな数です。 鍵のビット長が大きい=鍵空間が大きいことを意味します。つまり可能な鍵の総数が大きいため総当り攻…

データ暗号化で考慮すること(暗号アルゴリズム編)

概要 ユーザのメールアドレスといった機密情報を暗号化・復号したいユースケースがあるとします。 メール送信などに利用するためパスワードのようにハッシュ化するのでなく、復号して利用したいケースです。 機密情報の管理全般については以前↓で話しました…

パスワードを保存するときに考慮すること

概要 パスワードを保存する際は平文で保存せずハッシュ化するのは当然です。しかし単にハッシュ化するだけでなく 暗号学的に優れたハッシュ関数を使う saltを付ける 計算コストのかかるアルゴリズムを採用する ストレッチングで計算コストを上げる といった…

Homebrewで過去のバージョンを使いたい【tap版】

概要 以前以下の記事でhomebrewの過去バージョンの使い方を紹介しました。 christina04.hatenablog.com あれからHomebrewも変わり、以前の方法ではうまくいかなくなったため新しい過去バージョンのインストール方法を紹介します。 環境 macOS Catalina 10.15…

CircleCIの新UIでのslack連携 (Webhook URL版)

追記 現在(slack orb v4)は新しい連携方法に変わっています↓ christina04.hatenablog.com 以下(slack orb v3)は古い連携方法です。 概要 旧UIでは以下のような設定画面でslack連携を行っていましたが 新UIからはこの設定方法はサポートされなくなり、新しくS…

メールにおけるDKIMの仕組み

概要 前回SPFについて説明しました。 christina04.hatenablog.com 今回は署名によってヘッダ・メール本文の改ざんを検知するDKIMについて説明します。 フロー図 DKIMの検証フロー DKIMの検証フローは以下です。

メールにおけるSPFのドメイン認証の仕組み

概要 SPF(Sender Policy Framework)はメールのなりすましを防ぐための送信ドメイン認証の手法です。 さらに細かく説明すると SMTPのTCPコネクションの送信元IPアドレスと送信元メールアドレス(エンベロープFrom)のドメインのTXTレコードに含まれるIPアドレス…

GoのCLIで標準入力とファイル読み込みの両方に対応する

Go

概要 Goでは簡単にコマンドラインツールが作れますが、人によって引数やオプションといったインタフェースがバラバラになりがちです。 POSIX Utility Syntax Guidelinesというガイドラインがあるので、これに則るとUnixライクな統一されたインタフェースのCL…

gRPCのkeepaliveで気をつけること

概要 gRPCでは1つのHTTP/2コネクション上でstreamを多重化します。 しかしidleなコネクションは、LBなど間に介在するネットワーク機器によって気づいたら切断されているケースがあります。 そうならないよう、定期的にパケット(PINGフレーム)を流して「id…

Bigtableに時系列データを保存する

概要 Bigtableで時系列データを保存する手段として 縦長のテーブルを使用する 横長のテーブルを使用する 列バージョンを利用する の3種類あるのでそれぞれの特徴、使い方を紹介します。 環境 go v1.15.0 Google Cloud SDK v293.0.0 cloud.google.com/go/big…

sshポートフォワーディング

SSH

概要 sshポートフォワーディングの仕組みを説明します。 簡単に言うと、直接アクセスできないサーバ(Target)に対し、何かしら踏み台サーバ(Remote)を経由させることでまるで直接アクセスできるようにする仕組みです。 その際に踏み台サーバに対しては上…

Atlantisを用いてPRを介したTerraformオペレーションの自動化

背景 TerraformはInfrastructure as Codeを実現してくれるとても素晴らしいツールである一方、運用時に以下のような問題が発生します。 個々人がローカルで実行する場合のオペミス パブリッククラウドリソースを扱うクレデンシャルの管理 そのため実行環境を…

Workload IdentityでPodからのGCPリソースアクセスをセキュアにする

概要 GKEのPodといったWorkloadからGCPのリソース(GCS、PubSubなど)にアクセスする場合 GKE NodeのService Accountの権限でアクセスする 権限を持ったService AccountのJSONキーを使う の2通りあります。 それぞれの問題点の理解と、その解決策としてのWo…

GoGo Protobufのメリット・デメリット

概要 Goでprotobufのコードを生成する際には公式のgolang/protbuf以外にgogo/protobufが候補に挙がると思います。 メリット 大きなメリットはパフォーマンスとカスタマイズ性です。 marshalling と unmarshalling が高速 去年のベンチマークですが、公式より…

Go でサーバレスポンスの内容を表示

Go

概要 開発中にサーバレスポンスの内容を表示したい時があると思いますが クライアントが受け取ったレスポンス サーバが送ったレスポンス のそれぞれをログなどで表示する方法を紹介します。 環境 go 1.14.3 クライアントが受け取ったレスポンスを表示 クライ…

Goのioパッケージのメソッドを図示

Go

概要 Goのioパッケージにはio.Reader、io.Writerのインタフェースを有効活用するため以下のような便利なメソッドが用意されています。 io.Copy io.Pipe io.MultiReader io.MultiWriter io.TeeReader しかし普段から使っていないと、これらメソッドの方が簡単…

CPU CFS Quotaを制限している場合の適切なGOMAXPROCS

概要 christina04.hatenablog.com 以前上の記事でGOMAXPROCSはCPU数程度が適切に動くという話をしました。 これはこれで正しいのですが、一方でdockerのようにcgroupsでCPU Quotaを制限するケースではこれに当てはまらなくなります。 Kubernetesでいうと Kub…

PrometheusがStatsDより優れているところ

概要 新しい技術というのは既存の技術にある課題を解決するために生まれてきます。 入門 監視 ―モダンなモニタリングのためのデザインパターン作者:Mike Julianオライリー・ジャパンAmazon はStatsD&Graphiteを中心に説明されており、同時期に読んだ 入門 P…

Go Module MirrorとChecksum Database

Go

概要 Go 1.13から、goコマンドはデフォルトでGo Module MirrorとChecksum Databaseを使用してモジュールをダウンロード&認証するようになりました。 環境 go 1.14.1 Module Mirror (Module Proxy) Module Mirrorは公開モジュールをキャッシュし、go modでの…

Redis Clusterを冗長構成で構築

概要 前回はマスターのみでRedis Clusterを構築しました。 christina04.hatenablog.com 今回は冗長構成で構築し、可用性を確認します。 環境 Redis 5.0.7

Redis Clusterの構築と水平スケーリング

概要 christina04.hatenablog.com 前回の続きで今度はRedis Clusterを構築してスケール性などを検証してみます。 環境 Redis 5.0.7 Redis Clusterの特徴 Redis Clusterは以下の特徴を持ちます。 シャード毎にSlotを持ち、データ分散される(hash slot) 全部…

go generateでモックを生成する

Go

背景 Clean Architecture に則ってレイヤ間をプラガブルにするためにインタフェースを使っていくと、テストのために各インタフェースのモックが欲しくなります。 そのモックを生成する際にgolang/mockを使用するわけですが、毎回 $ mockgen -source user.go …

Cassandraのデータモデルを理解する

概要 Cassandraはワイドカラム型のKVSでデータモデル図もネット上には色々上がっていますが、実際にはTable Schemaもあって普通のRDBのような表に見えます。 またkeyも primary key row key partition key composite key clustering key とたくさん出てきて…

Keepalivedを用いた冗長化

概要 デフォルトゲートウェイのように1つしかIPを設定できない箇所を冗長化したい ロードバランサ、Proxyを冗長化したい active/standby型でフェイルオーバーした時にクライアント側でIPの変更を意識したくない といったケースでVIP(仮想IP)を用いること…

RedisのReplication

概要 Redisの冗長構成は Replication Cluster Sentinel の3種類がありますが、そのうちのReplicationについて説明します。 環境 Redis 5.0.7 Replication Replicationはmasterからデータをreplicaにコピーし、read系コマンドをreplicaから行うことでスケー…