はじめに
ポンポさんが来ったぞ〜! nikkieです。
この記事は、かがみの孤城 円盤発売アドベントカレンダー 17日目です。
ここまでの私のアドカレはアニメ語りに振ってきましたが、今回は趣向を変えて技術記事です。
触ってみたかったプログラミング言語Rustの素振りとして、あと何日か数えるPythonプログラムを再実装します。
目次
- はじめに
- 目次
- Rustの環境構築
- Rustで、ある日から別の日まで何日あるかを求める
- 参照したリソース
- 感想(終わりにに代えて)
- P.S. 「助け合いは美しい。大いにやってくれたまえ」 アドベントカレンダー、どなたのご参加も大歓迎です!
Rustの環境構築
まずはRustで開発する環境を作るところから。
これはめちゃめちゃ簡単でした🍰
pyenv + venv
の呼吸1を会得する難易度を10とすると、今回のRustの環境構築は3くらい(あくまで個人の感想)
rustup
!
% 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つ
- 標準ライブラリの
std::time
- サードパーティライブラリの
chrono
chrono
はPythonのdatetime
に近そうな印象を受けたので選択。
依存関係は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
を作る(現在時刻と同じ年で、月日だけ指定) NaiveDate
のsigned_duration_since
メソッドでDuration
が返るDuration
はnum_days
メソッドで何日か返せる
コンパイルして実行すると、発売日当日を含めずにあと何日か(=今日から発売日前日までの日数)が求まります!
% cargo run # src/main.rs の内容が上記のGistです 『かがみの孤城』の円盤が発売する6/28まで、あと11日です
chrono::Date
はdeprecatedなので、NaiveDate
を作ったDateTime<Local>
のyear
,month
,day
メソッドにはDatelike
をuse
する必要がある(よく分かっていない)
from_ymd_opt
でNaiveDate
を作るとOption型4- 不正な値を渡したら
None
が返る - 不正な値を渡していない実装なので(
None
が返るはずないから)unwrap
していく
- 不正な値を渡したら
- 日付ができているのか日時なのかは
println!
5でプリントデバッグ(もっといいやり方知りたい)
参照したリソース
先人のアウトプットに感謝です。
いわしまんさんのブログエントリ「日本語で読めるRust言語の商業本まとめ」
Webで見られるリソースとして以下を知りました
挙げられている本のいくつかも、近日中に私の手元にあるでしょう
2022/03 みんなのPython勉強会#79 「Diversity & Inclusion of Programming Language」
過去のstapyにRustのトークがあったことを思い出しました!
みんなのPython勉強会#79 - connpass
cargo
コマンドや日本語のオンラインドキュメントを確認しました。
カウントダウンはHayaoさんのLT「日常生活で使うPython」きっかけ
この発表、ちょっとしたことでもプログラミングで便利になるという好例で、非常にいいと思うんです!
このエントリは日常生活で素振りするRustといった趣ですね。
感想(終わりにに代えて)
Rustの素振りとして、かがみの孤城の円盤発売まであと何日かを数えました(あと11日!)
Rustの感想は以下です。
- 所有権、まだ全然慣れない
- 今回は所有権が出てこなかった(所有権から逃げても書けるプログラムはある(キリッ←開き直り))
DateTime<Local>
のオブジェクトを指す変数を別の変数に代入したら、オブジェクトがコピーされた(所有権が移らなかったから、コピートレイト6ってこと?)
- さかなー(
::<>
)の向きについて教えていただく- turbofish ref: ジェネリクス|Rust入門
ありがとうございます。
— nikkie にっきー (@ftnext) 2023年6月17日
><> 右向きの魚で尾ひれが::になってる ::<> ってことなんですね!
以上、かがみの孤城 円盤発売アドベントカレンダー 17日目の記事でした。
P.S. 「助け合いは美しい。大いにやってくれたまえ」 アドベントカレンダー、どなたのご参加も大歓迎です!
『かがみの孤城』に関係するアウトプット、ツイート1つからでもかまいませんので、お気軽にお祭りにご参加ください〜
素振りがてらRustで実装した日数カウントプログラムによると、
— nikkie にっきー (@ftnext) 2023年6月17日
% cargo run
『かがみの孤城』の円盤が発売する6/28まで、あと11日です
アドベントカレンダーもたくさん集まってきています!👇 #かがみの孤城https://t.co/bP5LHqrXO0
ひとりでも続けられるよう、レギュレーションはゆるくしています
- 直近のLTスライドより ↩
- The Rust Programming Languageでも案内される方法です。インストール - The Rust Programming Language 日本語版↩
- 転びまくって身体で覚えたほうがいいのかな。GitHub Copilotとかに半自動でフォローしてもらうのもありなのかな↩
- ref: Option型|Rust入門↩
-
この
!
はなんなんだろう。プリントしまくったらなんかコードのテンション高いぞ↩ - コピートレイト|Rust入門↩