Carpe Diem

備忘録

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です

続きを読む

ブラウザのキャッシュ

概要

Webフロントのパフォーマンス診断 - Carpe Diem
で指摘されたブラウザキャッシュの対応をするため調べてみました。

大きく分けて強いキャッシュ弱いキャッシュの2種類のキャッシュがあります。

強いキャッシュ

ブラウザ側でリソースを保持し、期限が切れるまでサーバにHTTPリクエストを発行しません
なので一度ブラウザにキャッシュされるとサーバ側からハンドリングすることができなくなります

これを設定する方法は

  • Cache-Controlヘッダー
  • Expiresヘッダー

の2つがあります。

続きを読む

Webフロントのパフォーマンス診断

概要

Webフロントのパフォーマンスをチェックする診断ツールの紹介です。
なんだかもっさりした挙動だけどどこから手を付けたら良いか分からない、といった時に問題点を洗い出すのに便利です。

Audits

Chrome DevToolsに標準で付いています。
ページを開いた状態でRunを押すと以下のように診断してくれます。

f:id:quoll00:20170623002538p:plain

続きを読む

GoでBigQueryにデータを追加する

概要

GoでのBigQueryの使い方です。
認証周りが以前と変わっており、JWTを使ってゴニョゴニョしてた部分をライブラリ側で吸収してくれるようになったのか使う側は簡単になりました。

環境

  • go 1.8.3

サービスアカウントキーの作成

API Console Credentials pageで以下のようにサービスアカウントキーを作成します。

f:id:quoll00:20170622010124p:plain

続きを読む

Goのnilについて

概要

先日の golang.tokyo #6 - connpass で独自のエラー型でnilにハマった点に触れられていて、自分でもふわっとしか覚えてなかったのでまとめ。

覚えること

以下を覚えておけばとりあえず大丈夫です。

  • nilは型を持つ
  • interfaceの場合のみ、型もnilでないとxxx == nilはfalse

nilを扱う型は

  • pointer
  • function
  • map
  • slice
  • channel
  • interface

がありますが、注意するのはinterfaceのみで大丈夫です。

続きを読む