2. • @lestrrat • Perl/Go hacker, author, father • Author of github.com/peco/peco • Organizer for builderscon

結論 実装ではなくインターフェースに依存させる Goのinterfaceは実装の明示が必要ないので便利 aws-sdk-goのスタブ 外部ライブラリの例としてaws-sdk-goを使ったこういったコード例を考える: type CertificateFetcher struct { client *dynamodb.Client } func New(client *dynamodb.Client) *CertificateFetcher { return &CertificateFetcher{client: client} } func (f *CertificateFetcher) GetCertificate(domain string) (string, error) { resp, err := f.client.GetItem(...) if err != nil { retu
以前の記事ではprotocプラグインの書き方を紹介したが、実は1つ問題があった。 実用的なプラグインを書こうとした場合に、しばしば生成時に必要な、ドメイン固有の情報が足りないのである。本稿ではそれを補うカスタムオプションの話をする。 ここでもう一度確認しよう。protocのプラグインはProtocol Buffersのスキーマを読んで任意の処理を行える仕組みだ。それはCodeGeneratorRequest内のFileDescriptorProto messageを読み取って任意のバイト列を出力し、出力を受け取ったprotocが指定通りにファイルにバイト列を書き込んでくれる。 ただ、FileDescriptorProtoはprotobufのスキーマ言語の文法をprotobufメッセージとして表現したものに過ぎないから、極めて一般的なデータ構造とサービス定義を表現する能力しか持たない。プログ
Go 1.10 Release Party in Tokyo の発表です
はじめに 2018年2月にリリース予定のGo1.10では、strings.Builderという型が(CL74931)が入ります。 このstrings.Builderを用いると、効率良く文字列を生成することができます。 この記事では、まずstrings.Builderの使い方を説明し、次に同様の使い方ができるbytes.Bufferとベンチマークを取ってパフォーマンスを比較してみます。 そしてさらに、strings.Builderの実装をソースコードから読み解き、そこで使われているテクニックを解説します。 使い方 まずは使い方をみていきましょう。 strings.Builderはゼロ値で扱える型です。そのため、使用するのに初期化は特にいらず、次のように変数を定義するだけで使用することができます。
There are a lot of good tutorials which talk about Go's sql.DB type and how to use it to execute SQL database queries and statements. But most of them gloss over the SetMaxOpenConns(), SetMaxIdleConns() and SetConnMaxLifetime() methods — which you can use to configure the behavior of sql.DB and alter its performance. In this post I'd like to explain exactly what these settings do and demonstrate t
こんにちは、こんばんわ @Konboi です。 kamakura.go#3 @yokohama を1/20(土)に開催しました。 ブログを書くまでが勉強会ということで次回予告と共にお届けします! connpass.com kamakura.goとは 湘南・鎌倉地域のGopherが集い、切磋琢磨しつつ交流するための活動をしています。 今回は約3年ぶりの開催ということで、比較的参加しやすいであろうと横浜で開催することになりました。 今回は Go開発環境にGo!! というテーマで発表していただきました。 発表内容 Goでゲームサーバーを実装して考えたこと 面白法人カヤック 荒賀 謙作 発表が前日にインフルエンザになってしまいピンチヒッターということで前日に発表が決まりました。 Goで開発しているゲームサーバーをどのように開発しているのかを発表していただきました。 コード生成を積極的に取り入れなが
I had an integration test that was very complex (most are, sadly) and took too long to start. I was able to diagnose why using new features of Go’s 1.10 trace tool. This post describes my workflow and what led me there. The example code I’m using for this post is at https://github.com/cep21/trace-110. My integration test was a bit more complex, but generally had startup that was slow due to a sing
OSS紹介アドベントカレンダー の14日目の記事です。 Fluentd の 公式 Go 版 Logger である fluent-logger-golang はこのように使うのがよさそう、という使い方をまとめてみました。 元々社内で書いておいたドキュメントを編集したものです。 github.com 前提のユースケース Webアプリケーション(APIサーバ) を Go で書いていて、そこから何らかのログを Fluentd に送信したい。 config のお勧めオプション Timeout : Connect に対するタイムアウト。デフォルト3秒なのでそのままでよさそう WriteTimeout : 書き込みのタイムアウト。デフォルトだとずっと待ってしまうので 3 秒とか? BufferLimit : デフォルト 8MB これを超えると捨てられてしまう。送る流量によって調整が必要 MaxRetry
Reader interface の Read 関数は、どのタイミングで io.EOF を返すのでしょうか。 まずは strings.Reader で見てみましょう。 package main import ( "fmt" "strings" ) func main() { r := strings.NewReader("example\n") for { var b [1]byte n, err := r.Read(b[:]) fmt.Printf("%d %q %v\n", n, b, err) if err != nil { break } } } 結果 1 "e" <nil> 1 "x" <nil> 1 "a" <nil> 1 "m" <nil> 1 "p" <nil> 1 "l" <nil> 1 "e" <nil> 1 "\n" <nil> 0 "\x00" EOF Readの結
こんにちわ。しいたけです。今日はgoroutineの実行状況をいいかんじに可視化するツールの話です。 goのプロファイリングツールと言えば、 runtime/pprof や net/http/pprof ですよね。これらの使い方はググればすぐに出てくるのですが、 詳細なtraceを取得して可視化できる runtime/trace については、日本語の情報が殆ど無いので書いてみましいたけ。 runtime/trace はgoroutineの実行状況やsystem callのイベント、Heapやnetworkの状況をこんな感じに可視化してくれるので便利です。 これは自作のクローラーを動かしている際のtraceを可視化したもので、横軸がタイムラインになっており、上段に Heapの使用状況やgoroutineとos threadの数が, 下段はnetworkやProccesor(GOMAXPROC
Mercari Advent Calendar 2017 の5日目はソウゾウ エキスパートチームの@tenntennがお送りします。 本日は12月5日、つまりは12月Go日ということでGoの話題について書きたいと思います。 先日、golang.tokyo#10にて”メルカリ カウルのマスタデータの更新“というタイトルで発表を行いました。 その中でgolang.org/x/text/transformパッケージを用いたバイト列の変換について紹介しました。 しかし、golang.tokyo#10では時間の関係上、詳しい説明を省いてしまったため、ここではtransform.Transformerインタフェースの実装方法について解説を行います。 golang.org/x/text/transformパッケージ(以降transformパッケージと表記します)は、Goの準標準パッケージであるgola
この記事は Gunosy Advent Calendar 2017の5日目の記事です。前回の記事はGunosyのパーソナライズを支える技術 -ワークフロー編-でした。 GoでAPIを書くときの問題僕の在籍するGunosyはGoを昔(?)から本番採用しておりまして、ノウハウも潤沢に溜まっている企業だと言えます。 しかし、contextの扱いやベストなパッケージ構成、テスト、net/httpでAPIを書くノウハウなどなど、迷うことは多々あります。 これは弊社特有の事情ではなく、Goのサーバーサイドエンジニア全員にとっての問題です。中でも、パッケージ構成をどうすればいいのか(相互参照せずに快適に開発を進められるパッケージ構成とは)を見つけるのは結構難しく、各々のチームにお任せ、という状況です。 今回は上記の問題のうち、パッケージ構成に踏みこんで見たいとおもいます。会社でもよくパッケージ構成をどう
以前に 200 行のコードへのブロックチェーンの実装 というエントリを読み、たった 200 行の Javascript で実装された Blockchain である Naivechain の存在を知った。本エントリは、その Naivechain の Go 版を実装してみたので、本家 Naivechain と合わせてご紹介しますという話。ちなみに、コードの短さは求めずになるべく構造化してわかりやすさ重視で書いた(つもり)なので、200 行ではない。 自分の Naivechain 以外に、300 行で実装された Go 実装 もあったりするので、短いコードがお好みの方はそちらもご参照あれ。 そもそもこれは Blockchain なの? Blockchain の定義についてここで深く議論するつもりはない。界隈でも厳密なコンセンサスが取れているわけではないと思うし。一応、JBA の定義 を紹介しておく
概要よくGoogle App Engineに関する記事を書くのですが、今回はAWSです。 APIサーバーでGoを使うことももちろんありますが、他にもgo-apexでLambdaファンクションを書く場面というのもあると思います。 以前go-apexのdeployについての記事を書いたので、それは下記を別途ご覧ください。 今回はElastic Transcoder(動画のエンコーダ)を例にサーバーレスにGoが役立つ実例を紹介します。 やりたいことS3に動画をアップロードするアップロードの通知を元にlambdaが呼ばれるElasticTranscoderを呼ぶエンコード結果をS3に保存するというフローです。今回扱うのは、3の部分です。1,2,4の部分は別途AWSの設定が必要で、個人的にはterraformでやるべきだと思っています。 go-apexでのエンコード処理まずlambdaの中で真っ先に
devfest 2017 tokyo の発表資料です。 Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える from pospome 当日は入室できない人もいたらしい & 機材トラブルで10minほど開始が遅れてしまった ということで申し訳なく思っています。 また、立ち見する価値がある内容を提供できたのだろうか? とも思っています。 スライドは単体でも発表内容が伝わるように文章を多めに載せているので、 是非確認してみてください。 100ページ越えていますが・・・。 #DevFest_room2 入れなかった。。— t.junichi (@tjun1) 2017年10月9日 ものすごい立ち見人数 #Devfest17 #DevFest_room2— バトルプログラマー柴田智也@少女終末旅行 (@tomoya_shibata) 2017年10月9日 ルーム2これから並ぶ方はま
Goで書いたツールのバイナリ配布ってどうやれば良いのかなーと思っていたら、goreleaser というツールを見つけたので使ってみた。非常に便利だったのでメモしておく。 goreleaserとは 簡単に言うと、Goのバイナリのクロスコンパイルと、Github Releasesへのデプロイをやってくれる君。詳しくは https://goreleaser.com/ と https://github.com/goreleaser/goreleaser を参照。 goreleaserのインストール https://github.com/goreleaser/goreleaser/releases からバイナリを取ってくるでも良いけど、僕はgo getでインストールした。 $ go get github.com/goreleaser/goreleaser goreleaserの設定を行う まずはリリ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く