Mastodonが流行ってますね。
そんな中でチラッと見た GNU Socialの方に興味を持ったのでローカルに立てるテスト。
最近のコントローラ事情
ついこの間、Windows 10ならBluetooth接続できるという新型 Xbox One ワイヤレスコントローラを買ってました。
Xbox One ワイヤレスコントローラー (ドーンシャドウ)
- 出版社/メーカー: 日本マイクロソフト
- 発売日: 2016/10/13
- メディア: Video Game
- この商品を含むブログを見る
いやホントに、フツーに繋がってUSBポートが一個空いたのは感動モノでしたね*1
とはいえ電池式になってしまったので、電池切れ対策どうしようかなー、とりあえずはエボルタかなー?
そんな時に
(´-`).。oO(Xbox Oneのプレイ&チャージキットってあったよな…?)
(´-`).。oO(いやでもそれだと結局充電用にポートふさぐし、それだと無線じゃなくて優先扱いになってしまうしなー)
(´-`)…
( ゚д゚)!
( ゚д゚)USB充電器使えばいいんじゃね?
で、そろえたもの
- 出版社/メーカー: 日本マイクロソフト
- 発売日: 2014/10/02
- メディア: Video Game
- この商品を含むブログを見る
usb充電器 RAVPower 24W 2ポート 充電器 iPhone iPad スマホ タブレット モバイルバッテリー 等対応 ac アダプタ 急速充電 チャージャー (ブラック)
- 出版社/メーカー: RAVPower
- メディア: エレクトロニクス
- この商品を含むブログを見る
これで充電しながら無線のままでいられる環境がそろってしまった( ・´ー・`)
*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
DUALSHOCK4を手に入れた
普段ゲームやるときは大抵Xbox One Controllerで済ませてきたんだけど、たまにXinputじゃないゲームをやるときに使ってたコントローラの調子が悪いことに気が付いてしまった。
そこに「PS4のコントローラはPCでも使える」という情報を入手したので、唐突に買いました。DUALSHOCK4だけ。
ワイヤレスコントローラー (DUALSHOCK 4) ウェイブ・ブルー
- 出版社/メーカー: ソニー・コンピュータエンタテインメント
- 発売日: 2014/02/22
- メディア: Video Game
- この商品を含むブログ (1件) を見る
所感
とりあえずUSBケーブルでPCにつなぐとちゃんと認識された…ってお前、有線で繋がってるのにワイヤレスって言い張るのか
そしてボタン配列を見たところ、こいつ14ボタンだったんだな*1*2
押した感じは特に問題なく、持ってみても違和感はなかった。
ただ、スティックの配置ちょっとおかしくないですかね。
右スティックがX回転/Y回転かと思うじゃん?残念がるZ軸/Z回転なのよね(;´д`)
え?X回転/Y回転はどこ行ったかって?そりゃもちろん L2とR2 ですわ。
どういうことかというと、
- L2を押すと7番と認識されつつX回転がギューンと伸びる
- 同じくR2は8番かつY回転
という配置。( ´゚д゚`)エー、Xboxコントローラっぽいかと思ったら違う配置というのはちょっと直感からずれる気がする。
というか、Z回転なんであるんだ
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。
メモ
標準ライブラリで環境変数展開ができれば要らなくなるはずなんですけどねー