ホーム

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本を輪読会で読み終わったので読書メモを残す。 序章 ドメインモデルは”考え方”。知識の再構成と抽象化。表現手段(図でもプログラミング言語でも自然言語でも)は問わない。 モデルの基本的用法 モデルと設計の核心が相互に形成し合う モデルは、チームメンバ全員が使用する言語の基盤 モデルとは蒸留された知識 ...

DDD

PHP7.4からPHP8.1までの新機能をキャッチアップ

アプリケーション

概要PHPの知識が7.3から止まっているので8.1までの新機能を駆け足でキャッチアップする。 PHP 7.3.x - PHP 7.4.x新機能型付きプロパティ<?php class Person { public int $age; // 指定の型だけ代入できるように強制される public string $name; } ?> アロ...

PHP

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 Tips

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

ポエム

2021年の振り返りと来年の抱負 去年のやつ。 2020年の振り返りと来年の抱負 今年も振り返りを書いておこうと思うが、年々面倒になってきたのでざっくりにかく。 良い買い物 2021は自分の人生で一番出費があった年だったと思う。 結婚式 引っ越し 車 M1 Macbook Air オフィスチェア あと何か色々細々としたものを買ったような気がする。 どちらかといえばケチなタイプだが、有意義な出費...

振り返りと抱負

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

アプリケーション

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

Golang ロードバランサー ラウンドロビン

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

インフラストラクチャ

この記事は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 Tips

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 Tips

ISUCON11に参加した

ポエム

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

ISUCON ISUCON10

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" ) fun...

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

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 /migra...

GCP Golang Spanner

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

アプリケーション

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

GCP Spanner Tips

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 Tips

認証・認可の基本

アプリケーション

概要最近認証サービスの開発に携わっているので今一度基本的なことを再確認しておく意味でまとめる。 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. ...

IP ロードバランサー

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確認 デプロイ整備 アプリケーションのデプロイ、...

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 us...

Golang gocode gopls Language Server vscode Tips

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) 先入れ先出し 待ち行列ともいう。 データの...

キュー

アルゴリズムとデータ構造 - スタック

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

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 スタック 常に最新のデータからしかアクセスできないようにデータを一列に並べた構造 LIFO(Last In First Out) 後入れ先出し 常に最新のデータへアクセスしたいときに便利な構造 データの追加をPush、削除...

スタック

2018年の振り返りと2019年の目標

ポエム

※はてぶで公開していた記事を移管しました 概要表題のとおり。 昨年のやつは非常に雑ではあるが、日々色々と考えながら過ごしていたので実際はそれなりによく行動できていた気がする。 振り返り今年のやったことの振り返りから。 今年はエンジニア歴でいうと3年目か4年目くらいだったのだが、インプットの足りなさを自覚していたので、インプットに注力することを意識していた。なので例年に比べるとアウトプット量は少ない...

振り返りと抱負

今年買ってよかったモノ

ポエム

※はてぶで公開していた記事を移管しました  もうすぐ2018年が終わってしまうので今年買って良かったものをリストアップする。 今年は去年よりも充実していて色んなモノを買った年であった。 順位をつけるのはめんどくさいのでテキトーにリストアップしていく。  長財布馬の革のいい感じの長財布を買った。(正確には買ってもらったw) 外側は馬で内側はヌメ革で、使い込むほどいい感じに味がでるというやつだ。 ま...

bmfと今年買ってよかったモノ

ポエム

※はてぶで公開していた記事を移管しました この記事は、bmfカレンダー Advent Calendar 2017 - Adventarの19日目の記事です。 2017年購入してよかったなぁというモノを振り返ってみます。 個人的にQOLが向上したなぁと思うものをピックアップしました。 Bluetooth対応イヤホンMpow Bluetooth イヤホン Bluetoothに対応したイヤホンです。 お...

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

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

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 配列 データを1列に並べたもの データへのアクセスは容易だが、追加や削除には時間がかかる 配列のデータはメモリの連続した領域に順番に格納される 固定長のメモリを確保する 宣言時に確保(静的確保) 実行時に確保(動的確保) ...

配列

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

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

概要アルゴリズム図鑑を参考に、アルゴリズムとデータ構造を学ぶ。 実装はgithub - bmf-san/road-to-algorithm-masterにも置いてある。 リスト(線形リストの片方向リスト) データを一直線上に並べた構造 各ノードは次のノードへのポインタを持つ データの追加や削除は容易だが、アクセスには時間がかかる リストでは、データは連続したメモリ領域に格納される必要はない 一...

連結リスト 片方向リスト

PHPカンファレンス沖縄2019に参加してきた

ポエム

PHPカンファレンス沖縄に参加してきた先月に続きPHPカンファレンスに参加してきました。 沖縄は6月末に宮古島にいった以来で、少し気温の変化が感じられました。 セッション実用PHPメタプログラミング実用PHPメタプログラミング evalは最終手段 ex. foreach内でevalを使って関数定義するとか →Closureで頑張る 大いなる力には大いなる責任が伴う 静的解析の恩恵が受けられな...

PHP PHPカンファレンス

PHPカンファレンス北海道2019に参加してきた

ポエム

PHPカンファレンス北海道2019に参加してきた2ヶ月ぶりのPHPカンファレンスに参加してきました。(前回はPHPカンファレンス福岡2019に参加・登壇してきました) 北海道は子供の頃数年ほど住んでいたり、祖父母が住んでいたりと縁の地なので、他のカンファレンスとはちょっと違った感情を感じて、ポエミーでエモい気持ちになりながら現地で過ごしていました。(昔住んでいた家やよく遊んでいた公園を見に行ったり...

PHP PHPカンファレンス

FuelPHP1.8.0→1.8.2、PHP5.6→PHP7.3へのバージョンアップした

アプリケーション

概要FuelPHP1.8.0→1.8.2、PHP5.6→PHP7.3へのバージョンアップ対応をした。業務でアプリケーションのバージョンアップ対応を行ったので、取り組みをまとめておく。 スコープ FuelPHP1.8.0 → FuelPHP1.8.2 PHP5.6 → PHP7.3 対象リポジトリ ユーザー側アプリケーション 管理側アプリケーション パッケージリポジトリ ※ミドルウェアのバージ...

PHP FuelPHP

Golangでトライ木を実装する

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

概要トライ木のアルゴリズムと実装についてかく。 bmf-san/road-to-algorithm-master  トライ木とはトライ木(プレフィックス木ともいう。英語はそれぞれ、trie、prefix tree)は文字列の集合を扱う木構造の一種。 各ノードは単一または複数の文字列あるいは数値を持ち(ノードは必ずしも値を持つ必要はない)、根ノードから葉に向かって探索して値をつなげていくことで単語を...

Golang 基数木 トライ木

Mackerelで監視対象から外れたホストを再度復帰させる方法

インフラストラクチャ

概要 Mackerelの監視対象から誤ったホストを退役させてしまったり、意図せず監視対象から外してしまったときなどに復帰させる方法についてメモっておく。 手順 mackerel-agentを再起動しても自動で復帰しないのでホストに割り振られたhostIdを更新させる必要がある。 service mackerel-agent stop cd /var/lib/mackerel-agent mv id...

Mackerel Tips

Dockerizeを使ってDocker Composeのコンテナの起動順を制御する

インフラストラクチャ

概要Dockerizeを使ってDocker Composeで起動するコンテナの順番を制御する方法についての覚え書き。 github.com - jwilder/dockerize なぜDockerizeを使うのかDockerizeではなく、wait-for-it というピュアなbash scriptを使った方法も採用することもできる。 cf. Docker-docs-ja - Compose の起...

Docker Docker Compose Dockerize

Golangでクリーンアーキテクチャに入門する

アプリケーション

概要GolangでClean Architectureの実装に挑戦したみたので整理しておく。 内容は概ねスライドの内容を踏襲している。 理解しきれていないところがあったり、自分の解釈、考えを記述しているので、正しくない部分もあるかもしれない。 スライドLTをする機会があったのでスライドを貼っておく。 Dive to clean architecture with golang ソースソースはこれ。...

Clean Architecture Golang DIP

MySQLでテストデータを生成するSQL

データベース

概要MySQLだけでテストデータを生成するSQLについてメモしておく。テストデータをスクリプトで生成する方法は柔軟性が高く、上等手段な気がするが、数万件のレコードを用いてパフォーマンステストをしたい時などはSQLだけでも十分かもしれない。 SQLクエリはこんな感じ。 DROP TABLE IF EXISTS `tests`; CREATE TABLE `tests` ( `id` int(...

MySQL sql cross join

PHPカンファレンス福岡2019に参加・登壇してきました

ポエム

PHPカンファレンス福岡2019に参加・登壇してきましたPHPカンファレンス福岡に初めて参加してきました。 今までCFPに落ち続けていたのですが、今年度は無事採択されることができたのでスピーカーとして参加しました。 東京以外のカンファレンスに参加するのはPHPカンファレンス仙台に続いて2回目でした。 登壇資料はこちら。PHPでURLルーティングを自作する PHPerKaigiでトークをしたネタでし...

PHP PHPカンファレンス

execコマンドによるリダイレクト

アプリケーション

概要execコマンドは現在のプロセスを実行するコマンドで置き換えるコマンドだが、引数無しで使うとリダイレクトの動的変更ができる。 ちょうどmaster直プッシュの際にプロンプトで確認するようにするで #!/bin/sh exec &lt; /dev/tty read ANSWER というコードが出てきてよくわからなかったので調べてみたのがきっかけ。 使い方#!/bin/sh echo "Outp...

bash shellscript exec

master直プッシュの際にプロンプトで確認するようにする

アプリケーション

概要gitでmasterブランチへの直pushを未然に防ぐためのセーフーティネットの作り方。github上でmasterブランチへのpushを禁止すれば良いのだが、DevOpsの都合上でgithubの設定では問題があったのでhooksを使う方向で設定した。 導入グローバルに設定したいので~/.git_template/hooks配下にpre-pushファイルを作成する。.git_templateデ...

Git shellscript

dockerでイメージとコンテナを削除してもボリュームが消えていなかったときのメモ

インフラストラクチャ

概要dockerでコンテナとイメージを削除してもvolumeが削除されていなくてちょいちょい忘れてハマるのでメモっておく。 普段は、docker-composeを使っている。 docker-compose builddocker-compose up -d して、 docker rm **docker rmi ** という感じにお片付けしているのだが、どうやらマウントしているvolumeを削除する...

Docker Docker Compose

PHPで学ぶデザインパターン - Stateパターン

アプリケーション

概要PHPで学ぶデザインパターン Advent Calendar 2018で間に合わなかった記事。 Stateパターンとは状態をクラスで用意することで振る舞いを切り替えることができるようなパターン。 実装スイッチのオンオフの状態を切り替えるような例を想定した。シングルトンを使ったほうが良い気がする。 &lt;?php class OnState { public function get...

GoF PHP デザインパターン ステートパターン

ゴリラで学ぶソフトウェアの法則10選

アプリケーション

概要以前書いたソフトウェア開発の法則 の雑メモをベースにLTをしたのでスライド内容を補足する形でまとめる。 スライドは↓ゴリラで学ぶソフトウェアの法則10選 ゴリラで学ぶには無理があったのでスクリプトを書き残しておく。 ソフトウェア開発の法則ソフトウェアの文脈で語られる法則に縛らず、他分野での法則でもソフトウェアに当てはまるであろうものを”ソフトウェア開発の法則”としている。 経験則に基づく...

ソフトウェア開発

PHPerKaigi2019に参加・登壇してきました

ポエム

PHPerKaigi2019に参加・登壇してきましたPHPerKaigiに初参加&登壇してきました。 fortee - PHPでURLルーティングをつくるSpeaker Deck - PHPでURLルーティングをつくる 過去登壇した会場よりも客席が近い・スライドが大きい!で結構緊張しました... 登壇を終えてcfpを提出した段階ではまだネタが仕上がっていなくて実装を焦っていました..採択されてから...

PHP PHPカンファレンス PHPerKaigi

GoogleChromeでBurp Suiteを使う手順

ツール

概要Burp SuiteをChormeで使う際の諸々の設定について。脆弱性診断や対応時にburpをchromeで使えるようにしたかった。 環境Mac OS 準備 burpsuite chrome extension - proxy switchsharp 手順プロキシを設定するchrome extension - proxy switchsharpでProxy Profilesを設定する。 Pr...

Burp Suite セキュリティ 脆弱性

URLルーティングをつくる エピソード3(完結編)

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

概要URLルーティングをつくる エピソード1 とURLルーティングをつくる エピソード2 でURLルーティングの自作について試行錯誤の過程を記してきたが、ようやく一段落させることができたので完結編という形で締括くりたい。 完結、といっても課題はいくらでもあるし突き詰めるとこればっかりに時間をかけることができるようなモノであるということは承知している。。。 前回までの話しエピソード1 では、ルーティ...

PHP URLルーティング HTTP 木構造

Laravel JP Conferenceにコアスタッフ兼LTスピーカーとして参加してきました

ポエム

Laravel JP ConferenceのコアスタッフとLT登壇してきました。 コアスタッフとして参加してみて普段、カンファレンスは参加者側なのですが、PHPのコミュニュティに対して微力でも貢献する機会であり、自分の好きなFWのカンファレンスでもあったので、コアスタッフとして参加しました。(ほぼ一日中受付スタッフをやっていました。) 自分がエンジニアとしてなんとかやれているのは、包容力のあるPH...

Laravel LT PHP

ubuntu初期設定メモ

インフラストラクチャ

概要 ちょいちょい忘れてるのでメモ。 不足があれば随時追加。 環境 ConoHa ubuntu 18.04.2 LTS (Bionic Beaver) 準備 ubuntuインストール&amp;rootログイン確認 conohaでubuntuサーバーを用意し、rootログインできることを確認しておく。 ssh用の鍵をクライアント側で用意する 秘密鍵と公開鍵を作成。 ssh-keygen -t r...

Ubuntu

雑Trelloと雑spreadsheetを公開した話とプライベートのタスクを計測し始めた話

ポエム

雑Trelloと雑spreadsheetを公開にしたプライベートの時間にやるタスクを可視化しているTrelloとオレオレスプリントの計測データを管理しているspreadsheetを公開設定にしてみた。 →現在は非公開です。 自分のエンジニアとしての活動は可能な限りオープンにしていきたいとなんとなく考えていて、思い切って公開にしてみた。 そんなふうに考えるのは自分がエンジニアになる前もなった今も世の...

Google SpreadSheet Trello

Laravelでの機能テストの始め方雑メモ

アプリケーション

概要Laravelでの機能テストの始め方と簡単な使い方について紹介する。入門レベルに限るのでより実践的な内容については触れない。※LTの元ネタ程度でメモくらいの内容。 対象テストを書いたことがない人向け。 テストを書いたことがなくても機能テストであればアプリケーションの仕様さえわかっていれば比較的に誰にでも楽に何を書くのかわかりやすいと思う。 特にLaravelは機能テストで使える便利なAPIやツ...

Laravel 機能テスト

Goでmysqldumpツールをつくる

アプリケーション

概要このブログのDBバックアップを原始人のごとく手動でやっていたのでコマンド一発でバックアップをリモートからローカルにバックアップを取れるツールをgoでつくってみた。 パッケージ &quot;net&quot; ネットワークI/O、TCP/IP、UDP、ドメイン名前解決、Unixドメインソケットなどのインターフェースを提供してくれるやつ &quot;time&quot; 時間の計算や表示のため...

Golang MySQL ssh mysqldump

PHPで学ぶデザインパターン - Bridgeパターン

アプリケーション

概要PHPで学ぶデザインパターン Advent Calendar 2018で間に合わなかった記事。 Bridgeパターンとは機能拡張のためのスーパークラスと実装拡張のためのサブクラスを用意し、機能の橋渡しをするようなパターン。 実装&lt;?php interface Connector { public function __construct(Converter $converter)...

GoF PHP デザインパターン ブリッジパターン

PHPで学ぶデザインパターン - Adapterパターン

アプリケーション

概要PHPで学ぶデザインパターン Advent Calendar 2018で間に合わなかった記事。 Adaperパターンとは元となるクラスに修正を加えることなくインターフェースを変更することができるパターン。 異なるインターフェース間の互換性を調整するようなAdapterクラスを用意することで実現する。 実装&lt;?php interface Bird { public function...

アダプターパターン GoF PHP デザインパターン