タグ

ブックマーク / mattn.kaoriya.net (74)

  • Big Sky :: os/signal に NotifyContext が入った。

    Go のアプリケーションを作っていると、シグナルの受信に伴い処理を中断したり再起動する処理を実装する事が多い。これまでは signal.Notify でシグナルをキャッチし、別途 context.WithCancel で作成したコンテキストを自ら cancel する処理を書かなければならなかった。Go の tip に入ったコミットにより、これが幾分改善される様になった。 package main import ( "context" "fmt" "os" "os/signal" "time" ) func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() select { case <-time.After(time.Second): fmt.Println

    Big Sky :: os/signal に NotifyContext が入った。
    soh335
    soh335 2020/09/16
  • Big Sky :: gocode やめます(そして Language Server へ)

    はじめに まず始めに言っておかなければなりません。 gocode 今まで当にありがとう この記事は、Go 言語歴10年になる僕がこれまで愛用してきた Go 言語のコード補完ソフトウェア gocode の歴史と功績、そして今、gocode 自らがその役割を終えようとしている姿をぜひ皆さんに知って頂きたいという思いから Go Advent Calendar 2018 の記事として起こしました。この記事では gocode が歩んできた歴史と苦悩を少しでも皆さんに分かる様に解説させて頂きつつ、そして次にやってくる Go 言語のコード補完の未来についてご紹介したいと思います。Vim について多めに書かれていますが、Visual Studio Code での Go 開発にも影響する話です。 gocode とは gocode は nsf 氏が開発した Go 言語のコード補完サーバです。 GitHub

    Big Sky :: gocode やめます(そして Language Server へ)
    soh335
    soh335 2018/12/17
  • Big Sky :: Go 言語の非同期パターン

    Gogoroutine という非同期の仕組みを提供していますが、使い方次第では色々なパターンが実装できる為、初めて goroutine を見た人はどの様な物が正解なのか分からない事があります。以前、このブログでも紹介した事がありますが Go の非同期の仕組みは一見単純な様に見えて実はとても奥深いのです。 Big Sky :: golang の channel を使ったテクニックあれこれ golang の channel は他の言語に見ない独特のパラダイムを開発者に提供します。 単純にスレッド間でメッセージングをするだけでもC言語で書けばそこそこの量になったり、慣れていない人であればど... https://mattn.kaoriya.net/software/lang/go/20160706165757.htm 2012 年に Rob Pike 氏が Google I/O で「Go

    Big Sky :: Go 言語の非同期パターン
    soh335
    soh335 2018/06/01
  • Big Sky :: golang の html/template でレイアウトを扱う方法

    golanghtml/template について書かれたブログ等を色々見ていると、みんなレイアウトとコンテンツの分離に苦労している感があったのでどうやるか書いておきます。 t.ExecuteTemplate(w, "content", data) Gohtml/template はテンプレートの名称を指定して ExecuteTemplate を実行します。しかし html/template には、その content を囲う layout テンプレートを指定する方法がありません。特に以下の様に ParseGlob を使った場合、各 html で同じ content という名前で define する事は出来ません。 template.ParseGlob("public/views/*.html") やりたいのは layout というテンプレートの中から content という名称

    Big Sky :: golang の html/template でレイアウトを扱う方法
    soh335
    soh335 2018/04/23
  • Big Sky :: goroutine でドハマリした。

    今日たまたま見つけた gotest というプログラムの修正を行った際にドハマリした。 GitHub - rakyll/gotest: go test with colors https://github.com/rakyll/gotest gotest は go test の出力の PASS や FAIL といった定型の文字列を見つけて緑や赤に色付けする小さなプログラム。仕組みも簡単で以下の様なコードになっている。 func main() { setPalette() enableOnCI() gotest(os.Args[1:]) } func gotest(args []string) { r, w := io.Pipe() defer w.Close() args = append([]string{"test"}, args...) cmd := exec.Command("go"

    Big Sky :: goroutine でドハマリした。
    soh335
    soh335 2018/01/31
  • Big Sky :: 「Mackerel サーバ監視[実践]入門」を読んだ。

    Mackerel サーバ監視[実践]入門 井上 大輔, 粕谷 大輔, 杉山 広通, 田中 慎司, 坪内 佑樹, 松木 雅幸 技術評論社 単行(ソフトカバー) / ¥3,190 (2017年08月26日) 発送可能時間: 書籍「Mackerel サーバ監視[実践]入門」を執筆しました | おそらくはそれさえも平凡な日々 書籍「Mackerel サーバ監視[実践]入門」を執筆しました Mackerel サーバ監視[実践]入門 やっと出せました。このは、僕がはてなに入社してからずっと携わっている、 Mackerel と... http://www.songmu.jp/riji/entry/2017-08-28-mackerel-book.html 僕が Mackerel を知ったのは2014年5月の事でした。 mackerel-agentをオープンソース化しました - Mackerel ブロ

    Big Sky :: 「Mackerel サーバ監視[実践]入門」を読んだ。
    soh335
    soh335 2017/08/29
  • Big Sky :: Vim で端末機能が動くようになった。

    ひさびさ Vim のエントリを書く気がします。 今から4年ほど前、Vim にスレッドセーフなメッセージキューが欲しいというメールが vim-dev 届きます。 [PATCH] Proof of concept: thread-safe message queue https://groups.google.com/forum/#!searchin/vim_dev/tarruda%7Csort:relevance/vim_dev/65jjGqS1_VQ/fFiFrrIBwNAJ その時はまだ、vim-dev の中にも「Vim はエディタだし必要ない」といった空気があったと思います。 [PATCH] Non-blocking job control for vimscript https://groups.google.com/forum/#!searchin/vim_dev/tarruda%

    Big Sky :: Vim で端末機能が動くようになった。
    soh335
    soh335 2017/07/24
  • Big Sky :: Re: Goでコマンドライン引数と環境変数の両方からflagを設定したい

    Goでコマンドライン引数と環境変数の両方からflagを設定したい - Qiita Goで実装したプログラムでオプションをコマンドライン引数から取るには標準の `flag` パッケージを使いますが、値を環境変数からも読みたいことがあります。(特に Docker で動かす場合) htt... http://qiita.com/sfujiwara/items/f177d85e9c10f4c34fb6 実は結構簡単に出来ます。github.com/namsral/flag に依存したくない場合や github.com/namsral/flag が実は flag 互換で無かった、なんて問題が見付かった場合に使えるハックです。 オリジナルのコード package main import ( "flag" "fmt" ) func main() { var age int flag.IntVar(&ag

    Big Sky :: Re: Goでコマンドライン引数と環境変数の両方からflagを設定したい
    soh335
    soh335 2017/06/09
  • Big Sky :: golang では変数の宣言位置が大事

    今日こんなツイートをした。 @mattn_jp よろしければベターな理由をm(_ _)m 名前空間を短くする作法なのはわかるのですがメモリやGCやコンパイラなど、どの辺に優しい感じですか? — Ryuji IWATA (@qt_luigi) April 5, 2017 qt_luigi さんからどうしてかを聞かれたので説明したいと思います。 golang では宣言した位置で初めて自動変数としてメモリが確保され、ゼロクリアされます。 for i := 0; i < b.N; i++ { var foo Foo bar, err := doSomething() if err != nil { continue } foo.v = bar fmt.Fprintln(ioutil.Discard, foo) } なので例えばこの様なコードで doSomething() が err を返した場合、

    Big Sky :: golang では変数の宣言位置が大事
    soh335
    soh335 2017/04/11
  • Big Sky :: golang と Generics と私

    以下の記事は Java について触れていますが、Java を dis っている訳でもありませんし、冗長に見える例を意図的に使っています。 最近 Twittergolang に Generics が無い事についてずいぶんと盛り上がったのですが、僕の意見をこのブログにも書いておこうと思います。 golang に多相が無いのはアレだとか開発者の怠慢だみたいな話はだいたい他の言語を覚えた人から出る感想で、静的型付言語である golang を見ると確かにそう見えるかもしれない。ただ golangJava や他の言語と違って Duck Type を採用している。 — Vim芸人 (@mattn_jp) March 7, 2017 スクリプト言語の多くに多相が求められないのと同じ様に golang を深く触る人達から多相が欲しいという意見がそれほど出ないのは golang の型が Duck

    Big Sky :: golang と Generics と私
    soh335
    soh335 2017/03/10
  • Big Sky :: Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる

    go-bindata もいいけど、go-assets もいいよ。 Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる - Diary Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる 個人的なアプリをつくるとき、だいたい以下のような環境で作業しています WAF は E... http://diary.app.ssig33.com/166 みんなのGo言語にも書いた気がするのでそういうの興味ある人は買って下さい。 みんなのGo言語【現場で使える実践テクニック】 松木雅幸, mattn, 藤原俊一郎, 中島大一, 牧 大輔, 鈴木健太, 稲葉貴洋 技術評論社 大型 / ¥80 (2016年09月09日) 発送可能時間: バイナリに assets を埋め込む際には

    Big Sky :: Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる
    soh335
    soh335 2017/01/20
  • Big Sky :: golang でパフォーマンスチューニングする際に気を付けるべきこと

    golang のテストツールには標準でベンチマークツールが付属しています。例えば、引数 n を貰ってその数分だけメッセージの入ったスライスを返す関数 makeSlice が以下の実装だったとします。 foo.go package foo import "fmt" func makeSlice(n int) []string { var r []string for i := 0; i < n; i++ { r = append(r, fmt.Sprintf("%03d だよーん", i)) } return r } 如何にも遅そうなコードですね。まずはこのコードを単品で計測するベンチマークを書きます。 foo_test.go package foo import "testing" func BenchmarkMakeSlice(b *testing.B) { b.ResetTimer()

    Big Sky :: golang でパフォーマンスチューニングする際に気を付けるべきこと
    soh335
    soh335 2016/10/19
  • Big Sky :: golang の遅いコードをたった1行で高速化するテクニック

    記事中に間違いがありました。数倍も速くはなりませんでした。確か 1.0X ~ 1.1 倍程度の高速化は得られましたがびっくりするほどの物ではありませんでした。すみません。 そろそろ Go1.7 がリリースされるそうですが、皆さん如何お過ごしですか。Go 界隈の波平こと mattn ですこんにちわ。バカモー(略 Go1.7 ではコンパイラの最適化が行われ、ビルド速度がかなり短縮される様になりました。毎日ビルドしてる僕としては非常に嬉しい機能改善ですね。 さてとてもキャッチ―なタイトルで釣ってしまった訳ですが、気にしたら負けなのでどんどん話を進めます。 var t [256]byte func f(b *[16]byte) { for i, v := range b { b[i] = t[v] } } 例えばこのコードを見て下さい。このコードはココから拝借しました。issue の内容はスコー

    Big Sky :: golang の遅いコードをたった1行で高速化するテクニック
    soh335
    soh335 2016/08/05
  • Big Sky :: golang の channel を使ったテクニックあれこれ

    golang の channel は他の言語に見ない独特のパラダイムを開発者に提供します。 単純にスレッド間でメッセージングをするだけでもC言語で書けばそこそこの量になったり、慣れていない人であればどう実装すればいいか分からないなんて事もあったと思います。しかし golanggoroutine/channel は、やっている内容の割にとても容易にスレッド間通信やキューイング、処理の受け待ち等を実装できる様になっています。尚、channel をどの様に適用したら良いかについては以下を参照下さい。 Big Sky :: Golang の channel の使い所 golang の特徴と言えば goroutine と channel ですが、その使いどころに悩む人もおられる様です。 goroutine は非同期に実行される処理、channel はその grout... http://mat

    Big Sky :: golang の channel を使ったテクニックあれこれ
    soh335
    soh335 2016/07/06
  • Big Sky :: Web Component を簡単に作れる JavaScript ライブラリ「X-Tag」

    slack で x-tag を教えて貰ったのでちょっと遊んでみた。 X-Tag ★ Web Components Docs Table of Contents Getting Started Registration - Where it All Begins The most important method ... http://x-tag.github.io/ X-Tag は Web Component を簡単きれいに作れるライブラリで、Microsoft からのサポートを受けている事をウリにしているらしいです。動作に必要なのはカスタムタグがサポートされているブラウザというだけで、polyfills も使う事が出来ます。 簡単なチュートリアルが Docs に書かれているのでパッと見ただけでだいたい API が予想できます。自前のメソッドや属性、イベントを定義する事が出来るのでコン

    Big Sky :: Web Component を簡単に作れる JavaScript ライブラリ「X-Tag」
    soh335
    soh335 2016/06/09
  • Big Sky :: Windows ユーザは cmd.exe で生きるべき。

    [D] Windowsはターミナルがダメだから使えないってのは過去の話? 基的にはいい感じに見えますが、いくつか問題は発覚してます。 http://blog.drikin.com/2015/01/windows-2.html 僕は Cygwin よりも msys2 が好きです 理由は最後の方に書きます。 cygwin は windows 上に完全な POSIX を提供するのが目的であって、msys2 は native な windows アプリケーションをビルドするのが目的なのでゴールが違うのよね。そして僕は全て cygwin で染められるのが好きじゃ無い。それだけの話です。 — mattn (@mattn_jp) April 10, 2016 もちろん msys2 を POSIX 環境としても使いますが、一番の目的は cmd.exe から Windows ネイティブなアプリケーションを

    Big Sky :: Windows ユーザは cmd.exe で生きるべき。
    soh335
    soh335 2016/04/12
  • Big Sky :: Vim にchannel(ソケット通信機能)が付いた。

    13年前、僕は vim-dev (Vim の開発グループ)に Vim からソケット通信が出来る関数群のパッチを書いて送りました。 Socket functions for vim. - Yahoo! Groups https://groups.yahoo.com/neo/groups/vimdev/conversations/topics/32576 その時は Bram (vimboss) に「PythonPerl インタフェースを使えるやないか、もしくは外部コマンドとか」と返されてしまいました。確かに言語拡張を使えば出来ますし、それに処理がブロッキングだったので実はそれほど有益では無かったかも知れません。 その後、このソケット通信のパッチは vimproc の一部に取り込まれ、シーケンシャルなソケット通信は出来る様になりました。しかし Vim には非同期インタフェースがありません。

    Big Sky :: Vim にchannel(ソケット通信機能)が付いた。
    soh335
    soh335 2016/01/29
  • Big Sky :: Crystal と CRuby でHTTPサーバのベンチマーク

    Matz も驚く Crystal これ、Rubyでもそのまま動くんじゃないか? Crystalすげーっ。 https://t.co/pO0F0vqTly — Yukihiro Matsumoto (@yukihiro_matz) June 16, 2015 Crystal Language Goals Ruby-inspired syntax. Statically type-checked but without having to specify the type ... http://crystal-lang.org/ ruby と殆ど同じシンタックスが通る様です。 # A very basic HTTP server require "http/server" server = HTTP::Server.new(8080) do |request| HTTP::Response.o

    Big Sky :: Crystal と CRuby でHTTPサーバのベンチマーク
    soh335
    soh335 2015/06/18
  • Big Sky :: Vim プラグインの機能として golang を使う。

    golang 1.5 から、x86_64 のみですが -buildmode=c-shared というビルドオプションが足される事になりました。 これは、golang で共有ライブラリを生成する為のオプションで、例えば package main import ( "C" "fmt" ) var ( c chan string ) func init() { c = make(chan string) go func() { n := 1 for { switch { case n%15 == 0: c <- "FizzBuzz" case n%3 == 0: c <- "Fizz" case n%5 == 0: c <- "Buzz" default: c <- fmt.Sprint(n) } n++ } }() } //export fizzbuzz func fizzbuzz(n int

    Big Sky :: Vim プラグインの機能として golang を使う。
    soh335
    soh335 2015/06/09
  • Big Sky :: Re: Golang で言語処理100本ノックの No.3 の問題を解いてベンチマークとってみた

    Golang で言語処理100ノックの No.3 の問題を解いてベンチマークとってみた - Qiita http://qiita.com/megu_ma/items/01029c3ca24fb9820373 正規表現や strings.Trim 等はとても便利なのですが、いかんせん単一の関数呼び出しに対して真面目にループを回す作りになっており、戻り値がコピーされる前提の作りになっています。例えば func answer1() []int { // 単語に分解 words := strings.Split(sentence, " ") var pi []int for _, word := range words { word = strings.Trim(word, ",") word = strings.Trim(word, ".") // pi = append(pi, utf8.R

    Big Sky :: Re: Golang で言語処理100本ノックの No.3 の問題を解いてベンチマークとってみた
    soh335
    soh335 2015/04/20