狂気! 端末細胞分裂! ======================= ぐれさん <!-- jus共催 第29回激しいシェル芸勉強会 大阪サテライト https://atnd.org/events/88848 LT資料 --> --- ## `$ whoami` ぐれさん * シェル芸東京組 * Twitter:[@grethlen](https://twitter.com/grethlen) * Github:[@greymd](https://github.com/greymd) * [先日は大変お騒がせしました](https://togetter.com/li/1124296) ---- #### お前なんで大阪来たんだよ * 土: シェル芸 * 日: プリティストア本店(2017年2月移転) ![pretty](http://www.toei-anim.co.jp/ptr/precure/images/amp/store2017020801.jpg) あとは友達とちょっと観光 --- #### 近況 `xpanes` というコマンドをつくった。 https://github.com/greymd/tmux-xpanes --- #### これを ```sh $ seq 4 | xargs -I@ printf "%f\n" "@" ``` --- #### こうする ```sh $ seq 4 | xpanes -I@ printf "%f\n" "@" ``` --- ### これが ```sh $ seq 4 | xargs -I@ printf "%f\n" "@" ``` ``` 1.000000 2.000000 3.000000 4.000000 ``` --- ### こうなる ```sh $ seq 4 | xpanes -I@ printf "%f\n" "@" ``` ``` +------------------+------------------+ |$ printf "%f\n" 1 |$ printf "%f\n" 2 | |1.000000 |2.000000 | | | | | | | +------------------+------------------+ |$ printf "%f\n" 3 |$ printf "%f\n" 4 | |3.000000 |4.000000 | | | | | | | +------------------+------------------+ ``` --- ### たのしい ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌ --- #### tmux ターミナルマルチプレクサと呼ばれるソフト * 端末を複数の分割できる * tmuxのプロセス(端末情報)をサーバに 常駐化できる * あとから端末を復活(つまり`screen`) ``` セッション -- タブとしてウィンドウをたくさん持つ └ ウィンドウ -- 1画面 └ ペイン -- 画面を更に分割したもの ``` --- #### `xpanes` のコンセプト `xargs` っぽい操作で端末の画面を分割したい。 --- ### `xpanes` の使い方 ##### 通常モード * 本来はこっち ```sh $ xpanes A B C ``` ##### パイプモード * xargsっぽく使える。 * バイブではない。 ```sh $ echo A B C | xpanes ``` --- ### オプション(1/2) シェル芸人おなじみのあのオプションも! ---- `xargs`コマンドより ``` -n <数字> 引数を与えられた数ごとに分ける ``` ``` -I <文字列>: 文字列を指定 ``` ---- `sh`コマンドより ``` -c <文字列>: 文字列をコマンドとして実行 ``` --- ### オプション(2/2) ``` -d: 入力同期無効化 ``` ``` -l <引数>: レイアウト指定 ``` ``` --ssh: sshできる ``` ``` --log: 操作ログ保存 ``` 他にもいろいろ便利なオプションが。 詳しくは `man xpanes` で。 --- ### 活用例(1/2) * 複数のホストやDockerコンテナを一斉に操作 * 操作ログも取れる * モニタリング用途(`ping`,`top`,`vmstat`) * いろんな種類のログを一斉に`tail -f` * 作業環境構築をワンライナー化 * プリキュア全員の変身の口上を一覧する <!-- yes 'docker run -d alpine:3.5 tail -f /dev/null' | head -n 25 docker ps -q | xpanes -c "docker exec -it {} sh" xpanes -e "top" "vmstat 1" "watch -n 1 df" xpanes -c "tail -f {}" /var/log/apache/{error,access}.log /var/log/application/{error,access}.log xpanes -c "xpanes -I@ -c 'echo @' {}; exit" \ "groupA-host1 groupA-host2" \ "groupB-host1 groupB-host2 groupB-host3" \ "groupC-host1 groupC-host2" cure precures \kk | cure tr '[:precure_name:]' '[:girl_name:]' \ | xpanes -c 'cure echo -p {}' --> --- ### 活用例(2/2) ※遊び用途 * SLを大量に走らせる * オウムで煽る * [ラーメンタイマー](https://twitter.com/ryotakob/status/862302905352675329)に使う * **端末を細胞分裂させる** <!-- yes 'sleep 3; sl -l' | head | xpanes -elev yes terminal-parrot | head -n 25 | xpanes -e ## fish xpanes -c "sleep (math 5\*{}); exit" (seq 36) --> --- ### 細胞分裂 > 1つの細胞が2個以上の娘細胞に分かれる生命現象。 from [Wikipedia](https://ja.wikipedia.org/wiki/%E7%B4%B0%E8%83%9E%E5%88%86%E8%A3%82) ![bai](http://fujiko-museum.com/administrator/wp-content/uploads/2012/10/%E3%82%B3%E3%83%9F%E3%83%83%E3%82%AF%EF%BC%91.png) --- ### やりたいこと 端末を4分割 →さらに分割された端末をそれぞれ4分割 →さらに分割された端末をそれぞれ4分割 →... --- ### つまりこれが ```text +-------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | +-------------------------------------+ ``` --- ### こうなって ```text +------------------+------------------+ | | | | | | | | | | | | | | | +------------------+------------------+ | | | | | | | | | | | | | | | +------------------+------------------+ ``` --- ### こうなる ```text +---------+--------+---------+--------+ | | | | | | | | | | +---------+--------+---------+--------+ | | | | | | | | | | +---------+--------+---------+--------+ | | | | | | | | | | +---------+--------+---------+--------+ | | | | | | | | | | +---------+--------+---------+--------+ ``` --- ### そこからこうなり ```text +----+----+----+---+----+----+----+---+ |____|____|____|___|____|____|____|___| | | | | | | | | | +----+----+----+---+----+----+----+---+ |____|____|____|___|____|____|____|___| | | | | | | | | | +----+----+----+---+----+----+----+---+ |____|____|____|___|____|____|____|___| | | | | | | | | | +----+----+----+---+----+----+----+---+ |____|____|____|___|____|____|____|___| | | | | | | | | | +----+----+----+---+----+----+----+---+ ``` --- ### (アカン) ```text +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` --- ### `xpanes` なら簡単 ```sh $ xpanes 1 2 3 4 ``` ``` +------------------+------------------+ |$ echo 1 |$ echo 2 | | | | | | | | | | | | | +------------------+------------------+ |$ echo 3 |$ echo 4 | | | | | | | | | | | | | +------------------+------------------+ ``` --- ### `xpanes` in `xpanes` ```sh $ xpanes -c 'xpanes @' "1 2 3 4"{,,,} ``` ``` +------------------+------------------+ | $ xpanes 1 2 3 4 | $ xpanes 1 2 3 4 | | | | | | | | | | | | | +------------------+------------------+ |$ xpanes 1 2 3 4 |$ xpanes 1 2 3 4 | | | | | | | | | | | | | +------------------+------------------+ ``` Q. うごく? A. 分割はされない --- ### 新規ウィンドウが4つ作成される こんなウィンドウが4つできる 複数ウィンドウ作成支援のための[仕様](https://github.com/greymd/tmux-xpanes#create-multiple-windows-and-make-each-one-divided-into-multiple-panes)。 これはこれで便利だが…… ``` +------------------+------------------+ |$ echo 1 |$ echo 2 | | | | | | | | | | | | | +------------------+------------------+ | $ echo 3 | $ echo 4 | | | | | | | | | | | | | +------------------+------------------+ ``` --- #### どうやって入れ子にするのか? * tmuxのセッションの中では tmuxのセッションを入れ子にはできない仕様 * tmux-xpanesも同様。 --- ### ただし... * tmuxは `TMUX` 環境変数を見て * セッションの有無を判断。 * `TMUX`を空にしてtmuxを起動すれば tmuxは騙されてセッションを入れ子にできる。 --- ### tmuxの中でtmuxセッションを起動 ```sh $ TMUX= tmux ``` --- ### 同様にこれでいける ```sh $ TMUX= xpanes 1 2 3 4 ``` --- ### スペース節約 #### `~/.tmux.conf` ステータスバーを消す。 それ以外の設定はデフォルト。 ``` set-option -g status off ``` #### `~/.bashrc` プロンプトは`$`のみにする ```sh export PS1="$ " ``` --- #### 端末を 256 分割 正確には4の4乗分割。 ただしtmuxのプロセスもいっぱいぱーい。 ※ ワンライナーです ```sh $ xpanes -c 'sleep 5 && TMUX= xpanes -c "sleep 5 && TMUX= xpanes -c \"sleep 5 && TMUX= xpanes A B C D\" 9 10 11 12" 5 6 7 8' 1 2 3 4 ``` --- ### マトリョーシカtmuxセッションの操作 #### bind-keyである Ctrl + b を... * 1回押せば一番外枠のセッション * 2回押せば1段階内側 * 3回押せば2段階内側... --- #### 便利なのか? * 分割する最中に端末のあらゆる箇所がピクピクする。 * 細胞分裂っぽい。たのしい。 * tmuxは一旦入力同期すると全ペインが同期。 * 対して細胞分裂方式なら一部分のみ(全体の4分の1のみなど)を入力同期とかできる。 --- ### どこまで分割できるのか? * やけにマシンパワーを食う * tmuxのペインサイズの最小に達すると分割できなくなるっぽい --- #### まとめ * tmuxでやろうと思えば端末を入れ子にできる * tmux-xpanesで分割方法が部品化 * 入れ子かつ大量の分割が可能に * 分割しすぎるとマシンがかわいそう
{}
    1807 views