Rustでmd5を生成する

cargo add md5 して、今回は0.7.0が入ったな

let digest = format!("{:x}", md5::compute(b"test"));
assert_eq!(&digest, &"098f6bcd4621d373cade4e832627b4f6");

最近寒いですな

2019年の振り返りと2020年の抱負

こういうの書いておくと後で思い出になるし、糧にもなるので。

2019年の振り返り

  1. 本業が忙しい
    • 今回は本業が忙しくさすがに転職を考えるわけです。まあでも、大変なのは今だけだし、勉強になるし、他の仕事より楽ちんで答えも明確だから、続けなくてはと思った一年でした。
  2. 病気をきっかけに生活習慣の見直し
    • 全身ボロボロな件に気づいて生活瞬間を見直しました。運動して、酒や食事に気をつけています。
  3. Youtuberをはじめた
    • やりたいテーマがあったのでやってます。泣かず飛ばず。
  4. ブログを定量で書き始めた
    • 良い刺激になり休日や夜寝る前に勉強するきっかけになった。
  5. Webサービス花咲いた
    • 2年前くらいから運営したサービスが結構人気になってきた。泣かず飛ばずだったんだけど、時間が経ったら花咲くもんですね。
  6. 在宅勤務はじめた
    • 人とのコミュニケーションや自己管理が大変で、特に私はメンタルがやられます。だからといって前時代的な働き方に戻すのも芸がないので、この働き方でうまくやる方法を見つけたい。

2020年の抱負

  1. 本業を楽にこなせるように強くなりたい
    • 要量・技術・メンタルの3つを強化すればもう少し高いレベルの業務も淡々とこなせるだろう。
  2. Youtuberの継続
    • 強化はちょっと厳しい。今の強度の継続で数年は凌ぐ。
  3. Webサービスを作る
    • これは楽しいだけ。開発速度・運用コスパ・メンテのしやすさを両立できるRustで作りたい。

Rustでtokio-timerのIntervalを使って定期処理を行う

JSのwindow.setIntervalみたいなことがしたい。tokio-timerを使うといいらしい。で、tokioは現在2.4が最新なんだけど、結構古いシステムなので古いtokioで今回はやっています。

tokio = "0.1"
tokio-timer = "0.2.12"

take(10)ってところで10回処理するって設定なんですが、これを取ると無限に実行されます。

use tokio::prelude::*;
use tokio::timer::Interval;
use std::time::{Duration, Instant};

fn main() {
    tokio::run(
        Interval::new(Instant::now(), Duration::new(1, 0))
            .take(10)
            .for_each(|instant| {
                println!("ヒャロー! instant={:?}", instant);
                Ok(())
            })
            .map_err(|e| panic!("ぐああああ; err={:?}", e)),
    );
}

参考

https://tokio.rs/docs/going-deeper/timers/

RustのFutureでinspect_errでエラーの時に処理を行う

Futureが解決された時にエラーであればinspect_errの部分が実行される

use futures::future::TryFutureExt;

#[tokio::main]
async fn main() {
    assert!(async {
        Err::<(), String>("hoge".into())
    }.inspect_err(|e| {
        println!("{}", e)
    }).await.is_err());
}

try-cache的な感じの働きができるなーと思いました

   Compiling result v0.1.0 (/home/user/dev/rust/inspect_err)
    Finished dev [unoptimized + debuginfo] target(s) in 2.03s
     Running `target/debug/inspect_err`
hoge

RustでStructにDerefトレイトを実装する

Derefは通常、参照外し演算子*をオーバーロードするために利用されるとのことです。今回は自分で作ったStructにDerefトレイトを実装して検証してみました。

use std::ops::Deref;

#[derive(Debug, PartialEq)]
struct UserId(u64);

impl Deref for UserId {
    type Target = u64;

    fn deref(&self) -> &u64 {
        &self.0
    }
}

fn main() {
    let id = UserId(36);

    // これは普通に同じだねって確かめている
    assert_eq!(&id, &UserId(36));

    // *でDerefの結果を得る
    assert_eq!(&*id, &36);

    // なのでこんなこともできた
    assert_eq!(*id * 2, 72);

    // チェーンでDerefが実行されていることを確認する
    assert_eq!(id.swap_bytes(), 2594073385365405696);
}

どうやらDerefはチェーンで呼び出された時も実行されるらしいので、swap_bytesが呼ばれるかも試すことができました。

参考

RustでDropを実装してデストラクタ的なことをする

struct Jiisan {
    name: String,
}

impl Jiisan {
    fn attack(&self) {
        println!("{}の攻撃", &self.name);
    }
}

impl Drop for Jiisan {
    fn drop(&mut self) {
        println!("わしの名は{}。今から死ぬ。", self.name);
    }
}

fn main() {
    let a = Jiisan {
        name: "山下".into(),
    };
    let b = Jiisan {
        name: "達郎".into(),
    };

    a.attack();
    b.attack();
}

実行結果

山下の攻撃
達郎の攻撃
わしの名は達郎。今から死ぬ。
わしの名は山下。今から死ぬ。