memoメモ

最近はGo言語関連で。φ(..)メモメモ

ビルドしたバイナリからビルドに利用したGoのバージョン情報を読む

なにができる?

  • goでビルド済みのバイナリからgoのバージョン情報が取得できます。

なにがうれしいの?

  • 配布した(された)バイナリはどのgoのバージョンでビルドされたのかわかります。ので、goの本体にセキュリティ修正などが行われた際、もし古いバージョンだと困るのであれば調べることができます。

やってみよう

適当な実行ファイルをビルドする。とりあえずhelloworldレベルで。

$ cd hello
$ cat main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}
$ go build

go tool nmコマンドで、変数buildVersionのアドレスが特定できる(ちなみに、buildVersion$GOROOT/src/runtime/zversion.goにある変数):

$ go tool nm hello | grep buildVersion
  258ec0 D runtime.buildVersion

これをgdbで見てみると:

$ gdb hello
GNU gdb (GDB) 7.9.1
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin13.4.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from hello...done.
Loading Go Runtime support.
(gdb) x/s *0x258ec0
0x18f110 <go.string.*+8176>:    "go1.5.1"
(gdb) 

で読めます。なお、以前go getしたコンパイル済みのバイナリからもGoのバージョン情報を引き出すことができます。

簡単にバージョンを調べたい

gdbで見るのは面倒なので、objdumpでバージョン情報を取得できるようにしてみました(Linux):

使い方:

$ ./goversion.bash hello
go1.5.1

さらに簡単に・・

動かなくなるかもしれませんが単純にgrepしてもいいかもしれません。

力技:

$ objdump -s hello | grep -E "go[0-9]" | sed -e 's/.*\(go.*\).*/\1/' -e 's/\.\.\+//g'
go1.5.1

他にいい方法があれば教えて下さい!

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

よく使う電源タップ

昔から愛用しているタップについて調べてみた。

背景

買おうと思ったら

f:id:atotto:20151017170931p:plain

取り扱いがなくなっていたorz

一人暮らしの時からこれを3つくらい使って少しづつ増やしてきた。おもちゃや家電が増えるとコンセントですぐに増やせるこれが役に立つ。壁からはみ出ないし、片側に2つ出ているのでコードを逃がしやすく、拡張性が高い。

さて、どうするか。

同じもの?似たものがあるみたい

ELECOM 電源タップ 片面+下方向 3個口 ホワイト T-TR4WH

ELECOM 電源タップ 片面+下方向 3個口 ホワイト T-TR4WH

サイドコーナータップ 3個口 白 [HS-AS315/W-G]

サイドコーナータップ 3個口 白 [HS-AS315/W-G]

安く手に入れるにはどうしましょうかね。。

LinuxからUSB HUBの電源のON/OFFを制御してみる

はじめに

USBの規格上、各ポートの電源の制御ができる(Per-port power switchingというらしい?)そうですが、その機能を実装しているデバイスがあまり無いようです。 いろいろを探してみるとSUGOI HUBがその機能を実装しているということなので買って試してみました。

システムトークス SUGOI HUB4Xシリーズ ブラック アダプタ付 電力供給安定型 USB2-HUB4XA-BK

システムトークス SUGOI HUB4Xシリーズ ブラック アダプタ付 電力供給安定型 USB2-HUB4XA-BK

システムトークス SUGOI HUB4Xシリーズ ホワイト アダプタ付 電力供給安定型 USB2-HUB4XA-WH

システムトークス SUGOI HUB4Xシリーズ ホワイト アダプタ付 電力供給安定型 USB2-HUB4XA-WH

lsusbコマンドで確認する

Linuxならなんでもいいですが、とりあえずraspberry pi 2で。

lsusbで確認してみます:

pi@raspberrypi ~ $ sudo lsusb 
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0409:005a NEC Corp. HighSpeed Hub

このなかのNEC Corp.製のチップのデバイスがSUGOI HUBです。BUS=1, Device=4であることがわかります。

hub-ctrlを使って制御する

portの電源制御が簡単にできるようになるので利用してみます:

http://www.gniibe.org/development/ac-power-control-by-USB-hub/index.html

hub-ctrlをコンパイル

$ wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
$ gcc -O2 -o hub-ctrl hub-ctrl.c -lusb

-vで各portの状態が確認できます:

pi@raspberrypi ~ $ sudo ./hub-ctrl -v
Hub #0 at 001:004
 INFO: individual power switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0100 power
   Port 3: 0000.0100 power
   Port 4: 0000.0100 power
*snip*

Hub #0 at 001:004が先にlsusbで確認したBUS=1, Device=4のSUGOI HUBです。

操作してみる

portはSUGOI HUBの左から1,2,3,4の順で指定できます。

$ sudo ./hub-ctrl -b 1 -d 4 -P 1 -p 0 # port 1のpower off
$ sudo ./hub-ctrl -b 1 -d 4 -P 1 -p 1 # port 1のpower on
$ sudo ./hub-ctrl -b 1 -d 4 -P 2 -p 0 # port 2のpower off
$ sudo ./hub-ctrl -b 1 -d 4 -P 2 -p 1 # port 2のpower on

なお、port 3,4は操作できませんでした。

これでUSBファンなどが自在に操作できます! USB電源連動のタップを使えば、安全に電化製品を制御できそうですね。

https://gist.github.com/atotto/5c1d55a2cb99ced9f7c7

raspberry piでやっていて気になったこと

hub-ctrl -vで確認するとBUS=1, Device=2にも何か見えています。 これはraspberry piのものです。

Hub #1 at 001:002
 INFO: individual power switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect
   Port 2: 0000.0100 power
   Port 3: 0000.0100 power
   Port 4: 0000.0503 highspeed power enable connect
   Port 5: 0000.0100 power
Hub #2 at 001:001
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect

ためしに、raspberry piのportを操作してみました。 port 1の電源を落とすとLANが落ちました:

$ sudo ./hub-ctrl -b 1 -d 2 -P 1 -p 0

port 2、または、port 4を操作するとraspberry piのUSBの電源がすべて落ちました:

$ sudo ./hub-ctrl -b 1 -d 2 -P 2 -p 0
$ sudo ./hub-ctrl -b 1 -d 2 -P 4 -p 0

残りのport 3,5はよくわかりません。 #どこの資料をみればいいのでしょう。。

YAPC::Asia 2015 へ行ってきた #yapcasia

f:id:atotto:20150823103112p:plain

YAPC::Asiaへ行ってきました。 関係者の皆様、本当にありがとうございました。

YAPCというと、Perlに関するカンファレンスで、私自身Perlをまともに使っていないということもあり、見送っていました。が、Rebuildでアナウンスを聞き、実は技術者のお祭りなんだよ!最後だよ!ということで初参加しました。

結果、参加して良かったです。これが最後ということですが、次に繋がる最後だと思っています。今後の祭りも楽しみに生きていこうと思います。

聞いた・参加したもの一覧

day1:

day2:

ほとんどAトラックにいました。

も聞きたかったものの、他の行きたいものとバッティングしてしまいました。後日資料を追いたいと思います。

その他リンク:

すこし詳しく

Merry Christmas! / Larry Wall

最初どういう話なのかついていけませんでした・・が、ざっくりまとめると、Perl5とPerl6の違うようで似ていて、また別の進化がある、、というようなことだと思います。

  • Perl5 → hobbit
  • Perl6 → LotR

この違いについてしっかりとした教養が足りませんでした・・。スタートレックスター・ウォーズについては知識があるのですが、こっちの勉強範囲を広げる必要がありそうです。

また、ラリーさん曰く、「Perl6はこれまでクリスマスに出すとは言っていた。が何年のクリスマスとは言ってこなかった!Perl6は何事もなければ2015のクリスマスにリリースする、かもしれない」というアナウンスがあり、盛り上がりました。

f:id:atotto:20150821104241j:plain

Managing Containers at Scale with CoreOS and Kubernetes / Kelsey Hightower

slide: Managing Containers at Scale with CoreOS and Kubernetes

Kubernetesについてちょっと知りたかったので参加。

Kubernetes:くべぇねぇてす

ライブでデモをしながらだったのでイメージが湧きやすかったです。資料yapc-asia-2015/demo at master · kelseyhightower/yapc-asia-2015 · GitHub

  • コンテナ管理がしやすそう。
  • Podでコンテナをまとめて運用する。
  • 異常をきたしたコンテナは安全に切り離してデバッグする。←これ重要!

f:id:atotto:20150821113333j:plain

TBD (Toward Brain-aware Design) / Yukihiro Matsumoto

アーキテクチャの進化、考え方は振り子のようになっていて、それにより新しいことが生まれてくる。

そんななかで、マルチコア時代のシェルスクリプトって見直されてきている:

  • パイプライン処理でマルチコアを有効的につかえそう
  • でもShellで書くのつらい

マルチコア時代のスクリプトを書く言語としてstreemを提案している。

感想:

@mattn_jpさんすごすぎる。

streemをウォッチしていこうと思う。

Docker For Polyglots : Where We've Come From, and Where We Can Go / @upthecyberpunks at Docker

polyglots = 多数の言語を使えるひと

将来はシンクライアントな構成になっていく

Dockerの方向性:

  • より簡単にさまざまなコンテナを使えるようにする
  • テクノロジーを使うための敷居を下げる

  • すぐれたエンジニアなら適切なテクノロジーを適切なところで使いたい

→ 開発環境を設計、利用、運用していくのは大変。さらに健全な状態で運用することも大変

すべての人がすべてのツールを学ぶことはできない

Tooling is difficult

ビルドのための仕組みを手元で再現するのはむずかしい → 貢献しようとしてくれるひとへの敷居が高い

参入障壁を減らす、トラックナンバーを下げる。それなら、

  • 環境の構築を自動化したい
  • dependency hellをなくしたい

Dockerはこういった問題に対応できる。

  • Dockerを使って環境を簡単に定義できる!
  • DockerfileはREADMEとして使える!
  • kernelさえサポートしていればよい!
感想:

アプリケーションの実行環境の構築はDockerでやっているが、開発環境の構築までは手を付けていない。 開発環境は個人の好みの問題もあって結構むずかしい。いい解決案を探して行きたいなぁ。

f:id:atotto:20150822101422j:plain

Docker 3兄弟について / @toritori0318

  • Docker Machine
  • Docker Compose
  • Docker Swarm

全然使ってませんでした。Linuxマシンを直接触っているのもあってdockerコマンドを直接。。ちょっと、このあたりで整理する必要がありそう、かも?

関係無いですがOSX・・というかMacをつかって開発したい。

Adventures in Refactoring / Ben Lavender

リファクタリングのありがたいお話。

f:id:atotto:20150822131214j:plain

振る舞いを変えずにコードを整理していく。

f:id:atotto:20150822132427j:plain

go fmtは良い仕組みです!

Parallelism, Concurrency, and Asynchrony in Perl 6 / Jonathan Worthington

Perl6でサポートされる並列、並行、非同期処理の話。

各問題について丁寧に説明があり、わかりやすかった。 タスクの処理やデータ処理などをスクリプトで書くときに重宝しそう。streemとともにウォッチが必要。

Perl6まだかな・・・

Profiling & Optimizing in Go / Brad Fitzpatrick

トラックAの最後の講演はなんと @bratfitz さんのGo言語の話。 @bratfitz さんはGo言語のコアな開発者です。

資料: bradfitz/talk-yapc-asia-2015 · GitHub slide: YAPC: Go Debugging, Profiling, and Optimization - Google スライド

@bradfitz さんのライブコーディングすごい。そしてわかりやすい。Youtubeでもライブコーディングの動画があるのでオススメです。

f:id:atotto:20150822153214j:plain

みんなでGo言語やりましょう(ぉ

GoでgRPCを始めるときに見ると良さそうな資料

とりあえずリストだけ・・

GoCon 2015 summerを見てきました #gocon

2015-06-21のgocon 2015 summerを見てきました。

遠方からいらっしゃっていた @kwmt27 さんや @qt_luigi さんに会えたり、 @vvakame さんにTypeScriptについていろいろ聞いたり、その他皆様ありがとうございました!

次回も楽しみにしています!


以下、簡単なものですが、メモを公開します。

Keynote by @francesc at Google

It's an exciting time to be a gopher

Go 1.5 won't have a single line of C

Go in Go:

  • don't like C
  • love writing Go
  • a more maintenable code base
  • more mind space left for innovation (no context switch)

Program analysis:

  • dynamic analysis
    • debbuging
    • code cover
  • static analysis
    • gofmt, golint, go vet

SSA (Single Static Assignment):

  • Data flow analysis easier
  • SSA Backend plan for go1.6

Oracle:

  • source code analysis tool
  • pointer analysis
    • analysis: satatic function call or dynamic function call
    • call stack
  • godoc -analysis

Mobile:

総括: Goで開発ベースは全部整うし、モバイルもこれから書けるし、Goでいいやん。

"What I Talk About When I Talk About CLI Tool By Golang" by @deeeet at rakuten

https://speakerdeck.com/tcnksm/what-i-talk-about-when-i-talk-about-cli-tool-by-golang-number-gocon

Cloud foundry : Goで書き直し中

Command line toolつくるときに使えるライブラリ:

感想:

flagパッケージでほとんど事足りる、が、必要に応じてライブラリ使うほうがいいかも。

"Generative Programming in Go" by @monochromegane at GMO Pepabo

https://speakerdeck.com/monochromegane/generative-programming-in-go

generate programming

templateは可読性重視。goimportsで自動整形する:

func writeWithFormat(file, template string, structs structs) ([]byte, error) {
    var b bytes.Buffer
    w := bufio.NewWriter(&b)
    write(w, template, structs)
    w.Flush()
    formatted, err := imports.Process(file, b.Bytes(), nil)
    if err != nil {
        return nil, err
    }
    return formatted, nil
}

func write(w io.Writer, tplText string, structs structs) error {
    t := template.New("t")
    t.Funcs(template.FuncMap{})
    tpl := template.Must(t.Parse(tplText))
    if err := tpl.Execute(w, structs); err != nil {
        return err
    }
    return nil
}

感想:

ASTでGoのコードを解析してコードを生成するというのは、それなりにメンテナンスコストもかかるので、細かい所を除いた8割くらいにおさえていた方がいい、というのがこれまでの経験で思う所。 goimportsの処理をコードから呼ぶことで整形するのは良いかもしれないので今度実装したい。

"GoCon 2015 Summer GoのASTをいじくって新しいツールを作る" by @vvakame at TopGate

http://www.slideshare.net/vvakame/gocon-2015-summer

TypeScript and Go の人

"Gore: A Tale of Go REPL" by @motemen at hatena

https://speakerdeck.com/motemen/gore-a-tale-of-go-repl

Gore: https://github.com/motemen/gore

  • REPL
  • Goを試したいときにirbみたいにやりたい
  • しくみ: 中でgo runしてる
  • コードをastで解析して各行をラップしてmainで実行する

"Debugging Go Code with GDB" by @kaneshin at eureka

https://speakerdeck.com/kaneshin/debugging-go-code-with-gdb

サービスをGoで書き換え中。

デバッグ:

感想:

GoでGDBは何度か試みたことがある、が、うまく動くことが少なかったので諦めていた。 go1.4+で解消されているのであればまたチャレンジしてみようかな。

"Scaling Sourcegraph with Go" by Gabriel Aszalos(@gabrielaszalos) at Sourcegraph

https://sourcegraph.com/ https://srclib.org/

感想:

ソースコードの解析サービスがWebブラウザで手軽に閲覧できるのはうれしい。 gRPCをもう取り込んでい活用していてすごい。 いろんなノウハウが溜まっていそう。

ikawaha at パシフィックポーター

形態素解析 kagomme

https://github.com/ikawaha/kagome

go gettableを目指す

感想:

形態素解析の話からはじまってどこへ向かうのかとおもったら、go getで簡単に取れるようにするための工夫がいろいろあった。 go-bindataつかったことないので困ったら活用しよう。

cubicdaiya at Mercari

https://speakerdeck.com/cubicdaiya/a-general-push-notification-server-in-go

nginxの人

"Golang, make and robotics" by @HideyukiTakei at beatrobo

https://speakerdeck.com/hideyuki/golang-make-and-robotics-number-gocon

Go in Robot

感想:

ロボット動いてた。 IDLなんだかんだで使ったことない。試さないと。

"広告サーバーでのGoの開発・運用" by @catatsuy at ビクシブ

https://speakerdeck.com/catatsuy/p-ads-server-gocon2015

インフラまわり 広告サーバをGoで作っている

  • nginx → Circus → Application(golang)
  • nginxでユーザーのリクエストをバッファリングする
  • アクセス制御も簡単
  • nginx <-unix domain socket-> Circus <-file descriptor-> go

感想:

nginx <--> Circus <--> Go の組合せでの運用は良さ気。 GoでCircusのような実装ってないのかな?

nishio ryota サイバーエージェント

サーバーサイド

  • 基盤はJavaの開発が長い
  • Goのメリット: 並行性、わかりやすさ、速度
  • コード: 読みやすい、フォーマット・コード規約が明確
  • 学習コスト: A Tour of Go、Effective Goで基本的(6割)に書けるようになる。Goらしく書くにはその先
  • 開発環境: 充実 gfmt, golint, go vet etc..
  • デプロイ: クロスコンパイル簡単。
  • テスト: 標準で。 go test
  • ベンチマーク: 簡単。 go bench, go tool benchcmp
  • プロファイル: 標準。 runtime/pprof, net/http/pprof
  • パッケージ管理: まだこれから
  • Goっぽさ: 標準パッケージで学ぶ。

感想:

人出が足りてないという割にはちゃんと使いこなせていてすごい。 Goの勉強会を開催するらしいので遊びに行ってみたい。

その他

Tex Yoda(トラックポイントキーボード)

これいいです。

f:id:atotto:20150501231713j:plain

メカニカルキーボードにトラックポイントがついているキーボード(Tex Yoda)です。

以前よりトラックポイントが付いているキーボードを愛用していて、こんなの

Lenovo ThinkPlus USBトラベルキーボード ウルトラナビ付 [31P9514]

Lenovo ThinkPlus USBトラベルキーボード ウルトラナビ付 [31P9514]

レノボ・ジャパン ThinkPad USB トラックポイントキーボード(日本語) 55Y9024

レノボ・ジャパン ThinkPad USB トラックポイントキーボード(日本語) 55Y9024

を使ってきました。ちなみに上の2つはもう売っていません。

メカニカルキーボードも使ってみたいと思いつつ、トラックポイントがないので踏みきれていませんでした。 #そういえば大学の先輩がHHKに穴を開けてトラックポイントを取り付ける改造を試みていましたが、あれはどうなったんだろう・・

そんなところにTex Yodaが Massdrop https://www.massdrop.com/buy/tex-yoda で購入できるということを知って乗っかってみました。 なお、Massdropは、サイトで欲しい人を募り、目標人数を達成(drop)すれば割引価格で購入できるというショッピングサイトです。

メカニカルキーボードははじめてなので、軸について調査。

なんとなくこれみて茶色かなということで茶軸を選択。

2015/02/01にdropが完了して、発送されたのが4/8。待ち長いですが、まとまった数での購入なのでこのあたりはしかたないですね。

Tex Yodaは基本的に自分で組み立てる(ハンダ付け)必要があります。 注文時に組み立て済みのものを選択できますが+$50くらいかかります。

組み立ては全工程で2hほどかかりました。

操作感は良好。トラックポイントの感度がこれまで使っていたものより入力が大きいので調整が必要でした。

自分で組み立てるのは楽しいし愛着わきますね。