ホーム

モニタリングシステムにおけるPull型とPush型のアプローチの違い

インフラストラクチャ

概要 モニタリングのシステムにおけるPull型とPush型のアプローチの違いについてまとめる。 Pull型 監視サーバー側で監視対象ホストについて設定をし、監視サーバーから監視ホストにデータを取得しにいく。 ex. Prometheus、Nagios、Zabbixなど PrometheusはPull型の欠点を補うかのように、exporterというPush型のようなアプローチのような仕組みがある。e...

モニタリング

キャッシュの書き込み方式

インフラストラクチャ

概要 キャッシュの書き込み方式についてまとめる。 ライトスルー データがキャッシュに書き込まれると同時にメインメモリにも書き込む方式。 書き込み操作がキャッシュとメインメモリ両方に対して発生する。 データの一貫性を保ちやすいが、書き込みの遅延が発生する可能性がある。 ライトバック データがキャッシュに書き込まれた後、メインメモリに書き込みをするまでキャッシュ内にデータが保持される方式。 書き込み操...

キャッシュ

シャーディングとパーティショニングの違い

データベース

概要 時々どっちがどっちか混乱してしまうので、メモを残す。 シャーディングとパーティショニングの違い 項目 シャーディング パーティショニング データの分割方法 水平方向(≒水平パーティショニング) ex. 行 垂直方向 ex. テーブル、データベース、カラム メリット パフォーマンスの向上、スケーラビリティの向上 パフォーマンスの向上、データの検索性向上 デメリット データや...

パーティショニング シャーディング

デプロイ戦略について

アプリケーション

概要 デプロイ戦略についてまとめる。 デプロイ・リリース・ロールバックの定義 デプロイ戦略の前提知識として言葉の定義を明確にしておく。 デプロイとは、「実行環境に実行可能なプログラムを配置すること」 リリースとは、「ユーザーがアクセスできる状態にすること」 ロールバックとは、「古いバージョンのリリースをリリースすること」 デプロイ戦略の種類 代表的と思われるものを取り上げる。 インプレースデプロイ...

デプロイ

プロキシサーバー(フォワードプロキシサーバー)・リバースプロキシサーバー・ゲートウェイサーバーの違いについて

インフラストラクチャ

概要 プロキシサーバー(フォワードプロキシサーバー)・リバースプロキシサーバー・ゲートウェイサーバーの違いについてまとめる。 プロキシサーバー(フォワードプロキシサーバー)とは クライアントとサーバーの間に配置され、両者の通信を代理で行う(中継する)サーバー。 クライアントからのリクエストを代理をする。 クライアント→プロキシサーバー→インターネット→サーバー メリットは次のようなものがある。 ...

フォワードプロキシ リバースプロキシ ゲートウェイ

GCPについての覚え書き

インフラストラクチャ

概要 Google Cloud認定アソシエイトクラウドエンジニアの試験に向けた勉強をしている際の雑多な覚え書き。 考え方 責任共有モデル 最小権限の原則 組織全体でガバナンスを発揮する 権限の分譲 ステートレスなアプリケーションとイミュータブルなインフラ 自動化によるトイルの削減 スケーラブル・高可用性・堅牢性 モニタリングと自動的な通知 cf. https://blog.g-gen.co.j...

GCP

MySQLで全文検索

データベース

概要 MySQLにはだいぶ前から全文検索が使えるになっているが、最近まで全然触ってもいなかったので軽く素振りしてみた。 MySQLで全文検索を始める MySQLで全文検索を利用するのはElasticSearchよりも圧倒的に手間が掛からない。 検索対象としたいカラムにFULLTEXT INDEXを付与、MATCH (col1,col2,...) AGAINST (expr [search_modi...

MySQL

PyroscopeでContinuous Profiling

アプリケーション

概要 PyroscopeというContinous Profilingのツールを導入してみた。 Continous Profilingについてはこちら参照。 What is continuous profiling? 今年に入ってからGrafanaが買収したらしい。 Grafana Labs が Pyroscope を買収してコード プロファイリング機能を追加 買収してからは、Grafana Pyr...

プロファイリング

DefaultServeMux以外でpprofを使う方法

アプリケーション

概要 net/http/pprofをDefaultServeMux以外(Goの標準のルーター以外)で使う方法についてメモ。 ハマりどころ pprofをblank importするだけではだめ。 package main import ( _ "net/http/pprof" ) DefaultServeMux以外のルーターを使う場合はblank importするだけ...

Golang

Goのhtml/templateでURLをエンコードさせない

アプリケーション

概要 html/templateを使っているときに、テンプレートに渡すURLをエンコードさせたくなかった。 template.URLを使う Goのhtml/templateを使って、URLをテンプレートに渡すとエンコードされてしまう仕様になっている。 cf. https://pkg.go.dev/html/template#hdr-Contexts セキュリティ上の理由でこのような仕様になっている...

Golang

buildxを使ったGoアプリケーションイメージのクロスコンパイル

アプリケーション

概要 プライベートで開発しているアプリケーションのイメージをクロスコンパイルする必要性に駆られて(ローカルの開発環境と本番の環境でアーキテクチャが異なっていることが起因)対応したのでメモ。 buildx Docker Desktopにはbuildxが標準で備わっているのでそちらを利用する。 Docker Buildx buildxを使うことでマルチアーキテクチャ対応のイメージを簡単に作ることができ...

Golang Docker

CFPを書く技術

ポエム

概要 カンファレンスなどの登壇イベントでCFPを提出することがあるが、自分がどのようにCFPを書き上げ、提出しているかについてポエムを書いておく。 これまでの実績 過去CFPを提出した回数が7回、採択率は100%(うち1件は諸事情により辞退)であった。 登壇したイベントは、PHPのカンファレンスとGoのカンファレンスで、PHPのカンファレンスのほうが登壇回数が多い。 cf. https://spe...

テクニカルライティング

NewSQL関連の資料を読み漁った

データベース

NewSQLについての色々と調べて読み漁ってみたので読んだものをまとめておく。 元々いくつかのNewSQLのDBについての比較をしてみたいと思って漁っていたのだが、内部で使われている技術について知っておく必要があったので、関連技術についての記事が多めになっている。 資料一覧 Hybrid Clock Hybrid Logical Clock (HLC) 本当は恐ろしい分散システムの話 分散処理シ...

NewSQL

FuelPHPの2023年3月現在の現況

アプリケーション

概要 2023年3月現在のFuelPHPの現況についてざっくり調べたことをまとめる。 独自に調べた情報なので正確性には欠けるかもしれない。 PHPのフレームワークはLaravelが圧倒的に人気があるように感じるが、FuelPHPもまだ現役で使っている人がいるかもしれないので、何か一助になれば嬉しい。 FuelPHPバージョン情報 独自に調べたFuelPHPの情報をまとめる。 Version ...

FuelPHP

システム設計関連の資料を読み漁った

システムアーキテクチャ

システム設計関連の資料をいくつか読み漁ったので、リンク集的にまとめておく。 動画系は見れていないものが多い。 あとあんまり関係なさそうなやや離れたトピックに関してのコンテンツも含んでいたりする。 モチベーション なぜ色々と調べてみたかというと、システム設計について体系的に学ぶことができないか知りたかった、学んでみたかったからである。 もっというと、システム設計についての能力を高める糸口が欲しかった...

システム設計

Datadog continuous testingについて調べたことメモ

ツール

概要 Datadog continuous testingについて調べたことのメモ。 Datadog continuous testingとは ノーコード 画面ポチポチでテストを用意できる 自己修復型E2E "回復力"のあるテスト 誤検出を最小限に抑える クロスブラウザテスト対応 主要なインテグレーションをカバー CircleCI、Github Actions、Jen...

Datadog

ファイルシステムの容量不足によるサービスダウン

障害報告

ステータス 解決 事象 2023年1月2日正午頃、https://bmf-tech.com/ にアクセスするとレスポンスが遅い、500エラーが常に返却されることに気づき、発覚。 grafanaにログインして調査をしようとしたが、ログインができなかった。 一部コンテナが何らかの原因でダウンした可能性を考慮して、デプロイを実施したが、no space left on device のエラーログを確認...

ポストモーテム

2022年の振り返りと来年の抱負

ポエム

2022年の振り返りと来年の抱負 毎年恒例の振り返りと抱負について書く。 2021年の振り返りと来年の抱負 2020年の振り返りと来年の抱負 2019年の振り返りと来年の抱負 2018年の振り返りと2019年の目標 プライベート やれたこと 自分の中で大きめの課題であった、このbmf-techのリプレースを完了したことが一番達成感があったことかもしれない。ソフトウェアエンジニアリング総合格闘技...

振り返りと抱負

オレオレTechnology Radarを作る

ツール

Makuake Advent Calendar 2022の7日目の記事です! 概要 オレオレTechnology Radarの作り方についてかく。 Technology Radarとは Technology Radarとは、ThoughtWorks社(ソフトウェア開発やコンサルティングをグローバル展開している企業。マーティン・ファウラー氏が所属している。)が発信しているソフトウェア開発における技術...

Technology Radar

Goで始めるコードのパフォーマンス改善

アプリケーション

Makuake Advent Calendar 2022の9日目の記事です! Goで始めるコードのパフォーマンス改善 自作HTTP Routerのgoblinのパフォーマンス改善をしよう思った際に、Goのパフォーマンス改善について取り組んでみたので、その際のアプローチと実践した取り組みについて書く。 前提知識 より奥深いチューニングをする上ではもっと必要な知識があると思うが、最低限必要なことだけリ...

Golang

アジャイルメトリクスを読んだ

ソフトウェア工学

Makuake Advent Calendar 2022の6日目の記事です! 概要 最近スクラムチームのプロセス改善について頻繁に思いを馳せており、カイゼンのヒントが何か得られないだろうかと思ってアジャイルメトリクスを読んでみた。 アジャイルメトリクス 原著は多分Agile Metrics in Action。何年か前に出版された本。 アジャイルメトリクスとは? アジャイルメトリクスとは、アジャイ...

アジャイル

SOAとマイクロサービスとの違いについて整理するために読んだ記事メモ

システムアーキテクチャ

SOAとマイクロサービスの違いについて整理したくなったときに漁った記事の雑メモ。 aws.amazon.com - サービス指向アーキテクチャとは何ですか? www.talend.com - マイクロサービスとSOA:の違い 適したユースケースとは ja.wikipedia.org - エンタープライズ・サービス・バス www.xlsoft.com - API インフラストラクチャ: ESB と...

マイクロサービス

homebrewで過去バージョンをインストールする

アプリケーション

概要 Homebrewでインストールするパッケージで過去のバージョンを指定してインストールしたいときがたまにある。 Homebrewは最新版のみ保持する方針になったらしく、過去バージョンをインストールするときはひと手間かかったのでメモ。 やり方 今回vim9系からvim8系のダウングレードをしたかったので、そのときの手順を例に上げる。 手順は以下。 brew tap-new bmf-san/vim...

homebrew vim

Design Docsについて

システムアーキテクチャ

概要 Design Docsについて調べてみた。 Design Docsとは Design Docsはソフトウェア設計のためのドキュメント。 決まった形式を持たず、プロジェクトにとって意味ある形で書くことをルールとしている Design Docsは開発プロセスにおいて、以下のようないくつかのメリットを持つ。 設計上の課題洗い出し、手戻りの軽減 設計について合意形成 横断的な関心事についての整理・...

Design Docs

SLI・SLO・SLAについて

アプリケーション

SLI・SLO・SLAについて SLI・SLO・SLAについて色々調べてみたことをまとめる。 SLO・SLI・SLAとは何か SLO、SLI、SLAとは、サービスレベル(Service Level)に関わる指標、目標、合意のことである。 サービスレベルとは一定の期間内で提供されたサービスを特定の方法で測定して表したものである。 SLI(Service Level Indicator) サービスレ...

SLI SLA SLO

スクラムマスターとプロダクトオーナーの違いについて

アプリケーション

概要 先日認定スクラムマスターの研修を受けたのだが、スクラムマスターとプロダクトオーナーの違いについて改めて整理しておく必要があると感じたので、記事にする。 cf. 認定スクラムマスター(LSM)になった スクラムマスターとは 責任 スクラムの確立と有効性に責任を持つ スクラムが正しく実践されるようにスクラムの理論やプロセスをスクラムチームに理解してもらえるようにする スクラムチームがスクラム...

スクラム

Cloud Functionsを使ってSlack AppのSlash Commandを実装

アプリケーション

概要 Cloud Functionsを使ってSlack AppのSlash Commandを実装する。 今回作ったボイラープレートはこちら。 go-slack-app-on-cloud-functions-boilerplate Slash Commandの使えるSlack Appを作る方法は色々あるが、安く、簡単に、サーバーレスで作れるということでCloudFront Functionsを使って...

slack-bot Slack Golang GCP Cloud Functions

マークダウン形式のファイルをPDFファイルに変換する(mermaid・emoji・toc対応)

アプリケーション

概要 マークダウン形式のファイルをPDFファイルに変換したいという要望に応えるための簡易的なドキュメント管理ツールを作った。 bmf-san/docs-md-to-pdf-example 特に深く考えることなくあり物のライブラリを活用して作ったので、あまりサステナビリティを感じない構成になっている。 モチベーション 単にマークダウン形式のファイルをPDFファイルに変換するだけであれば、md-to-...

markdown marked emoji mermaid JavaScript

認定スクラムマスター(LSM)になった

ポエム

scruminc.japanのRegistered Scrum Masterの研修・試験を受けて認定スクラムマスターになったので感想とメモ。 ちなみに認定期間が1年らしいので、認定を継続するには年に1回小テストを受けて更新する必要があるらしい。 研修を受けた理由 普段、チームでスクラム開発を行っているが、開発者(というかチームリーダー)としてスクラムについて理解を深めて、チームのプロセス改善とプロ...

スクラム

bmf-techを支える技術

システムアーキテクチャ

bmf-techを支える技術 このブログ(bmf-tech.com)を支える技術スタックについてかく。 旧bmf-techの構成 まずは現行のbmf-techはよりも1世代前の構成について。 アプリケーションはLaravelをベースとしたモノリシックな構成 APIはPHPで、管理画面はReactでSPAを構築していた 当時触っていた技術を何となく採用しただけ Sakura VPSでホ...

Docker Docker Compose VPS Golang Vue.js prometheus Promtail Loki Grafana Nginx

ブログのシステムを移行した

ポエム

ブログのシステムを移行したので記念投稿。 bmf-tech.comはWordpress→Laravel製自作CMS→Go製自作CMSと3世代目のアップデートをすることができた。 振り返りの記事をそのうち書く予定。 ...

CMS

Githubでレジュメを管理するようにした

ツール

今までGoogle Driveで管理していたレジュメをGithubで管理するようにした。 これが個人的に良い取り組みだったので記事にしておく。 ここでいうレジュメは、自分のキャリアのあれこれがテキストベースでまとめられたものを指す。 モチベーションGoogle Driveでファイルをアップロードして管理していたが、イマイチ更新しづらかったり、更新する気力が沸かなかったりした。差分がわかりやすいよう...

Git GitHub

Spannerの知見メモ

データベース

概要 Cloud Spannerの知見を漁ったのでメモ。走り書きなのでカテゴライズしていない。 メモ 計画メンテナンスやスキーマ変更のためのダウンタイムなし、最大99.999%の可用性を保証 Cloud SQLはダウンタイムありの計画のメンテナンス Cloud Spannerのアーキテクチャ構成 クライアント R/Wするコードが実行されているサーバーやコンテナ クライアントライブラリを使うと...

Spanner

エリック・エヴァンスのドメイン駆動設計を読んだ

アプリケーション

概要DDD本を輪読会で読み終わったので読書メモを残す。 序章 ドメインモデルは”考え方”。知識の再構成と抽象化。表現手段(図でもプログラミング言語でも自然言語でも)は問わない。 モデルの基本的用法 モデルと設計の核心が相互に形成し合う モデルは、チームメンバ全員が使用する言語の基盤 モデルとは蒸留された知識 ソフトウェアの核心≒ドメインに関係した問題をユーザーのために解決する能力 第1章知識...

DDD

legoでLet's encryptのSSL証明書をDNS-01方式で取得する

インフラストラクチャ

Conoha VPSでAnsibleを使ってLet's EncryptのSSL証明書の取得を行おうとしていた。 証明書の取得はDNS-01方式(ドメインのTXTレコードに認証局が発行したワンタイムトークンを登録して検証する)で取得したかったので、ConohaのAPIを使って、TXTレコードを登録、削除するようなスクリプトを組んで対応(cf. github.com - k2snow/lets...

Let's Encrypt

2021年の振り返りと来年の抱負

ポエム

2021年の振り返りと来年の抱負去年のやつ。2020年の振り返りと来年の抱負 今年も振り返りを書いておこうと思うが、年々面倒になってきたのでざっくりにかく。 良い買い物2021は自分の人生で一番出費があった年だったと思う。 結婚式(プライスレス?) 引っ越し(骨を埋めても良いと思える街に引っ越した。すごく気に入っている) 車(安い中古車。ディーラーが値引きしてくれてお手頃に買えた。ポルシェに乗り...

振り返りと抱負

Golangでロードバランサーを実装する

アプリケーション

概要この記事はMakuake Advent Calendar 2021の24日目の記事です。(大遅刻しました・・)ラウンドロビンで負荷分散するロードバランサーをGolangで自作してみるという話です。 ロードバランサーとは何かロードバランサーはリクエストを複数のサーバーへ振り分けて負荷分散する(ロードバランシング)機能を持ったサーバーです。 サービスの可用性を高めてくれるリバースプロキシの一種で...

Golang Load Balancer Round Robin

コンテナで始めるモニタリング基盤構築

インフラストラクチャ

この記事はMakuake Advent Calendar 2021の17日目の記事です。 気づけば入社して丸3年が経ち、会社のアドベントカレンダーも3回目の参戦です。 ここ1年はRe-ArchitectureチームというMakuakeのサービス基盤の開発・運用を行うチームに所属し、色々と奮闘してきました。 来年もきっとあれこれと奮闘するでしょう。 Re-Architectureチームの求人はこちら...

Docker Docker Compose elasticsearch Grafana kibana prometheus cadvisor efk fluentd node-exporter

StreamYardでKeynoteの発表者ディスプレイを表示しながら配信する方法

ツール

概要StreamYardを使ってプレゼンする機会があったのでやり方をメモしておく。 Keynoteの発表者ディスプレイを表示しつつ、再生中のスライドだけをStreamYardで共有する方法について手順をまとめる。 必要なものディスプレイが2枚必要。 手順 Keynoteでプレゼン資料を開く。ウインドウで再生をクリック。 再生中のウインドウ画面右上、発表者ディスプレイをウインドウで表示。 発...

Keynote StreamYard

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

アプリケーション

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

Golang HTTP

ECS on Fargate環境でDatadog APMを導入

インフラストラクチャ

概要ECS on Fargate環境でDatadog APMを導入したときの雑メモ。 PHPコンテナイメージの調整php-fpmのイメージをベースとしたカスタムイメージを使っている。datadog-php-tracerをが必要なので以下のような感じでイメージに組み込んでいる。 ENV DDTRACE_VERSION=0.65.1 RUN curl -Lo datadog-php-tracer.a...

AWS Datadog ECS Fargate

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

アプリケーション

概要長文の執筆をする際にテキスト校正を自動化しておきたかったのでやってみた。 構成テキストはGithub上で管理するようにしており、ディレクトリ構成は以下のようになっている。 ├── .circleci │ └── config.yml ├── README.md ├── documents │ ├── はじめに.md │ └── おわりに.md ├── images ├── .tex...

CircleCI npm textlint

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

アプリケーション

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

Git

M1 MacでMySQL8.0.17のコンテナが起動できない

データベース

M1 Macに買い替えたので手元の開発環境のためにmysqlコンテナを動かそうとしたら動かなかった。 エラーはこんな感じ。 runtime: failed to create new OS thread (have 2 already; errno=22) goのエラーだったので、アーキテクチャの何かしらの問題で動いていないのだろうと推測。 とりあえずdocker hubを見て8.0.17より最...

Docker Docker Compose MySQL M1

ISUCON11に参加した

ポエム

今年もISUCONに参加してきた去年に続き、今年も同じメンバーで参加してきた。 ISUCON参加はこれで3度目になる。 bmf-tech.com - Road to ISUcon bmf-tech.com - ISUCON10に参加してきた この1年間はメンバーと去年のKPTを元に、ボトルネックの調査までのフローやオペレーションの練習、全ISUCON過去問を見て出題傾向や解法のパターンなどの勉強...

New RelicとDatadog APMの比較

インフラストラクチャ

概要New RelicからDatadog APMへの乗り換え検討時に機能比較をしたのでメモ。 ※APM以外の部分も含めている。 比較 New Relic Datadog 比較 サーバー監視 クラウド、コンテナ、OS、ミドルウェア、ネットワーク、OSS等のメトリクス収集可能CPU、メモリ、ストレージ、ネットワーク、プロセス等のメトリクス収集可能 New Relicと同等なので割愛 特に...

APM Datadog New Relic

AWS認定ソリューションアーキテクトアソシエイトを受験した

インフラストラクチャ

概要AWS認定ソリューションアーキテクトアソシエイトを受験して合格したので取り組んだことなどを記録しておく。 前提自分について。ソフトウェアエンジニアとして5年目くらい。AWSは会社で利用しており、普段から触る機会はあるが、設計とかはあまりやっていない。(やりたい) モチベーションクラウドの知見が足りないことを自覚(クラウドを使ったアーキテクチャを自分で考えるときに、自分の引き出しが少ないと感じた...

AWS

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

アプリケーション

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

Golang

AWSサービスの種類ーAZ・リージョン・グローバル

インフラストラクチャ

概要AWSの代表的なサービスの分類をメモ。 AZサービス サブネット(複数AZにはまたがらない) NAT ネットワークACL EC2インスタンス RDSインスタンス Elastic Cache Elastic File System Elastic Load Balancing EBS Volume Redshift リージョンサービス VPC(複数のAZにまたがることができる) セキュリティグ...

AWS

AWSのARNを覚える

インフラストラクチャ

AWSのリソースネーム(ARN)の形式を忘れないようにメモ。 arn:partition:service:region:account-id:resource-id arn:partition:service:region:account-id:resource-type/resource-id arn:partition:service:region:account-id:resource-ty...

AWS

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

アプリケーション

概要最近、自作ルーティングのgoblinをアップデートしたのでその記録を書き残しておく。 以下は過去ルーティングについて書き残した記事。他にも実装検討フェーズの記事があるが、内容があまり良くないので割愛。 URLルーティング自作入門 エピソード1 URLルーティング自作入門 エピソード2 GolangのHTTPサーバーのコードリーディング Introduction to URL router f...

Golang OSS router

フから始まるシステム障害関連用語

インフラストラクチャ

概要たまに混乱するので用語集としてメモ。 用語フェイルセーフ障害が発生したら安全な状態に移行する仕組み。 フェイルオーバー稼働中システムに障害は発生したら代替のシステムに自動的に機能を引き継ぎ、処理を続行する仕組み。 フェイルバック代替システムから元のシステムに処理を引き継いで元の状態に戻すこと。フェイルオーバーの逆。 フェイルソフト障害が発生したら障害箇所を取り除き、影響範囲を狭めて運転を継続す...

Gitでcommitを分割する方法

アプリケーション

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

Git

Docker CLIでDocker Composeが使えるようになった

インフラストラクチャ

最近のアップデートでDocker CLIがDocker Composeをサポートするようになったらしい。 cf. docs.docker.com - Compose CLI Tech Preview Tech Previewなのでまだプロダクションでの利用推奨されていないとのこと。 互換性についてはこちら。docs.docker.com - Compose command compatibilit...

Docker Docker Compose

TerraformとAnsibleを使ってKubernetes環境構築

インフラストラクチャ

概要TerraformとAnsibleを使ってKubernetes環境構築に取り組んだ。 自作アプリの運用をKubernetesに乗っけてみたいという気持ちから環境を構築するところから初めてみた。 サーバー選定プライベートでの開発なので、せいぜい月2000円前後くらいの予算に留めたいところ。 クラウドかVPSか、マネージドか、ノンマネージドかといったところが大きな観点だが、そのへんはコスト感と運用...

Ansible Kubernetes Terraform kubeadm

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

アプリケーション

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

GCP Golang Spanner

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

アプリケーション

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

GCP Spanner

2020年の振り返りと来年の抱負

ポエム

2020年の振り返りと来年の抱負年明けてしまったが書いておく。2020年は毎月振り返りのようなことをTrelloベースでやっていたので、書くつもりはなかったが、文字起こししておきたいことがあったので書く。 今年の振り返り去年のやつ。<a href="https://bmf-tech.com/posts/ 2019%E5%B9%B4%E3%81%AE%E6%8C%AF%E3%82%8A%E8%BF%...

振り返りと抱負

TerraformとAnsibleを使ってVPSを構築する

インフラストラクチャ

概要この記事はMakuake Advent Calendar 2020の20日目の記事です。 TerraformとAnsibleを組み合わせてVPS上でサーバー構築をしてみたのでその手順をまとめておこうと思います。 動機趣味で開発しているアプリケーションのインフラ環境をIaCで整備したかったので、勉強を兼ねてTerraformを使ってみました。 環境 Terraform v0.14.0 Ansib...

Ansible VPS OpenStack Terraform

docker-compose.ymlで指定した環境変数がコンテナビルド中に参照できない

インフラストラクチャ

概要docker-compose.ymlのserviceの1つにenv_fileを指定し、環境変数を設定したが、サービスがbuildするコンテナ内(Dockerfile側)では参照できなかった。vueのアプリケーションをコンテナ内でnpmを使ってビルドしており、アプリケーション側でprocess.env.VUE_APP_API_ENDPOINTという形でアプリケーションのビルド時に環境変数を参照さ...

Docker Docker Compose

認証・認可の基本

アプリケーション

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

FIDO IAM LDAP OAuth OpenIDConnect SAML SSO 認可 認証

ネットワーク用語まとめ

ネットワーク

概要ネットワークに関して知識が曖昧なワードをまとめる。 IPv4 Internet Protocol version 4 IP(Internet Protocol)の一種 OSI参照モデルにおいてはネットワーク層に位置づけられるプロトコル 32ビットのアドレス空間を持つ 2の32乗=42億9496万7296個がIPv4のIPアドレス総数 インターネットの普及とともに枯渇してきた cf. w...

ISUCON環境で学ぶシステムメトリクス入門

インフラストラクチャ

概要 ISUCON環境を利用してシステムメトリクスをちゃんと見れるようなろうという勉強会を定期的に行っているので、そのまとめを残す。 Webエンジニアが知っておきたいインフラの基本 インフラの設計から構成、監視、チューニングまでを参考図書とし、第5章以降の内容を実際に手を動かして確認するような形で行っている。 環境はConohaでISUCON8のイメージを利用してサーバーを立てている。 プラン:メ...

ISUCON

Kubernetesドキュメントのリーディングーコンセプトのまとめ

インフラストラクチャ

概要Kubernetesを本格的にキャッチアップしていくためにドキュメントを読んだので、オレオレメモを残す。全部は長いのでメモ書きはコンセプトの章だけにする。 kubernetes.io Kubernetesとは何か?cf. Kubernetesとは何か? Kubernetesとは何か? 宣言的な構成管理 自動化の促進 コンテナ化されたワークロードやサービスの管理のためのプラットフォーム 過去を...

Docker コンテナ Kubernetes

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

アプリケーション

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

Golang キャッシュ

Go CodeReviewCommentsのまとめ

アプリケーション

概要github.com - CodeReviewCommentsを読んでメモしておきたいことをまとめる。 Comment Sentences コメントの終わりはピリオドで終わるようにする。 golang.org - commentary Copying 別のパッケージから構造体をコピーするときは、予期しない参照に気を付ける。 メソッドがポインタの値に関連付けられているならTではなく*Tを使うよ...

Golang コードレビュー 

ISUCON10に参加してきた

ポエム

ISUCON10に参加してきた。ISUCON参加は2年ぶり2回目。 前回は2人チームで参加したが、今回は3人チームで参加した。 やったこと 予選マニュアルやレギュレーションの内容確認 SSH接続の確認 githubに登録している鍵で接続可能だった。今回は踏み台サーバーが用意されていた。 プロセスの確認 APIのエンドポイントやUIを確認 DB確認 デプロイ整備 アプリケーションのデプロイ、sc...

ISUCON ISUCON10

JWTとは

アプリケーション

概要JWTについて調べたことをまとめておく。OAuthやOpen ID Connectなど実際の利用事例については触れない。 JWTとはJWT(JSON Web Token)は、JSONデータ構造を用いたURLセーフなClaim(JWTを用いたJSONオブジェクトはClaim Setと呼ばれる)を表現するフォーマット。JWTでは、デジタル署名またはメッセージ認証コード(MAC)を用いたJWS(JS...

JWT

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

アプリケーション

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

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

リトルエンディアン・ビッグエンディアン・ミドルエンディアン・バイエンディアンの違いについて

コンピューターアーキテクチャ

概要リトルエンディアンとビッグエンディアンの違いについてまとめる。 エンディアンとは 複数のバイトの並びの方式をエンディアン、またはバイトオーダーと呼ぶ データをメモリ上にロードするときの配置の仕方  エンディアンはCPUやプロトコル、OSによってそれぞれ決まっている 異なるシステム間やネットワーク間でデータをやりとりする際にエンディアンによる問題が発生しやすい ex. バイナリを解析したいときな...

メモリー

孤児プロセスとゾンビプロセスの違い

コンピューターアーキテクチャ

概要Dockerを触っていたらorphan(孤児の意)というプロセスの存在を知ったのでゾンビプロセスとの違いを調べてみた。 ゾンビプロセスとは 処理が終了した子プロセス プロセステーブルに残った状態で親プロセスのwaitを待つ システムリソースは使用しないが、PIDは保持される ゾンビプロセスが大量に増えると、使用可能なPIDが減り、他のプロセスを起動できなくなる ゾンビプロセスの確認方法 ps ...

UNIX プロセス

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

アプリケーション

概要Golang×chromedp×slack botでslackの絵文字自動生成ボットをつくってみた。 作ったものslackでbotにパラメータを付けたメンションを飛ばすと画像を生成してくれるだけのもの。内部的には、パラメータを元にcanvasで画像を生成、ヘッドレスブラウザでスクショを撮って画像を保存、slackに投稿、といった感じ。 github.com - emoji-generator-...

Golang Slack chrome chromedp emoji slack-bot

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

アプリケーション

概要vscodeでgoのLanguage Serverの設定を有効にしたらコード定義元へのジャンプができなくなってしまったので原因を調査した。 settings.json &quot;go.useLanguageServer&quot;: true, 結論go.modがプロジェクトのルートに存在している必要がある。 cf. stackoverflow - How to properly use ...

Golang gocode gopls Language Server vscode

DBドキュメント(ER図など)を自動生成してくれるツールーschemaspy, tbls

データベース

概要DBドキュメントを自動生成できるツールの有名所でいうと、MySQL Workbenchが筆頭に上がると思うが、それ以外にも良いOSSがないか漁ってみてちょっと触ってみたので感想を残す。 Schemaspy schemaspy.org github.com - schemaspy/schemaspy DBに接続してhtmlでDBドキュメントを生成してくれるJava製のツール。 Dockerhu...

Docker ER

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

アプリケーション

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

PHP

VPS×Docker Compose×Docker Machine×Golang×Nginx×Let's Encryptでの本番運用

ポエム

概要GolangのアプリケーションをVPSでDocker-Composeを使って本番運用してみたかったので、トライしてみた。 環境実際に自分がトライした環境をまとめておく。 VPS(Conoha) お名前ドットコム(ドメイン管理) Docker Compose(本番とローカルの構成を別ファイルで構築) Docker Machine(デプロイで使う) Let&#39;s Encrypt(TLS/S...

Docker Docker Compose Golang Let's Encrypt Nginx Docker Machine VPS

アルゴリズムとデータ構造 - クイックソート

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 クイックソート データ列の中から適当なデータ(ピボット)を選択し、ピボットより小さいデータを前方、大きいデータを後方に移動させる。 分割されたデータをそれぞれソートする 分割統治法の一種 計算時間 最悪計算時間 O(n²) ...

クイックソート

アルゴリズムとデータ構造 - マージソート

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 マージソート データ列が分割できなくなるまで(要素が1つ)再帰的に分割を行い、分割されたデータを複数回マージを繰り返していくことによってソートする 分割統治法に基づくソート 大きな問題を小さな問題に分割する 計算時間 最悪計...

マージソート

アルゴリズムとデータ構造 - ヒープソート

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 ヒープソート 要素の並べ替えを二分ヒープ木を用いて行うソート ヒープの構築 ヒープから要素(根)を取り出す操作をヒープ木が空になるまで行う 計算時間 最悪計算時間、平均計算時間 O(n log n) 実装package...

ヒープソート

アルゴリズムとデータ構造 - 挿入ソート

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 挿入ソート データ列の先頭から順番にソートしていく ソート済みと未ソートでそれぞれ部分列に分けられる 1回目:0番目をソート済みとするので何もしない 2回目:0番目と1番目を比較して順序が逆なら入れ変える 3回目:0番目から1番目...

挿入ソート

アルゴリズムとデータ構造 - 選択ソート

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 選択ソート データを昇順または降順に並べ変えるソートの一つ 1番目の要素と2番目以降の要素の中で最小の値を比較して、順序が逆なら入れ変えを行う、という操作をデータ列の最後の一つ手前まで繰り返す 計算時間 最良計算時間、平均計算時...

選択ソート

アルゴリズムとデータ構造 - バブルソート

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 バブルソート データを昇順または降順に並べ変えるソートの一つ 全要素に対して、隣合う要素同士を比較し、順序が逆なら入れ替えを行う、という操作を要素数-1回繰り返す 計算時間 最悪計算時間、最良計算時間、平均計算時間 O(n²) ...

バブルソート

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

アプリケーション

概要GolangでURLルーターを自作したので実装するまでの過程をメモしておく。 準備URLルーターを実装する際に行った下準備をまとめる。 データ構造とアルゴリズムURLをどのようにマッチングさせるか、というロジックについて検討する。 多くのライブラリでは、データ構造として木構造がよく扱われているので、どんな種類の木構造を採用するかを考えてみた。 文字列探索に特化した木の中で、時間的・メモリ的計算...

Golang URLルーティング

アルゴリズムとデータ構造 - 二分探索木

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 二分探索木 各ノードが多くとも2つまでのノードしか持たない二分木の一種で、左の子ノード ≤ 親 ≤ 右の子ノードという制約を持った構造の木 最も左にあるノードが最小ノードで、最も右にあるノードが最大ノードとなる 二分探索木に限...

二分探索木

アルゴリズムとデータ構造 - ヒープ

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 ヒープ 優先度付きキュー(priority queue)の一種 優先度付きキューは、集合(set)を扱うデータ型 集合に含まれる要素は優先度順に取り出される 集合を扱うデータ型の例:キュー、スタック ヒープの種類 ...

ヒープ

トランザクション概観 

データベース

概要トランザクションについてまとめる。 トランザクションデータを正しく保つための手法。DB固有の概念ではなく、一つの理論として独立している。 多数のクライアントからDBサーバーに対して同時アクセスが発生するような状況や、DBサーバーまたはアプリケーションが更新処理途中にクラッシュするという状況などからデータの整合性を守りたい時に必要とされる。 トランザクションが提供する機能は2点ある。 同時実行...

トランザクション

2019年の振り返りと来年の抱負

ポエム

2019年の振り返りと来年の抱負今年も残すところ1週間とちょっとくらいになったので、今年の振り返りと来年の抱負をポエムっとく。 今年の振り返りここ3年間くらい右肩上がりで公私ともに良い機会、良い経験に恵まれている。今年は特に良い年だったと思う。めんどくさいので雑に箇条書きにしていく。 パブリックな方面個別の事柄をピックアップして書きたいけど、多すぎて大変面倒なことになるので総括だけ。 リードエン...

振り返りと抱負

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

アプリケーション

概要この記事はURLルーティング自作入門 エピソード1の続きで、Makuake Development Team Advent Calendar 2019の15日目となります。 URLルーティングを自作する前回の続きです。 ルーターを自作するにあたり、ルーターがどういった処理を行うのかデータ構造の観点から考えてみます。 ルーターがどんなInputを受け取って、どんなOutputを返すのか、動的な...

HTTP URLルーティング

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

アプリケーション

概要この記事はMakuake Development Team Advent Calendar 2019の14日目の記事です。 趣味で駆け出し※URLルーティング自作マンをやっているので、URLルーティング自作界隈※に入門したい人に向けた記事となれば幸いです。 ※駆け出しというキーワードが今年はWeb界隈で流行り?ましたね。私は去年末からURLルーティング自作を始めたので駆け出しだと思います。※そ...

HTTP URLルーティング

アルゴリズムとデータ構造 - ハッシュテーブル

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 ハッシュテーブル ハッシュ値を添え字とした配列 ハッシュの衝突処理 開番地法 衝突が生じた際に、ハッシュ関数とは別の関数を使って別の番地を求める方法。 連鎖法 衝突が生じても新しい番地を求めずに、衝突した番地に衝突したキー同士...

ハッシュテーブル

2019年の全PHPカンファレンスをコンプリートした

ポエム

概要2019年に日本国内で開催された全ての公式PHPカンファレンスにしたので参加記録をまとめる。 PHPカンファレンス参加レポートまとめ仙台に始まり、東京で終わるまでの道のり。東京以外のカンファレンスは全て初参加。 PHPカンファレンス仙台2019に参加した Laravel JP Conference国内初開催のLaravelカンファレンス。スタッフ兼スピーカーとして参加した。来年度もスタッフと...

PHP PHPカンファレンス

アルゴリズムとデータ構造 - キュー

アルゴリズムとデータ構造

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 キュー 常に先に追加されたデータからしかアクセスできないようにデータを一列に並べた構造 スタックとは追加と削除の方向が逆になる。 FIFO(First In First Out) 先入れ先出し 待ち行列ともいう。 データの...

キュー