Carpe Diem

備忘録。https://github.com/jun06t

Scratch imageでtime: missing Location

概要

以前以下の記事でscratch imageの作成方法を紹介しました。

christina04.hatenablog.com

しかしgolangのコードによっては以下のpanicが起きることがあります。

panic: time: missing Location in call to Time.In

今回はその対応方法です。

環境

  • golang 1.8.3
  • docker 17.06.0-ce
続きを読む

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イメージでGolangアプリの超軽量イメージをビルド

概要

Alpineベースのイメージが軽量イメージとして認知されていますが、golangの場合は単一バイナリで動くのでイメージ内に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))
}
続きを読む

AngularのHttpClientModuleの使い方

概要

Angular 4.3からこれまでのHttpModuleに代わってより軽量かつ使いやすいHttpClientModuleと言うものが出てきました。
今回はその移行作業を書きます。

環境

  • Angular 4.3.1
  • angular-cli 1.2.3

成果物

今回の成果物は以下です。 github.com

続きを読む

delveでGolangのデバッグ

概要

Golangデバッグをする際に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の区別がよく分からなかったので調べてみました。
正直なところ人によってちょこちょこ定義が異なるのではっきりとした答えはなさそうですが、自分で調べてしっくりした形をまとめます。

Blocking I/O

f:id:quoll00:20170628133720p:plain

ref: java Selector is asynchronous or non-blocking architecture - Stack Overflow

続きを読む

GolangでMockを書く時のTips

概要

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

環境

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

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

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

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