Rust用の文字列展開ライブラリ varsun を作りました
ヴァルサンとか読みます *1。
crates.ioで公開してます → https://crates.io/crates/varsun
どういうライブラリか
やりたかったことは単純に、文字列に埋め込まれた環境変数を展開したかったのです。
具体的にはGo言語の os.ExpandEnv 相当のができればよかった。
使い方
extern crate varsun; let homedir = varsun::substitute("${HOME}", |name: &str| -> Option<String> { match ::std::env::var(name) { Ok(val) => Some(val), Err(_) => None, } });
環境変数に限ればヘルパー関数があって、こうなります。
extern crate varsun; let homedir = varsun::substenvar("${HOME}"); // これは以下と同じだったりします。 // let homedir = varsun::substitute("${HOME}", varsun::envar);
特徴
地味な特徴として、Windows形式での展開が可能です *2。
むしろこっちが本命かもしれない。
extern crate varsun; let homedir = varsun::mswin::substenvar("%USERPROFILE%"); // 実は、varsun::{substitute, substenvar} は cfg!(windows) の結果がtrueの場合とそうじゃない場合で処理が違います。 // 具体的には // if cfg!(windows) { // return varsun::mswin::substitute(src, fn); // } else { // return varsun::posix::substitute(src, fn); // } // のようになってます。
TODOとか
検索が適当実装すぎるので、ちゃんとパフォーマンスが出るであろう実装にしたい*3。
メモ
標準ライブラリで環境変数展開ができれば要らなくなるはずなんですけどねー
スマホを新調しました✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
二年半ほど付き合ったAQUOS PHONE (SHL22) に別れを告げて、AQUOS PHONE SERIE (SHV34) に乗り換えました。
そしてとりあえず手帳型カバーを二つほど確保して、休みの間に試してたりしてました。
一つ目
ELECOM AQUOS ZETA(SH-04H) AQUOS SERIE(SHV34) AQUOS Xx3レザーケース 薄型 マグネット付 ホワイト PM-SH04HPLFUMWH
- 出版社/メーカー: エレコム
- 発売日: 2016/06/03
- メディア: エレクトロニクス
- この商品を含むブログを見る
弱めの磁石で蓋がずれたりしないのは👍
二つ目
ラスタバナナ AQUOS ZETA/SERIE/Xx3 窓付き手帳型ケース ネイビー 2407AQUO
- 出版社/メーカー: ラスタバナナ
- 発売日: 2016/06/06
- メディア: エレクトロニクス
- この商品を含むブログを見る
ただズレるだけならいいんだけど、ズレると蓋が開いた扱いになって本体が反応しちゃうのでちゃんとロックしておかないと誤操作しそうだった。
なお、小窓には時計とカメラ起動ショートカットが置かれてました。小窓サイズで写真撮るのはちっちゃくてつらいかもしれない。
手帳型について
今回初の手帳型カバーだったので、慣れるまではヒーヒー言ってそうだなーという印象。電話はかける分には問題ないけど、受けるときはすぐに取れなかったりはした。
そしてスマホ本体に搭載されている特殊機能 *1 が使えなくなってるのでそのうち別のカバーを探してるかもしれない。
*1:持つだけで反応するグリップマジックのこと
Rustでserde_codegenを使わずにシリアライズしたかった
RustでJSON/YAMLとかにシリアライズしたい場合、たぶん今なら serde を使えばいいんじゃないかと思ってるんだけど、
serde-rs.github.io
ちょっと不便だなーって思うところがあって。それは
- serde_codegen だとビルドスクリプトに書くことになるので、複数バイナリとか cargo test とかに対応しきれない
- かといってマクロを使うと Nightly ビルドじゃないと動かない
といったところ。なので、ふと
serde_codegenが生成しているのと同じことするの書けばいいんじゃね?
などと考えたのが失敗だった _("_´ω`)_
続きを読む続・ssh-keygenを使わずにOpenSSHキーペアを作りたかった
前略
先日作った makey さんですが、フィンガープリントの出力に対応しました。MD5/hexとSHA256/Base64の両対応です。
bitbucket.org
ところで
ssh-keygen の Randomart Image ってどうやって出してるんですかね (ろくに情報がない)。
これはソースを読み行くしかないのか…_("_´ω`)_ペショ
そして
DSA対応は諦めようかな…
ssh-keygenを使わずにOpenSSHキーペアを作りたかった
結果
Goで作りました。
bitbucket.org
目的とか
もともとはWindowsでOpenSSHキーを作るのに、わざわざPuTTYGenを使うのはちょっとなー、でもCygwin入れたくないしなー、みたいなことを考えてました。*1
そんなときに、Goの非標準パッケージに golang.org/x/crypto/ssh があるのに気がついてしまいまして。
そうだ、Goで作ればWindowsでも動くぞ…!
とか考えて作りました。
使い方
- go get する*2
- makey
- ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
C:>go get bitbucket.org/chiku2gonzalez/makey C:>makey -output hello C:>dir 2016/05/26 23:08 1,766 hello 2016/05/26 23:08 380 hello.pub
makey -h とかするとオプション出てきます。-outputでファイル名を指定ない場合は id_rsa になるので注意してください。
というのも、保存処理は上書き (確認なし) なので。
やり残し
- フィンガープリントしたい
- Randomart imageとか出したい
- DSAって対応するべきだろか
- ssh-keygenにある以下の機能はあったほうがいいよね
- ファイル名が指定されなかった場合に対話式で聞く
- 上書き確認
- ログ出さなくていいよモード (-quiet)
適当なGo言語用ログライブラリのようなものを作った
LOGO is LOGger for GO
動機
モンハンやってる合間に細々とツール作成しているわけですが、そんな中でログライブラリほしいなー、って思うことがあるんです。
ただ最近は、どのロガーもちょっとしたツールには機能過剰だなーと感じてました。
とはいえ、標準のロガーだとそれはそれでデバッグログとか出し分けができないやつなので、どうしたもんかと思ってたんです。
で、仕方なく作りました。
機能的には標準のロガーにデバッグログの出し分けを増やした程度のものです。
使い方
標準のロガーと併用する前提で、こんな風になります。
package main import "fmt" import "log" import "os" import "bitbucket.org/chiku2gonzalez/logo" func main() { logger := Wrap(log.New(os.Stdout, "[LOGO]", 0)) fmt.Fprintf(os.Stdout, "<<BASIC>>\n") logger.SetMode(BASIC) logger.Println("(・∀・)") logger.Debugln("(`・ω・´)") fmt.Fprintf(os.Stdout, "\n") fmt.Fprintf(os.Stdout, "<<DEBUG>>\n") logger.SetMode(DEBUG) logger.Println("( ˘ω˘ )") logger.Debugln("( ゚Д゚)") fmt.Fprintf(os.Stdout, "\n") fmt.Fprintf(os.Stdout, "<<QUIET>>\n") logger.SetMode(QUIET) logger.Println("('ω')") logger.Debugln("(・ω・)") fmt.Fprintf(os.Stdout, "\n") fmt.Fprintf(os.Stdout, "<<END>>\n") }