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

@Konboi memo

主に技術に関してつらつらと。

みんなのGo言語を読んで

golang Go言語 感想

iPhone7の発表やRubyKaigiのことでTLが賑わう今日この頃、みなさんいかがお過ごしでしょうか。 自分は新型PS4が気になるところです。

さてみなさん、明日 9月9日は何の日でしょうか?

そうですね!! みんなのGo言語 の発売日ですね!!

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

著者の1人である @fujiwra さんから発売日より、一足先に頂くことができたので読んだ感想を書かせていただきます。

はじめに

自分は業務のメイン使用言語はPerlで業務で使っているツール類(rmlp, google-play-review-watcher をGoで書いたり、趣味で使うツールも最近はGoメインで書いている感じです。

なので、今回の感想はそんなバックグラウンドがある人が書いた感想だと思っていただければと思います。

感想

各章どんなことが書かれているのかは @soh335 さんが書かれている

みんなのGo言語【現場で使える実践テクニック】 に よくまとめられているのでこちらをご覧下さい。

全体的に自分の知らなかった知識や改めて理解を深めることが多く全体的にとてもためになりました、読んでいて特にためになったのは

  • @fujiwaraさんによる3章の実際のアプリケーションを書くにあたってのテクニック集
  • @deeeetさんによる実用的かつ保守しやすいコマンドラインツールをつくるため

の章が特にためになりました

3章

自分が担当しているサービスのプロダクション環境で実際に利用しているstretcherfluent-agnet-hydraの開発を通して得た知見を惜しみなく紹介してくれています

  • Goで外部コマンドを使うときって…
  • この処理にタイムアウト機能をつけたいんだよな
  • goroutineを途中で止めたいんだけど

とアプリケーションやコマンドラインツールなどを作っていて 以上の事を調べたり/嵌ったりしたことがある人は読む価値があると思います。

また、以下の発表資料を読んでなるほど~~~ってなった人も、詳しく説明がされているのでオススメです。

4章

Goはクロスコンパイルが可能なので、Goを使ってコマンドラインツールを作ってみた人もいるのでは無いでしょうか。

そんな中で、

  • flagってどうやって使うんだ?
  • ディレクトリ構成どうしよう
  • テストどうやって書くかな
  • など

コマンドラインを一作ったことがある人は一度は経験した(嵌った)であろう事柄が紹介されているので、 コマンドラインツールを作った事がある人/これから作ってみようかな と思っている人はいかがでしょう。

表紙

かわいい

f:id:Konboi:20160906151604j:plain

さいごに

@fujiwaraさん、著者の皆様、技術評論社様ありがとうございました

No patch utility found の対処法

perl plenv
$plenv install 5.xx.xx 

…

No patch utility found
ABORT

となりエラーになった

$ which patch
/usr/bin/which: no patch …

となり patch コマンドがインストールされていないのが原因だった

$ sudo yum  install -y patch 

して無事解決

めでたしめでたし

参考記事

"No patch utility found"の対処法 DQNEO起業日記

brewでのnginx openrestyのインストールに嵌ったのでメモ

はじめに

OpenResty を使ってやりたいことがあったので 手元の環境(Mac)にhomebrewを使ってインストールしようと思ったらエラーがでて嵌ったのでメモ

TL;DR

brew install opensll
brew link --force opensll
brew install ngx_openresty

エラーになる

nginx openresty を homebrew でインストールする場合は

$ brew install ngx_openresty

でインストールできる

ただ、今回実行したら

...
checking for OpenSSL library ... not found

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
...

のような感じでopnesslのパスが見つけられない様子でエラーになった

解決方法

homebrewopensslをインストールしたら解決した

brew install openssl

このままだと /usr/bin/openssl が参照されるので

brew link --force openssl
source ~/.zshrc

これで homebrewでインストールしたopensslが参照されるので

brew install ngx_openssl

が上手く行った

net/httpで静的ファイルを返す

Go go static

追記 (2016/04/13)

完全に読み間違えていましたね やっちゃいけないそうです

shogo82148.github.io

やるならこう

func main() {
  http.HandleFunc("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
  http.ListenAndServe(":3000", nil)
}

まとめ

ドキュメントをみましょう


軽いwebアプリケーション作ってたら読み込んだjsがhtmlでエラー出てて??? ってなってた

よくよく調べたら /static 以下のhandlerを定義してなかったので/にマッチしてtopのhtmlが返ってきてたからだった

調べたらこんな感じで静的ファイルを返せばよさそう

http.Handle("/static/", func(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, r.URL.Path[1:])
})

stackoverflow.com

GoでMySQLからdatetimeのデータを引いてtime.Time に食わせるときに嵌った

go Go golang mysql DB
db, err := sql.Open("mysql", "<user>:<password>@/<db name>?parseTime=true&loc=Asia%2FTokyo")

parseTime=true をつけるといい感じにparesしてくれる

ただこれだとUTCになるっぽうので loc=Asia/Tokyo をつけるとよい

github.com

#shibuyago #2でLTしてきました

Go shibuyago 発表エントリー 発表資料 redis Redis

はじめに

@suzu_v さん VOYAGE GROUP さん会場提供及び、 🍺と🍕の提供ありがとうございました

発表資料

こちら発表資料になります

自分のツールの紹介もしつつ、時期的に新卒氏にも読んで欲しい内容にまとめた感じです

さいごに

  • 最初からビール飲みピザ食べれるのはお腹減らなくて良いですね
  • ただ、ビール最初に飲んじゃうと発表時に大分眠くなるという罠w

Goのflag package で同じオプション名で複数の値を受け取る

Go flag コマンドラインツール golang cli

はじめに

コマンドラインツールを作っていると同一オプションで複数の値を受け取りたい事があります

今回は -ignore hoge -ignore fuga の用に特定の文字列を結果から除きく ignore というオプション名で複数のStringを受け取りたい

という事にします

Goのflagが標準で提供しているもので複数の値を受け付けているのは

flag.Args() だけで今回の要件は満たすことができません

無いなら作る

では、どうするか

flag には flag.Var() という flagで定義しているValueを引数にとるメソッドがあります

flag.Value は

type Value interface {
    String() string
    Set(string) error
}

このように String()Set(string) error のinterfaceを満たすtypeを定義してあげます

interfaceを満たすtypeを定義する

String()Set(string) error を満たすtypeを実装すると 今回は複数のStringを受け付けたいので以下の用になります

type sliceString []string

func (*ss sliceString) String() string {
    return fmt.Sprintf(“%s”, *ss)
}

func (*ss sliceString) Set(value string) error {
    *ss = append(*ss, svalue)
    return nil
}

var ignoreStrings sliceString

これで flag.Typeを満たしつつ複数のstringを受け付けられるtypeの定義しそれの変数である ignoreStrings の準備ができた。

複数のintを受け付けたい場合は String()strconv.Itoa(someIntValue) などのようにしてstringを返す必要があります

定義した型を使う

定義できたので以下の用に flag.Var()を使うことで複数Stringを受けつることが出来る

func main () {
    flag.Var(&ignoreStrings, “ignore”, “Set ignore strings”
    flag.Parse()
}

こんな感じ(※ Go Playground 上では何も表示されません)

最後に

  • flag.Value を満たすtypeを定義すれば色んな引数がとれそう
  • 自分で定義するのが面倒なら alecthomas/kingpin とか使えばよさそう

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発