(移行しました)Goのhttp.Headerについて
↓↓↓こちらに移行しました↓↓↓
続・GoでパスワードなどをPrintfで出力させたくない
前回、GoでパスワードなどをPrintfで出力させたくない - kawaken's blog というのを書いたけど、 その後 GoStringer というインターフェースがあることを知ったので再度試してみた。
- fmt.Formatterを実装して%vや%+vをカスタマイズしたり、%3🍺みたいな書式をつくってみよう #golang - Qiita
- fmt - The Go Programming Language
前回のおさらい
前回上手く隠蔽できずに出力されてしまったのが、以下。 %+v だと出力されないんだけど、%#vだと出力されてしまう…
type Password string func (p Password) String() string { return "FILTERED" } type User struct { Name string Password Password } func main() { u := &User{ Name: "namae", Password: Password("pass"), } fmt.Printf("%#v", u) // &main.User{Name:"namae", Password:"pass"} }
https://play.golang.org/p/1BT9E4dM17
GoStringerを実装する
package main import ( "fmt" ) type Password string func (p Password) String() string { return "FILTERED by String" } func (p Password) GoString() string { return "FILTERED by GoString" } type User struct { Name string Password Password } func main() { u := &User{ Name: "namae", Password: Password("pass"), } fmt.Printf("%#v", u) // &main.User{Name:"namae", Password:FILTERED by GoString} }
https://play.golang.org/p/H_ccstzjCC
よっしゃー!うまく隠蔽された。
これでログとかに意図せず出力されることが回避できそう。
GoでパスワードなどをPrintfで出力させたくない
RailsのLoggerだとリクエストパラメータにパスワードなどが含まれていると、FILTERED
といった感じで生の情報が出力されない。
Goでも、例えば、以下のような構造体Userを fmt.Printf("%#v", u)
で出力したときに Password
が隠れて欲しい。
type User struct { Name string Password string }
ノーガード
特に何もしないと、そのまま出力される。
type User struct { Name string Password string } func main() { u := &User{ Name: "namae", Password: "pass", } fmt.Printf("%+v", u) // &{Name:namae Password:pass} }
https://play.golang.org/p/HZuuaXwS4O
そりゃそうだ。
Password を Stringer にしてみる
fmtで出力されるとき、StringerだとStringが呼ばれるはず。
type Password string func (p Password) String() string { return "FILTERED" } type User struct { Name string Password Password } func main() { u := &User{ Name: "namae", Password: Password("pass"), } fmt.Printf("%+v", u) // &{Name:namae Password:FILTERED} }
https://play.golang.org/p/hmNsB0yrbk
お、できた!?
"%#v" には勝てない
%+v だと出力されないんだけど、%#vだと出力されてしまう…
type Password string func (p Password) String() string { return "FILTERED" } type User struct { Name string Password Password } func main() { u := &User{ Name: "namae", Password: Password("pass"), } fmt.Printf("%#v", u) // &main.User{Name:"namae", Password:"pass"} }
https://play.golang.org/p/1BT9E4dM17
ポインタ型にしてみる
ポインタ型にしたらどうだろう。
type Password string func (p Password) String() string { return "FILTERED" } type User struct { Name string Password *Password } func main() { p := Password("pass") u := &User{ Name: "namae", Password: &p, } fmt.Printf("%#v", u) // &main.User{Name:"namae", Password:(*main.Password)(0x1040a120)} }
https://play.golang.org/p/_pcSzrx64p
アドレスが出力されるので、とりあえずパスワードはわからない状態になった。
まとめ
- とりあえずStringerにする
- 構造体のフィールドとしてはポインタ型にしておく
で良いんだろうか?
もっと良い方法ないだろうか。
Macの開発環境構築メモ
最近SSDに変えてクリーンインストールしたので、また環境構築している。
前にAnsibleのPlaybookで色々インストールできるようにしていたはずだけど、対象のソフトのバージョンが古かったりとかまぁなんかアレだったので、ぼちぼち手作業でインストールすることにした。
今まで homebrew 使わない派?だったんだけど、今回は面倒なので homebrewで楽することにした。
homebrewのインストール
ここにコマンドが乗ってるので、コピペして実行する。
GNU のコマンドインストール
とくにsedがいつも困るので、Linuxと同じように使えるようにする。
cf: Install and Use GNU Command Line Tools on Mac OS X | Hong Xu (xuhdev)
brew install binutils brew install findutils --with-default-names brew install gawk --with-default-names brew install gnu-indent --with-default-names brew install gnu-sed --with-default-names brew install gnu-tar --with-default-names brew install gnu-which --with-default-names brew install grep --with-default-names brew install gzip brew install watch brew install wdiff --with-gettext brew install wget brew install zsh brew install fontforge
既存のコマンドを上書きしたい時には、 --with-default-names
とかのオプションが必要らしい。
fontforge
は Ricty
のインストールに必要。
MacVimのインストール
Releases · splhack/macvim-kaoriya · GitHub
ここから最新版のdmgをダウンロードしてインストールする。
Ricty(フォント)のインストール
Mac に Ricty と Ricty Diminished をインストールする - Qiita
これを参考にした。合成には数分時間がかかる。
Terminal の設定
最近見つけた、Terminalのカラースキーマが一杯あるリポジトリから好きなのを選らぶ。
GitHub - lysyi3m/osx-terminal-themes: Color schemes for default Mac OS X Terminal.app
数年間 Solarized Dark
にしてたけど、やっぱり背景色は黒色が良いかもと思って、最近は会社でも DimmedMonokai
にしてる。
git clone https://github.com/lysyi3m/osx-terminal-themes.git open osx-terminal-themes/schemes/DimmedMonokai.terminal
これでスキーマが使えるようになる。デフォルト設定とかはターミナルの設定から行う。
dotfiles の設定
githubでdotfilesを管理してるので、それを入れる。
MacVimのPATH設定が入ってなかったので追加した。
PATHの順番入れ替え
Homebrewで入れたgit,zshを優先的に利用する - Glide Note
/etc/paths
で管理されている。知らなかった。
Alfred2 のインストール
AppStoreのは古いやつなので、ダウンロードしてインストールする。活用するといろいろできるの知ってるんだけど、結局簡単なランチャと電卓代わりになってる。
ATOKのインストール
課金ユーザなので使わないともったいないんだけど、もうそろそろいいかなーとか思い始めている。
ていうか今ATOKじゃないとダメな理由ってなんだろ。昔は「今日」で「2016/03/06」って変換ができたのが便利だったんだけど、デフォルトのIMEでもできるようになってるしなぁ。
AppStoreから購入済みアプリをインストール
AppStoreで買うと再インストールが楽だ。最近Macから直接S3をいじる機会が増えたので、Transmitをまた使うようになった。CyberDuckでも十分だけど。
Karabiner のインストール
もうこれがないと生きていけない体になってしまった。
英数
->esc
かな
->enter
Shift+英数
->英数
Shift+かな
->かな
右コマンド
->delete
というカスタマイズをしている。
各種SDK
必要に応じて入れる。いまんところ Go くらいかな。
とりあえずそんなところかな。これ便利だよってのがあったら教えてください。
2015年振り返りと2016年目標
遅くなったけど、簡単に2015年の振り返りと、2016年の目標。
2015年初に立てた計画はどうだったか
デプロイ自動化
まだまだ細かいところの調整が必要。というか、終わりがない感じする。
読書
年間50冊が目標で、最終25冊だった。前半は調子が良かったが、後半はペースが落ちた。一番の敗因は、コードコンプリートだと思う。そんなに面白くないのに、やたら長くてモチベーションの低下が著しかった。さっさと違う書籍に移れば良かった。
目標はまったく達成できなかったが、古典で著名だからといって良い書籍ばかりではないし相性がある、ということがわかったのが昨年の成果だと思う。
チームとかの共同作業
キャリアパスや評価辺りまで面倒を見ているわけでもないし、チーム内であの人が何やってるかわかんないという状況ではないので、悩んだだけ損だったのかもしれない。人数も多くないし。
10月から3ヶ月ほど、Goの勉強も兼ねてほぼ日で簡単な問題作成をしたりしていて、教育面でサポートできたのは良かったかなと思う。
ドキュメント
Sphinxをちょっと試してみたけど、普及には至らず。
やらなくて良いことはやらない
これは意識していたので、けっこうできていた気がする。
その他
年初は想像もしてなかったが、8月からiOSアプリの開発に携わることになり、35歳にして新しいチャレンジの機会が得られたのは良かった。Goもやる機会ができて良かった。
アウトプットはほとんどできてないが、1件だけOSSにプルリクをした。簡単なドキュメントの間違いだったけど。
2016年の目標
今年はアウトプットを増やしたい。
モバイルアプリ
個人的なプロジェクトだと、3つなんかアプリを作ろうと思う。ネタはあるので、時間を作ってリリースする。
モバイルアプリと言うけど、バックエンドも作り込みいるし、時間を上手く作って達成したい。
読書
読書はムリせず30冊にしとく。月2冊か3冊。
たまには小説も読んでも良いかなと思ってる。 技術書については、DBとかOSとかのベーシックなところを読みたい。
OSSへのコントリビューション
今までやってこなかったのだけど、頑張ってみよう。簡単なタイポとかだと敷居も低い。
仕事
仕事に関しては、新入社員の教育とかの大事なこともあるんだけど、意識してコード書く時間取っていかないと、緩慢な死を迎えそうで怖い。
いかにコード書く時間を増やせるかを意識して立ち回りたい。
MacVimの起動時にメニューのエラーがでる
splhack/macvim-kaoriya を使っているんだけど、気づいたら以下のようなエラーが出るようになっていた。
kawaken % /Applications/MacVim.app/Contents/Resources/vim/runtime/menu.vim の処理中にエラーが検出されました: 行 1236: E334: メニューが見つかりません: Help.MacVim\ Help
別に動作に問題ないのでほったらかしていたけど、ちゃんと確認してみた。
どうやらカラースキーマの altercation/vim-colors-solarized が影響しているっぽい。
" Menus "{{{ " --------------------------------------------------------------------- " Turn off Solarized menu by including the following assignment in your .vimrc: " " let g:solarized_menu=0
そもそもメニューを使ってないし、コメントに従って let g:solarized_menu=0
を設定したらエラーが出なくなった。
あるいは、MacVimのバグでは?というIssueがSolarizedの方に立っていた。
Solarized menu items in MacVim not working · Issue #133 · altercation/vim-colors-solarized
実際どうなのかわからないけど、とりあえずエラーが出なくなったので解決ってことにしておく。
Macでの開発環境構築
8月から親会社に一部出向していて、モバイルアプリやることになった。
なので、自宅のMacは丸一年くらい触ってなかったけど、久しぶりに開発環境を整えることにした。
ついでに、yosemiteをクリーンインストールした。
今回はモバイルアプリのお勉強が目的なので、とりあえずxcodeを入れて、おすすめのツールとか、これ必須とかを調べている。
↓これが気になってる。ビルドツール?
fastlane - iOS Automation for Continuous Delivery
ちなみに、atomに乗り換えは失敗した。ので、Macvimを使うことにして、vimrcやプラグインを整理した。
あと、dotfileも整理して、gitのユーザ設定に悩んでいたのを解決できたので、スッキリした。