So-net無料ブログ作成

Go Modules [golang]

Go(コンパイラ)のソースを最新にして
go test
を実行したら cannot find package "xxxx" と出るようになってしまった。

ここらへんのことらしい
https://budougumi0617.github.io/2019/02/15/go-modules-on-go112/

go mod init github.com/nakagami/firebirdsql
して
go test
したら go.mod というファイルができたのでリポジトリに追加しておいた。
バージョン番号のこととか、よくわかってないけど、今はこれでいいんだろう

依存するモジュールをいちいち go get しなくてよくなったのはいい。
・・・というか、絶対そういうのいるよなと思っていたものの、「どれ使えばいいの?」状態だったのが、本体に標準機能として入ったのはありがたい。

Go Module によるモジュール探索は、 1.13からデフォルトになるらしい。
Go 言語はいろいろな便利ツールや便利パッケージが本体にマージされ進化していってるけど、そうするとサードパーティーの便利ツールや便利パッケージの使うタイミングと、やめるタイミングが難しいなぁ・・・とは思う。

コメント(0) 
共通テーマ:日記・雑感

Go1.5 以降をソースからコンパイル [golang]

セルフコンパイルになった影響で
最新のソースを pull したら golang 自身をコンパイルできなくなっちゃったのでメモ
git clone -b release-branch.go1.4 https://github.com/golang/go.git $HOME/go1.4
cd $HOME/go1.4/src
./make.bash
export GOROOT_BOOTSTRAP=$HOME/go1.4
cd $HOME
git clone https://github.com/golang/go.git
cd go/src
./make.bash


http://qiita.com/orociic/items/b285cf205f75b7291a9d ←ここらへんのパクリ

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

gofmt と git の pre-commit hook [golang]

インデントはハードタブというのがちょっとつらいけど、
golang には gofmt という整形ツールがあって、これさえ通せばいい。
http://blog.golang.org/go-fmt-your-code

git の hook で gofmt を呼び出すようにしてる人がいるに違いない、と思ったら
公式ブログに解説があった
http://blog.golang.org/go-fmt-your-code

.git/hooks/pre-commit に http://tip.golang.org/misc/git/pre-commit
これを書いておけばいいらしい


・・・と思ったら、規約に沿ってないものを gofmt しろってメッセージを表示するものだった。

Go Conference 2013 autumn [golang]

http://connpass.com/event/3510/

最近 Go 言語の練習をしているので、初めて参加してみた。
参加者全体として、皆さん Go のコードは読み書きできるようだった。
ちょっとあせる

PHP/Ruby/Python/Perl の人達が 高速に動作する Go 言語に興味を持っているという感じ。
(まぁ、自分もそうなんだけど)
プロダクションに使っているひとはまだごく一部だけど、これは、みんな使うようになりそうな予感がした。

日本マイクロソフト様の貸してくれた会場は非常に素晴らしかった。
Windows Azure のためにオープンソースの活動を支援してるとのこと。
Windows Azure 無料評価版(1ヶ月 17000円分)だそうです
http://www.windowsazure.com/ja-jp/pricing/free-trial/

発表資料、網羅できてないけど忘れないうちに記録
https://speakerdeck.com/rosylilly/ming-duan-silian-seyoyi-nu
http://www.slideshare.net/Jxck/network-server-in-go-go-con-20131114
https://docs.google.com/presentation/d/14Os8yTAfXKzko2FJUxC8Q3wBch_egoYmvDi1Dd3LcGc/preview?sle=true#slide=id.p
http://www.slideshare.net/takuyaueda967/reflect-27186813
https://docs.google.com/presentation/d/1_wi8u2VPf8QSdxb1uoKzVM9cTxj4lFOujj8CjDyyGL8/pub?start=false&loop=false&delayms=3000#slide=id.p
https://github.com/methane/isucon3-qual-go/blob/master/gocon.md
https://github.com/stanaka/go-rest-api-server

(参加した人の記録)
http://masahito.hatenablog.com/entry/2013/10/14/153946
https://gist.github.com/shiumachi/6972974


(追記)
主催者の方がまとめてくれているので、そちらを見るのがよろしい
http://ymotongpoo.hatenablog.com/entry/2013/10/16/122700
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Go での時刻(日付なし)の取り扱いと文字列パース [golang]

Go で時刻を取り扱うには、どのパッケージのどの型を使えばいいのかよくわからなかった。
日付は、 time パッケージの日付時刻型の時刻部分を 00:00:00 にすればいいんかなぁ、とは思っていた。

ここ↓ にある回答を見ると、time パッケージで時刻もパースできるみたい。
http://stackoverflow.com/questions/14094228/parse-go-time-stamp-using-go

ということで試してみると、時刻だけのフォーマットの文字列をパースすると西暦 0年 1月1日の時刻 (UTC) として扱われるみたい。こういうもんなのか。
まぁ、 timestamp, date, time なんて3つも型なくても、文脈でわかるわな。
同じデータ型として扱う場合のデメリットを、あえて言うなら、日付だけ、時刻だけしかあつかわないのにメモリ4バイトもったいないってこと?
まあ、21世紀なので、4バイトくらい無駄にしてもよかろう。

time.Parse() は、%Y とかのフォーマット文字列じゃなくて、日付時刻の例を指定してパースする。変わってるなぁ。
第1引数がフォーマット文字列で第2引数がパースしたい文字列。
ぱっと見、どっちをパースしたいのかよくわからない。

いくつかのパターンでやってみると、いろいろな時刻フォーマットでパースできるにはできるけど、フォーマット文字列として指定する文字列を適当に選ぶと、思ったようにフォーマット判定してくれなかったりする。

試行錯誤してうまくパースできるパターンのコードを貼っておく
https://gist.github.com/nakagami/6737567

コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Go 言語で Linked List [golang]

普段 Python を使っていて、新たに Go でコードを書こうとすると、最初は型の宣言が後置だったり、ループが for しかなかったり、 switch case の書き方が複数あったりするのが戸惑うんだけれども、そこらへんに少し慣れてくると、配列(スライス)のサイズが固定なのに行き詰まってしまう。

スライスの書き方は Python に似ているのでなじみ深いのだが、Python の場合は、どんどん要素を追加していくとバッファが自動で増やされていくのに対して Go ではバッファの最大は固定されているところで、
「えっと、この配列のサイズはいくつで確保すればいいんだっけ・・・」と悩んでしまう。
C 言語でもそうだし、メモリにランダムにアクセスするためには、連続したメモリを 確保する必要があって、勝手にどんどん増やせないのはわかるのだが、日頃、いかに Python で楽していたことか。

んで、全体の数がわからない要素を追加していくにはどうすればいいのか悩んでいたのだがビルトインパッケージに、Linked List があることを発見
http://golang.org/pkg/container/list/
https://gist.github.com/nakagami/6518534

サンプル例を改造してみた。
https://gist.github.com/nakagami/6518534
要素には、どんな型も入れられるので、 Java の裸の List クラスみたいなものなので「型安全じゃない」っていう人がいるのはわかるけど、まあいいんじゃないですかね。

配列、スライスと container/list を使うと、Python のリストでやっていたことがなんとかできそう。
Python の set はないから、Go の場合は map で代用するんだろうな。

配列、スライスと *list.List, map の組み合わせでなんとかなりそう

Go をソースからコンパイルして使ってみる [golang]

macport のものを使っていたのだが Go 言語自体をソースからコンパイルして使ってみる。

http://golang.jp/install/source
http://golang.org/doc/install/source

$ cd $HOME
$ hg clone https://code.google.com/p/go
$ cd go/src
$ ./all.bash

でコンパイルできて環境変数にパスを通すと使えた

export PATH=$PATH:$HOME/go/bin:

ちなみに、 go を使うために、ほかに GOPATH という環境変数を設定してる

export GOPATH=$HOME/golang

なんか、えらく簡単だな。
ソースからコンパイルしないにしても、手元にビルトインパッケージのソースがあるとはかどるので、 hg clone しておくべき
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Go 言語でいろんな型の値をひとつの変数に入れる [golang]

Go 言語で、久しぶりに変数に型がついているプログラミング言語を書いてみている。
ほとんどの場合は、宣言した型でいいのだが、時々、どうしても、場合によって異なる型を1つの変数に入れたくなる。
C 言語で書く場合は void* を使うんだと思うが、 Go 言語だとどうすればいいんだ?

Python との比較のこの↓記事が参考になった。
http://python.matrix.jp/2013/05/12/go_start2.html
interface{} という型(インターフェース?)を使うみたい。
サンプルコードを書いてみた
https://gist.github.com/nakagami/6518526

受け取った変数から reflect で元の型がわかるので C 言語より大分いいな
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Go 言語で(文字列・数値)→バイト列変換 [golang]

http://nakagami.blog.so-net.ne.jp/2013-08-27 の続き

ネットワークプロトコルを扱いたいと言う場合、文字列や数値と byte 配列の変換がしたい。
そのための予習。いろいろ調べて試行錯誤して、最低限のところまではできた。
https://gist.github.com/nakagami/6401913

文字コードが UTF-8 固定であれば、文字コード→byte 配列への変換はbytes パッケージを使って Buffer 構造体を介すれば割と簡単にできる。
(UTF-8 以外の文字コードをビルトインパッケージだけで処理するのは難しそうなので、諦めた)

byte 配列→数値は、 encoding/binary パッケージを使うとできる

数値→byte 配列は、ビルトインパッケージでうまくやる方法が発見できなかったので
ビットシフトとキャストを組み合わせたけど、もっといい方法があったら誰か教えて。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Go 言語で MySQL にアクセスしてみる [golang]

http://nakagami.blog.so-net.ne.jp/2013-08-24 の続き。
プログラミング言語を学ぶのに大事なのは自分で何か役に立つ(or おもしろい)コードを書くことだと思う。
というか、役に立つプログラムを書けないんだったら、あんま意味がない。
人によって何が役に立つのかっていうのは違うし、興味のある分野も違うと思うけど、僕でいうと MySQL のデータを操作できるようになると使い道もありそうなので、まずは Go 言語で MySQL を操作できるようにすることを目指す。

MySQL のドライバーがいくつかあるけど、どれがオススメ?
stackoverflow にあった。さすが stackoverflow サンプルコードもあって助かる。
http://stackoverflow.com/questions/11353679/whats-the-recommended-way-to-connect-to-mysql-from-go
やっぱり http://nakagami.blog.so-net.ne.jp/2013-08-24 の時に調べたドライバーのどっちからしい
https://github.com/ziutek/mymysql
https://github.com/go-sql-driver/mysql/
リポジトリを見ると、今時点では mymysql のほうが、最近まで commit されていて App Engine CloudSQL のサポートとか Native エンジンとか Thread safe エンジンとか色々やってる。
サイトの README.md に使い方の説明が詳しい。
go-sql-driver よりも高機能なのか、やり過ぎなのかよくわからない

import するライブラリは違っていて、接続(Open) の時のパラメータは違うけど、Interface が同じものなので、ドライバーは違っても同じコードになる。なるほど。
他の RDBMS も database/sql のインターフェースを使ってアクセスするのね。

Python を使っていると、クエリーを発行するメソッドが
1. 実行して結果が必要ないのが Exec()
2. 1行だけ結果を取得するのが QueryRow()
3. 複数取得したいのが Query() と
と分かれているのがなじめないけど、そういうもんなので慣れよう。

コードの断片だとわからないので、動くサンプルコード書いた
https://gist.github.com/nakagami/6349319