JODCの潮汐欠測値を正規化するCLI #Rust

成果物

日本海洋データセンターから提供されている、潮汐データの欠測潮高値はスペースが含まれておらず、 そのまま解析等に使用すると使い勝手が悪いので、欠測値を4桁ごとに区切りスペースを挿入するCLIツールです。

開発意図

兄が通っている大学で、上記のデータ変換を手動で行っていたので、
ツールで自動化し、楽に正規化できるようにしたかったため。

詳細情報

  • 開発期間(バグ修正込み): 3日
  • 対応OS: Windows, Linux

技術選定

  • 言語: Rust v1.78.0
  • 使用クレート: Clap v4.5.4

変換処理

     /// Converts missing digits to normal digits in the given text data.
    ///
    /// ## Arguments
    ///
    /// * `txt_data` - The text data to convert.
    ///
    /// ## Returns
    ///
    /// * The converted text data with missing digits replaced by normal digits.
    pub fn convert_missing_to_normal(&self, txt_data: String) -> String {
        let mut result = String::new();

        for (_index, line) in txt_data.lines().enumerate() {
            // 行の反転を行い、探索方向を逆順にする
            let reversed_line: String = line.chars().rev().collect();

            // 行の中に偶数桁で連続している9があったら、4桁ごと(前に)にスペースを挿入
            let mut converted_line = String::new();
            let mut count = 0;
            let mut chars = reversed_line.chars().peekable();
            // 各行の文字を逆順で探索を行う
            while let Some(c) = chars.next() {
                if c == '9' {
                    count += 1;
                } else {
                    count = 0;
                }
                converted_line.push(c);
                if count % 4 == 0 && count > 0 && chars.peek().is_some() {
                    converted_line.push(' ');
                }
            }

            result.push_str(&converted_line.chars().rev().collect::<String>());
            result.push('\n');
        }

        result
    }

実装にあたってつまずいた部分

最初は、正規表現を使用していたのですが、急ぎの開発だった為、
個人的に実装しやすかった欠測値判定の繰り返し処理での実装に切り替えました。

ソースコード

github.com

Youtube動画のAscii_Art風ターミナル表示CLIを実装してみた。#Rust

成果物

www.youtube.com

詳細情報

  • 日数: 4日
  • 言語: Rust
Crate Version
image 0.25.1
term_size 0.3.2
tokio 1.37.0
rusty_ytdl 0.7.1
FFmpeg 4.4.2
clap 4.5.4

技術選定

Rustを選んだ理由は、下記の理由です。
1. 似たソフトをPythonで実装している方がいたのですが、どうせなら別の言語で実装したかった。(Python経験ほぼ無いし...)
2. 読み書きのIO処理や繰り返し処理を多用するため、処理が早く・安全性が高い言語がいいのでは?と考えた。
3. 1番の理由はやっぱり、Rustが一番書いてて楽しかったから...(笑)

実装方法

  1. Youtubeから動画をダウンロードし、ファイルを読み込む。
  2. FFmpegを使用し、動画を画像フレーム&&グレースケール変換・ターミナルサイズに合わせ画像をリサイズする。
  3. フレームの明度ごとに文字を割り当て、繰り返し処理を使用してターミナルに表示する。

実装にあたってつまずいた部分

FFmpegのRust用Wrapper Crateを使用しようと思ったのですが、Buildにそもそも失敗し、 結局、うまくいかなかったためCommand::newで子プロセスとしてFFmpegを実行する方法に切り替えました。

再生中に、ノイズのようなものが表示されるのを解決できませんでした。

別の実装方法を考慮すべき点

24FPS処理のため、3分40秒の動画で220s*24fで5200枚程度の画像が生成される事になり、 ターミナルサイズが大きいほど解像度が高くなるため、綺麗に描画したい場合は、より容量が必要になります。
IO処理や繰り返し処理を多用しすぎた点も反省...

ソースコード

より良い実装方法ができる方は、是非教えてください! github.com