狂気!
端末細胞分裂!
=======================
ぐれさん
<!--
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で分割方法が部品化
* 入れ子かつ大量の分割が可能に
* 分割しすぎるとマシンがかわいそう
{"metaMigratedAt":"2023-06-14T13:04:17.136Z","metaMigratedFrom":"Content","title":"狂気!\n端末細胞分裂!","breaks":true,"contributors":"[{\"id\":\"3a410ba4-8e36-42a8-b476-7a8d5c415603\",\"add\":17,\"del\":17}]"}