正月三が日でGolangを触ってみた
1
Golangとは
● プログラミング言語の 1つ
● 以下の特徴がある
○ 静的型付け
○ C言語の伝統に則ったコンパイル言語
○ メモリ安全性
○ ガベージコレクション
○ 構造的型付け
○ CSPスタイルの並行性
● Goのコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースである
● 以下の特徴もある
○ 軽量スレッディングのための機能
○ Pythonのような動的型付け言語のようなプログラミングの容易性
● Go処理系としてはコンパイラのみが開発されている
2
出展: https://ja.wikipedia.org/wiki/Golang
Golangとは
● プログラミング言語の 1つ
● 以下の特徴がある
○ 静的型付け
○ C言語の伝統に則ったコンパイル言語
○ メモリ安全性
○ ガベージコレクション
○ 構造的型付け
○ CSPスタイルの並行性
● Goのコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースである
● 以下の特徴もある
○ 軽量スレッディングのための機能
○ Pythonのような動的型付け言語のようなプログラミングの容易性
● Go処理系としてはコンパイラのみが開発されている
3
出展: https://ja.wikipedia.org/wiki/Golang
わたしとGolang
● Hello Worldくらいしか出来ない
○ しかも調べながら
● クロスコンパイルって響きがかっこいい(※ 意味分かってません )
● GopherかわいいよGopher
4
きっかけ
● tmuxのステータス画面で、`現在のメモリ・swapの残量を表示(1s更新)`
○ Ubuntu上で作成
5
きっかけ
● tmuxのステータス画面で、`現在のメモリ・swapの残量を表示(1s更新)`
○ Ubuntu上で作成
6
#!/bin/bash
_mem=$(free -h | awk 'NR==2 {print $4}')
_swap=$(free -h | awk 'NR==3 {print $4}')
echo "${_mem}/${_swap}"
きっかけ
● tmuxのステータス画面で、`現在のメモリ・swapの使用量を表示(1s更新)`
○ 同じスクリプトをmacOS上にコピー
○ tmux上で動かすと何も表示されない…
7
きっかけ
● tmuxのステータス画面で、`現在のメモリ・swapの使用量を表示(1s更新)`
○ 同じスクリプトをmacOS上にコピー
○ tmux上で動かすと何も表示されない…
8
きっかけ
● tmuxのステータス画面で、`現在のメモリ・swapの使用量を表示(1s更新)`
○ 同じスクリプトをmacOS上にコピー
○ tmux上で動かすと何も表示されない…
9
macOSにfreeコマンドはありません \(^o^)/
10
基礎知識
● Ubuntu
○ Debian GNU/Linuxをベースとした、LinuxディストリビューションのOS
● MacOS
○ BSD系UNIXをベースに開発されているOS
11
基礎知識
● Ubuntu
○ Debian GNU/Linuxをベースとした、LinuxディストリビューションのOS
● MacOS
○ BSD系UNIXをベースに開発されているOS
12
無くて当たり前...
解決策の模索
● 他のコマンドで代用してみる
○ vmstat
○ top
○ 出力形式は(やっぱり)違ったし、OSの違いを自分で扱うのはつらい※
■ それが目的では無いので
13
解決策の模索
● 他のコマンドで代用してみる
○ vmstat
○ top
○ 出力形式は(やっぱり)違ったし、OSの違いを自分で扱うのはつらい※
■ それが目的では無いので
● Pythonで書く
○ Versionとかライブラリとか面倒くさい …
14
解決策の模索
● 他のコマンドで代用してみる
○ vmstat
○ top
○ 出力形式は(やっぱり)違ったし、OSの違いを自分で扱うのはつらい※
■ それが目的では無いので
● Pythonで書く
○ Versionとかライブラリとか面倒くさい …
● Golangを使ってみる
○ Golangはクロスコンパイルだ! (※ 意味分かってません )
○ やりたいことは明確である
■ そこまで重たい処理・複雑なロジックでは無いはず
○ 興味もかなりある
○ 正月三が日は駅伝見るくらいしかやりたいことが無い※
■ やりたいことが無い != やらなくてはいけないことが無い 15
まずは使ってみる
● 使えそうなライブラリ(パッケージ?)をググって探す
○ gopsutilなるものを見つける
○ https://github.com/shirou/gopsutil
○ http://tdoc.info/blog/2015/12/16/gopsutil.html
16
まずは使ってみる
17
まずは使ってみる
18
まずは使ってみる
19
まずは使ってみる
20
まずは使ってみる
● Alpine LinuxベースのDockerコンテナでソースコードを作る
○ go runで動作確認 ◎
○ go build して出来たバイナリで動作確認 ◎
○ ここまでは順調
21
まずは使ってみる
● Alpine LinuxベースのDockerコンテナでソースコードを作る
○ go runで動作確認 ◎
○ go build して出来たバイナリで動作確認 ◎
○ ここまでは順調
● ホストマシンのUbuntu 18.04で、バイナリを実行してみる
○ 動かない !!!!
22
まずは使ってみる
23
ここで作ったものが…
まずは使ってみる
24
ここで動かない !!
この時の問題(?)点
● エラーを見ているとライブラリが bash 前提っぽい…??
○ Dockerコンテナ(Alpine Linux)はshellで実行している
○ でも、コンテナ内では動作確認出来た
● たぶん、環境変数的な何か…か??
○ go get -u golang.org/x/sys/unix
25
この時の問題(?)点の解決策の模索
● 環境変数を変えていろいろやってみる
○ だめだった
26
この時の問題(?)点の解決策の模索
● 環境変数を変えていろいろやってみる
○ だめだった
● Dockerコンテナに Bash をインストールする
○ コンテナが肥大化するので却下
27
この時の問題(?)点の解決策の模索
● 環境変数を変えていろいろやってみる
○ だめだった
● Dockerコンテナに Bash をインストールする
○ コンテナが肥大化するので却下
● おとなしく、 Bash が入っているDockerコンテナを使う
○ Debianベースのものを使う(golang:1.11.4-stretch)
○ この環境で go build をし、動作確認もした
○ ホストサーバのUbuntu18.04上でも動いた!!!
28
この時の問題(?)点の解決策の模索
29
ここで作ったものが…
この時の問題(?)点の解決策の模索
30
ここでも動いた !!!
本命のmacOSで動かしてみる
● MacOS上に再度コピーをして実行してみる
31
本命のmacOSで動かしてみる
● MacOS上に再度コピーをして実行してみる
○ 結果、動かなかった…
32
本命のmacOSで動かしてみる
● MacOS上に再度コピーをして実行してみる
○ 結果、動かなかった…
○ クロスコンパイルとは…
33
本命のmacOSで動かしてみる
● めげずにググってみる
34
本命のmacOSで動かしてみる
● めげずにググってみる
● まずはクロスコンパイルの環境を作る必要があるらしい
35
本命のmacOSで動かしてみる
● めげずにググってみる
● まずはクロスコンパイルの環境を作る必要があるらしい
○ all.bash とか make.bash とか
36
本命のmacOSで動かしてみる
● めげずにググってみる
● まずはクロスコンパイルの環境を作る必要があるらしい
○ all.bash とか make.bash とか
37
本命のmacOSで動かしてみる
● Dockerfile
38
この部分、追加
本命のmacOSで動かしてみる
● ソースコード
39
本命のmacOSで動かしてみる
40
本命のmacOSで動かしてみる
41
本命のmacOSで動かしてみる
● 無事、macOSでも動作確認が出来ました !!
42
43
ここまでが、正月三が日のお話
44
その後
しばらく使って、気になってきたこと
● 出来ることが少なすぎる
○ 現状はメモリとSwapの残量しか取れない
45
しばらく使って、気になってきたこと
● 出来ることが少なすぎる
○ 現状はメモリとSwapの残量しか取れない
46
しばらく使って、気になってきたこと
● クロスコンパイルの準備に謎が多い
○ make.bash の中で go1.4 を使うとか嘘でしょ…
47
しばらく使って、気になってきたこと
● クロスコンパイルの準備に謎が多い
○ make.bash の中で go1.4 を使うとか嘘でしょ…
48
この中に go1.4 が
ハードコーディングされている
しばらく使って、気になってきたこと
● そもそもOSが違うと挙動(単位)が違う
○ 深刻な問題
49
しばらく使って、気になってきたこと
● そもそもOSが違うと挙動(単位)が違う
○ 深刻な問題
50
今、やっていること
● 引数を用いて、もう少し便利に使う
○ 出来ることを増やす(増やし過ぎない)
● DockerHubを使って環境用意
○ クロスコンパイルの環境を作っておく
● CircleCI辺りを使って、配布用意をする(ex. GitHub)
○ せっかく作ったので、配布までのCI/CDをしたい
● gopsutilにPRをする準備
○ まずはソースコードを読む
51
52
つまり
53
正月三が日でGolangを触ってみた
54
ではなく
55
正月三が日からGolangを頑張ってる
になりました
56
正月三が日からGolangを頑張ってる
になりました
まとめ
● ちゃんとドキュメントを読みましょう
● そもそもちゃんとGolangを学びましょう
● でも、突貫で作ってみるのも楽しいです
57
まとめ
● ちゃんとドキュメントを読みましょう
● そもそもちゃんとGolangを学びましょう
● でも、突貫で作ってみるのも楽しいです
● とは言え、まずはPythonをしっかり修めてから…
58
59
おわり

2019-01_正月三が日でGolangを触ってみた