Carpe Diem

備忘録

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について話します。

続きを読む

App Store の In-App Purchase の Grace Period対応

概要

AppStoreでGrace Period機能がリリースされたました。
これはその機能の検証を行った結果です。

Appleは気づいたら仕様変更することもちょこちょこあるので、こちらの結果が常に正しいとは信じず参考程度に捉えてください

前提知識

サブスクリプション決済手段を登録すると、毎月 or 毎年自動で更新されます。
しかしキャリア決済の上限に達したり、カードの上限・更新期限に達して意図せずお金を支払えないケースはサービス側が想像するよりもずっと多いのです。

なのでAppleに限らずGoogleもStripeも、決済問題が解決するまで一時的に解約させずに猶予期間というものを提供しています。

サービス側は猶予期間に入ってしまったユーザに「決済手段に何らかの問題が発生して支払いできてませんよー」と注意喚起を通知し、ユーザ側で問題を解決してもらえるように促す対応が必要です。

続きを読む

Go の http.Server は各種 Timeout をセットした方が良い

概要

以前↓の記事を紹介しましたが、

christina04.hatenablog.com

http.Serverの各Timeoutを使わないと

による大量接続攻撃を受けた時に困るので注意してください。

続きを読む

I/O Multiplexing(I/O多重化)

概要

christina04.hatenablog.com

で一度まとめましたが、まだ理解があやふやなところがありました。

その後

Working With TCP Sockets

を読んでようやくストンと理解できたのでまとめます。

経緯

たくさんのリクエストを受けるにはどうしたらいいか、で

  • マルチプロセス
  • マルチスレッド

といった手法が提案されてきました。

続きを読む