2016年始まりましたね
あけましておめでとうございます。今年もchikuchikugonzalezをよろしくお願いします。
などとあいさつを済ませたところで本題です。
昨年の最後のエントリで適当に作ったライブラリを紹介しましたが、その片方の cfgo でこんなことを言ってました。
そのうち一度読み込んだファイルはは読み込まないっていう機能を持った構造体を追加しようと思ってます。
http://chiku2gonzalez.hatenablog.com/entry/2015/12/28/235253
で、それを作ってるところで、さぁテスト書くかって思ったときに一つ問題にぶち当たりました。っていうか前にもぶち当たったのを忘れてました。
それは
サブパッケージ内から親パッケージを見ている場合に、サブパッケージを利用するテストを親パッケージに置けない
です。いや当たり前なんですが今回はまともなテストが書けないっていう感じになりました。
なので、サブパッケージのリポジトリを分割しました。
chiku2gonzalez / cfgo-driver — Bitbucket
ただ分けるのもあれだったので TOML 対応もしておきました。
✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
適当に作ったGo用ライブラリ置いておきますね
chiku2gonzalez / xdgo — Bitbucket
XDG Base Directory Specification のディレクトリから設定を読み込むためのライブラリ。
ってもパスしか返さないので読み込みは使う側でどうにかしてください。
動機としては、ひっそりと作ってるツールの設定ファイルをどこに置くか悩んでるときに NeoVim が上の仕様で読み込むようにしたよー、って言う記事を見たのが発端です。
その中で Windows は AppData から、ていうのが書いてあったので「じゃぁそれで対応するか」ってなりました。
モンスターハンタークロスの村クエが一段落しました
シャンティ楽しいです ✌('ω'✌ )三 ✌('ω')✌ 三( ✌'ω')✌
パケ買いしたシャンティが思いのほか楽しくて困ってない。
横スクロールアクション自体すっごい久しぶりなせいもあっていい買い物でした。
道中迷子になったり最終ダンジョンで指痛めたりとかしたけど。
- 出版社/メーカー: インターグロー
- 発売日: 2015/11/19
- メディア: Video Game
- この商品を含むブログ (3件) を見る
PC版もあると聞いて即買ってしまうとかもしてた。フルHD + フルスクリーンでできるからこっちのほうがやりやすかった。
エレコムの新トラックボールM-XT3DRBK買ってました
懲りずにエレコム製トラックボールに手を出してました。
見た目は前のと変わらず、チルトホイールと薬指付近の追加ボタンのあるデザインです。
ELECOM マウス トラックボール ワイヤレス 握りの極み 6ボタン ブラック M-XT3DRBK
- 出版社/メーカー: エレコム
- 発売日: 2015/10/17
- メディア: Personal Computers
- この商品を含むブログ (1件) を見る
実のところ、こっちのほうしか知らんかったんですが、Amazonにあったのは↑のほうだけでした。*1
www2.elecom.co.jp
この二種類、違いは薬指のボタンの機能の違いでした。
M-XT2DRBK | 速度調整ボタン |
---|---|
M-XT3DRBK | 拡張機能ボタン |
期せずして、便利そうなほう買ってました(・∀・)
さしあたり、
- スタートスクリーン
- アクションセンター
- 仮想デスクトップ
を割り当ててます。(チルトホイールはそのまま横スクロールにしてある)
使用感
前の M-XT1DRBK と変わらず、ポインタがふらつくことが結構ありますねぇ…('A`)
これ電池寿命を犠牲にハイスピードモードして直ってくれたしないかな…
やっぱロジクールのほうが安定感ある.
あとボールがショリショリしてる。
あと薬指ボタンは誤爆しやすい気がする。
*1:M-XT2DRBKのつもりで買ってた
Goで構造体スライスをXMLにして ( ;゚皿゚)ノシΣバンバン!! ってなった話
結論から書くと、ちゃんと構造体でラップしましょう、ということです。
出ないと書き出したXMLがちゃんと読み込まれなくて ( ;゚皿゚)ノシΣバンバン!! ってすることになります。
やらかしたこと
次のように、構造体とそのスライスを用意して、XMLに変換したわけです。
package main import "encoding/xml" import "fmt" type Item struct { XMLName xml.Name `xml:"item"` ID string `xml:"id,attr"` Name string `xml:"name"` Value string `xml:"value"` } type Items []Item func main() { items := Items{ Item{ ID: "001", Name: "AA1", Value: "|ω・`)ノ ヤァ", }, Item{ ID: "002", Name: "AA2", Value: "|д゚)チラッ", }, } if buf, err := xml.MarshalIndent(items, "", " "); err != nil { panic(err) } else { fmt.Print(xml.Header) fmt.Println(string(buf)) } }
実行すると次のようなXMLを得られます。
<?xml version="1.0" encoding="UTF-8"?> <item id="001"> <name>AA1</name> <value>|ω・`)ノ ヤァ</value> </item> <item id="002"> <name>AA2</name> <value>|д゚)チラッ</value> </item>
この時点ですでになんか怪しいことにお気づきでしょうか。そう、ルート要素が複数あるということに。
さて、これを以下のコードで読み込むと( ゚д゚)します。
package main import "encoding/xml" import "fmt" type Item struct { XMLName xml.Name `xml:"item"` ID string `xml:"id,attr"` Name string `xml:"name"` Value string `xml:"value"` } type Items []Item func main() { items := make(Items, 0) doc := `<?xml version="1.0" encoding="UTF-8"?> <item id="001"> <name>AA1</name> <value>|ω・`)ノ ヤァ</value> </item> <item id="002"> <name>AA2</name> <value>|д゚)チラッ</value> </item> ` if err := xml.Unmarshal([]byte(doc), &items); err != nil { panic(err) } else { for _, item := range items { fmt.Println(item) } } }
以下出力結果。
{{ item} 001 AA1 |ω・`)ノ ヤァ}
二要素目が闇に消えましたね ( ・´ー・`)
原因
たぶんルート要素がいっぱいあるせい。つまり正しいXMLになってない。
正しい解決法
なので、ちゃんと構造体でラップしましょう、そうしましょう。
エンコードする方のコード
package main import "encoding/xml" import "fmt" type Item struct { XMLName xml.Name `xml:"item"` ID string `xml:"id,attr"` Name string `xml:"name"` Value string `xml:"value"` } type Items struct { XMLName xml.Name `xml:"items"` Items []Item `xml:"item"` } func main() { items := &Items{ Items: []Item{ Item{ ID: "001", Name: "AA1", Value: "|ω・`)ノ ヤァ", }, Item{ ID: "002", Name: "AA2", Value: "|д゚)チラッ", }, }, } if buf, err := xml.MarshalIndent(items, "", " "); err != nil { panic(err) } else { fmt.Print(xml.Header) fmt.Println(string(buf)) } }
エンコード結果
<?xml version="1.0" encoding="UTF-8"?> <items> <item id="001"> <name>AA1</name> <value>|ω・`)ノ ヤァ</value> </item> <item id="002"> <name>AA2</name> <value>|д゚)チラッ</value> </item> </items>
デコードする方のコード
package main import "encoding/xml" import "fmt" type Item struct { XMLName xml.Name `xml:"item"` ID string `xml:"id,attr"` Name string `xml:"name"` Value string `xml:"value"` } type Items struct { XMLName xml.Name `xml:"items"` Items []Item `xml:"item"` } func main() { items := Items{} doc := `<?xml version="1.0" encoding="UTF-8"?> <items> <item id="001"> <name>AA1</name> <value>|ω・`)ノ ヤァ</value> </item> <item id="002"> <name>AA2</name> <value>|д゚)チラッ</value> </item> </items> ` if err := xml.Unmarshal([]byte(doc), &items); err != nil { panic(err) } else { for _, item := range items.Items { fmt.Println(item) } } }
デコード結果
{{ item} 001 AA1 |ω・`)ノ ヤァ} {{ item} 002 AA2 |д゚)チラッ}
ダメな解決方法
構造体作りたくないでござる、スライスはスライスのままにしたいでござる、みたいな人 *1 のためにたぶん間違った解決方法を。
その方法は xml.Marshaler / xml.Unmarshalerを実装して、ルート要素を無理やり作る、というのもですが。
エンコード側
package main import "encoding/xml" import "fmt" type Item struct { XMLName xml.Name `xml:"item"` ID string `xml:"id,attr"` Name string `xml:"name"` Value string `xml:"value"` } type Items []Item func (self Items) MarshalXML(e *xml.Encoder, start xml.StartElement) error { root := struct { Items []Item `xml:"item"` }{ Items: self, } start.Name.Local = "items" return e.EncodeElement(&root, start) } func main() { items := Items{ Item{ ID: "001", Name: "AA1", Value: "|ω・`)ノ ヤァ", }, Item{ ID: "002", Name: "AA2", Value: "|д゚)チラッ", }, } if buf, err := xml.MarshalIndent(items, "", " "); err != nil { panic(err) } else { fmt.Print(xml.Header) fmt.Println(string(buf)) } }
デコード側
package main import "encoding/xml" import "fmt" type Item struct { XMLName xml.Name `xml:"item"` ID string `xml:"id,attr"` Name string `xml:"name"` Value string `xml:"value"` } type Items []Item func (self *Items) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { root := struct { Items []Item `xml:"item"` }{} if err := d.DecodeElement(&root, &start); err != nil { return err } else { *self = root.Items return nil } } func main() { items := Items{} doc := `<?xml version="1.0" encoding="UTF-8"?> <items> <item id="001"> <name>AA1</name> <value>|ω・`)ノ ヤァ</value> </item> <item id="002"> <name>AA2</name> <value>|д゚)チラッ</value> </item> </items> ` if err := xml.Unmarshal([]byte(doc), &items); err != nil { panic(err) } else { for _, item := range items { fmt.Println(item) } } }
自分自身のスライスの参照先を書き換えるとか ((((;゚Д゚))))ガクガクブルブル しますね!!
*1:私
最近財布の紐が緩すぎる気がしてならない
最近うしおととら (Kindle版) を全巻まとめ買い*1*2したりとかで散財してるところで、またゲームを衝動買いしてしまいましてな。
- 出版社/メーカー: インターグロー
- 発売日: 2015/11/19
- メディア: Video Game
- この商品を含むブログ (1件) を見る
会社で調べものってことでググってたら至る所で広告を見てしまったので洗脳された感はありつつも、ほぼパケ買いですハイ。