アスキーアートで作るLTスライド


## はじめに
みなさんはAA(アスキーアート)でLTをしてみたいと思ったことありますか？私はあります。<br>ということで今回はAAでスライドを作る方法を説明していきたいと思います

## ひ つ よ う な も の
 * Ubuntu 20.04(WSL)
 * jp2a (コマンド)
 * スライドを作ることができるSomething
 * Windows Terminal(表示用)
 * Pythonの実行環境
 * AAでLTをしたいという無意味な意欲


## スライドを作る
  そもそもLTというのはスライドが必要です。Power Point等のスライド作成ソフトを開いて任意のスライドを作成してください。



## 作成したスライドをjpeg形式で出力する
jp2aはjpeg画像しかアスキーアートに変換できないという制約がある為、jpeg形式でスライドを出力し、新しく作ったディレクトリに入れておきましょう。また、スライドを動かすためのプログラムの記述を楽にするために、ファイル名を連番(拡張子なし)にします。

jpegで保存されたスライドを1から連番でリネームしてください

※ディレクトリ内のファイルがすべて連番でリネームされます

```sh
 ls | awk '{ printf "mv %s %d\n", $0, NR }' | sh
```


## 試しにjp2aを使ってみる
jp2aをまだインストールしていない方は任意の方法でインストールしてください

```Ubuntu
sudo apt install jp2a
```

jp2a の使用方法

```
jp2a test.jpeg
```
24bit color ターミナル全体に表示 

```
jp2a --color-depth=24 --term-zoom --clear test.jpeg
```
<br>

Tux君をAAにするとこんな感じになります
![スクリーンショット 2020-12-04 003221.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603442/09adb071-d431-6a03-d646-082a8851127a.jpeg)



## スライドを動かす為のプログラムの作成
コマンドを使ってアスキーアートを生成するので、シェルスクリプトのほうが楽なはずなんですが、私は書けないのでPythonで書きます(Pythonもまともに書けない) 

```python

import subprocess
import sys
import tty
import termios
import os
def getch():
   
   fd = sys.stdin.fileno()
   old = termios.tcgetattr(fd)
   try:
      tty.setraw(fd)
      return sys.stdin.read(1)
   finally:
      termios.tcsetattr(fd, termios.TCSADRAIN, old)

# Unicode制御文字のエイリアス
EOT = 3
TAB = 9
ESC = 27
r = 114
# コマンドの設定
number = 1
comand2 = ["jp2a", "--clear","--term-zoom","--color-depth=24","--chars=BBBZKXNWM","1"]
# スライドの最大枚数
counter = len(os.listdir()) -1
subprocess.check_call(comand2)

# メインループ
while True:
   key = ord(getch())
   if key == EOT:
      break
   elif key == TAB:
      #END
      exit()
   elif key == r:
      #restart
      number = 1
      comand2[5] = str(number)
      subprocess.check_call(comand2)
   elif key == ESC:
      key = ord(getch())
      if key == ord('['):
         key = ord(getch())
         if key == ord('A'):
            #up key
            continue
         elif key == ord('B'):
            #down key
            continue
         elif key == ord('C'):
            #right key
            if number == counter:
               continue
            number += 1
            comand2[5] = str(number)
            subprocess.check_call(comand2)
            continue
         elif key == ord('D'):
            #left key
            if number == 1:
               continue
            number -= 1
            comand2[5] = str(number)
            subprocess.check_call(comand2)
            continue
```

## 操作方法
左右キーで操作できます。何らかのコマンドを追加したい場合は上下キーに追加することをおすすめします。また、rキーで最初のスライドに戻ることができます。TABキーを押すと終了します。



## Windows Terminalを使う理由
主に改行関連が関係しています。素のcmd.exeやPowerShellを使った場合改行関連で表示できるアスキーアートの細かさに限度ができてしまいます。Windows Terminalの場合その問題が起きないのでお勧めです。
Windows Terminalの文字サイズを調整して先ほどのコードを実行するとこのようになります
![dokupe_resize_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603442/12905c0d-d00c-ce67-6c45-7da12f28b534.png)
また、jp2a をLinuxコマンドとして使う理由は、何故かWindows版だと表示速度がかなり低下するからです。

## まとめ
* jp2a はjpeg画像しかAAに変換できない
* スライドは任意の方法で書きましょう
* スライドは矢印キーで操作できたら便利

## 参考
* Python3 で 十字キーが入力された判定をとる方法<br>
https://qiita.com/t4t5u0/items/605ad611cc02716e3b98
* ディレクトリ内のファイル名をまとめて変更（連番付与）する<br>
https://qiita.com/NoName/items/fc59849ce7d497a7571a