Bye Bye Moore

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

io/ioutilパッケージを使ってパイプで繋いだ標準出力から文字列を受け取る

io/ioutilパッケージを使ってパイプで繋いだ標準出力から文字列を受け取る

実際のところ

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	stat, _ := os.Stdin.Stat()
	if (stat.Mode() & os.ModeCharDevice) == 0 {
		fmt.Println("data is being piped to stdin")

		bytes, err := ioutil.ReadAll(os.Stdin)
		if err != nil {
			fmt.Printf("We got error on os.Stdin")

		} else {
			fmt.Println(string(bytes))
		}

	} else {
		fmt.Println("No stdin pipe")
	}
}
$ go run samplescript.go 
No stdin pipe

$ echo "hoge" | go run samplescript.go 
data is being piped to stdin
hoge

GO言語のメソッドについて

GO言語のメッソドは一見関数に似てますが……関数名の前に型を指定するトコがあります。
これにより、特定の型等々に付随する処理を書き下す事が可能です。

実際のところ

package main

import "fmt"

type MyType struct {
	num  int
	body []byte
}

func (mt *MyType) String() string {
	return fmt.Sprintf("%d::%s\n", mt.num, mt.body)
}

func main() {
	p := new(MyType)
	p.num = 12
	p.body = []byte("yes")
	fmt.Printf("%v\n", p.String())
}

GO言語の構造体型を初期化する方法

Go言語の構造体型は変数を意味合いレベルでカタマリにできるもので……なんだかクラスに似ています。
今回はこれの初期化方法について。

実際のところ

MyTypeというint型と[]byte型をもつ構造体を定義し、

  • 一個毎にデータを突っ込む方法
  • まとめて入れる方法(複合リテラル

を考えます。

package main

import "fmt"

type MyType struct {
  num int
  body []byte
}

func main() {
        //
	p := new(MyType)
	p.num = 12
	p.body = []byte("yes")
	fmt.Printf("%d::%s\n", p.num, p.body)

	//複合リテラルによる単純化
	p2 := MyType{34,[]byte("great")}
	fmt.Printf("%d::%s\n", p2.num, p2.body)
}

実行すると、以下の通り

$ go run hoge.go 
12::yes
34::great

for文におけるrange節について

日本語や中国語も含めたマルチバイト文字もよろしくパースしてくれます
UTF-8でサポートしてる必要があるので、ヒエログリフとかは駄目です。

package main

import "fmt"

func main() {
	for pos, char := range "これ不错one까요?" {
		fmt.Printf("character %c starts at byte position %d\n", char, pos)
	}
}
$ go run forsample.go 
character こ starts at byte position 0
character れ starts at byte position 3
character 不 starts at byte position 6
character 错 starts at byte position 9
character o starts at byte position 12
character n starts at byte position 13
character e starts at byte position 14
character 까 starts at byte position 15
character 요 starts at byte position 18
character ? starts at byte position 21

deferでリソースの閉じ忘れを防止する

前回の事例でもちょっと触れたdeferについて。
これは例外の地獄ネストを回避するための素敵な機能です。

実際のところ

一時ファイルを使う場合の事例は以下の通り。

import (
	"io/ioutil"
)

func Something () {
	file, _ := ioutil.TempFile(os.TempDir(), "")

	defer os.Remove(file.Name())
	defer file.Close()

        //something to do
}

なにが良いかというと……
リソースを作った直後に開放処理を記述できるので見通しがよくなります。

deferはキューされて処理されます。
今回の場合、ファイルポインタを閉じてから、ファイルの実体を消すようにしています。
こうしないとWindows系では意図せずクラッシュする事もあるそうなので注意してください。

参考もと

golang.jp
github.com

【読書メモ】セルフビルドの世界: 家やまちは自分で作る

タイトルにある「セルフビルド」という言葉を知りませんでした。
オビの文言から建築や地域社会の事を指すのかと思っていましたが……どうもそうでない。
我々技術屋の語彙に落とし込むと「Makers Movement」に相当する言葉のようです。
そんな事もあってか、本書の内容は建物を中心に据えつつも実に混沌としています。
以下、裏表紙の冊子紹介をそのまま引用します。

フツーの人が手作りした驚嘆の家!トタンでできたバー、トラック上の2階建住居、アウトサイダーアート的な「秘密の家」、びっしりの貝殻でできた公園、湖に浮かぶ村、0円~500万円で建てた家、「磯崎新の隠れ家」など、圧倒されまくる30の物件。自分の家という世界や、共同体を作る熱い思い。文庫化にあたり2篇を新取材。迫力のカラー写真満載!

わけが分かりませんね。
上記の例では日本の事例ばかりですが、東南アジアの水上生活者、ネパールのコミュニティ等々、海外の話題もあります。

と、紹介されている事例は豊富で非常に面白いのです。
問題は「典型的文化人」としか言い様が無い作者の視点。
特に前書きから中盤までが酷い。
回りくどい表現で大量消費社会ガー欧米ガー等々、左巻きの政治パンフレットめいた悪臭が鼻をつきます。
ところが、途中で急に文体が丸くなり、表現もスッキリしてきたりします。
連載元雑誌がサブカル誌からインテリア誌に変わったらしく……ナルホド。

補足:「0円ハウス」について

0円ハウスの件は個人的にお気に入りトピックなので補足をば。
文中で「一冊では紹介しきれない」と書いてありますが、
こちらの本では作り方から載ってます。
作者の視点も、「現社会を肯定しつつ、軸をずらした視点を提供する」というスタンスで好感が持てます。
興味のある方は、こちらも是非。