nikkie-ftnextの日記

イベントレポートや読書メモを発信

Rust素振りの記 | ねえねえRust、かがみの孤城の円盤発売まであと何日?

はじめに

ポンポさんが来ったぞ〜! nikkieです。

この記事は、かがみの孤城 円盤発売アドベントカレンダー 17日目です。

ここまでの私のアドカレはアニメ語りに振ってきましたが、今回は趣向を変えて技術記事です。
触ってみたかったプログラミング言語Rustの素振りとして、あと何日か数えるPythonプログラムを再実装します。

目次

Rustの環境構築

まずはRustで開発する環境を作るところから。
これはめちゃめちゃ簡単でした🍰
pyenv + venv呼吸1を会得する難易度を10とすると、今回のRustの環境構築は3くらい(あくまで個人の感想)

rustup!

macOSにインストールしていきます2

% sw_vers
ProductName:    macOS
ProductVersion: 12.6.6
BuildVersion:   21G646

% curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# ターミナル出力の抜粋

Current installation options:


   default host triple: aarch64-apple-darwin
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

# 途中 1) Proceed with installation (default) を選択

Rust is installed now. Great!

% exec "$SHELL"
% rustc --version
rustc 1.70.0 (90c541806 2023-05-31)
% cargo --version
cargo 1.70.0 (ec8a8a0ca 2023-04-25)

cargo new

% cargo new day-counter
     Created binary (application) `day-counter` package

% tree day-counter
day-counter
├── Cargo.toml
└── src
    └── main.rs

2 directories, 2 files

src/main.rsにはHello Worldできるコードが書かれています!

% cd day-counter
% cargo run  # Cargo.lock と targetディレクトリ ができる
Hello, world!

VS Code 拡張 rust-analyzer

存在を知っていた拡張をインストール。
慣れてないのでRustの文法を間違えまくるのですが(文末のセミコロン特に忘れがち3)、リアルタイムに赤線が出て大変助かりました。
エディタ上で小さいフィードバックループが何度も回って赤線が消えるので、cargo runはほぼ通ります。

Rustで、ある日から別の日まで何日あるかを求める

サードパーティライブラリchrono

日付を扱うライブラリにはどんなものがあるかGPT-4に聞きました。

あなたは経験豊富なRust開発者です。
Rust初心者の質問に丁寧に答えてください

========

Rustで日付を扱うにはどのような方法がありますか?

教えてもらったのは以下の2つ

chronoPythondatetimeに近そうな印象を受けたので選択。
依存関係はCargo.tomlに書くんですね

[dependencies]
chrono = "0.4"

サンプルコードも生成してもらったのですが、chrono 0.4.26ではdeprecatedを多く含んでいて採用できず、ドキュメントに当たりながら実装していきました。

2つのNaiveDateの間のDurationを求める

Overviewの中の「Date and Time」の例に注目しながら手を動かします(src/main.rsを編集)

  • Local::now()でシステムローカルタイムゾーンの現在時刻を取れる
  • 現在時刻から年月日を取り出し、NaiveDateを作る
  • 数えたい日もNaiveDateを作る(現在時刻と同じ年で、月日だけ指定)
  • NaiveDatesigned_duration_sinceメソッドでDurationが返る
    • Durationnum_daysメソッドで何日か返せる

コンパイルして実行すると、発売日当日を含めずにあと何日か(=今日から発売日前日までの日数)が求まります!

% cargo run  # src/main.rs の内容が上記のGistです
『かがみの孤城』の円盤が発売する6/28まで、あと11日です
  • chrono::Dateはdeprecatedなので、NaiveDateを作った
    • DateTime<Local>year, month, dayメソッドにはDatelikeuseする必要がある(よく分かっていない)
  • from_ymd_optNaiveDateを作るとOption型4
    • 不正な値を渡したらNoneが返る
    • 不正な値を渡していない実装なので(Noneが返るはずないから)unwrapしていく
  • 日付ができているのか日時なのかはprintln!5でプリントデバッグ(もっといいやり方知りたい)

参照したリソース

先人のアウトプットに感謝です。

いわしまんさんのブログエントリ「日本語で読めるRust言語の商業本まとめ」

Webで見られるリソースとして以下を知りました

挙げられている本のいくつかも、近日中に私の手元にあるでしょう

2022/03 みんなのPython勉強会#79 「Diversity & Inclusion of Programming Language」

過去のstapyにRustのトークがあったことを思い出しました!
みんなのPython勉強会#79 - connpass

cargoコマンドや日本語のオンラインドキュメントを確認しました。

YouTubeアーカイブはないみたいでした🙏)

カウントダウンはHayaoさんのLT「日常生活で使うPython」きっかけ

この発表、ちょっとしたことでもプログラミングで便利になるという好例で、非常にいいと思うんです!
このエントリは日常生活で素振りするRustといった趣ですね。

感想(終わりにに代えて)

Rustの素振りとして、かがみの孤城の円盤発売まであと何日かを数えました(あと11日!)

Rustの感想は以下です。

  • 所有権、まだ全然慣れない
    • 今回は所有権が出てこなかった(所有権から逃げても書けるプログラムはある(キリッ←開き直り))
    • DateTime<Local>のオブジェクトを指す変数を別の変数に代入したら、オブジェクトがコピーされた(所有権が移らなかったから、コピートレイト6ってこと?)
  • さかなー(::<>)の向きについて教えていただく

以上、かがみの孤城 円盤発売アドベントカレンダー 17日目の記事でした。

P.S. 「助け合いは美しい。大いにやってくれたまえ」 アドベントカレンダー、どなたのご参加も大歓迎です!

かがみの孤城』に関係するアウトプット、ツイート1つからでもかまいませんので、お気軽にお祭りにご参加ください〜

ひとりでも続けられるよう、レギュレーションはゆるくしています


  1. 直近のLTスライドより
  2. The Rust Programming Languageでも案内される方法です。インストール - The Rust Programming Language 日本語版
  3. 転びまくって身体で覚えたほうがいいのかな。GitHub Copilotとかに半自動でフォローしてもらうのもありなのかな
  4. ref: Option型|Rust入門
  5. この!はなんなんだろう。プリントしまくったらなんかコードのテンション高いぞ
  6. コピートレイト|Rust入門