Carpe Diem

備忘録

vim-goからvim-lspへ移行しました

概要

vim-goからvim-lspへ移行する時に問題になってたところを全部mattnさんが解決してくださってたのでようやく完全移行したという話です。

環境

  • vim 8.2
  • go 1.13.5

これまでの課題

vim-goの問題点

2014年からgoを触っていましたが当時はvim-go一択で、しかもやりたいことはそれだけで事足りていました。

しかし時代は流れ、以下のように少しずつモヤモヤを感じるようになってきました。

  • 1.10のビルドキャッシュ辺りでバグがちょこちょこ起きたり
  • 機能が増えてきて重くなったり
  • Language Server Protocolの機運が高まってきた(色んなエディタやIDEが対応してきた)
続きを読む

MacでのGithubリポジトリのcloneを自動化

背景

パソコンを新調した時に大変なのが

です。

前者に関してはhomebrewが提供しているbrew bundleである程度対応できます。

後者でghqはdump, restore的な機能ってあるのかな?と思って探したのがこの記事のきっかけです。

環境

方法

ghqlistimport(getに統合されました)といった機能を提供しています。

続きを読む

check digitを使った誤り検出

概要

クレジットカード・シリアルナンバーなど、長くなるほど入力ミスはしやすくなります。

そんな時に毎回DBに問い合わせて正しい値かをチェックするのではなくアルゴリズムによって正しいものかどうかチェックする仕組みがcheck digit(チェックディジット)です。

具体例

例えば

全桁を足し合わせて10で割った値をcheck digitとする

という計算式でcheck digitを算出するとします。
元の値を1234 5678 901とするとcheck digitは

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 = 46

46 \% 10 = 6

となります。
よってcheck digitを付加した最終的なコードは1234 5678 9016となります。

元の値 check digit 最終的な値
1234 5678 901 6 1234 5678 9016
続きを読む

inodeから見たmvやcpの動き

背景

実行中のファイルに対してcpで上書きする場合だとText file busyで置き換えられず、mvだと何も聞かれず置き換えられる理由を深掘ってみました。

データ構造

mvやcpの動きを確認する前に必要な前提知識を説明します。

プロセスとinodeとの関係

プロセスとinodeは以下のように

プロセステーブルエントリ
└ファイルテーブルエントリ
 └v-node(i-node)

という形で繋がっています。

f:id:quoll00:20191224054722p:plain

続きを読む

リダイレクトの仕組みを深掘りする

背景

$ コマンド > outfile 2>&1

$ コマンド 2>&1 > outfile

は結果が異なります。
前者は標準出力、標準エラーともにoutfileに出力されるのに対し、後者は標準出力はoutfileに、標準エラーはターミナルに出力されます。

この違いを理解するためにUnixのシステムを深掘ってみます。

カーネルデータ構造

Unixシステムでファイルをオープンした場合は以下のようなデータ構造になります。

f:id:quoll00:20191219062003p:plain

ref: https://www.usna.edu/Users/cs/aviv/classes/ic221/s16/lec/21/lec.html

続きを読む

cgoを使わないGoのクロスコンパイル時に -installsuffix cgo が不要になってた

背景

以前Docker multi stage buildなどビルド環境と実行環境が異なる(クロスコンパイル)時に、単純にGOOSGOARCHをセットするだけではなく

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
  go build -a -installsuffix cgo -o main main.go

のように

  • CGO_ENABLED=0
  • -a
  • -installsuffix cgo

といったおまじないが必要ですよ、という記事を書きました。

ScratchイメージでGolangアプリの超軽量イメージをビルド - Carpe Diem

が、go 1.10からそれらが不要になったようです。

CGO_ENABLED=0 and -installsuffix cgo are no longer required since Go 1.10 | by Адам | Medium

環境

続きを読む

OpenAPI で REST API のスキーマ作成

背景

今やWebだけでなく、iOSAndroid、TV、カーナビといった多数のクライアントでAPIを利用する時代です。
各クライアントでBFFを置く設計もありますが、開発コストや運用コストを考えて同一のAPIサーバを用意し利用することも多いと思われます。
加えてサービスが大きくなってくると外部企業との連携や有志の開発者のためにAPIを公開するケースもあります。

そういった状況下では単にドキュメントベースでやり取りするのは難しく、しばしばAPIとドキュメントの乖離が生まれ負債となっていきます。

そのためこれらの問題を解決できる

  • JSON Schema
  • Protocol Buffers
  • OpenAPI Specification

といったスキーマ言語の活用がとても重要になってきます。

今回はOpenAPIについて話します。

続きを読む