読者です 読者をやめる 読者になる 読者になる

DRYな備忘録

Don't Repeat Yourself.

RedHatにGo言語をインストール(というか配置)

$ cd $ mkdir -p opt/src $ cd opt/src $ wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz $ tar zxvf go1.8.1.linux-amd64.tar.gz $ mv go ~/opt/.go # GOROOT用 $ mkdir -p ~/proj/go # GOPATH用 $ export GOROOT=~/opt/.go $ exp…

個人開発程度のOCRサーバならHerokuに立てればいいじゃない

このエントリはGo (その2) Advent Calendar 2016 - Qiitaの5日目です。WETな方でもお世話になっております、otiai10です。 とある個人開発が、もうかれこれ3年ぐらい続いているんですが、ブラウザ上に描画されたちょっとしたテキストをOCR(文字認識)する要…

herokuで自作buildpackを作った時に得た知見

かつてこれ↓を書いたときからまたHerokuは状況が変わってて、 otiai10.hatenablog.com 今では、buildpackっていう、いうなればインスタンスの初期化スクリプトみたいなのを定義できるっぽい。そこで依存するパッケージのインストール(に相当すること)も可…

How to install gosseract to CentOS 7

What is this document for? "gosseract" is a Tesseract-OCR wrapper for Golang, and this document is for an issue reported to "gosseract" github.com Reproduce the issue Set up environment for simulating CentOS # because I'm using MacOS % doc…

【Go言語】GoでJWT(JSON Web Token)を使うサンプル

参考 JSON Web Tokens - jwt.io GitHub - dgrijalva/jwt-go: Golang implementation of JSON Web Tokens (JWT) jwt - GoDoc GitHub - slok/go-jwt-example: Golang & jwt (Jason web token) example ← なんかこれ今時点で動かなかったので package main impo…

【Go言語】ローカルのGoの(継続的な)バージョンアップ【go1.7】

go

なんかいつの間にこんなrepoあったの go - Git at Google git clone https://go.googlesource.com/go とりあえず現状確認 % go version go version go1.6.2 darwin/amd64 % echo $GOROOT /Users/otiai10/.go/1.6.2 % ls /Users/otiai10/.go 1.4.3 1.5.3 1.6.2…

Go言語でBasic認証する

go

参考 http - The Go Programming Language javascript - How to prevent browser to invoke basic auth popup and handle 401 error using Jquery? - Stack Overflow 実装 main.go package main import ( "fmt" "net/http" "github.com/otiai10/marmoset" ) …

【追記】AppEngine Goで、go-app-builder: Failed parsing input: app file users.go conflicts with same file imported from GOPATH と叱られる問題

問題 AppEngineなアプリケーションをGoで開発していて、もちろんコントローラとかモデルとかは、initがあるところとは別のディレクトリ切って作ったりするんだけど、意気揚々とgoapp serve ./すると以下のように叱られる % goapp serve ./ # 中略 ERROR 2016…

HerokuにDockerで動くアプリケーション(Go)をデプロイする

追記(2016/12/22) 任意のパッケージがインストールされた環境をHerokuにつくりたい、という目的でDockerを選択したけれど、Dockerfileに書かれているinstallコマンドは有効に動かない、みたいな情報を得ました。で、どうやらさいきんはbuildpackをうまいこ…

アメッシュをターミナルに表示して、ついでに雨降ってたらSlackでおしえてくれるところまで、Goでやったことのまとめ

go

このエントリはGo その2 Advent Calendar 2015 - Qiitaの8日目です。 7日目のS_Shiomtoriさんの記事もコマンドラインツールの話でした。 % go get github.com/otiai10/amesh/amesh % amesh -g 思ったことや詰まったこと書きます Goでコマンドラインツールを…

【Go言語】画像ファイルをbase64エンコード文字列にする、とその逆

package main import ( "encoding/base64" "io/ioutil" "os" ) func main() { f, err := os.Open("./hoge.png") if err != nil { panic(err) } defer f.Close() b, _ := ioutil.ReadAll(f) out, _ := os.Create("out") base64.NewEncoder(base64.StdEncoding…

【Go言語】inconsistent definition for type ほげ during import ふが

go test, go build, go runなどで以下のエラーが出る。エディタの警告にも出る。 inconsistent definition for type gorm.search during import struct { db *gorm. 以下略 inconsistent definition for type ほげ ってことで、たぶん同じ名前の違う定義が存…

【Go言語】go testに-coverをつけるとruntime.Callerが変わっちゃう問題

go

github.com % go test -v === RUN TestCaller 2015/09/14 17:57:33 375167 /Users/otiai10/proj/go/src/covsample/sample.go 9 true --- PASS: TestCaller (0.00s) PASS ok covsample 0.004s % go test -v -cover === RUN TestCaller 2015/09/14 17:57:39 37…

【Go言語】なんかjinzhu/gormのLogModeがバグってんじゃねえのかと

github.com 経過を待つ ついでに hack.aipo.com DRY

おっぱいが%dつ

The Go Playground see this code in play.golang.org なんかいい響きだったので、つい

【Go言語】無名structの初期化

しれっと可能だったのでメモ The Go Playground package main import ( "encoding/json" "fmt" ) func main() { // 無名structの初期化 dest := &struct { Name string `json:"name"` Age int `json:"age"` Langs []string `json:"langs"` }{} json.Unmarsha…

gormでcomposite primary keyを使いたいのだが

なんかこうするっぽい type Foo struct { Bar string `gorm:"primary_key"` Baz int `gorm:"primary_key"` } で、gorm.DBのAutoMigrateかCreateTableを叩けばいいわけで、LogMode(true)で発行されてるSQLを確認すると CREATE TABLE "foos" ( "bar" varchar(2…

【Go言語】container/listのRemoveでハマった

や、ハマったってほどでもないんだけど、まあそうだよね、って感じたメモ。 以下のように書いて、barとquxをlistから排除しようとした see this code in play.golang.org barは排除できてるけど、quxは排除できてないことがわかる。 原因 Remove(e)を呼んだ…

go templateで、スライスの特定インデックスの要素の、そのまたプロパティにアクセスしたい

前回 go templateで、スライスの特定インデックスにアクセスしたい - DRYな備忘録otiai10.hatenablog.com {{index .myslice 1}} で出力できることを知ったけど、出力するだけならまだしも、それがstructでさらにプロパティがある場合どうすんねん的なことを…

go templateで、スライスの特定インデックスにアクセスしたい

あかんやつ Can I access index directly? the second is: {{.Bars[1]}} panic: template: :2: unexpected bad character U+005B '[' in command ヒィィ うごくやつ Can I access index directly? the second is: {{index .Bars 1}} The Go Playground リファレ…

Goのエラーハンドリングについてちょっとだけ思ったメモ

go

だめ1 if err := foo(); err != nil { return err } // どこがやねん、ってなる だめ2 if err := foo(); err != nil { return fmt.Errorf("failed to do foo") } // なんでやねん、ってなる すき if err := foo(); err != nil { return fmt.Errorf("failed…

#gunosygo でIntelliJ IDEAでGoを書く環境設定を教えてもらった

GOROOT, GOPATH is empty or not detected このエラーが消せなくて困っていたのだが、 IntelliJ14でGolang PluginがGOROOT, GOPATHを認識しないja.stackoverflow.com 2015/06/02開催のGunosy.goで、LTという名の他力本願で、その場で教えてもらった(ライブ…

【Go言語】[]string, []int to []interface{} とかそういうの

go

「なんかのスライス」を「interface{}のスライス」にしたい。 スライスでなければ、「なんか」を「interface{}」にするのは単に抽象度の増すキャストなので超簡単なわけだけど。 s := "hoge" i := interface{}(s) これがスライスとなるとだめ ss := []string…

【Go言語】could not determine kind of name for C.foo

問題 cgoを使ってGoのコードからC/C++のライブラリを使いたいので、手始めにHello, World書いて実行したけど、以下のエラーが出る。 % go run main.go # command-line-arguments could not determine kind of name for C.foo 可能性1) そこ、空行いれちゃだ…

Go言語の三項演算子

go

そんなものは無い。設計を見直そう。 There is no ternary form in Go. Frequently Asked Questions (FAQ) - The Go Programming Language それでも、クライアントがAPIレスポンスに、ゼロ値じゃなくてnullが欲しい、と要求してくるケースがある。この場合は…

Goのパッケージ管理ツールgodepの紹介と、僕がハマった罠

Goのプロジェクトの依存パッケージをどうするかという問題があります。 package myapp import ( "gopkg.in/hoge/fuga" "myserver.com/foo/bar" "buz" ) func main() { // ... } などのアプリケーションをサーバにデプロイするとき、fugaパッケージやbar、buz…

【Go言語】メモ:runtime.Caller

go

runtime.Caller runtime - The Go Programming Language func Caller(skip int) (pc uintptr, file string, line int, ok bool) Callerはgoroutineのスタックから呼び出された関数のファイルと行数に関する情報をレポートします. 引数skipは、スタックフレー…

【Go言語】sliceの要素をn個ずつ処理する

go

メモ source := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} fmt.Println(source) u := 2 for i := u; len(source) > 0; { if len(source) < u { i = len(source) } target := source[:i] source = source[i:] fmt.Println(target) } もっといい方法あ…

【Go言語】ループ内でのgoroutine生成の潜在的なエンバグポイントについて

go

1番、よくやるやつ(やばめ) for _, user := range users { go func() { user.SomeHeavy() }() } 非同期で生成されるクロージャの中で、参照されるuserはループ内スコープのそれなので、たとえばループのn番目とn+1番目の処理において、同じn+1番目のユーザ…

【Go言語】固定長arrayからsliceへの変換 "convert array to slice"

go

こうです arr := [4]byte{10, 20, 30, 40} slc := arr[:] fmt.Printf("%T\n%T\n", arr, slc) Go Playground 参考 Go Slices: usage and internals - The Go Blog ここにちゃんと書いてあった This is also the syntax to create a slice given an array: x :…

【Go言語】sql driverの違いによるCHARとVARCHARの挙動の違い【特にpostgresのlib/pq】

Go言語からSQLを使うときは Go言語からSQL(or SQL-like)データベースを使うときは、Go言語標準のsql - The Go Programming Languageが定めるinterfaceを実装したdriverを実際は使っています. たとえばdriverはここに列挙されてたりします. SQLDrivers - go-w…

個人的におせっかいだなと感じたGo言語の仕様

go

Go言語は、必要なものを提供し、必要じゃないものは削ぎ落とし、明示的でとても学びやすい言語だと思ってます。好きです。「なるほど、ここからは自分でやれ、ということか、面白い」「おーこんなこともしてくれちゃうのかー」という発見こそあれ、「なんで…

Go言語でmongodb使うときのmgoのメモ

Goでmongodb使うときは mgo - Rich MongoDB driver for Go まあこれ使うと思う しりたいこと embedしたstruct込みでポインタ渡すとキャストしてくれるのかという件 というのも package main import ( "fmt" mgo "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) …

データベースのコネクションプーリング(とGo言語におけるそれ)

go

コネクションプーリングとは コネクションプーリングとは 【 connection pooling 】 〔 コネクションプール 〕 - 意味/解説/説明/定義 : IT用語辞典 「コネクションを張る/切る」というコストを削減することが主な目的。1つのDBに対するコネクション総数を…

【Go言語】Go Playgroundの使い方メモ

go

Go Playgroundとは Go Playground http://play.golang.org/ どんな言語でも用意しているような、ブラウザ上でGoを書いて実行できる実行環境。 キーボードショートカットがあるっぽい (公式ドキュメント探し中) キーバインド アクション Shift + ⏎ ビルド&…

【Go言語】http.NewRequestでBodyできなくてはまった

go

問題 net/httpパッケージでRequestインスタンスを得るためにNewRequestを使う 第三引数を指定するもBodyができない なーぜー 問題のコード package main import ( "bytes" "encoding/json" "fmt" "net/http" ) func main() { data := map[string]interface{}…

【Go言語】html/templateパッケージの使い方メモ

go

メモ template.Template型のstructを扱う Newなどして得る Parseメソッドでテンプレート部分を解釈させる Executeで変数を当て込める サンプル package main import "html/template" import "fmt" import "bytes" func main() { // *template.Templateのオブ…

【Go言語】素因数分解とか約分とか

go

fmt.Println( sprime.Factorize(329).List(), sprime.Factorize(329).Dict(), ) // [7 47] // map[7:1 47:1] otiai10/sprime · GitHub 雑感 なんか車輪の再発明感がとてつもないんですけど 既存の方法とか誰かおしえてください ホリデーコーディングとしては…

【Go言語】http.Request.Formとhttp.Request.PostFormの違い

go

golangのnet/httpパッケージにあるRequestオブジェクトにはFormとPostFormというフィールドがある。この違いはなんだ? ドキュメント見る http - The Go Programming Language // Form contains the parsed form data, including both the URL // field's qu…

【Go言語】database/sqlのplaceholderで叱られる

go

問題 res, err = db.Exec( "INSERT INTO table001 (name,age) VALUES (?, ?);", "otiai10", 17, ) で、以下のように叱られる pq: syntax error at or near "," なお当方、 import "database/sql" import _ "github.com/lib/pq" の構成です 解決 ?じゃなくて$…

【Go言語】`net/http`パッケージことはじめ

go

さっきマックで女子高生が「えーまだ生net/http使ったことないのーw マジウケるんですけどー」って話してた。やばい。 最小限 とりあえず、HandleFuncやHandleを用いた最小限のサーバ package main import ( "fmt" "net/http" // "io/ioutil" ) // ResponseW…

【Go言語】可変長のioをReadしたい【bufio.Scanner】【io.Rader】

go

io.Readerを使った読み込み ファイルの読み込みやTCPコネクションのメッセージ読み込みに、io.Readerインターフェースを実装したstructのReadメソッドを使う 以下その例 package main import "fmt" import "os" func main() { file, _ := os.Open("sample.tx…

【Go言語】循環参照"import cycle"についてメモ

go

例 $GOPATH/src/foo/foo.go package foo import "bar" func Foo() { println("foo.Foo") } func CallBar() { bar.Bar() } $GOPATH/src/bar/bar.go package bar import "foo" func Bar() { println("bar.Bar") } func CallFoo() { foo.Foo() } buildしてみる …

【Go言語】Appleプッシュ通知を使う【APN】

ゴール 先日【iOS】Push通知の実装(サーバ編その1)【できた】 - DRYな備忘録においてRubyで実装した 今回はこれをGo言語でやる 記録 こういうのがある anachronistic/apns · GitHub 上記ブログで使用したRuby製のhoustonとの違いは クライアントを初期化す…

【Go言語】assignment to entry in nil map

go

問題 以下のエラーが出た panic: runtime error: assignment to entry in nil map 調査 Go言語では、ほとんどの型は宣言時に初期化される。 package main import "fmt" type A struct { Foo []float64 Bar bool } func main() { var i int fmt.Printf("%+v\n…

【Go言語】別packageのstructを埋め込んだら何でアクセスすればいいんです?

go

メモ $GOPATH/src/foo/foo.go package foo type Foo struct{ Bar string } main.go package main import "fmt" import "foo" type Buz struct { foo.Foo } func main() { bar := Buz{} fmt.Printf("%+v\n", bar) bar.Foo = foo.Foo{Bar:"otiai10"} fmt.Print…

【Go言語】testの中でPrintlnしてるのに標準出力に出ない

go

% go test ok command-line-arguments 120.786s いやokじゃねえよ。出せよ。 解決 -vつけましょう % go test -v === RUN TestNew hoge is hoge DRYな備忘録

【Go言語】FileのReadちょっとメモ

go

// hoge.conf aaaaaaaa bbbbbbbb cccccccc dddddddd // main.go package main import "fmt" import "os" import "io/ioutil" import "strings" func main() { f, _ := os.Open("hoge.conf") defer f.Close() // (*os.File) Read を使う限りは、buffer sizeを…

【Go言語】packageに定義されてるstruct名を取得する

問題 メタプログラミング的なことをするうえで、ある名前のpackageの中で定義されているstruct名を抽象的に取得したいことがあったので、その方法をメモ 方法 go/ast go/parser あたりを使う 準備 % cd % mkdir $GOPATH/src/foo % vi $GOPATH/src/foo/foo.go…

【Go言語】`go build`コマンドについて和訳とメモ

go

go help build usage: go build [-o output] [build flags] [packages] Build compiles the packages named by the import paths, // `build`はimport pathsで与えられた名前のgo srcをコンパイルします along with their dependencies, but it does not ins…