chikuchikugonzalezの雑記帳

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

最近のコントローラ事情

ついこの間、Windows 10ならBluetooth接続できるという新型 Xbox One ワイヤレスコントローラを買ってました。

いやホントに、フツーに繋がってUSBポートが一個空いたのは感動モノでしたね*1

とはいえ電池式になってしまったので、電池切れ対策どうしようかなー、とりあえずはエボルタかなー?

そんな時に

(´-`).。oO(Xbox Oneのプレイ&チャージキットってあったよな…?)
(´-`).。oO(いやでもそれだと結局充電用にポートふさぐし、それだと無線じゃなくて優先扱いになってしまうしなー)
(´-`)…
( ゚д゚)!
( ゚д゚)USB充電器使えばいいんじゃね?

で、そろえたもの

Xbox One プレイ & チャージ キット

Xbox One プレイ & チャージ キット

これで充電しながら無線のままでいられる環境がそろってしまった( ・´ー・`)

*1:4個中3個埋まってたのが2個に減った

Rustでプロセスの実行ファイルパスを取得するナニカを作った

Process Entry、略して pentry と名付けました。
github.com

大元の動機は結構前にGoでツール作ってた時、「あー、親プロセスの実行ファイルとれねーかなー」とか思ったたら既にあったというもの*1
github.com

で、これと同じことをRustできないかなー、って思ったのが始まり。
つーてLinux側は特に心配してなかったんだけど、Windows側はFFIの関係でちょっと苦労した*2

使い方

基本はプロセスIDから探すので、こうなります。ところでホントにlibc使わないと今のプロセスID取れないんですか…?

extern crate libc;
extern crate pentry;

let pid: i32;
unsafe {
    pid = libc::getpid() as i32;
}

if let Ok(ps) = pentry::find(pid) {
    println!("#{} {}", ps.pid(), ps.path().unwrap());
}

で、いちいちlibc書くのめんどいだろうからヘルパー的に現在プロセスを取得する関数はあります。

extern crate pentry;

if let Ok(ps) = pentry::current() {
    println!("{:?}", ps);
}

取得できたプロセスオブジェクトには親プロセスを取得するためのメソッド parent() が生えているので、それをたどれば親プロセスを取得できます( ´∀`)b

extern crate pentry;

let ps  = pentry::current().unwrap();
let pps = ps.parent().unwrap();
println!("Parent: {:?}", pps);
おまけ:pentryコマンド

cargo install pentryとかすると一緒に pentry コマンドが $HOME/.cargo/bin に配置されます。これを使うと特定プロセスの実行ファイルとか見れます、たぶん*3
ある意味参考実装的なものですね。

chiku2gonzalez@xenial:~$ pentry  -h
Show some process information.

USAGE: pentry -h|--help
       pentry [-P|--parent] [PID [PID...]]

Options:
    -h, --help          Show this usage message.
    -P, --parent        Inspect parent process entry.

chiku2gonzalez@xenial:~$ .cargo/bin/pentry
  PID	 PPID	PATH
 5284	 2379	/home/chiku2gonzalez/.cargo/bin/pentry

chiku2gonzalez@xenial:~$ .cargo/bin/pentry -P
  PID	 PPID	PATH
 2379	 2377	/bin/bash
 5295	 2379	┗ /home/chiku2gonzalez/.cargo/bin/pentry

chiku2gonzalez@xenial:~$ 
余談

とりあえず trait を Go の interface みたいにできないのがツライ(´・ω・`) *4

*1:HashiCorpの人が作ってた

*2:コード量の大半はFFI絡みという

*3:フルパスに関しては取れないこともある前提で。型もOptionだし。

*4:Result型に入らない的な意味で

DUALSHOCK4を手に入れた

普段ゲームやるときは大抵Xbox One Controllerで済ませてきたんだけど、たまにXinputじゃないゲームをやるときに使ってたコントローラの調子が悪いことに気が付いてしまった。
そこに「PS4のコントローラはPCでも使える」という情報を入手したので、唐突に買いました。DUALSHOCK4だけ。

所感

とりあえずUSBケーブルでPCにつなぐとちゃんと認識された…ってお前、有線で繋がってるのにワイヤレスって言い張るのか
f:id:chikuchikugonzalez:20160909003446p:plain

そしてボタン配列を見たところ、こいつ14ボタンだったんだな*1*2
f:id:chikuchikugonzalez:20160909003603p:plain

押した感じは特に問題なく、持ってみても違和感はなかった。
ただ、スティックの配置ちょっとおかしくないですかね。
右スティックがX回転/Y回転かと思うじゃん?残念がるZ軸/Z回転なのよね(;´д`)

え?X回転/Y回転はどこ行ったかって?そりゃもちろん L2とR2 ですわ。
どういうことかというと、

  • L2を押すと7番と認識されつつX回転がギューンと伸びる
  • 同じくR2は8番かつY回転

という配置。( ´゚д゚`)エー、Xboxコントローラっぽいかと思ったら違う配置というのはちょっと直感からずれる気がする。
というか、Z回転なんであるんだ

*1:PS4持ってないので、タッチパネルエリアがボタンになってるとは知らず

*2:SHAREとOPTIONボタンも9番と10番として使える

varsunをGitHubに引っ越した

ついこの間、初のRust用ライブラリ (Crate) を作たんですが、
chiku2gonzalez.hatenablog.com

crates.io の仕様とかでやっぱ Bitbucket に置いておくのは悲しいこと*1が起きるので、GitHubに引っ越しました*2
github.com

*1:Ownerのアイコンをクリックして移動する先がGitHubなので、そこにcrateのソースがなくて怪しまれる感がある

*2:引っ越しついでにバージョンが 0.1.1 になりました。Cargo.tomlの中身が変わったので区別のために分けただけですが。

続きを読む

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が生成しているのと同じことするの書けばいいんじゃね?

などと考えたのが失敗だった _("_´ω`)_

続きを読む