bouzuya.hatenablog.com

ぼうずやのにっき

bouzuya/nostr-user-discovery 0.1.0 をつくった / PAST#11 の J を解いた

bouzuya/nostr-user-discovery 0.1.0 をつくった。

NIP-05 に従って internet-identifier を nostr key (public key) に解決するコマンド。 https://github.com/nostr-protocol/nips/blob/master/05.md

使用例は↓。

$ nostr-user-discovery b@bouzuya.net
npub16ysnnfr4lge38jrp0ptt762wmjvr5zyupvvqyaa3xl8aahjhrxtqa3uadg

インストールは cargo を使うか docker を使う。詳細はリポジトリの README を参照。

Rust で書いている。定番のクレートを使っている。 crates:anyhow, crates:clap, crates:regex, crates:reqwest, crates:serde, crates:tokio 。固有なものとしては crates:bech32crates:secp256k1 。それぞれ npub... な形式への変換や鍵の扱いのために使っている。 crates:nostr を使う手もあったけど大げさな気がしたので削ってみた。

他のクライアントで検索欄にでも実装されている 1 機能だと思うので、わざわざインストールして使うほどのものではなさそうだけど、切り出しておくのも良いかと思ってつくってみた。

今後の展開などは特にない。類似機能を単機能の Web アプリケーションとするかもしれない。その場合でも別リポジトリ・派生プロジェクトになりそう。


PAST #11 第11回 アルゴリズム実技検定 過去問 の J を解いた。

use proconio::{input, marker::Chars};

fn main() {
    input! {
        s: Chars,
        t: Chars,
    };
    let s_y = s[0..4].iter().collect::<String>().parse::<usize>().unwrap();
    let s_m = s[5..7].iter().collect::<String>().parse::<usize>().unwrap();
    let s_d = s[8..10]
        .iter()
        .collect::<String>()
        .parse::<usize>()
        .unwrap();
    let t_y = t[0..4].iter().collect::<String>().parse::<usize>().unwrap();
    let t_m = t[5..7].iter().collect::<String>().parse::<usize>().unwrap();
    let t_d = t[8..10]
        .iter()
        .collect::<String>()
        .parse::<usize>()
        .unwrap();
    let mut count = 0_usize;
    let mut weekday = 5;
    let mut is_in = false;
    for y in 2022..=9999 {
        let is_leap_year = (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
        for m in 1..=12 {
            let days_of_month = vec![
                0,
                31,
                if is_leap_year { 29 } else { 28 },
                31,
                30,
                31,
                30,
                31,
                31,
                30,
                31,
                30,
                31,
            ];
            for d in 1..=days_of_month[m] {
                if y == s_y && m == s_m && d == s_d {
                    is_in = true;
                }
                if is_in && (weekday == 5 || weekday == 6) {
                    count += 1;
                }

                if y == t_y && m == t_m && d == t_d {
                    is_in = false;
                }

                weekday += 1;
                weekday %= 7;
            }
        }
    }
    println!("{}", count);
}

2023-03-05 に AtCoder の Submission をしていないことに気づいた。手元でテストして満足して送信していなかった模様……。悲しい。


昼休みに『そーだいさんと並河さんに聞くエンジニアキャリア論〜30歳からの非連続的な成長を考える〜』 https://findy.connpass.com/event/274644/ に参加した。


今日のコミット。