Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rustで作った自作コマンド群の話
Search
garebare
June 17, 2022
Programming
0
130
Rustで作った自作コマンド群の話
6月17日に行われたNEW DEBUG!!!!で発表した資料です。
https://caspur.wintu.dev/front/lives/264
garebare
June 17, 2022
Tweet
Share
More Decks by garebare
See All by garebare
ペンギンをおすすめする
garebareda
0
20
hey-techcamp-2022
garebareda
2
52
クリーンアーキテクチャ をGoでする場合に不要な Interfaceは消しやがれ
garebareda
0
100
自作Git作った話
garebareda
3
590
Rustで自作言語のインタプリタ作って Webで動くようにした話
garebareda
0
680
Vtuberをやりたくなりました
garebareda
1
65
Other Decks in Programming
See All in Programming
企業向け生成AIアプリの 開発から得られた知見
takaakikakei
0
310
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
15
8.5k
유연한 Composable 설계
l2hyunwoo
0
380
AWSでゲームサーバーを運用! Amazon GameLiftのお話
iriikeita
0
200
DMMプラットフォームにおけるTiDBの導入から運用まで
pospome
7
3k
Microservices rules (July 2024) : what good looks like
cer
PRO
0
1.6k
開発部に不満を持っていたCSがエンジニアにジョブチェンしてわかった「勝手に諦めない」ことの大切さ
sakuraikotone
28
16k
Ruby メモリ管理 プログラミング
megmogmog1965
0
130
CSC307 Lecture 14
javiergs
PRO
0
220
ピグパーティにおけるMongoDB CommunityバージョンからAtlasへの移行事例
10969hotaka
0
130
AWS初心者ってどうやってAWSを学ぶ?〜アプリエンジニアがやってよかったアーキテクチャ学習方法〜
yamanashi_ren01
0
190
TiDB Serverless ~理想のServerless DBを考える~
soso_15315
1
160
Featured
See All Featured
Speed Design
sergeychernyshev
9
270
Optimizing for Happiness
mojombo
373
69k
Art, The Web, and Tiny UX
lynnandtonic
291
20k
A Philosophy of Restraint
colly
200
16k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
149
45k
The Brand Is Dead. Long Live the Brand.
mthomps
52
36k
Learning to Love Humans: Emotional Interface Design
aarron
269
39k
The Cost Of JavaScript in 2023
addyosmani
31
4.7k
It's Worth the Effort
3n
181
27k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.9k
What's new in Ruby 2.0
geeforr
338
31k
Rails Girls Zürich Keynote
gr2m
93
13k
Transcript
Rustで作った 自作コマンド群の話 @garebare521
自己紹介 名前:ガレバレ とうとうインターンシップ始めた 授業とインターンシップで死にそうに なってる コーヒーの器具を一式買った
このスライドは前座
皆さん、自作コマンド 作りたくないですか?
作りたいですよね?
残念ですがそんなことを思っている間に 私が先に作りました
でもフルスクラッチではないので 皆さん頑張って下さい
最初に下準備
とりあえず、全部に実装するトレイトを定義する pub trait Commands { fn help(&self); fn version(&self); fn
name(&self) -> &str; fn run(&self) -> Result<(), String>; }
helpとversionのオプションはデフォルトで実装 pub trait Commands { fn print_help(&self, options: &Vec<String>, arg:
&str) -> bool { if options.contains(&"--help".to_string()) || options.contains(&"-help".to_string()) || options.contains(&"-h".to_string()) || arg == "help" { self.help(); return true; } false } }
parser 毎度同じみのパーサー 一番最初に来たものはコマンド名として処理する ハイフンがついているものはオプションとして処理する 何もついてないのは引数として処理する
オプション let options = args.iter().filter(|arg| arg.starts_with(“-”)) .map(|arg| arg.to_string()) .collect(); Rustの場合こんな感じにすれば最初の文字がハイフンで始
まってる文字列が取れる
引数 let args = args.iter().filter(|arg| !arg.starts_with(“-”)) .map(|arg| arg.to_string()) .collect(); 条件を反転させるだけ
- cat - ls - ps - rm - touch
- witch 作ったコマンド
ざっくり紹介します
cat 単純にRustでファイルを開いて一行ずつ読み込んで表示して る -e 最後に$を入れる -n 行番号をつける -b 空白行を入れずに行番号をつける
エンジニアの皆様なら 実装は想像つきますよね????
ls std::os::unix::fs::{MetadetaExt, PremisstionsExt}でメタデー タと権限を取得 あとはディレクトリを回して表示してる 存在している権限はライブラリで取得 -a 隠しファイルも表示 -l ディテールの表示
-R 再帰的に表示 -r 逆順で表示
ps ライブラリを使ってuidとプロセスを取得 大体ライブラリの例通り実装してオプションにより表示を制限す ればいい -x 端末操作以外の全てのプロセスも表示 -a 他ユーザーのも含めてすべてのプロセスを表示 -l ディテールも表示
rm Rustでディレクトリを回して単純に削除してる -r 再帰的にファイルを削除 -i 削除する際に同意を求める
touch 実はファイルを生成するコマンドじゃない! ライブラリを使って編集時間を取得して更新もしている metadetaから編集時間などを取得するためまぁまぁ実装する のに疲れた -a 最終アクセスした時間をアップデート -m 最終編集した時間をアップデート -r
指定したファイルのタイムスタンプと同じ日時にする
touch とは言えファイルの生成もできるようにした
witch 環境変数PATHを全部読み込んで分割して表示してる -a フルパスの表示
これで全部!