Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2802

iTermで動く年賀状(寅)を作ってみた

$
0
0
こんにちは、@nininiです。 本記事はハンズラボAdvent Calendar 2021 の21日目の記事です。 はじめに クリスマスもまだですが、そろそろ年賀状を作るリミットですね。 自分はまだハガキも買っていませんが... bashのワンライナーで干支の絵でも書いてほしいと社内でリクエストがありました。 macのターミナルで年賀状っぽいものを作ってみました。 とりあえず動くものだけでも見ていっていただけると幸いです。 ↓来年の干支、トラです 本記事の目的 トラをフニフニ動かして、新年をお祝いする準備をしたかっただけです。 仕事と関係ないことをしております。 動かしていった手順 以下、動かしていった手順を書きます。 泥臭かったり、ひどいプログラムが出てくきます。 環境 mac:Big Sur version:11.6 ターミナル:iTerm2 Build 3.4.14 手順 絵をエクセルで描く 絵の素材をファイルに貼り付ける 変なbashを動かす 1. 絵をエクセルで描く これが一番大変かもしれません。 絵を描いてデジタル化出来るアプリとかもあるみたいですがエクセルで描きました。 2種類書きました(動かしたかったので) 色をつけたいところはセルに文字を書いています。(C10セルは黄色にしたいからyと書く、など) 2. 絵の素材をファイルに貼り付ける B2セル〜AJ20セルをテキストファイルにコピペ→tora-1というファイル名で保存 tora-1 r r r r r r w w w r r b b b y y b b b b b y y y y y y b b b b b b b y y y y y y y y y y y y y y y y y y y y y w w w y y y y y y y y y w w w y y y y y y y w w w y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y AO2セル〜BW20セルをテキストファイルにコピペ→tora-2というファイル名で保存 tora-2 r r r r r r w w w r r y y b b b y y y y y y b b b b b y y b b b b b b b y y y y y y y y y y y y y y y y y y y y y y w w w y y y w w w y y y y y y y w w w y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y 3. 変なbashを動かす さっき作ったtora-1tora-2と同じ階層に置いて実行します。 可読性の「か」の字も無いプログラムです。 nengajou.bash #!/bin/bash for ((;;)) ;do for torafile in $(ls tora-*);do eval echo $(cat ${torafile} | sed 's/ /\t/g;s/ /\t/g;s/\t\t/\t_\t/g;s/\t\t/\t_\t/g;s/r/1/g;s/y/3/g;s/b/4/g;s/w/7/g' | expand | awk 'BEGIN{print "$(tput clear)"}{for(i=1;i<=NF;i++){if($i!="_"){print "$(tput cup "NR,(i*2)-1")$(tput setaf "$i")■"}}}') done sleep 0.1 done exit 0 変なbashについて 説明しよう! 3行目 for ((;;)) ;do ずっとフニフニ動かしたかったので無限ループにしています。 4行目 for torafile in $(ls tora-*);do 作ったtoraファイルを順番に読み込みます。 5行目 ここがひどいプログラムです。分解します。 eval echo $(cat ${torafile} | sed 's/ /\t/g;s/ /\t/g;s/\t\t/\t_\t/g;s/\t\t/\t_\t/g;s/r/1/g;s/y/3/g;s/b/4/g;s/w/7/g' | expand | awk 'BEGIN{print "$(tput clear)"}{for(i=1;i<=NF;i++){if($i!="_"){print "$(tput cup "NR,(i*2)-1")$(tput setaf "$i")■"}}}') tputというコマンドがあります。これがターミナルを制御するのに便利です。 よしなにエスケープシーケンスを発行してくれます。 エスケープシーケンスで書いた方がかっこいいかもしれませんが、途中でわけがわからなくなったのでtputに頼りました。 tput clear:画面をクリアします。 clearコマンドと同じ動きをします。 tput cup <行> <列>:カーソルを左上から指定した場所に移動します。 tput setaf <色番号>:カーソルの色を変えます。 Qiitaのtora-1,tora-2をコピるとタブがスペースになってしまうので、一旦タブ区切りに変換 このプログラムを試していただけるありがたい方用処理(エクセルコピペ時は不要) sedコマンドで実施しているs/ /\t/g;s/ /\t/g; タブ区切りなっているので、スペース区切りに変換する sedコマンドで実施しているs/\t\t/\t_\t/g;s/\t\t/\t_\t/g expandコマンド 色を指定するコードを文字から数字に変更 sedコマンドで実施しているs/r/1/g;s/y/3/g;s/b/4/g;s/w/7/g 文字を出す場所、出す色、出す文字を指定 awkコマンドで色々やっています 色が指定されている座標を出力しています。($(tput cup 15 9)など) NRで行番号、(i*2)-1で列番号。出力する文字が■でマルチバイトなので、それに合わせています 指定された色を出力するための文字列を出しています。($(tput setaf 3)など) evalを実行する前はこんな文字列が続いていきます。1つのプロットごとに位置指定→色指定→■を出力をする形になります。 最初の$(tput clear)ですでに描画されている絵を一度消しています。 $(tput clear) $(tput cup 2 59)$(tput setaf 1)■ $(tput cup 2 61)$(tput setaf 1)■ $(tput cup 3 57)$(tput setaf 1)■ $(tput cup 3 59)$(tput setaf 1)■(続く...) そして、eval echoでこれらの文字列を実行して絵を描いています。 7行目 無限ループさせているのでsleepも入れています。 暴走は怖いですからね。 まとめ ここまで読んでいただいた方、ありがとうございます。 トラの動きは、個人的には気に入ってます。 久しぶりに無意味なプログラムが書けて楽しかったです。息抜き大事。 実際に業務で書くプログラムは、可読性重視で行きたいと思います。

Viewing all articles
Browse latest Browse all 2802

Trending Articles