【初心者向け】モールス信号でプログラミングをしてみる

## はじめに
皆さん、こんにちは。
普段はエンジニアチームで仕事をやらせてもらっています。

私たちは常に新しいものを学ぶことに重きをおいていますが、時には過去の技術を知り、使ってみることで新しい発見があると思うんですよね。

そこで、今回はモールス信号を使って学びを深めてみることにします。

モールス信号といったら、最近流行りの[あの曲](https://www.google.com/search?q=%E3%81%AF%E3%81%84%E3%82%88%E3%82%8D%E3%81%93%E3%82%93%E3%81%A7&sca_esv=ad1fe64d584e8890&rlz=1C1PWSB_jaJP1122JP1122&ei=GNbOZq-VGY7Y1e8P7tSM8QU&ved=0ahUKEwivgdiSmZeIAxUObPUHHW4qI14Q4dUDCBA&uact=5&oq=%E3%81%AF%E3%81%84%E3%82%88%E3%82%8D%E3%81%93%E3%82%93%E3%81%A7&gs_lp=Egxnd3Mtd2l6LXNlcnAiFeOBr-OBhOOCiOOCjeOBk-OCk-OBpzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYRzIKEAAYsAMY1gQYR0jYBVCKBFi6BHABeACQAQCYAe0BoAHtAaoBAzItMbgBA8gBAPgBAZgCAaACCpgDAIgGAZAGCpIHATGgB-AG&sclient=gws-wiz-serp)のワンフレーズに使われ、その存在を再認識した次第。さっそくいってみましょう。

## モールス信号とは
そもそも、モールス信号は電信などで用いられ、文字や記号を短点（・）と長点（－）で表現したものです。詳しくは[モールス符号/Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%83%AB%E3%82%B9%E7%AC%A6%E5%8F%B7 "モールス符号のウィキペディア記事へ")でどうぞ。

モールス信号で会話ができたらかっこいいと思いませんか？
しかし、私たちエンジニアはモールス信号で会話ができるようになっても何の役にも立たないのは事実かもしれません。

どうにかしてモールス信号を使うことで私たちの生活を豊かにできないか。
ありましたね。1つだけ。プログラミングですね。

モールス信号はトン、ツーの2つのキーがあれば実質どんな文字列も表現できるわけです。
つまり、片手でプログラミングもできるはず。
これは便利ですね。きっと開発体験が大幅に向上するはずです。

ということで、今回はモールス信号でプログラミングしてみることにしました。

## モールス信号からテキストへの変換
モールス信号からテキストに変換するJavaScriptコードを紹介します。
モールス信号のトンを”.”（ドット）、ツーを”-”（ハイフン）で表現することにします。

:::note info
アルファベット・数字に加え、プログラミングに必要な文字を独自に定義します。
:::

```
// モールス信号を定義
const MORSE_CODE = {
   ".-": "A",
   "-...": "B",
   "-.-.": "C",
   "-..": "D",
   ".": "E",
   "..-.": "F",
   "--.": "G",
   "....": "H",
   "..": "I",
   ".---": "J",
   "-.-": "K",
   ".-..": "L",
   "--": "M",
   "-.": "N",
   "---": "O",
   ".--.": "P",
   "--.-": "Q",
   ".-.": "R",
   "...": "S",
   "-": "T",
   "..-": "U",
   "...-": "V",
   ".--": "W",
   "-..-": "X",
   "-.--": "Y",
   "--..": "Z",
   "-----": "0",
   ".----": "1",
   "..---": "2",
   "...--": "3",
   "....-": "4",
   ".....": "5",
   "-....": "6",
   "--...": "7",
   "---..": "8",
   "----.": "9",
   ".-.-.-": ".",
   "--..--": ",",
   "-.--.": "(",
   "-.--.-": ")",
   "....--": "{",
   "--....": "{",
   ".-..-.": '"',
   "/": " ",
   "...---": "UPPPER_CASE",
 };
```
 以下のコードは、モールス信号をテキストに変換する関数の一例です。morseToTextは、受け取ったモールス信号の文字列をテキストに変換し、返り値としています。

モールス信号は1文字分のトンツーの後に半角空白を入れる必要があります

e.g.「sos なら "... --- ..."」

大文字を表現する場合は、その文字の前に”UPPPER_CASE”のトンツーを追加することで対応します。

本来モールス信号には大文字・小文字の区別がないため、”UPPPER_CASE”の指定がなければ小文字に変換し、指定があれば変換せずに大文字のまま出力するようにして対応します。

 ```javascript
function morseToText(morseCode) {
      // モールス信号を単語ごとに分割し、配列にする
      const morseWords = morseCode.split(" ");
      let result = "";
    
      // 各モールス信号についてループを行う
      for (let i = 0; i < morseWords.length; i++) {
        // UPPPER_CASEに一致する場合
        if (morseWords[i] === "...---") {
          // モールス信号を大文字に変換して出力に追加
          result += MORSE_CODE[morseWords[i + 1].toUpperCase()];
          i++;
        } else {
          // モールス信号を小文字に変換して結果に追加
          result += MORSE_CODE[morseWords[i]].toLowerCase();
        }
      }
      // 最終的な結果を返す
      return result;
}
```

実際にモールス信号で”Hello, World”を出力してみます。
```javascript
// console.log("Hello, World")のモールス信号
const morse = "-.-. --- -. ... --- .-.. . .-.-.- .-.. --- --. -.--. .-..-. ...--- .... . .-.. .-.. --- --..-- / ...--- .-- --- .-. .-.. -.. .-..-. -.--.-";
const result = morseToText(morse);

// スクリプト（文字列）を実行
new Function(result)();
```
開発者ツールのコンソール画面を確認してみます。

![スクリーンショット 2024-08-28 155008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3706512/7be2895f-4ec9-47e9-06ce-cf6fb0d7f010.png)

無事、コンソール画面に「Hello, World」と表示されました。

成功ですね。素晴らしいです。


:::note alert
警告
`eval()` を利用することでも、同じようにスクリプトを実行することができますが、セキュリティの観点から`new Function(result)()`の方が適しています。文字列から JavaScript を実行することは、非常に大きなセキュリティリスクを伴います。下記の記事を読みましょう。

[開発者向けのウェブ技術 - MDN Web Docs - eval() を使わないでください!](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval#eval_%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%E3%81%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84! "")
:::

## おわりに
いかがでしたか？
今回はモールス信号でプログラミングしてみました。

モールス信号ってとっても便利ですね。
あとひと手間加えれば実用性があるかもしれません。

開発体験を向上させたい、モールス信号でプログラミングしてみたい人はぜひ試してみてくださいね。

少しでも皆さんの知見が広がりましたら嬉しく思います。

それでは良い開発ライフを！
　
...-.-（通信終了）
　
 
:::note warn
注意
この記事の内容は個人の意見・感想（ネタ）です。
すべてを真に受けないようにしましょう。
:::

▼追伸
-.-. --- -. ... --- .-.. . .-.-.- .-.. --- --. -.--. .-..-. -.- . -.- -.- -.-- --- -.- ..- .... .- -. . / -.-- .- ... .- ... .. ... .- ... .- . .- . .- .-. . -... .- / .. .. - --- --- -- --- ..- -. -.. . ... ..- .-..-. -.--.-