だいぶ前にGolangでパーミッションを指定してファイルを作成したいということがあったので、備忘として残しておく。
以下のように、permで指定してやればいい。
package main
import (
        "fmt"
        "io/ioutil"
        "os"
        "strconv"
)
func main() {
        content := []byte(
                `test line 1
test line 2
test line 3
test line 4
test line 5`)...
    
    
    
    
          
                                            
                    
        
    
            2年くらい前からちょこちょこ作ってたツールがある程度形になってきて、個人的に結構便利に使えるようになったので(ここんとこ忙しくて書くこともないし)紹介してみる。
『lssh』という名称でGolangで書いたsshクライアントコマンドで、設定ファイルの内容をもとに接続先を選択できる様になっている。
コマンドなのでMacOS XやLinuxで動くのと、WindowsでもWSL(2018.03のアップデートが適用されてる必要あり)で動作を確認してる(ssh接続処理も全部Golangで書いてるので、多分Windows単体でも動くと思うけど未確認)。
実際に使ってる画面はこんな感じ(gifフ...
    
    
    
    
          
                                            
                    
        
    
            Golangで、データのゼロ埋め・スペース埋めをする場合、以下のようにすれば良いようだ。
padding-test.go
package main
import (
"fmt"
)
func main() {
// ゼロ埋め
fmt.Print("--ゼロ埋め--\n")
fmt.Printf("'%020d'\n", 123)
fmt.Print("\n")
// スペース埋め(右)
fmt.Print("--スペース埋め(右)--\n")
fmt.Printf("'%20s'\n", "Right")
fmt.Print("\n")
// スペース埋め(左)
fmt....
    
    
    
    
          
                                            
                    
        
    
            Golangで、受け付けた標準入力(stdin)を、一時ファイルにコピーしたいことがあったので、備忘として残しておく。
一時ファイル(tmpファイル)については ioutil.TempFile()で、一時ファイルへのコピーについてはio.Copy()で行える。
以下、実行例。
    
    
    
    
          
                                            
                    
        
    
            Golangで一時ファイルを作成する場合、ioutil.TempFileで作成が行える。
ioutil.TempFile(dir,prefix string)
dirを指定しない場合、テンポラリ領域(Linuxだと/tmp)に一時ファイルが作成される。
一時ファイルと言っても、自動では削除されないので注意。以下、実行例。
TempTest.go
package main
import (
    "io/ioutil"
    "fmt"
)
func main() {
    tmpFile, _ := ioutil.TempFile("","tmptest")...
    
    
    
    
          
                                            
                    
        
    
            Golangで、bytes.Bufferの内容を一行ずつ配列に入れる処理を前にやってたので、ネタがないので備忘として残しておく。
こんな感じで書いてた。
    
    
    
    
          
                                            
                    
        
    
            Golangでは、os.Getenv で環境変数を取得させることができる。
testenv.go
package main
import (
        "fmt"
        "os"
)
func main() {
        // 既存の環境変数を取得
        fmt.Println("1. $HOME:",os.Getenv("HOME"))
        // プログラム中で設定してやることもできる
        fmt.Println("2. $TEST:",os.Getenv("TEST"))
        os.Setenv("...
    
    
    
    
          
                                            
                    
        
    
            前にGolangでTabwriterの結果を一時的にバッファに書き出させる対応をしてたので、(次以降で使うかどうか知らんけど)備忘で残しておく。
大体、こんな感じで書くことでファイルなどへの出力なしに利用可能だ。
    
    
    
    
          
                                            
                    
        
    
            Golangの標準ライブラリだと、プロセスIDは取得できるみたいなのだけど、どうもプロセス名は取ってこれないらしい。
で、なんかいい方法ないかなと調べてたところ、『go-ps』というライブラリを見つけた。
これなら、プロセス名も取ってこれそうだ。
以下、実際にいじってみた際のコード。FindProcessの使い方は、基本的にはos.FindProcessとあまり変わらないみたいだ。
package main
import (
    "fmt"
    "os"
    "github.com/mitchellh/go-ps"
)
func main() {
    pid...
    
    
    
    
          
                                            
                    
        
    
            Golangでは、関数の可変引数に対し、スライス展開して渡すことができるようだ。
例えば、以下のような感じ。
test.go
package main
import "fmt"
func main() {
    // 普通に指定して渡す
    fmt.Println("普通に指定して渡す")
    args_test("1 String :", "Arg1")
    args_test("2 Strings:", "Arg1", "Arg2")
    args_test("3 Strings:", "Arg1", "Arg2", "Arg3")
    fmt....
    
    
    
    
          
                                            
                    
        
    
            Golangで、最低限WindowsなのかLinuxなのか、Mac OS Xなのか程度に確認したい場合、「runtime.GOOS」を用いるといいようだ。
test.go
package main
import (
    "fmt"
    "runtime"
)
func main() {
    fmt.Println(runtime.GOOS)
}
        
    
上のコードを実行すると、Ubuntuの場合だと...
    
    
    
    
          
                                            
                    
        
    
            Golangで変数内のメタ文字をエスケープさせる場合、「regexp.QuoteMeta()」で行える。
例えば、以下のようにすることでメタ文字である「[」や「+」をエスケープする。
package main
import (
    "fmt"
    "regexp"
)
func main() {
    str := "a[b+c=\\"
    fmt.Println(str)
    fmt.Println(regexp.QuoteMeta(str))
}
        
    
    
    
    
    
          
                                            
                    
        
    
            Go言語の勉強をしようと思って検索していたところ、ターミナル上でグラフやらなんやらを使ってグラフィカルに監視を行うダッシュボード『termui』というものがあったので、試しに使ってみる事にした。厳密には、監視項目などをGo言語で指定してあげて利用するので、ライブラリといったほうが正しい。
まずはインストール。
対象サーバ上で、以下のコマンドを実行するだけだ。
※事前にgoのインストール、設定を行っておくこと
sudo go get -u github.com/gizak/termui