Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?
@Shirataki2

カフェでプログラミングしてる風(でも何もやってない)Rust(クソ)コード

はじめに

私はキラキラ✨エンジニア✨!
うふふ!今日はどんなアートを作ろうかしら!

みたいなノリになりたいときってあるかと思います.

この記事は上の記事のパクオマージュです.

今日は、カフェで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倍です.嬉しいですね!

更には,画面右側にはなんかそれっぽい名前のプログラムが表示されています.こりゃきっとなんかしているにきまってます!!

さて肝心の実際に動かした例ですが以下のようになります.

7.gif

こりゃ間違いなくなんかしてるに決まってます!
自己肯定感爆上げですわ!!

おわりに

僕はおうちにこもってWindowsのデスクトップでシラフでこの記事を書きました.

イケイケ度が足りない環境で執筆してしまったことをここにお詫びいたします.

さいごに

全く同名で先を越されていた!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?