a

よろしくのキワミ

1時間前後で作るコマンドラインツール

1時間前後で作るコマンドラインツール

※この記事はQiitaに投稿したものと同じ内容になります

昔、自分の残したメモを見返すことができるコマンドラインツールを作成したが、久しぶりに何か開発したいと思う気持ちが起きたので今回1時間ほどで簡単なコマンドラインツールを作成することにした。

作成したものは以下のリポジトリにある

github.com

作ったもの

サンバノリズムを出力するコマンドラインツール

環境

  • Windows10 Pro
  • rustup 1.18.3
  • cargo 1.33.0-nightly
  • 開発時間:1時間

サンバのリズムとは?

サンバのリズムはココリコ遠藤さんが披露したネタの一つです。

基本的な文法は以下のようになっている

ホホホイ ホホホイ ホホホイ ホイ

使用している文字は2種類しかありません。

これは現在主要なフォンノイマン型のコンピュータが10の2種類で構成されていることから、 コンピュータとの相性は抜群だということがわかります。

というわけで、入力する文字の種類を2種類にし、それをサンバのリズムの基本形(以下、基本形)に置き換える形でツールを作成していきます。

入力値のチェック

まずは入力文字数のチェックから

// check rhythmtext length
if 2 != rhythmtext.len() {
  panic!("I can't get on such rhythm (pointed out)");
}

let split_rhythm: Vec<char> = rhythmtext.chars().collect();

当初、上記の通りに書いていました。

ですが、入力される文字が日本語のようなUTF-8の形式だと対応ができなかったため先に分割しておいて配列の要素数を数える方法に変更します。

let split_rhythm: Vec<char> = rhythmtext.chars().collect();

// check rhythmtext length
if 2 != Vec::len(&split_rhythm) {
  panic!("I can't get on such rhythm (pointed out)");
}
基本形の作成

あとは分割した入力文字を基本形に当てはめることで文章は作成できる... のだが、あまりきれいな書き方ができなかった

// ホホホイ
let first_clause: String = 
  format!("{}{}{}{}", 
    split_rhythm[0],  // ホ
    split_rhythm[0],  // ホ
    split_rhythm[0],  // ホ
    split_rhythm[1]); // イ

ホホホイを作成するにあたってそのまま配列のn番目の文字を入れる形になってしまった。 定数としてルールのようなものを宣言し、それにのっとて基本形を作成すればよかった...?

// put samba rhythm
println!("{}{}   {}{}   {}{}",
  first_clause, charicon,
  first_clause, charicon, 
  last_clause, charicon);

出来上がった基本形と絵文字をつなげて標準出力に渡す形になってしまった。

動作確認をしてみる。

PS>cargo run -- ホイ
    Finished dev [unoptimized + debuginfo] target(s) in 0.49s
     Running `target\debug\dyktsr.exe ホイ`
ホホホイ🙏   ホホホイ🙏   ホホホイホイ🙏

コードの品質はともかく、これで入力された文字をサンバのリズムに乗せることができたので追加の機能としていろいろ足していくことにした。

追加機能その1: 任意のアイコンの設定

ユーザが入力した文字を表示するようにしたいと思い、そのあたりの処理を作ることにしました。

コマンドライン引数周りではdocoptというcrateを使用しました。 オプションとしてi文字列を指定し、その文字列を出力するようにします。

// default char icon
let mut charicon = "🙏";
if args.get_bool("--item") {
  charicon = args.get_str("--item");
}

デフォルトでは🙏を出力するようにしており、itemフラグがtrueの場合に任意の文字列を入れるという形にしています。

C言語では入力値のチェックをしないような代入は危険な気がしますが、Rustではそのあたりを気にせずに使えるのでとても助かります。

実行してみると

PS>cargo run -- ウキ -i 🐵
    Finished dev [unoptimized + debuginfo] target(s) in 0.70s
     Running `target\debug\dyktsr.exe ウキ -i 🐵`
ウウウキ🐵   ウウウキ🐵   ウウウキウキ🐵

となり、しっかりオプションiが効いていることがわかります。

追加機能その2: プエルトリコモード

サンバのリズムのネタにはプエルトリコが出てきますが、歌がこの節に入るとこれまでと基本形が変わってしまいます。

プエルトリコ状態は以下のような形になっています。

ホイホイ ホホホホイ ホイホイホホイホホイ ホイ

ノーマルモードですら綺麗にコードを書けなかったのにこんなに長くなるといよいよ恥ずかしいコードになってしまう...

こんなコードを書いてしまうとは、サンバのリズムの魔力は恐ろしいと思いました。

恐ろしい...

  let first_clause: String = 
    format!("{}{}{}{}", 
      split_rhythm[0], 
      split_rhythm[1],
      split_rhythm[0], 
      split_rhythm[1]);
  
  let second_clause: String = 
    format!("{}{}{}{}{}", 
      split_rhythm[0], 
      split_rhythm[0], 
      split_rhythm[0], 
      split_rhythm[0],
      split_rhythm[1]);

  let hoi_clause: String = 
    format!("{}{}", 
      split_rhythm[0], 
      split_rhythm[1]);

  let theard_clause: String = 
    format!("{}{}{}{}{}{}{}{}{}", 
      hoi_clause,
      hoi_clause,
      hoi_clause,
      split_rhythm[0], 
      split_rhythm[0], 
      split_rhythm[1],
      split_rhythm[0], 
      split_rhythm[0], 
      split_rhythm[1]);

  // put samba rhythm
  println!("{}{}   {}{}   {}{}   {}{}", 
    first_clause, charicon, 
    second_clause, charicon, 
    theard_clause, charicon, 
    hoi_clause, charicon);

感想

アルゴリズムや文字の処理周りの知識が足りないことがわかりました。 ふと思いついたアプリを開発すると、自分に足りないものがはっきりわかって勉強になります。

本ツールについては、ユーザが自由に基本形を設定出来たら面白くなりそうだと思いました。

プライバシーポリシー お問い合わせ