Carpe Diem

備忘録

BehaviorSubjectでAPIの結果をキャッシュ

概要

クライアントからのAPIコールは可能であれば避けた方がサーバの負荷も下がり、ユーザの体感速度も上がります。
1度取得すればほぼ変わらないデータなどは、最初にAPIコールした後はできれば避けたいです。
一方でcookieやlocalstorageで管理するほどでもない、というときはBehaviorSubjectを利用します。

環境

  • Angular 4.3.4
  • rxjs 5.4.2

BehaviorSubjectとは

基本的な動作

BehaviorSubjectの大きな特徴は直前にonNextで渡された値を保持し、subscribe()getValue()するとその保持していた値を取得できるところです。

f:id:quoll00:20170812194105p:plain

ref: ReactiveX - Subject

続きを読む

ScratchイメージでGoアプリの超軽量イメージをビルド

概要

Alpineベースのイメージが軽量イメージとして認知されていますが、Goの場合は単一バイナリで動くのでイメージ内にgolangが入っている必要はありません。
なので最も軽量と言われているScratch imageを利用することで、dockerイメージを軽量化することができます。

環境

  • golang 1.8.3
  • Docker 17.06.0-ce

ビルド手順

対象ファイル

以下のファイルを扱うことにします。

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
)

func main() {
    resp, err := http.Get("https://google.com")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(len(body))
}
続きを読む

delveでGoのデバッグ

概要

Goでデバッグをする際にdelveというツールがオススメです。

環境

  • golang v1.8.3
  • delve 1.0.0-rc.1

インストール

brewでもインストールできますが、単体テストの実行の際に上手く動かないことがあったのでgo getの方をオススメします。

$ xcode-select --install
$ go get -u github.com/derekparker/delve/cmd/dlv
続きを読む

Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別

概要

各言語がC10K問題をどう解決してきたかを調べてみたところ、Non-Blocking I/O, I/O Multiplexing, Asynchronous I/Oの区別がよく分からなかったので調べてみました。
正直なところ人によってちょこちょこ定義が異なるのではっきりとした答えはなさそうですが、自分で調べてしっくりした形をまとめます。

前提

同期と非同期の違い

用語 説明
同期 OSにタスクを投げて、入出力の準備ができたら
アプリケーションに処理が返ってくる
非同期 OSにタスクを投げて、入出力が完了したら通知をもらう

ブロッキングとノンブロッキングの違い

用語 説明
ブロッキング OSへ依頼したタスクが完了するまで待つ
ノンブロッキング OSへ依頼したタスクの完了を待たない
続きを読む

GoでMockを書く時のTips

概要

「GoはDuck TypeだからMock用意するの大変だよね」とよく言われますが、そんなことはないですよ、という話。

環境

1. interface自体埋め込めば実装済みと解釈してくれる

例えば以下のような複数のメソッドを持つinterfacedoEverythingがあり、showUserAge()にDIして表示させるロジックがあるとします。
※DIについては GoでDependency Injection - Carpe Diem を参考にしてください

type doEverything interface {
    getAge() int
    setAge(int) error
    getName() string
    setName(string) error
    getSex() string
    setSex(string) error
}

func showUserAge(d doEverything) {
    fmt.Println(d.getAge())
}
続きを読む

CloudFrontのキャッシュでハマった話

概要

ブラウザのキャッシュ - Carpe Diem
を検証している時に期待した挙動をしなくてハマったので、CloudFrontのキャッシュの動作と注意点をまとめます。

CloudFrontのキャッシュ動作

レスポンスヘッダのx-cacheを見ると以下の3つに区別できます。

x-cache CloudFrontのキャッシュ Originへのリクエス Originのレスポンス
Miss from cloudfront なし
or
あるがTTL切れでOriginに更新あり
あり 200でリソース返す
Hit from cloudfront あり なし なし
RefreshHit from cloudfront あるがTTL切れ あり 304でリソースは返さない

この中で注意なのはRefreshHit from cloudfrontです

続きを読む