Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

GoLangの環境変数を一覧する

shuzo-kino.hateblo.jp
の続きみたいな記事です。
すでにGOROOTは不要になっていたようです。

そういったGO言語の環境変数まわりを一覧するには"$ go env"を実行してください。

実際のところ

ちょっと誤爆してinstallコマンドを空で叩いたところ以下のようなメッセージが

$ go install
go install: no install location for directory /Users/shuzo_kino/##/## outside GOPATH
	For more details see: 'go help gopath'

ためしに'go help gopath'を叩いてみると、
>||
If the environment variable is unset, GOPATH defaults
to a subdirectory named "go" in the user's home directory
($HOME/go on Unix, %USERPROFILE%\go on Windows),
unless that directory holds a Go distribution.
|

また、

Run "go env GOPATH" to see the current GOPATH.

とあるので、やってみると……上記文章の通り、"$HOME/go"に相当する部分が充てがわれてますね。

$ go env GOPATH
/Users/shuzo_kino/go

ちなみに、何も指定しないと全部の環境変数がでてきます

$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/shuzo_kino/go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/02/546lp7s57l93kzydhj2dtyzr0000gn/T/go-build203631047=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"

参考もと

  • "$ go help gopath"

Arduinoでゼロ埋めや右詰めした文字列を関数に渡したいなら、諦めてsprintf

shuzo-kino.hateblo.jp
の続きみたいな話です。

sprintfはCの標準ライブラリにあるデータ列を生成する関数です。
こいつを使って文字列をつくり、それをシリアルに繋ぐ方向で実装します。

実際のところ

void setup() {
  // put your setup code here, to run once:
   Serial.begin(19200);
   while (Serial.available()) { ; } 
  

  //まずは何も考えずに
  Serial.println(B0001);

  //駄目元で型キャストだ!
  Serial.println(String(B0001));

  //当然動かないので、sprintfをつかおう
  char sendPacket[24] = "";
  sprintf(sendPacket, "%04d", B0001);
  Serial.println(sendPacket); 
}

まぁ、当然というか結果はこうなります。

1
1
0001

OSパッケージでディレクトリを弄る

OSパッケージでディレクトリを弄る方法です。

実際のところ

初期状態確認=>1234というディレクトリをつくる=>1234ディレクトリを消す
という挙動は以下の通り

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	var result []byte

	result, _ = showDir()
	fmt.Printf("Result:%s\n", string(result))

	os.Mkdir("./1234", 755)
	result, _ = showDir()
	fmt.Printf("Result:%s\n", string(result))

	os.Remove("./1234")
	result, _ = showDir()
	fmt.Printf("Result:%s\n", string(result))
}

func showDir() (out []byte, err error) {
	out, err = exec.Command("ls", "-la").Output()
	return out, err
}
$ go run mkdir.go 
Result:total 8
drwxr-xr-x   4 shuzo_kino  staff   136  4 11 22:15 .
drwxr-xr-x  46 shuzo_kino  staff  1564  4 11 22:01 ..
-rw-r--r--   1 shuzo_kino  staff   444  4 11 22:15 mkdir.go
drwxr-xr-x   2 shuzo_kino  staff    68  4 11 22:15 sampleDir

Result:total 8
drwxr-xr-x   5 shuzo_kino  staff   170  4 11 22:15 .
drwxr-xr-x  46 shuzo_kino  staff  1564  4 11 22:01 ..
d-wxr----x   2 shuzo_kino  staff    68  4 11 22:15 1234
-rw-r--r--   1 shuzo_kino  staff   444  4 11 22:15 mkdir.go
drwxr-xr-x   2 shuzo_kino  staff    68  4 11 22:15 sampleDir

Result:total 8
drwxr-xr-x   4 shuzo_kino  staff   136  4 11 22:15 .
drwxr-xr-x  46 shuzo_kino  staff  1564  4 11 22:01 ..
-rw-r--r--   1 shuzo_kino  staff   444  4 11 22:15 mkdir.go
drwxr-xr-x   2 shuzo_kino  staff    68  4 11 22:15 sampleDir

参考もと

golang.jp

GO言語でシェルコマンドを実行する

GO言語でシェルコマンドを実行する方法です。

実際のところ

この例ではコマンドを実行し結果を得ています。
結果は"[]byte"型で返ってくるため、必要おうじてstring型にキャストしてやる必要があります。

package main

import (
	"fmt"
	"log"
	"os/exec"
)

func main() {
	var out []byte
	out, err := exec.Command("ls","-la").Output()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Result:%s\n", string(out))
}


実行すると、こんな感じ。

$ go run curlexe.go | head -n 5
Result:total 8744
drwxr-xr-x   45 shuzo_kino  staff     1530  4 10 23:44 .
drwxr-xr-x+ 153 shuzo_kino  staff     5202  4  4 13:02 ..
-rw-r--r--@   1 shuzo_kino  staff     6148 10  7  2016 .DS_Store
-rw-r--r--    1 shuzo_kino  staff      485  4  1  2015 1.txt

単に実行したいだけの場合、Run()をやってやるだけで良いです。
内部的にはStartとWaitを読み出してるだけのようです

exprやbcを使わずシェル上で計算する

シェル上で計算刷る場合、exprやbcなんてのがありますが……今回はそれらを使わずシェル上で計算する方法です。

参考もと

変数展開を使うと、内部で式を書いておけば評価されます

$ echo $((1 + 2))
3


16進数の計算も(結果は10進数)

$ echo $((0x01 + 0x12))
19

小数点は使えないので、以下のようにします

$ echo $((15340 * 108 / 100))
16567

シェル変数と初期値

変数を設定して、それをprintfで出すだけなら、以下のようなスクリプトで事足りるでしょう。

$ VAR="hoge"
$ printf "Value::%s\n" ${VAR}
Value::hoge

さて、ここで問題。
変数が空の場合一々判定して別のprintf文を作る必要があるのでしょうか?
答えはNO。
幸いにして、空だった場合の代用文字を入れるオプションがあります。

$ VAR=""
$ printf "Value::%s\n" ${VAR:Nothing}
Value::
$ printf "Value::%s\n" ${VAR:-Nothing}
Value::Nothing

さらに、そのまま変数に投入するオプションも。

$ printf "Value::%s\n" ${VAR:=Nothing}
Value::Nothing

sedで不要な行を削除する その3:行頭や末尾

shuzo-kino.hateblo.jp

shuzo-kino.hateblo.jp
の続き。

$ cat data.csv 
hello,2,a
yeah,0,b
foo,1,c
bar,3,a

sedで末尾行だけ消すには"$"です。

$ cat data.csv | sed '$d'
hello,2,a
yeah,0,b
foo,1,c

一行目はそのまんま1です。

$ cat data.csv | sed '1d'
yeah,0,b
foo,1,c
bar,3,a

あわせ技も可能

$ cat data.csv | sed '1d;$d'
yeah,0,b
foo,1,c