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 に書いてあるから検知しやすいよな。
[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 に書いてあるから検知しやすいよな。
Go Modules [golang]
Go(コンパイラ)のソースを最新にして
ここらへんのことらしい
https://budougumi0617.github.io/2019/02/15/go-modules-on-go112/
バージョン番号のこととか、よくわかってないけど、今はこれでいいんだろう
依存するモジュールをいちいち go get しなくてよくなったのはいい。
・・・というか、絶対そういうのいるよなと思っていたものの、「どれ使えばいいの?」状態だったのが、本体に標準機能として入ったのはありがたい。
Go Module によるモジュール探索は、 1.13からデフォルトになるらしい。
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 言語はいろいろな便利ツールや便利パッケージが本体にマージされ進化していってるけど、そうするとサードパーティーの便利ツールや便利パッケージの使うタイミングと、やめるタイミングが難しいなぁ・・・とは思う。
Go1.5 以降をソースからコンパイル [golang]
セルフコンパイルになった影響で
最新のソースを pull したら golang 自身をコンパイルできなくなっちゃったのでメモ
http://qiita.com/orociic/items/b285cf205f75b7291a9d ←ここらへんのパクリ
最新のソースを 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 しろってメッセージを表示するものだった。
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 言語の練習をしているので、初めて参加してみた。
参加者全体として、皆さん 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
日付は、 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 の組み合わせでなんとかなりそう
スライスの書き方は 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 しておくべき
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 言語より大分いいな
ほとんどの場合は、宣言した型でいいのだが、時々、どうしても、場合によって異なる型を1つの変数に入れたくなる。
C 言語で書く場合は void* を使うんだと思うが、 Go 言語だとどうすればいいんだ?
Python との比較のこの↓記事が参考になった。
http://python.matrix.jp/2013/05/12/go_start2.html
interface{} という型(インターフェース?)を使うみたい。
サンプルコードを書いてみた
https://gist.github.com/nakagami/6518526
受け取った変数から reflect で元の型がわかるので C 言語より大分いいな
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 配列は、ビルトインパッケージでうまくやる方法が発見できなかったので
ビットシフトとキャストを組み合わせたけど、もっといい方法があったら誰か教えて。
ネットワークプロトコルを扱いたいと言う場合、文字列や数値と byte 配列の変換がしたい。
そのための予習。いろいろ調べて試行錯誤して、最低限のところまではできた。
https://gist.github.com/nakagami/6401913
文字コードが UTF-8 固定であれば、文字コード→byte 配列への変換はbytes パッケージを使って Buffer 構造体を介すれば割と簡単にできる。
(UTF-8 以外の文字コードをビルトインパッケージだけで処理するのは難しそうなので、諦めた)
byte 配列→数値は、 encoding/binary パッケージを使うとできる
数値→byte 配列は、ビルトインパッケージでうまくやる方法が発見できなかったので
ビットシフトとキャストを組み合わせたけど、もっといい方法があったら誰か教えて。