第63回シェル芸勉強会 大阪サテライト レポート

2/25(土) に開催された、第63回シェル芸勉強会 大阪サテライト会場の様子をレポートします。

案内

大阪サテライトの様子

今回大阪サテライトは、4名の方に参加していただきました。 東京会場が久々の現地開催だったのですが、上田先生が参加者の反応や様子を確認しながら進められていたようで、いつもの様子が戻ってきたなという、ちょっとした安心感がありました。 大阪では、YouTubeの配信にTwitterでツッコミを入れつつ、参加者同士で解き方を共有しながら問題に取り組んでいました。

今回個人的に勉強になったのは問題3の解き方で、uniqコマンド-s-fオプションで、先頭の文字やフィールドを読み飛ばして比較できるというものでした。 これは覚えて使いこなせるようになりたいです。

おやつタイム

便器型のもなかをバリボリと食すシェル芸人たち。

LT

1件の発表をしていただきました。

www.youtube.com

音声合成してみよう」 - たいちょーさん

speakerdeck.com

たいちょーさんの音声データを自由に組み合わせられるエンドポイントを不用意に公開してしまうと、やっぱりシェル芸人のオモチャになってしまいますね。 発表ありがとうございました。

おわび

シェル芸を実行する環境として、募集ページには

UNIX 環境のあるノート PC(MacWindowsでも可) ※Windows で参加している人もたくさんいますのでご安心ください。 (WSL・Docker・Cygwin・MSYS2・Git bashBash on WindowsChromebook など)

と記載したままずっと変更していなかったのですが、Git Bashでは問題リポジトリの取得ができないと報告がありました。

第33回の問題ファイルに、改行入りのパスが含まれており、それが Git for Windows(Git Bash)でうまく扱えないようでした。すみません。 次回の募集ページではこの表記を修正しておくようにします。

ちょっと試してみた

勉強会後に、Gitのスパースチェックアウトを使って、必要なファイルだけチェックアウトできないか試してみましたが、これはうまくいきませんでした。

git sparse-checkoutを使ってみる

別の方法として、curlGitHubAPIにアクセスして、必要なファイルだけ取ってくる方法を考えてみました。 別途Windows版のjqコマンドをインストールする必要がありますが、この方法であれば必要なファイルだけ取得することができると思います。Git LFSには対応しないと思いますが。

GitHubapi経由で必要なファイルを取得

$ curl -s https://api.github.com/repos/ryuichiueda/ShellgeiData/contents/vol.63 | jq -r '.[] | "curl "+.download_url+" -o "+.name' | sh

あるいは、GitHubにはリポジトリのZipアーカイブを生成してダウンロードする機能があるので、こちらを利用する方が楽で良いかもしれません。

Zipアーカイブでダウンロードする

$ curl -sL https://github.com/ryuichiueda/ShellGeiData/archive/refs/heads/master.zip -o ShellGeiData.zip

いくつかの方法を考えてみましたが、Git Bashにはパッケージマネージャーがなく、勉強会中に紹介されるコマンド類をインストールするのが難しいため、自身で環境を整備するのに慣れている玄人向きかなと思います。 Windows環境でシェル芸を試される場合は、WSL2上にUbuntu環境を用意していただくと、出題者の環境とほぼ同様になるため、トラブルが少なくて良いかなと思います。 GitでのShellGeiDataリポジトリのチェックアウトも、特に問題ありませんでした。

Ubuntu on WSL2を使う

2/27 追記

CygwinのGitでは問題ないようでした。

くんすとさんによると、Gitのスパースチェックアウトに加えて、protectNTFS 機能を無効化することでチェックアウトできるようでした。

blog.kunst1080.net

おわり

今回もご参加いただき、ありがとうございました。 また次回もよろしくお願いします。

第62回シェル芸勉強会 大阪サテライト レポート

12/3(土) に開催された、第62回シェル芸勉強会 大阪サテライト会場の様子をレポートします。

案内

大阪サテライトの様子

前々回は京都でサテライト開催しましたが、大阪でのサテライトは2020年2月に開催された第46回以来、3年弱ぶりの開催となりました。 今回大阪サテライトの参加者は3名で、いずれも複数回参加されている方だったため、YouTube の配信を見て雑談しながら各々のペースで問題を解いていました。 最後の6問目以外は呻き声が上がることもなく、ちょいうど良い手応えだったかなと思います。

今回個人的に勉強になったなーと思ったのが、問題2の回答例で xargs -n 1 bash -c 'echo $0' のように xargs から bash に渡された引数を位置パラメータとして参照しているところでした。

Man page of BASH より:

-c string

-c オプションが指定されると、コマンドが string から読み込まれます。 string の後に引き数があれば、これらは 位置パラメータ (positional parameter: $0 から始まるパラメータ) に代入されます。

パイプを通して受け取った文字列を xargs で後続のコマンドに渡したいときは -I オプションを使えば良いやとずっと考えていたため、こんなやり方もあるんだなあと新鮮でした。

Man page of XARGS より:

-I replace-str

initial-arguments 中で文字列 replace-str が現れるすべての箇所を、標準入力から読み込んだ名前で置き換えます。 なお、標準入力中にクォートされていない空白があっても、 それは入力項目の区切りにはなりません。 区切り文字は改行文字だけになります。 -x-L 1 の指定を暗に含みます。

注意して使い分ければ、今までちょっと困っていたケースのいくつかが解決できそうな気がします。

LT

2件の LT 発表をしていただきました。

「デーモンスレイヤー ワタナベ」 - たいちょーさん github.com

「魔術式シェル芸」 - takaさん speakerdeck.com

YouTube での録画には入っていませんが、この後 Discord での質疑応答も行われていました。 まるでゼミ発表のよう。

このあと、参加者で近くの居酒屋に行って 2 次会をしていたのですが、各地の渡辺ゆかりの場所やルーン文字研究の話が聞けて、とても興味深かったです。 紹介された本をちょっと読みたくなってしまいました(また積み本が増える)。

おわり

今回も楽しく、とても学びのある勉強会でした。 会場に集まれると、問題の解き方のアプローチを隣の人に相談してみたり、一緒に頭を抱えたりできるのが良いですね。

シェル芸勉強会は今回で10周年だそうです。 いつも参加・運営していただいているみなさま、ありがとうございます。 参加者と一緒に、毎回少しずつ学びを増やしていけたら嬉しいです。

第46回シェル芸勉強会 大阪サテライト レポート

2/14(土) に開催された第46回シェル芸勉強会 大阪サテライト会場の様子をレポートします。

案内

福岡はお休み。

あと今回は箱根でもサテライト会場が開かれたようです。楽しそう。

今まで ATND で募集ページを作成していましたが、4月にサービス終了になるようなので、connpass に引っ越しました。 ATND の過去の募集ページも connpass に取り込みましたが、参加者などの情報は移せないようでした。 参加コメントの大喜利も消えてしまいますが、まぁシェル芸なんて書き捨てのものなので良いでしょう。

大阪サテライトの様子

東京会場では例年この時期は参加者数が減るそうですが、大阪は久々に募集人数を超える応募がありました。 あまり大人数になってしまうと、会場スタッフが確保できずにアタフタしてしまうので、今のところ募集枠の拡大は考えておらず、このくらいの人数でやっていければ良いなと思っています。 参加者10名中、4名の方が初参加でした。

ホワイトボードを使って Q8 の枝刈りをする様子。

LT は無く、東京の様子を見ていました。

おわりに

アルゴリズム事典からの出題をシェル芸で解くということで、また知らない awk の使い方を学ぶことができました。 上田先生が冒頭に話されていましたが、普段使わない頭に、たまに負荷をかけて問題を解くのは面白いですね。

参加いただいた方、運営に協力頂いた方、そして主催の上田先生、ありがとうございました。 次回は4月頃ですかね。またよろしくお願いします。

ダウトー。

第45回シェル芸勉強会 大阪サテライト レポート

12/28(土) に開催された第45回シェル芸勉強会 大阪サテライト会場の様子をレポートします。

案内

午前の部

元々午前の部は予定されていませんでしたが、ぷる(@butackle66)氏が JavaScript の非同期処理について、ストリーミング配信で講義してくれました。

シェルの世界とは異なり、JavaScript では GUI の様々デバイスや I/O を同時に安全に効率よく扱うため、シングルスレッドであったり、非同期処理という方法が提供されているんだと思います。 このような制約のある状況で処理することは普段あまりないので、聞いてていろいろ考えてみることになり、勉強になりました。ありがとうございます。

ぷる氏も講義中に話されていましたが、聞き手の直接の反応が見えない配信は、やっぱり結構不安になってしまいますね。 聞いている方はラジオ番組を聴きながら、同じ番組を聴いてるリスナーと Twitter でワイワイする感じで、結構良かったのですが。

大阪サテライトの様子

参加者は5名、うち3名が初参加でした。 初めましての方は、(いつものことですが)午後のシェル芸問題にほとんど手が出なかった模様。 普段から触ってないと難しいもんね...。

会場の WiFiSSID とパスワードを QR コード生成ワンライナーで表示してみたのですが、あまり馴染みのない文字列で、初参加者には通じませんでした。残念。

twitter.com

LT

www.youtube.com

「シェル芸のおかげでUnicodeに怯えず楽しめるようになった話」 - taka(@amanoese)さん

twitter.com

帰省先からリモートで発表していただきました。 発表で紹介された kana2ipa と、東京の LT で kanata さんが紹介された ivsteg は、早速シェル芸botに追加してもらいました。

「ワタナベシェル」 - たいちょー(@xztaityozx_001)さん

www.slideshare.net

午後の勉強会の問題にもなっていた noc を入力にも出力にも使って完全 nabe 化されたシェル。 本人も読めてなかったよこれ。

配信メモ

OBS で配信してるんですが、macOS を Catalina にアップデートしてから、画面のキャプチャがうまくいかなくなっていました。 Catalina から、ウィンドウ・画面をキャプチャするアプリケーションに対して、個別にシステム設定から画面収録を許可しなければならなくなったようですが、OBS がアプリケーションの一覧に出てこなくて困っていました。

qiita.com にあるように、ターミナルから OBS を起動し、ターミナルに対して画面収録を許可することで、回避できました。 ただこれだと、ターミナルから起動する全てのアプリが許可されるようで、あまり良くない気もしますが。

おわり

年末の忙しい時期に、皆さん集まっていただき、ありがとうございました。 楽しいシェル芸納めができました。来年もよろしくお願いします。

X11シェル芸

この記事はシェル芸 Advent Calendar 2019 12日目の記事です。 当初 Qiita に投稿していましたが、こちらに引っ越しました。

X11シェル芸とは

X Window System(X11)上のGUIアプリケーションを操作するシェル芸です。 こんなやつ。

デスクトップ版のLinuxディストリビューションxeyesを実行すると、マウスカーソルを追いかける目玉のアプリケーションが動きます。 このようなGUIアプリケーションを、シェル芸botのような、デスクトップのない環境で実行しようというチャレンジです。

準備

Ubuntuで、以下のパッケージをインストールします。

  • xvfb
    • X11の仮想フレームバッファを提供するコマンドで今回の主役
    • 物理的なディスプレイがなくても、コイツとメモリがあればマルチディスプレイも余裕だ
  • x11-apps
    • xeyesなどの楽しいX11アプリケーション詰め合わせ
  • x11-utils
    • X11環境を便利に使うツールのお得な詰め合わせ
    • ここではxwininfoを使う
  • xdotool
  • imagemagick
    • 画像処理なら任せろ

ウィンドウマネージャ等は必要ないので省きます。 Docker環境で試せるよう、Dockerfileを用意しておきました。

FROM ubuntu:19.10
RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends \
    xvfb x11-apps x11-utils xdotool imagemagick \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

Dockerfileというファイル名で保存し、次のようなコマンドでDockerイメージをビルドできます。

$ docker image build -t shellgeiadv .

Dockerコンテナを起動します。実行するGUIアプリケーションのスクリーンショットを出力するため、./imagesをボリュームマウントしておきます。

$ docker container run -it --rm -v $(pwd)/images:/images shellgeiadv

仮想フレームバッファを準備する

この状態でxeyesを実行すると、ディスプレイが開けねーぞって怒られます。そりゃあそうです。

# xeyes
Error: Can't open display:

なので、Xvfbを使って、仮想的なディスプレイを用意してやります。

# Xvfb :1 -screen 0 320x240x8 &
[1] 8

:1はディスプレイサーバーの番号、-screenはディスプレイサーバーに紐付くスクリーン番号(0)の解像度(幅:320 x 高さ:240)x 色深度(8bit)の指定です。バックグラウンドで起動するため、&を付けています。 こんな極小ディスプレイはほとんどないと思いますが、仮想ディスプレイなら簡単に作れちゃいます。

X11アプリケーションは、DISPLAY変数に設定されたディスプレイサーバー番号にウィンドウを表示するため、Xvfbで作成した仮想ディスプレイの番号(:1)を設定しておきます。

# export DISPLAY=:1

xeyesを実行する

こちらもバックグラウンドで実行しておきます。

# xeyes &
[2] 11

ターミナルには何も表示されないため、動いているのかよくわかりませんが、psでプロセスを確認すると、ちゃんと動いているようです。

# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
    8 pts/0    00:00:00 Xvfb
   11 pts/0    00:00:00 xeyes
   12 pts/0    00:00:00 ps

xwininfoを使うと、仮想ディスプレイサーバーに配置されたウィンドウの位置が、なんとなくわかります。

# xwininfo -display :1.0 -root -tree

xwininfo: Window id: 0x4d (the root window) (has no name)

  Root window id: 0x4d (the root window) (has no name)
  Parent window id: 0x0 (none)
     1 child:
     0x20000a "xeyes": ("xeyes" "XEyes")  150x100+0+0  +0+0
        1 child:
        0x20000b (has no name): ()  150x100+0+0  +1+1

画面をキャプチャする

xwd(X Window System window dumping utility)を使って、ディスプレイのスクリーンキャプチャを取得することができます。 XWD形式のフォーマットで出力されますが、ImageMagickconvertで処理することができます。

# xwd -display :1 -root | convert xwd:- /images/xeyes.png

Dockerホストの./images/xeyes.pngに次のような画像が生成されていると思います。 f:id:horo1717:20200326012054p:plain

ウィンドウを操作する

xdotoolを使ってウィンドウを移動してみます。xdotoolでウィンドウを操作するには、ウィンドウIDを取得する必要があります。先のxwininfoより、xeyesのウィンドウIDは0x20000aと表示されましたが、環境によって変わる可能性があるため、xdotool searchを使って、ウィンドウ名で検索した結果を利用します。

# xdotool search --name xeyes
2097162

xeyesのウィンドウサイズは、先のxwininfoより、150x100となります。 また、xdotoolで次のように取得することもできます。

# xdotool getwindowgeometry 0x20000a
Window 2097162
  Position: 0,0 (screen: 0)
  Geometry: 150x100

これらの座標を元に適当に計算し、ウィンドウをディスプレイの中心に配置してみます。

# xdotool search --name xeyes | xargs xdotool getwindowgeometry | awk -F'[x ]' 'NR==1 {printf $2" "} NR==3 {print (320-$4)/2, (240-$5)/2}' | xargs xdotool windowmove

スクリーンキャプチャを取得してみると、寄り目が現れます。

# xwd -display :1 -root | convert xwd:- /images/xeyes_center.png

f:id:horo1717:20200326012200p:plain

シェル芸botで実行する

ここまでの内容を、適当にスクリプトとして実行します。バックグラウンドで動作するコマンドを連続して実行すると、前のコマンドの実行が間に合わないことがあるため、適当にsleepを挟んでおくと良いでしょう。

Xvfb :1 -screen 0 320x240x8 & sleep 1
export DISPLAY=:1
xeyes & sleep 1
xdotool search --name xeyes \
| xargs xdotool getwindowgeometry \
| awk -F'[x ]' 'NR==1 {printf $2" "} NR==3 {print (320-$4)/2, (240-$5)/2}' \
| xargs xdotool windowmove & sleep 1
xwd -display :1 -root | convert xwd:- /images/x.png

シェル芸botは、バックグラウンドプロセスが動きっぱなしでも実行結果ツイートしてくれますが、SGWebで実行する場合は、バックグラウンドプロセスも終了させておく必要があるため、timeoutコマンドで指定秒数後に停止するよう仕込んでおくと良いでしょう。

timeout 5 Xvfb :1 -screen 0 320x240x8 & sleep 1
DISPLAY=:1 timeout 3 xeyes & sleep 1
xdotool search --name xeyes \
| xargs xdotool getwindowgeometry \
| awk -F'[x ]' 'NR==1 {printf $2" "} NR==3 {print (320-$4)/2, (240-$5)/2}' \
| xargs xdotool windowmove & sleep 1
xwd -display :1 -root | convert xwd:- /images/x.png

おわりに

シェル芸botでxeyesを表示するだけではあまり面白くないですが、GUI環境をコマンドラインから扱えると、ちょっと嬉しいことがあるかもしれません。たとえば、GUIアプリケーションをデスクトップに並べてパズルとして遊ぶとか。そういえば昔、LinuxサーバーにXvfbとLibreOfficeを入れて、sofficeコマンドを使ってヘッドレスでOfficeドキュメントをPDFに変換していたこともありましたね。そんな感じで、GUI環境もコマンドラインから扱えると、作業が捗りそうです。 楽しいシェル芸ライフを。

第44回シェル芸勉強会 大阪サテライト レポート

10/26(土) に開催された第44回シェル芸勉強会 大阪サテライト会場の様子をレポートします。

案内

今回松江はお休み。 1年ぶりに福岡サテライトが開催されました。

大阪サテライトの様子

参加者は4名、いつも参加されているメンバーでした。

久々の午前の部はぷる氏による JavaScript のオブジェクトについての講義。 個人的にはとても苦手意識のある JavaScript について解説していただきました。 JavaScript がこんなにややこしい仕様になっているのは、長い歴史の積み重ねがあるからでしょうか...?

講義中、いつもはうんこばかり流れているシェル芸タイムラインに、とても有用な情報が流されていました。 講師からの一方向のお話ではなく、参加者皆の知見が集まるのは素晴らしいです。

午後の部の前半4問は、数独をシェル芸で段階的に解いていくものでしたが、2問目の難易度がとても高かったように思います。 行指向でデータを扱うため、前後の行にあるデータも利用できるように工夫することが求められているようでした。

LT

www.youtube.com

「-(横線)難読化シェル芸」 - MSRさん

speakerdeck.com

Unicode には 64 以上もの横線が収録されているそうです。大体一緒だろ。

横線を利用した新たなエンコード手法と、その実装の horizon コマンドを提案されました。

「structured-text-tools の紹介」 - 小原 一哉さん

dbohdan/structured-text-tools にまとめられている構造化テキスト処理ツールの中から、3つをピックアップして紹介されました。

発表内では csvquote のメリットが少し理解しづらかったのですが、後で調べてみてとても有用だなと思ったので、ついでに紹介してみます。

CSV では、"..." (ダブルクォート) 内の , (カンマ) をフィールドセパレータとして、改行をレコードセパレータとして扱わないようですが、そのようなデータを、awk, sort, cut のような UNIX コマンドで扱おうとすると、少し困ります。

例えば、以下のようなデータを2フィールド目でソートしたい場合。

$ cat sample.csv
unko,3
"u,nk,o",5
"un
ko",2

csvquote を通すと、ダブルクォート内のカンマは 0x1f (US; ユニット区切り)、改行は 0x1e (RS; レコード区切り) に置換されます。

$ cat sample.csv | csvquote | xxd
00000000: 756e 6b6f 2c33 0a22 751f 6e6b 1f6f 222c  unko,3."u.nk.o",
00000010: 350a 2275 6e1e 6b6f 222c 320a            5."un.ko",2.

この状態で sort を実行し、csvquote -u で置換された文字を元に戻すことができるようです。

$ cat sample.csv | csvquote | sort -t',' -k2n | csvquote -u
"un
ko",2
unko,3
"u,nk,o",5

ちょっと扱い辛かった CSV がとても扱いやすくなって良い感じです。

紹介された GitHub リポジトリには、他にも便利そうなツールがたくさん紹介されていました。

「柿と杮(かきとこけら)」 - たいちょーさん

www.slideshare.net

かきとこけら。一緒だろ(2回目)。

でバイナリを表現する手法と、その実装の kakikokera コマンドを提案されました。 こけらと同じく、肺の字のつくりは市ではないそうです。 しらなんだ。


LT で紹介されたコマンド類は、早速シェル芸botに追加してもらいました 🙌

おわり

久々に終日の勉強会となりとても疲れましたが、学びの多い一日でした。 講師の方、LT発表された方、参加された皆さま、ありがとうございました。 次回は年末頃でしょうか。またよろしくお願いします。

第43回シェル芸勉強会 大阪サテライト レポート

8/10(土) に開催された第43回シェル芸勉強会 大阪サテライト会場の様子をレポートします。

案内

大阪サテライトの様子

今回はいつもの場所が利用できなかったため、大阪工業大学さんの教室をお借りして開催しました。 参加者は6名、うち1名の方が初参加でした。

全員初心者宣言をする大阪サテライト民。

勉強会前半の問題はけっこう解けている人もいたのですが、休憩を挟んで後半は難しかったです。 解き方のヒントになりそうなものは、シェル芸botのツイートでちらほら見たことがあるのですが、実際に手を動かして取り組んでいないと、ぱっと手段が思いつかないですね。

LT

今回も2つ発表していただきました。 どちらもとても面白くてヤバい発表だったので、是非動画で見てください。

録画

www.youtube.com

「難読化PowerShell芸入門」 - たいちょー さん

www.slideshare.net

シェルを触っていると難読化してしまう病気を患っているらしい、ゆるふわお嬢様系難読化シェル芸人さん。 今回は PowerShell での難読化について語っていただきました。

料理番組のように「できましたー」と手際よく難読化されていくコマンド。 最終的に bashPowerShell の難読化が合わさってますます意味分からんぞ...。

「VUIでシェル芸を実行できるようにしてみた」 - taka さん

speakerdeck.com

アクセラ(アレクサと発音すると Alexa が反応してしまうためこう呼んでいた)に任意のシェル芸を実行させるための、厨二めいた呪文の詠唱がとんでもなくやばかったです。 ゲラゲラ笑いたいのに、アクセラの邪魔をしちゃダメなので、笑いをこらえるのにみんな必死。 すごく真面目にイタい呪文を唱える、最高の LT でした。

そのた

勉強会中にコマンドを追加した

勉強会 の Q3 で IPv4 アドレスの10進2進変換問題が出ました。 bcdc コマンドで基数変換ができるのですが、ipcalc という便利なコマンドがあれば一発で求めることができるそうです。 シェル芸botには ipcalc は入ってなかったのですが、せっかくふるつきさんから ShellgeiBot-Image リポジトリのコミット権をもらってるので、勉強会中にしれっと追加 しちゃいました。

おわり

終始とても楽しい勉強会でした。 主催の会長さん、参加いただいた皆さん、LT で発表していただいた方、運営を手伝って頂いた方、会場を貸して頂いた大阪工業大学さん、ありがとうございました。

$ owari kan -g -a so

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
|        終        |
|    制作・著作    |
|   ̄ ̄ ̄ ̄ ̄ ̄ ̄  |
|        so        |
|_________|
    ∧∧ ||
   ( ゚д゚)||
    /   づΦ

次回は午前の部が企画されているそうで、楽しみです。 次回もよろしくお願いします!