読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

GoLangの環境変数を一覧する

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

arduino

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

実際のところ

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パッケージでディレクトリを弄る

golang

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言語でシェルコマンドを実行する

golang

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を使わずシェル上で計算する

unix

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

参考もと

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

$ echo $((1 + 2))
3


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

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

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

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

シェル変数と初期値

unix

変数を設定して、それを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:行頭や末尾

unix

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