SSブログ

実行バイナリをコピーするだけではダメだった [golang]

手元の環境で go のソースをビルドして、実稼働環境にコピーして起動しようとしたら

/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found

っていうエラーがでて起動できなかった
ビルドした環境の glibc が実行環境の glibc のバージョンよりも新しいことが原因なのはわかった。

CGO_ENABLED=0 をつければいいと書いているブログ記事もいっぱいあったけど、うまくいかない。
そもそも、 glibc の機能が必要ってことは mac で linux のバイナリ作ろうとした時には、 glibc を static link できないからうまくいかないのでは?

ここに、ヒントになりそうなことが書いてあったが、
https://qiita.com/KEINOS/items/739f83cb9ddfed43404b
(ふむふむ、 ld フラグ渡せたりするんだな)

ビルドしたい環境と実行したい環境が違っていて、自分の場合はどうすれば良いかわからない(・・・し、解決できる見込みもない)

結局、実行環境と同じ環境で go でビルドできるようにして、ことなきを得たが、ビルド環境と実行環境が別でも動くと考えない方が良さそうだな、と思った。

おそらく、ファイル操作はうまくいくけど net パッケージ使うとダメとか、簡単にできる、できないと断言できないとかそういうことなんだと思うけど。
コメント(0) 

GitHub の Security Advisory 警告メール [golang]

以下のようなメールが 2通きた

[nakagami]A security advisory on golang.org/x/crypto affects at least one of your repositories

以下の CVE
- CVE-2022-27191
- CVE-2021-43565
について、公開している Go のリポジトリが依存しているライブラリに脆弱性があるから、新しいバージョンにしてというお知らせだった。
こういう機能が、効果的に動作してるのすごいなと思った。

はっきりとした記憶はないが、おそらく受け取ったのは初めて。

脆弱性のある機能は使ってなかったが、まあいつか新しいバージョンにしないといけないので、依存パッケージのバージョンを上げて push した。
すると、ここ↓に警告が出ていたのに出なくなった

- https://github.com/advisories/GHSA-8c26-wmh5-6g9v/dependabot?query=user:nakagami
- https://github.com/advisories/GHSA-gwc9-m7rh-j2ww/dependabot?query=user:nakagami

うまくできているなぁ

他の言語でどうなのかは知らないが、 Go言語は、依存ライブラリとそのバージョンは go.mod に書いてあるから検知しやすいよな。
コメント(0) 

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 ←ここらへんのパクリ

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

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

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 しておくべき

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 言語より大分いいな