Technology Engineering

178inaba の技術ブログ

go-cmpでuintが16進数で表示される問題を解決した

一ヶ月くらい前だがgo-cmpuint が16進数で表示される問題を解決した。

go-cmpは差分がいい感じに表示されるので重宝していたのだがuint系の変数だけ16進数で表示されるのが気になっていた。

https://play.golang.org/p/uE2CalqpkTZ

  main.Ints{
-   Int:    0,
+   Int:    255,
-   Uint:   0x00,
+   Uint:   0xff,
-   Uint8:  0x00,
+   Uint8:  0xff,
-   Uint16: 0x00,
+   Uint16: 0xff,
-   Uint32: 0x00,
+   Uint32: 0xff,
-   Uint64: 0x00,
+   Uint64: 0xff,
  }

同僚も気にしていて需要がありそうだと思ったのでプルリクを出してみた。

github.com

プルリクがマージされて v0.4.1 以上でuint系の変数が10進数で表示されるようになったので同じく気になってた方はぜひバージョンアップしてみてください。

https://play.golang.org/p/dGhSMmjFVnS

  main.Ints{
-   Int:    0,
+   Int:    255,
-   Uint:   0,
+   Uint:   255,
-   Uint8:  0,
+   Uint8:  255,
-   Uint16: 0,
+   Uint16: 255,
-   Uint32: 0,
+   Uint32: 255,
-   Uint64: 0,
+   Uint64: 255,
  }

ちなみに uint8 のスライスだけは10進数になりません。

https://play.golang.org/p/Osxp1JT_Huc

  main.Ints{
    Int: []int{
-       0, 0,
+       255, 255,
    },
    Uint: []uint{
-       0, 0,
+       255, 255,
    },
    Uint8: []uint8{
-       0x00, 0x00, // -|..|
+       0xff, 0xff, // +|..|
    },
    Uint16: []uint16{
-       0, 0,
+       255, 255,
    },
    Uint32: []uint32{
-       0, 0,
+       255, 255,
    },
    Uint64: []uint64{
-       0, 0,
+       255, 255,
    },
  }

これは byteuint8 の型エイリアスであり、go-cmpが設計思想を「byte スライスは16進数で表示すべき」としているためです。

https://golang.org/pkg/builtin/#byte

#技術書典 応援祭で無料配布している技術書まとめ

技術書典8は中止になってしまいましたが技術書典 応援祭がオンラインで開催されています。
技術書典に行ったことがない人でもオンラインの応援祭であれば気軽に覗けるのではないでしょうか。

この記事では技術書典に興味を持つきっかけになればと思い、応援祭で無料配布されている同人技術書をまとめました。
ぜひ技術書典 応援祭を覗いてみてください。

書名 サークル名 初出イベント ページ数
DELiGHTWORKS TECHBOOK DELiGHTWORKS TECH 技術書典8 52
JavaScript で位置情報取得 Ginza.rb 技術書典 応援祭 15
モダナイズ モバシフ Ginza.rb 技術書典 応援祭 40
イケてないアプリケーションで試すセキュリティホール Ruby on Rails版 Ginza.rb 技術書典6 56
ニャーQL勉強会のつくりかた Ginza.rb 技術書典7 48
Born 図式とその一般化 Pate Cube (冊子のみ) Math Relish C95 8
OPTiM TECH BOOK #1 OPTiM 技術書典 応援祭 144
WANTEDLY TECH BOOK (電子版のみ) Wantedly執筆部 技術書典 112
WANTEDLY TECH BOOK 2(電子版のみ) Wantedly執筆部 技術書典2 76
WANTEDLY TECH BOOK 3 Wantedly執筆部 技術書典3 88
WANTEDLY TECH BOOK 4 Wantedly執筆部 技術書典4 148
WANTEDLY TECH BOOK 5 Wantedly執筆部 技術書典5 140
WANTEDLY TECH BOOK 6 Wantedly執筆部 技術書典6 148
WANTEDLY TECH BOOK 7 Wantedly執筆部 技術書典7 116
Go Starter Book Women Who Go Tokyo 技術書典 応援祭 28
お絵描きソフトをつくる本 おえかきや 技術書典8 58
コードレビュー×信号処理の薄い本 お引越し 技術書典 応援祭 18
オレオレ証明書との HTTPS 通信設定(Android・ iOS) からてか 技術書典 応援祭 171
kintone × Google翻訳 きんとーん・らぼ 技術書典 4 20
kintoneで始めるIoT きんとーん・らぼ 技術書典 4 48
クマのたっきゅうびん きんとーん・らぼ 技術書典 4 20
Google Home プチハック! きんとーん・らぼ 技術書典 5 44
kintoneでおうちHack きんとーん・らぼ 技術書典 5 36
kintone まかない飯 きんとーん・らぼ 技術書典4 16
kintone 魔改造入門 ポータル編 PART1 きんとーん・らぼ 技術書典6 29
エンジニアのためのダイエット術 きんとーん・らぼ 技術書典6 33
俺の自由研究 - 3日でできる obniz 連携 きんとーん・らぼ 技術書典7 32
【無料頒布中】最短路問題のおはなし ちんちらんど コミックマーケット95 11
トークンエンジニア入門 なんでもトーク 技術書典8 2
[無料] ねこはうす通信創刊準備号 ねこはうす 技術書典応援祭 24
フルスクラッチで作る!UEFIベアメタルプログラミング へにゃぺんて コミックマーケット92 88
フルスクラッチで作る!x86_64自作OS パート2 ACPIでHPET取得してスケジューラを作る本 へにゃぺんて コミックマーケット94 88
フルスクラッチで作る!x86_64自作OS パート3 システムコールの薄い本 へにゃぺんて コミックマーケット95 40
フルスクラッチで作る!x86_64自作OS パート5 てっとりばやくマルチコア へにゃぺんて コミックマーケット96 52
バイナリ生物学入門 へにゃぺんて コミックマーケット97 48
Ohgami's Commentary on OS5 へにゃぺんて 技術書典2 124
フルスクラッチで作る!UEFIベアメタルプログラミング パート2 へにゃぺんて 技術書典3 72
フルスクラッチで作る!x86_64自作OS へにゃぺんて 技術書典4 112
自作OS自動化のPoCとしての遺伝的MBR へにゃぺんて 技術書典5 60
フルスクラッチで作る!x86_64自作OS パート4 ぼくらのイーサネットフレーム! へにゃぺんて 技術書典6 76
作って分かる!x86_64機械語入門 へにゃぺんて 技術書典7 108
バイナリ生成環境「daisy-tools」実験報告 へにゃぺんて 技術書典8 40
私がみんなに低レイヤーを学んでほしい理由 カレーうり坊 技術書典応援祭 2
[既刊:無償配布中]Oculus Goで動くVRアプリをUnityで作ろう コピペテック 技術書典6 152
[既刊:無償配布中]micro:bitではじめる電子工作 コピペテック 技術書典6 112
[既刊:無償配布中]Three.jsとTensorFlow.jsで作るモーションキャプチャ3Dゲーム コピペテック 技術書典7 102
PokéAI #1:初代1vs1編 ヤマブキ計算所 技術書典5 46
BRBT Magazine #prep. 株式会社エス・エム・エス A&I推進部有志 技術書典7 16
BRBT Magazine #1 株式会社エス・エム・エス A&I推進部有志 技術書典8 22
XFLAG Tech Note 株式会社ミクシィ 技術書典5 102
XFLAG Tech Note vol.02 株式会社ミクシィ 技術書典6 82
mixi tech note #01 株式会社ミクシィ 技術書典6 76
mixi tech note #02 株式会社ミクシィ 技術書典7 104
mixi tech note #03 株式会社ミクシィ 技術書典8 79
#UiPath activity Journey 厳選30アクティビティ 聖地で出会いし者たち 技術書典7 52
虎の穴ラボの薄い本。vol.4 虎の穴ラボ 技術書典 応援祭 88

Vim Pluginに入門してみた #vim

この記事はVim2 Advent Calendar 2019の19日目の記事です。

Vim Pluginを書こう書こうと思ってずっとできていなかったのでAdvent Calendarをきっかけにhello, world的なPluginを書いてみた。

github.com

:Hello foobar と打つと hello, foobar と返してくれるだけのPluginです。

今回はこのPluginを書くときにわからなくて調べた部分をご紹介します。

Plugin名

特に決まりは無くてvim-foobar、foobar-vim、foobar.vimの3つの流派が居るっぽい。
自分はvim-go、vim-lspを参考にvim-helloと名付けた。

Vim Pluginの開発ディレクトリは決まっている

Vim起動時に読み込まれるディレクトリが決まっている。
そのディレクトリは何個かあるが、ユーザが一番使いやすそうなのは ~/.vim/pack/*/start/ です。
* は1つのディレクトリ。
(複数ディレクトリあると読み込まれないので注意。)

自分は ~/.vim/pack/plugins/start/vim-hello に置いた。

ディレクトリ構成

今度はVim Plugin内のディレクトリ構成。

pluginautoload というディレクトリが必要。

├── autoload
│   └── hello.vim
└── plugin
    └── hello.vim

plugin 配下にあるファイルはVim起動時に読み込まれるファイル。
autoload 配下にあるファイルは必要になった時に読み込まれる。

コマンド定義は plugin で関数は autoload というように覚えておけば良さそう。

-nargs で引数ありコマンドを定義

コマンドの引数を取得したい場合 -nargs を使って引数を何個取るのか設定できます。

-nargs=0        引数なし
-nargs=1        引数 1 個
-nargs=*        いくつでも
-nargs=?        引数なし、もしくは 1 個
-nargs=+        引数 1 個以上

コマンドラインコマンドを定義する

自分は引数1個以上取りたかったのでこんな感じで書きました。

command! -nargs=+ Hello call hello#hello(<q-args>)

また、<q-args>特殊文字が入っていても適切にエスケープしてくれる引数指定です。
クオートの例が紹介されていて、クオートを適切に表示するなら <q-args> の方が良さそうだったので使用しています。

関数の引数は a: でアクセス

Vim Scriptではよく g:l: がついた変数を見ます。
これはスコープを指していて g: ならグローバル、l: ならローカルといった具合です。

thinca.hatenablog.com

しかし、引数はちょっと特殊で a: を使います。
a: をつけないで引数にアクセスしようとすると「未定義の変数です」と言われてしまうので注意。

vim-jp.org

まとめ

というわけで駆け足でしたが自分がhello, world的なPluginを書いた時に調べた箇所をご紹介しました。
一度hello, world的なPluginを作ってしまえばそこを足がかりに色々試したりできそうです。
そして試したことを切り出して新たにPluginを作っていけたらいいな。

Go言語で画像生成のテストを書く #golang

この記事はGo3 Advent Calendar 2019の18日目の記事です。

この記事ではGo言語における画像生成のテスト方法を紹介します。

画像生成というのはロジックに手を入れていなくてもライブラリがアップデートされたタイミング等でバグりやすい箇所です。
テストを用いてデグレの確認を常に行いましょう。

続きを読む

VimConf 2019参加レポートを書いた

自分のブログからもリンクしておきます。

engineer.dena.jp

VimConf 2019に参加した皆さんのブログを書くスピードが速くて自分もなんとか今週中には出したいと思っていたので間に合ってよかったです😎

今夜はVimConfのアイスクリームスプーンとハーゲンダッツで祝杯をあげようと思います。

YubiSwitch を使って YubiKey の誤作動を防ぐ方法

皆さん YubiKey 使ってますか?

私は YubiKey 5C Nano を使っています。

この YubiKey 5C Nano はちょっと触れただけで One Time Password (以下 OTP) を発行するという物でサクッと入力できて便利な反面、困ったこともあります。

f:id:i178inaba:20190824214654j:plain
金属部分に触れるだけでOTPを入力してしまう。

具体的には

  • Slack に OTP を投稿してしまう。
  • Jira のキーボードショートカットに引っかかり、新しいチケットを作成してしまう。
  • Twitter のキーボードショートカットに引っかかり、通知に飛んでしまう。

などです。

今回はそれを解決します。

続きを読む