natural born minority
2015/10/12 第01回関西golang勉強会LT
※ここ重要。
と「新しく「使う言語」を目標設定しよう」 と思っていた俺にとても良い感じにうつりました。
意気揚々と「第0回(企画会議)」に出かける三浦…
だが、この時には知らなかったのです。
というものを…。
初心者(主にオレだけ)の心がくだけてしまうッ!
初心者達(主にオレだけ)でもほっこりできるような…
あるいは「新しく興味を持ってくれる人」(主にオレ)の 裾野を広げるような「大丈夫だよ〜怖くないよ〜」な 「ミニチュアのハードル」のような(オレ向けな)セッションをしないと…。
背伸びして勉強会に出ていた疲れからか、
不幸にも黒塗りの高級車に追突してしまう。
後輩をかばいすべての責任を負った三浦に対し、
車の主、暴力団員谷岡に言い渡された示談の条件とは…。
(主にオレが)
2015/10/12 第01回関西golang勉強会LT
※ツッコミはあとでまとめてお受けします。
今回は「比較的簡単で比較的新しい」2.で入れました
sudo add-apt-repository ppa:evarlast/golang1.5
sudo apt-get update
sudo apt-get install golang
$GOPATHのには2つの役割が在ります。
とりあえず 「go関係はLibも自ソースもHomeディレクトリの /go に入れる」 と決めて…以下の方法で片付けました。
echo 'export GO_WORKSPACE=current' >> ~/.bashrc
echo 'export GOPATH=~/go/third:~/go/${GO_WORKSPACE}' >> ~/.bashrc
echo 'export PATH=${PATH}:~/go/third/bin:~/go/${GO_WORKSPACE}/bin' >> ~/.bashrc
mkdir -p ~/go/{third,${GO_WORKSPACE}}
mkdir -p ~/go/${GO_WORKSPACE}/{src,bin,pkg}
※$GO_WORKSPACE は「プロジェクト始めるごとに切替」前提
※最後の一行は、golang的に規定されている $GOPATH (ひとつ目) に必要な3つです。
こんな感じ!
[HOME]/go
├── current
│ ├── bin
│ ├── pkg
│ └── src
└── third
├── bin
├── pkg
└── src
IDEは 「InteliJ IDEA Community Edition」+「go-lang-idea-plugin」 で行こうと思います。
# リポジトリ追加
sudo add-apt-repository
ppa:ubuntu-desktop/ubuntu-make
sudo apt-get update
sudo apt-get upgrade
# Ubuntu make インストール
sudo apt-get install ubuntu-make
# InteliJ自体のインストール
umake ide idea
Choose installation path: /home/[おまえさん]/tools/ide/idea
「Ubutntu make」という「公式と別のパッケージ管理」経由です。 時間はかかりましたが、トラブル無く完了。
IDEAに「go-lang-idea-plugin」を入れていきます…。
が、GUIなので手順だけ。(詳しくはこちらのサイトへ)
「プロジェクト」というのは「Java/MS的な考え方」なんですが「プログラムの塊の単位」です。
今回、プロジェクトは…
で、とりあえずディレクトリを作成しました。
mkdir -p ~/go/${GO_WORKSPACE}/src/github.com/kazuhito-m/go-first-project
cd ~/go/${GO_WORKSPACE}/src/github.com/kazuhito-m/go-first-project
# ついでにgit初期化&登録
# (すでにgithub側に"go-first-project"というリポジトリを作成してある事)
git init
echo "/*.i??" > .gitignore # IDEA無視用
git add ./
git commit ./ -m '最初のコミット'
git remote add origin https://github.com/kazuhito-m/go-first-project.git
git push -u origin master
こんな感じ!
[HOME]/go
├── current
│ ├── bin
│ ├── pkg
│ └── src
│ └── github.com
│ └── kazuhito-m
│ └─ go-first-project
└── third
├── bin
├── pkg
└── src
cd ~/go/${GO_WORKSPACE}/src/github.com/kazuhito-m/go-first-project
vi main.go
で
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
でもって
go install
# $PATH で $GOPATH/bin にパス通ってるので…
go-first-project
Hello World!
月並みながら…なんだかうれしいっすね!
後々のこと考えて
touch build.sh
chmod 755 build.sh
vi build.sh
#!/bin/bash
# ビルド・インストール
go install
なスクリプトを用意しました。
※ここからの作業は こちらのリポジトリ から参照いただけます。
これまた月並みですが…main.goを以下のように改造。
package main
import (
"fmt"
"github.com/bitly/go-simplejson"
)
func main() {
fmt.Println("Hello World!")
// 文字列json化の例
json := simplejson.New()
json.Set("message", "Hello, World!")
b, _ := json.EncodePretty()
fmt.Printf("%s\n", b)
}
初めての”go get”
go get github.com/bitly/go-simplejson
# $GOPATH の設定により ~/go/third 側に入って行くはず
実行してみる。
go install
go-first-project
Hello World!
{
"message": "Hello, World!"
}
ビルドスクリプト”build.sh”を改造。
#!/bin/bash
# 依存性解決のgo get(ソースから自動解決)
go get
# ビルド・インストール
go install
唐突ですが、こんなふうに「足し算・引き算するパッケージ」を作り、 テストも追加してみました。
.
├── build.sh
├── calc
│ ├── add.go
│ ├── add_test.go
│ ├── sub.go
│ └── sub_test.go
└── main.go
そりゃ実行でしょう!
go test ./calc
ok github.com/kazuhito-m/go-first-project/calc 0.004s
やったぜ!
ビルドスクリプト”build.sh”を改造。
#!/bin/bash
# 依存性解決のgo get(ソースから自動解決)
go get
# テスト
go test ./...
if [[ $? -ne 0 ]] ; then
echo 'Test failed and Build failed!'
exit 1
fi
# ビルド・インストール
go install
./build.sh
? github.com/kazuhito-m/go-first-project [no test files]
ok github.com/kazuhito-m/go-first-project/calc 0.003s
再帰的テストする指定だけど…「テスト無い」証左だし出しとこ。
テストが出来るなら「テストがコケたら怒ってくれるモノ=CI」を、 仕込んできたくなるので仕込みます。
ローカルでJenkins…がいつものオレですが
「GOが普及し、整備されている」
を示すため「ネット上CIサービス」を使って行きたく思います。
TraviceCI, drone.io等、最近は色々あるようですが、
を使って行きたいと思います。
まずCircleCIにサインアップ&ログインします。
https://circleci.com へ行き、 「Sign Up Free」 -> 「Authorize With Github」 とクリックして下さい。
サイトに入る事ができれば
「どのアカウントを使うか」を選択して下さい。
アカウントを選択すると「githubのリポジトリが一覧」されます。
今回のGOのプロジェクトを見つけ、
右端の「Build Project」をクリックして下さい。
ビルドが始まりますので結果を注視して下さい。
※今回サンプルに使用しているリポジトリのビルドは ここで見れます。
例により
「GithubリポジトリのREADMEにバッジ貼っとく」
とかっこいいかも?
基本的な通知「メール」を設定します。
CircleCIログイン状態で画面左の「アイコン」をクリックします。
今回は「動いてるを意識する」ため「絶えず送信」に変更。
次はチャットです。好みの問題でSlackを使います。
を前提にします。
ログインしているチャットのURLを削り、
https://[なんちゃら].slack.com/services/new/incoming-webhook
というURLを指定してください。
「Post to Channel」という項目が現れるので「Choose a channel…」から 「通知を投げ込みたいチャンネル」を選んで下さい。
Channelを選ぶと「Add Incoming WebHooks Integration」 というボタンがあらわれますのでクリックして下さい。
「Webhook URL」という項目が現れるので、そのURLをコピーして置いて下さい。
CircleCIに戻り、プロジェクト画面から「Project Settings」
-> (左メニューの)「Chat Notifications」
をクリックして下さい。
先ほどのURLを「Webhook URL」に入力、Saveして下さい。
なんとなく…
##「コケたら音声で教えてくれる」
とかしてくれたらいいのに…。(伏線)
このサイト を一通りやればだいぶ身につく!
先ほどCIのところで
###「コケたら音声で教えてくれる」
とかしてくれたらいいのに、と書きましたが…
###「定形コマンド」
ご清聴、ありがとうございました。
質問あらば、どうぞどうぞ!