はじめに
私はキラキラ✨エンジニア✨!
うふふ!今日はどんなアートを作ろうかしら!
みたいなノリになりたいときってあるかと思います.
この記事は上の記事のパクオマージュです.
今日は、カフェでMacを使っている時に周りから
「お,この人Macで何かやってるな.何か難しそうな事をしているからエンジニアなんだな.素敵だな.」
と思わせる素敵な(Kuso)プログラムを用意しました.
ぜひ,おしゃれカフェで使ってみてください.
Dependencies
rand = "0.8.3"
indicatif = "0.15.0"
ターミナルで実行すればカッコイイRustコード
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
use rand::{rngs::StdRng, Rng, SeedableRng};
use std::{
sync::{Arc, Mutex},
thread,
time::Duration,
};
const FAKE_PROGRAMS: [&str; 16] = [
"cargo make",
"nginx daemon",
"tsc -",
"stack run",
"nohup python main.py",
"cURL fetching",
"g++ -O3 -std=c++11",
"nvidia-smi",
"openssl --rand",
"rustup",
"cryptocurrency",
"awesome dungs",
"owo",
"docker-compose",
"npx create-next-app",
"pipenv install",
];
fn main() {
let style = ProgressStyle::default_bar()
.template("[{elapsed_precise} {bar:60.green/blue}] {pos:5}/{len:5} {msg}")
.progress_chars("##>-");
let rng = Arc::new(Mutex::new(StdRng::from_seed([42; 32])));
let bars = MultiProgress::new();
for _ in 0..16 {
let pb = bars.add(ProgressBar::new(10000));
pb.set_style(style.clone());
let rng = Arc::clone(&rng);
let _ = thread::spawn(move || {
let mut ctr = 0;
while ctr < 10000 {
let diff = rng.lock().unwrap().gen_range(10..100);
ctr += diff;
pb.inc(diff);
thread::sleep(Duration::from_millis(rng.lock().unwrap().gen_range(5..10)));
let msg = FAKE_PROGRAMS[rng.lock().unwrap().gen_range(0..16)];
pb.set_message(msg);
}
pb.finish_with_message("Done!");
});
}
bars.join().unwrap();
}
indicatifはRustでプログレスバーを作成するときに重宝するクレートです.これを使うことで,それっぽいプログレスバーを表示することができちゃいます!
公式の例でもYarnっぽいなんもしてないプログレスバーを表示する例があります.
つまりこれは何もしてないカッコイイエンジニアへの特急券ともいえるクレートでしょう!使うに越したことはない!!
そしてせっかくのRustなわけですし,多スレッドで動かしてみたいわけじゃないですか.同時に処理しているプログレスバーが$m$本ある際,プログレスバーのそれっぽさは$m^2$に比例するという関係がある気がします.
このプログラムでは16本のプログレスバーが同時に動きますのでそれっぽさ256倍です.嬉しいですね!
更には,画面右側にはなんかそれっぽい名前のプログラムが表示されています.こりゃきっとなんかしているにきまってます!!
さて肝心の実際に動かした例ですが以下のようになります.
こりゃ間違いなくなんかしてるに決まってます!
自己肯定感爆上げですわ!!
おわりに
僕はおうちにこもってWindowsのデスクトップでシラフでこの記事を書きました.
イケイケ度が足りない環境で執筆してしまったことをここにお詫びいたします.
さいごに
全く同名で先を越されていた!!