chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

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

メモ

標準ライブラリで環境変数展開ができれば要らなくなるはずなんですけどねー

*1:VARiable SUbstitioN の略

*2:既存ライブラリはあったけど$HOGE 形式しかだめだったんよ

*3:そのためにはまずベンチマークをとれるようにならないといけないんですが、cargo benchを動かすにはNightlyが必要らしくて、ちょっと面倒だなーっと

スマホを新調しました✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

二年半ほど付き合ったAQUOS PHONE (SHL22) に別れを告げて、AQUOS PHONE SERIE (SHV34) に乗り換えました。
そしてとりあえず手帳型カバーを二つほど確保して、休みの間に試してたりしてました。

一つ目

エレコム製のこれ。これといって特殊な機能もなくて、とりあえずってことで装着してた。
弱めの磁石で蓋がずれたりしないのは👍

二つ目

ラスタバナナ  AQUOS ZETA/SERIE/Xx3 窓付き手帳型ケース ネイビー 2407AQUO

ラスタバナナ AQUOS ZETA/SERIE/Xx3 窓付き手帳型ケース ネイビー 2407AQUO

小窓に惹かれて投入したやつ。蓋開けるだけでロックまで外れるようになったりして、すぐに使えるのは便利なんだけど、蓋を固定するフラップとかがないのでわりとさくっとズレたりしそう。
ただズレるだけならいいんだけど、ズレると蓋が開いた扱いになって本体が反応しちゃうのでちゃんとロックしておかないと誤操作しそうだった。

なお、小窓には時計とカメラ起動ショートカットが置かれてました。小窓サイズで写真撮るのはちっちゃくてつらいかもしれない。

手帳型について

今回初の手帳型カバーだったので、慣れるまではヒーヒー言ってそうだなーという印象。電話はかける分には問題ないけど、受けるときはすぐに取れなかったりはした。
そしてスマホ本体に搭載されている特殊機能 *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でも動くぞ…!

とか考えて作りました。

使い方

  1. go get する*2
  2. makey
  3. ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
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)

*1:特にMercurialSSH接続するときに、ssh-keygenがなくて困ったというのが発端。Gitの場合はGit Bash経由でssh-keygenが使えるから問題にならないはず

*2:ロスコンパイル環境がないのでバイナリは用意してないです

適当なGo言語用ログライブラリのようなものを作った

LOGO is LOGger for GO

chiku2gonzalez / logo — Bitbucket

動機

モンハンやってる合間に細々とツール作成しているわけですが、そんな中でログライブラリほしいなー、って思うことがあるんです。
ただ最近は、どのロガーもちょっとしたツールには機能過剰だなーと感じてました。
とはいえ、標準のロガーだとそれはそれでデバッグログとか出し分けができないやつなので、どうしたもんかと思ってたんです。

で、仕方なく作りました。
機能的には標準のロガーにデバッグログの出し分けを増やした程度のものです。

使い方

標準のロガーと併用する前提で、こんな風になります。

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")
}