やっふぁい!一ヶ月ぶりの更新です。SOZ!
roadtoalinuxmintuser

theming

roundup
Shell :シェルスクリプトを組もう! Zenity 編 01:44

イントロ


例えば、あなたがゲーム開発者であったとしましょう。開発の過程で、テクスチャアトラスから座標を取得しゲームコードに記述する作業があります。ん?何を言っているか分かりませんか。テクスチャアトラスとは下の画像のように、一つのキャラクター(別に複数でも可)に対して全ての部品をまとめ画像のことを指します。一つのポーズにつき一枚の画像を用意するのは効率が悪いため、ゲーム開発やウェブサイトの画像の読み込みなどでよく使われる手法です:


このテクスチャアトラスから切り取りたい部分を座標で指定する必要が出てくるのですが、座標を指定するのに 4 つの数字を覚える必要が有り、疲れているときは覚えることが出来ず、一つ一つ数字を確認しながら、
Alt
+
Tab
で画像編集ソフトとテキストエディターを行き来します:


もし、テキストボックスがあるポップアップウィンドウをショートカットキーで表示させ、その中に入力した文字列が直接クリップボードに保存され、2つのアプリをいちいち切り替える必要なく座標をテキストエディターに入力できたら素敵だと思いませんか。

何が言いたいのかアニメーション GIF で示したいと思います:


Unix の哲学


何か効率化したいと思ったら、Unix の哲学を思い出しましょう:

  • 各プログラムが一つのことをうまくやるようにせよ。
  • プログラムは組み合わせて作れ。
  • 単純なテキストファイルにデータを格納せよ。

つまり、あなたが望んでいることをしてくれるプログラムは、すでに存在する小さなプログラム(コマンド)を組み合わせることで実現できる可能性がとても高いということです。

クリップボードに文字をコピーするコマンド


端末を起動し xsel というクリップボードにコピーしたり、クリップボードの中身を取得したりできるパッケージをインストールしてみて下さい:
sudo apt install -y xsel
次のコマンドを実行してみてください:
echo "ここがコピーされます。" | xsel --clipboard
そしたら、テキストエディターなどにクリップボードの中身を貼り付けてみましょう。
ここがコピーされます。
と入力できたはずです。echo の出力をパイプで xsel に渡してクリップボードにコピーしたのです。上述した Unix の哲学に帰れば、なぜ Bash があのように醜く、それでいてこのように素晴らしいものなのか分かるのではないでしょうか。誰かがすでにクリップボードにコピーするという機能を持った小さなプログラムを作成してくれているので、自分で 1 から作る必要がありません。

簡易 GUI アプリの作成


自分が初めて Zenity に出会った時、なんて賢く、なんてシンプルなんだろうと驚きを隠せませんでした。たった一行の文字列ベースの Bash スクリプトが便利な GUI アプリに変貌するのです。


ここで必要とするパーツはエントリーボックスです。エントリーボックスは文字列を入力するためのパーツです。端末で以下を実行してみてください:
zenity --entry
入力した文字列が戻り値として返されます。zenity の戻り値を xsel に渡せば、必要としているものが完成しそうです。

小さなプログラムにまとめる


端末で以下を実行しましょう:
zenity --entry | xsel --clipboard
見事です。最後に、スクリプトにまとめて、実行権限を付加し実行してみましょう。以下のコマンドはそれらのすべてを行います:
echo -e '#!/bin/bash' > handy-clipboard.sh && echo 'zenity --entry | xsel --clipboard' >> handy-clipboard.sh && chmod +x ./handy-clipboard.sh && ./handy-clipboard.sh
完成です。Unix の哲学の恩恵を得て、Unix の哲学に貢献するような小さなプログラムを作り上げたのです。

値を取得する


zenity --entryで表示されるダイアログに入力される文字列をクリップボードではなく、プログラムの中で使いたい場合はどうすればよいでしょうか。以下を実行してみて下さい:
x=$(zenity --entry)
echo $x

入力した文字列が端末に表示されましたか?

つまり、
変数名=$(zenity のコマンド)
という書式になっています。使うときは
$変数名
というふうに $ マークを変数名の前につけるだけで OK です。

しかし、もっと簡潔な方法があります。次のコマンドは上のものとほぼ同じ結果をもたらします:
zenity --entry; echo $?

これらのダイアログボックスを抑えておけば大丈夫


入力


今まで、エントリーボックスを使ってきましたが、--title でボックスのタイトルを、--text で文字を添えることができます:
zenity --entry --title "質問" --text "アニメキャラクターは誰が好きですか?"
初期値を表示するには --entry-text を使います:
zenity --entry --title "質問" --text "アニメキャラクターは誰が好きですか?" --entry-text "初音ミク"


質問


質問内容が Yes か No で答えられるようなものであればこちらが用意されています:
zenity --question --text "初音ミクは好きですか" --ok-label "大好きです" --cancel-label "好きです"


zenity --question ダイアログでは

  • OK なら 0
  • Cancel なら 1
  • タイムアウトなら 5
を返します。なので、それぞれの処理を case 文で分けたり:
case $? in
0) echo "Yes"
;;
1) echo "No"
;;
*) echo "Timeout"
;;
esac

if 文で 1 であれば即プログラムを終了させたりできるわけです:
if [ $? == 1 ]; then exit; fi

メッセージ・通知


その際、エラーとして終了するのであれば以下のようなメッセージボックスが作れます:
zenity --error --title "エラー" --text "プログラムを実行中エラーが発生しました。プログラムを終了します。"


単に終了するよと言いたければ --info が良いかもしれません:
zenity --info --title "終了" --text "キャンセルが押されたので終了します。"


警告として表示する場合は --warning を使います:
zenity --warning --title "終了します" --text "終了すると入力された値は破棄されます。"


メッセージをウィンドウではなく、通知としてそれとなく表示させたい場合はこうします:
zenity --notification --text "処理が終わりました。"


色を付けるときは html タグで


表示する文字に色を付けることができます。その時は html タグと同様の使い方をします:
zenity --info --text "
<span color=\"red\">red</span>
<span color=\"green\">green</span>
<span color=\"blue\">blue</span>
<span color=\"yellow\">yellow</span>
<span color=\"magenta\">magenta</span>
<span color=\"white\">white</span>
<span color=\"black\">black</span>
<span color=\"gray\">gray</span>
<span color=\"lightblue\">lightblue</span>
<span color=\"lightgray\">lightgray</span>"



目盛り


入力される値は文字列だけとは限りません。数値のときもあるでしょう。便利なダイアログが用意されています:
val=$(zenity --scale --text "1 から 30 までの値を選んで下さい。" --min-value 1 --max-value 30 --value 20 --step 1)
echo "入力された値は "$val" です。"



カレンダー


数値は数値でも日付であれば --calendar を使います:
date=$(zenity --calendar --text "日付を選んで下さい。")
echo "$date"



リスト


はじめから用意された項目から選んでほしいときは --list を使います:
extension=$(zenity --list --title "拡張子を選んで下さい" --text="拡張子を選んで下さい。" --column "拡張子" MOD mp4 avi mpg mkv mov MOV)
echo $extension



カラムは増やせます:
extension=$(zenity --list --title "拡張子を選んで下さい" --text="拡張子を選んで下さい。" --column "拡張子" --column "音楽・映像" mp4 映像 avi 映像 mpg 映像 acc 音楽 mp3 音楽)
echo $extension



リストでチェックボックスを使用できます(True or False はデフォルトでチェックを入れるか入れないかを示しています):
zenity --list --checklist --column "チェック" --column "ペット" True 犬 False 猫 True ハムスター


ラジオボタンも同様に可能です(True or False はデフォルトでチェックを入れるか入れないかを示しています):
zenity --list --radiolist --column=Selected --column "ペット" False 犬 False 猫 True ハムスター


ファイルチューザー


ファイルを選んでほしいときは --file-selection を使います。これだけだとファイルを指定できます:
file=$(zenity --file-selection --text "ファイルを選んで下さい。")
echo "$file が選ばれました。"



--directory を追加すれば選べるのはディレクトリだけになります:
folder=$(zenity --file-selection --directory --title "ディレクトリを選んで下さい")
echo $folder

--multiple を追加すれば複数指定できるようにできます:
files=$(zenity --file-selection --multiple --text "ファイルを複数選んで下さい。")
echo "$files が選ばれました。"

保存先用のダイアログも表示できます:
zenity --file-selection --save


フォーム


フォームもこのように作成できます:
zenity --forms --add-entry "ユーザー名" --add-password "パスワード" --separator ","


user=$(zenity --forms --add-entry "ユーザー名" --add-password "パスワード" --separator ",")
echo $user
としたときに、例えばユーザー名に「初音ミク」、パスワードに「pass」と入力し [ OK ] を押せば、以下の結果が返ってくるはずです:
初音ミク,pass

つまり --separator で指定した文字(ここでは ,)で仕切られた文字列が返ってきます。入力された値を使うにはどうにかして「,」で切り分ける必要があります:
username=$(awk -F, '{print $1}' <<<$user)
password=$(awk -F, '{print $2}' <<<$user)

これで、それぞれの値が $username と $password に格納されます。

プログレスバー


プログレスバーも実装できますが、少し難しいです。まず基本的には以下のとおりです。--percentage は 0 から 100 までの値を取ることができます:
zenity --progress --percentage=10


具体的にどれくらいと表示するのが難しいかも知れません。そのときは左右行ったり来たりするバージョンを使うといいでしょう:
zenity --progress --pulsate
100% になったときプログレスバーが自動的に消えてほしい場合は --auto-close を追加します:
zenity --progress --auto-close
1 から 10 まで数えてその分増えていくプログレスバーはこのようになります:
percent=0;
for num in 0 1 2 3 4 5 6 7 8 9 10; do
echo $percent
echo "# $num"
percent=$(($percent + 10));
sleep 1
done | zenity --progress --text "Counting..." --percentage=0

複数行に渡る文字列を表示する


--text-info はテキストファイルから表示したい内容を読み込むときに使います。以下の例では GPLv3 のライセンスを表示します:
zenity --text-info --filename "/usr/share/common-licenses/GPL-3"


テキストエリアのように編集できるエリアにしたい場合は --editable をつけます:
zenity --text-info --editable

カラーパレット


使う機会はそこまでないかも知れませんが、カラーパレットも表示できます:
color=$(zenity --color-selection --show-palette)


汎用性のあるパラメーター


次のパラメーターは上述した大抵のウィジェットで使えます:

  • --title "タイトル"
  • --height 400
  • --width 300
  • --icon-path "/usr/share/icons/Mint-X/categories/32/gnome-multimedia.png"

例えば、先程出したこのエラーメッセージは少々不格好です:


そこで幅を指定することでスッキリさせることができます:
zenity --error --width 350 --title "エラー" --text "プログラムを実行中エラーが発生しました。プログラムを終了します。"


音楽ファイル変換スクリプトを組んでみる


ここからは ffmpeg と zenity の力を借りて音楽を変換する簡易的なスクリプトを作成していきます。FFmpeg がインストールされていなければして下さい:
sudo apt install -y ffmpeg
#!/bin/bash
#変換するファイルを選ぶ
source=$(zenity --file-selection --title "変換するファイルを選んで下さい")
echo $source
#ユーザーがキャンセルするか閉じたらスクリプトを終了する
if [ $? == 1 ]; then exit; fi

#変換先のファイル形式を尋ねる
ext=$(zenity --list --title "変換先のファイル形式を選んで下さい" --text "変換先のファイル形式を選んで下さい" --column "拡張子" mp3 ogg flac wav)
echo $ext
#ユーザーがキャンセルするか閉じたらスクリプトを終了する
if [ $? == 1 ]; then exit; fi

#出力先を尋ねる
dest=$(zenity --file-selection --directory --title "出力先を選んで下さい")
echo $dest
#ユーザーがキャンセルするか閉じたらスクリプトを終了する
if [ $? == 1 ]; then exit; fi

#ファイル名を拡張子抜きで取得
filename=$(basename -- "$source")
filename="${filename%.*}"

ffmpeg -i "$source" -ab 320k -map_metadata 0 -id3v2_version 3 "$dest"/"$filename"."$ext"

zenity --notification --text "処理が終わりました。"

簡単に作ったので複数のファイルを指定したりはできないですが、立派に GUI アプリを作れた感じがします:


利便性を良く


このままでは端末からスクリプトを実行しないといけなくなるので、ショートカットキーに割り当てましょう。ミントメニューから [ キーボード ] -> [ ショートカット ] -> [ カスタムショートカット ] -> [ カスタムショートカットを追加 ]:


ショートカットキーの割当は [ 未割り当て ] をクリックして希望のショートカットキーの組み合わせを押します。例えば
Ctrl
+
Alt
+
F
にしました:


これで
Ctrl
+
Alt
+
F
を押すことでいつでもスクリプトを走らせることができます。

Linux 文化は手作り文化


zenity によって簡単なやりとりなら GUI でできることを示しました。シェルスクリプトと ffmpeg や youtube-dl などのコマンドとこの zenity を組み合わせれば、簡単な GUI アプリが作れてしまうわけです。zenity の存在は(クロスプラットホームに対応しているとは言え)間違いなく Linux を使う理由の一つとなるはずです。

参考元 : medium.com, YouTube
<< NEW | TOP | OLD>>
スポンサーサイト 01:44
| - |

Show some apps list:


miku

Follow on your feed reader:


About this blog:

Linux Mint-centric chronicle with anime girls since 2009.Best View with Google Chrome 1980x1080 dimension.
Info 更新は不定期です。

script

LinuxMint ISO 日本ミラーサーバー:




Amazon: