適当に作った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件) を見る
会社で調べものってことでググってたら至る所で広告を見てしまったので洗脳された感はありつつも、ほぼパケ買いですハイ。
Xbox One Controllerを導入
Windows 10にしてからどうにもXbox 360コントローラ及び互換コントローラの入力がおかしくなってました。おかしいというか、スティックの上方向から右斜め上方向の入力がほぼなくなるという(´Д`)*1
互換コントローラとXbox 360コントローラ両方で起きてたので、たぶんドライバレベルでなんかおかしくなってるっぽかったので、唐突にXbox One Controllerを買いました。ほら、Windows 10ならドライバ標準装備だって言うから…
マイクロソフト Xbox One ワイヤレスコントローラー(Xbox One/Windows PC対応)7MN-00005
- 出版社/メーカー: マイクロソフト
- 発売日: 2014/11/14
- メディア: Personal Computers
- この商品を含むブログを見る
買ってみての感想としては、
- 思ったより軽い。電池とかバッテリーがでかい360コントローラより軽くて負担が軽い
- USBケーブルで繋がる (= 有線コントローラ) なので、充電とか考えなくていい *2
- 扱いは Xbox 360と同じ (= XInput) になるので、大体のゲームで使えて(゚д゚)ウマー
という感じで、いい買い物だったかと.
難点は、R/Lキーが押しにくいことですが。
というのも、押せる場所が端のほうなんですが (下図参照) 持ち方の問題で人差し指がちょうど根元 (図の×のあたり) にきちゃって「あれ?押せないぞ?」とかなること。根元はまったく押せないのでつらいことになる。
意識すればいいんだけど、アクションゲームとかだと余裕なくなって押せなくなったりするのが困ったところです *3
この点だけは360より劣化してるなぁと