memoメモ

最近はGo言語関連で。φ(..)メモメモ

blink(1) mk2を買った

blink(1) mk2 USB RGB LED を同僚と一緒に購入しました。

簡単に説明すると、カラーLEDを制御可能なUSBランプです。ウラとオモテで別々に操作できる2つのカラーLEDを装備しています。

分解するとRGBのフルカラーLEDが見える:

blink1のgithubを見てみると対応している言語が多い!もちろんGo言語も。基本はlibusbで叩く感じです。

Linuxでセットアップ:

Ubuntuでのメモ。

ひとまずリポジトリをclone:

$ git clone https://github.com/todbot/blink1.git

https://github.com/todbot/blink1/tree/master/linux に説明がありますが:

$ sudo cp blink1/linux/51-blink1.rules /etc/udev/rules.d/

をしておくとユーザ権限でblink1を操作できるようになります。

コマンドのビルド:

$ cd blink1/commandline && make

使い方は blink1-tool.md にありますが、ちゃんとした使い方は実装を読むべきようです。

blink1-tool -m 1000 --rgb 255,0,0 
# 1秒かけて赤く光る
blink1-tool --off
# 消灯 
blink1-tool -t 1000 -m 200 --rgb 255,0,0 --blink 5
# ぴーかx5

Windows版やMac版ではGUIですぐに動かせます。色を自由に設定できるのは楽しいですね。IFTTTへの連携も簡単にできそうです。

とりあえずやること(アイディア):

  • リモートのJenkinsのビルドが失敗したら手元のランプが光る。
  • push前のコードのテストがバックグラウンドで失敗したら赤blink、成功したら緑3secとか。

まだまだ暑いですね!

よなよなエール 350ml 4種4缶 クラフトビールお試しセット

よなよなエール 350ml 4種4缶 クラフトビールお試しセット

よなよなエール 350ml 4缶 お試しセット

よなよなエール 350ml 4缶 お試しセット

Raspberry Pi Type B 512MB

Raspberry Pi Type B 512MB

Raspberry Pi Model B+ (Plus)

Raspberry Pi Model B+ (Plus)

MacBook Pro 2014 midを買う?

きっかけ

  • そしたらちょっと新しいMacBook Proがリリースされた!

なんのお告げか。

RetinaMacBook Proを買うにあたっての懸念点

  • 非光沢ディスプレイを選択できない
  • 自分でパーツの交換ができない(ストレージやメモリなど)
  • キーボードのストロークが薄っぺらい

などが気になってる。

MacBook Airの13inch買うならPro 13inchかなと思う。厚さも重さもそんなに変わらないし。 Airを買うなら11inchってことになるけど、ディスプレイの比率が横長なのが引っかかるのでパス。もしうわさの12inch MacBook Airが出たら欲しい!けど、まだなので出たときに考えることにする。

だけどそもそも。

いまのマシンをお金をかけずに延命できれば一番いいんだけど…。

と。ひとまずメモ。

qiitaから転載

golangのテンプレート(例えば text/template)では、FuncMapを使うことで好きな関数を実行できます。ので練習がてら簡単な計算機を作ってみます:

package example_test

import (
    "bytes"
    "fmt"
    "log"
    "text/template"
)

func ExampleTemplateCalculator() {
    funcMap := template.FuncMap{
        "add": func(a, b int) int { return a + b },
        "sub": func(a, b int) int { return a - b },
        "mul": func(a, b int) int { return a * b },
        "div": func(a, b int) int { return a / b },
    }

    var buf bytes.Buffer
    tp := template.Must(template.New("calculator").Funcs(funcMap).Parse("{{mul (div (sub 3 (add 1 4)) 2) -10}}"))
    err := tp.Execute(&buf, nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(buf.String())

    // Output:
    // 10
}

playgroundはこちら: http://play.golang.org/p/iYlS-L4qQZ

読んだ: Lean UX

先日、読書会で読んできました。

Lean UX ―リーン思考によるユーザエクスペリエンス・デザイン (THE LEAN SERIES)

Lean UX ―リーン思考によるユーザエクスペリエンス・デザイン (THE LEAN SERIES)

この本をざっくりと説明すると、UIデザイナ+エンジニア達がアジャイル開発をリーン・スタートアップの要領でプロダクト開発をすすめるために必要なこと・やることをおおまかにまとめた本、です。 Lean UXというタイトルからするとユーザーエクスペリエンスをリーンを通じてどうデザインするか、ということを想像するかもしれませんが、UXのtipsなどはなく、純粋にリーンの話です。

以下、感想:

すでにリーンスタートアップの本やアジャイルやUIに関する本を読んでいることもあり、すんなりと読めたように思います。

薄い本ですので、具体的な例が少なく、実践するにはおそらく情報が足りません。別途:

などを読むことをオススメします。

本文には、突然MVPやペルソナの話が出てきますので、そのあたりの知識を前提にしているようにも感じました。全体で150ページほどですので、どんな開発スタイルでどう顧客と向きあってプロダクトデザインを進めればよいのかということを知るには丁度良い本だと思います。

組織化された開発では、UIを設計する人、UIのデザインをする人、UIを実装する人、、などがレイヤー分けされていたりします。そういった退屈な開発を壊すために、この本の内容を実践できればいいと思います。

Running Lean ―実践リーンスタートアップ (THE LEAN SERIES)

Running Lean ―実践リーンスタートアップ (THE LEAN SERIES)

About Face 3 インタラクションデザインの極意

About Face 3 インタラクションデザインの極意

インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針

インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針

アジャイルサムライ――達人開発者への道

アジャイルサムライ――達人開発者への道

gotypeコマンドでgolangのastの結果を視覚化する

qiitaより転載

GolangのASTを可視化するツールを作った でastのステキな可視化がされていて出番は少ないかもしれませんが、gotypeコマンドでもastの結果を可視化できます。

これは何?

Go言語のソースコードを解析する際の補助的なツールです。 astパッケージを使う際のデバッグなどに役に立つと思います。

インストール

導入は:

$ go get code.google.com/p/go.tools/cmd/gotype

でok。

簡単な使い方:

例えば:

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, 世界")
}

を入れてみると以下のようになります:

$ gotype -ast main.go
     0  *ast.File {
     1  .  Package: main.go:1:1
     2  .  Name: *ast.Ident {
     3  .  .  NamePos: main.go:1:9
     4  .  .  Name: "main"
     5  .  }
     6  .  Decls: []ast.Decl (len = 2) {
     7  .  .  0: *ast.GenDecl {
     8  .  .  .  TokPos: main.go:3:1
     9  .  .  .  Tok: import
    10  .  .  .  Lparen: main.go:3:8
    11  .  .  .  Specs: []ast.Spec (len = 1) {
    12  .  .  .  .  0: *ast.ImportSpec {
    13  .  .  .  .  .  Path: *ast.BasicLit {
    14  .  .  .  .  .  .  ValuePos: main.go:4:2
    15  .  .  .  .  .  .  Kind: STRING
    16  .  .  .  .  .  .  Value: "\"fmt\""
    17  .  .  .  .  .  }
    18  .  .  .  .  .  EndPos: -
    19  .  .  .  .  }
    20  .  .  .  }
    21  .  .  .  Rparen: main.go:5:1
    22  .  .  }
    23  .  .  1: *ast.FuncDecl {
    24  .  .  .  Name: *ast.Ident {
    25  .  .  .  .  NamePos: main.go:7:6
    26  .  .  .  .  Name: "main"
    27  .  .  .  .  Obj: *ast.Object {
    28  .  .  .  .  .  Kind: func
    29  .  .  .  .  .  Name: "main"
    30  .  .  .  .  .  Decl: *(obj @ 23)
    31  .  .  .  .  }
    32  .  .  .  }
    33  .  .  .  Type: *ast.FuncType {
    34  .  .  .  .  Func: main.go:7:1
    35  .  .  .  .  Params: *ast.FieldList {
    36  .  .  .  .  .  Opening: main.go:7:10
    37  .  .  .  .  .  Closing: main.go:7:11
    38  .  .  .  .  }
    39  .  .  .  }
    40  .  .  .  Body: *ast.BlockStmt {
    41  .  .  .  .  Lbrace: main.go:7:13
    42  .  .  .  .  List: []ast.Stmt (len = 1) {
    43  .  .  .  .  .  0: *ast.ExprStmt {
    44  .  .  .  .  .  .  X: *ast.CallExpr {
    45  .  .  .  .  .  .  .  Fun: *ast.SelectorExpr {
    46  .  .  .  .  .  .  .  .  X: *ast.Ident {
    47  .  .  .  .  .  .  .  .  .  NamePos: main.go:8:2
    48  .  .  .  .  .  .  .  .  .  Name: "fmt"
    49  .  .  .  .  .  .  .  .  }
    50  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
    51  .  .  .  .  .  .  .  .  .  NamePos: main.go:8:6
    52  .  .  .  .  .  .  .  .  .  Name: "Println"
    53  .  .  .  .  .  .  .  .  }
    54  .  .  .  .  .  .  .  }
    55  .  .  .  .  .  .  .  Lparen: main.go:8:13
    56  .  .  .  .  .  .  .  Args: []ast.Expr (len = 1) {
    57  .  .  .  .  .  .  .  .  0: *ast.BasicLit {
    58  .  .  .  .  .  .  .  .  .  ValuePos: main.go:8:14
    59  .  .  .  .  .  .  .  .  .  Kind: STRING
    60  .  .  .  .  .  .  .  .  .  Value: "\"Hello, 世界\""
    61  .  .  .  .  .  .  .  .  }
    62  .  .  .  .  .  .  .  }
    63  .  .  .  .  .  .  .  Ellipsis: -
    64  .  .  .  .  .  .  .  Rparen: main.go:8:29
    65  .  .  .  .  .  .  }
    66  .  .  .  .  .  }
    67  .  .  .  .  }
    68  .  .  .  .  Rbrace: main.go:9:1
    69  .  .  .  }
    70  .  .  }
    71  .  }
    72  .  Scope: *ast.Scope {
    73  .  .  Objects: map[string]*ast.Object (len = 1) {
    74  .  .  .  "main": *(obj @ 27)
    75  .  .  }
    76  .  }
    77  .  Imports: []*ast.ImportSpec (len = 1) {
    78  .  .  0: *(obj @ 12)
    79  .  }
    80  .  Unresolved: []*ast.Ident (len = 1) {
    81  .  .  0: *(obj @ 46)
    82  .  }
    83  }

-commentを合わせて入れればコメント行も解析します。

godocはこちら gotype

Book「APIデザインの極意」

APIデザインの極意 を、この本の訳者の @yoshiki_shibata さんがレビューを募集していたので応募してみました。

手にとって中身をパラパラとみてみると、文字がぎっしり。本はEffective Javaより多少分厚いくらいですが、中の情報量がもの凄いです。このレビューを出すのが遅くなってしまった理由でもあります。

中には、APIをデザインする上で、何を考え、どうしておくべきか、どうしてこうするべきか、するとどうなるのか、なにに失敗したのかがしっかりと書かれています。コードはそれほど多くありません(最後は除く)が、Javaの知識があると背景をつかみやすいと思います。説明はNetBeansの開発経験などを元にした内容で書かれていますが、他に適用できる話が多いです。全てを読むには根気が要ると思いますので、何人か集めて読書会をするのもいいと思います。

簡単に中を紹介すると、第2部では、Effective Javaに続くような話があり、Effective Javaを読んだ方は是非読んでおくことをおすすめします。 第3部では、はじめの13章で軽く息抜きをしてから、APIを公開、維持する際の話がメインになります。APIは公開以前と公開以降では全く異なる性質を持つようになります。

以下、気になった所のメモを少し:

  • 無知な利用が成功するためには、 APIがライブラリの本質的な真意をきちんと反映していることが重要。2章より。
  • APIは自己文書化されている必要があり、つまりドキュメントが無くても使えるようにしておく必要がある。2章より。
  • APIは公開するものが少ないほどよい。ユースケースに確信が持てないときは公開しない。5章より。
  • 単一のAPIで構成されるライブラリはほとんどない。APIが対象としている複数の目的と複数のグループが存在する。ユーザの必要性に合わせてAPIを構成すべし。8章より。
  • テスト容易性を考えずにフレームワークを作成することは、開発者を不快にさせる。9章より。
  • API設計に問題がなく期待通りうまく運用されていれば「何も」起きない。「何もない」ことが大きな成功であることを示すことは難しい。14章より。

昨今APIをめぐるこんなトラブルもあり、今後のAPI設計の方向性が心配ですが、良いインターフェースの定義は広く使われるようになって欲しいですね。日本語で読めるようになったこの本でAPI設計に関する先人の知恵を読んでおくことをおすすめします!

APIデザインの極意 Java/NetBeansアーキテクト探究ノート

APIデザインの極意 Java/NetBeansアーキテクト探究ノート

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

Apple's SSL/TLS bugの件 #golang

Apple's SSL/TLS bugの件で。

golangだとそもそも括弧強要されるし、gofmtでインデントが強制されるのでわりとすぐに気づくのかもと思ったのでメモ。

そもそもエラーになる:

package main

import "fmt"

func main() {
    var err error = nil
    if err != nil 
        goto fail
        goto fail
 
    fmt.Println("Hello, playground")
fail:
    fmt.Println("Hello, fail")
}

http://play.golang.org/p/lcgZDh-ji4

修正&gofmtでこうなる:

package main

import "fmt"

func main() {
    var err error = nil
    if err != nil {
        goto fail
    }
    goto fail

    fmt.Println("Hello, playground")
fail:
    fmt.Println("Hello, fail")
}

http://play.golang.org/p/hinPttq13L

気づくかな。

goto文をつかうこと自体は悪く無いと思う。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

CODE COMPLETE 第2版 上

CODE COMPLETE 第2版 上

CODE COMPLETE 第2版 下

CODE COMPLETE 第2版 下