Slide 1

Slide 1 text

ショートカットと端末 2024.02.22 Thu. SmartHR LT大会 #3 とみた まさひろ SmartHR PdE

Slide 2

Slide 2 text

macOSのテキスト編集のショートカット(control+何か) A 行頭に移動 N 下に移動 B 左に移動 O 1行挿入 C P 上に移動 D 右の文字削除 Q E 行末に移動 R F 右に移動 S G T 左右の文字入替 H 左の文字削除 U I V 下スクロール J W K 行末まで削除 X L 再表示(カーソル位置を中心に) Y 貼り付け(アプリによる) M Z

Slide 3

Slide 3 text

macOS shell macOS shell A 行頭に移動 行頭に移動 N 下に移動 履歴の下に移動 B 左に移動 左に移動 O 1行挿入 改行 C 中断 P 上に移動 履歴の上に移動 D 右文字削除 右文字削除 / 入力終了 Q 出力再開 E 行末に移動 行末に移動 R 履歴を上に検索 F 右に移動 右に移動 S 出力停止 G 中断 T 左右の文字入替 左右の文字入替 H 左文字削除 左文字削除 U 行頭まで削除 I タブ V 下スクロール 次の文字そのまま J 改行 W 左の単語削除 K 行末まで削除 行末まで削除 X prefix L 再表示 再表示 Y 貼り付け 貼り付け M 改行 Z 停止 macOS + shell

Slide 4

Slide 4 text

macOS shell Emacs macOS shell Emacs A 行頭に移動 行頭に移動 行頭に移動 N 下に移動 履歴の下に移動 下に移動 B 左に移動 左に移動 左に移動 O 1行挿入 改行 1行挿入 C 中断 prefix P 上に移動 履歴の上に移動 上に移動 D 右文字削除 右文字削除/入力終了 右文字削除 Q 出力再開 次の文字そのまま E 行末に移動 行末に移動 行末に移動 R 履歴を上に検索 上に検索 F 右に移動 右に移動 右に移動 S 出力停止 下に検索 G 中断 中断 T 左右の文字入替 左右の文字入替 左右の文字入替 H 左文字削除 左文字削除 左文字削除 U 行頭まで削除 繰り返し I タブ タブ V 下スクロール 次の文字そのまま 下スクロール J 改行 改行 W 左の単語削除 範囲削除 K 行末まで削除 行末まで削除 行末まで削除 X prefix prefix L 再表示 再表示 再表示 Y 貼り付け 貼り付け 貼り付け M 改行 改行 Z 停止 停止/最小化 macOS + shell + Emacs

Slide 5

Slide 5 text

macOS ユーザーは 実質 Emacs ユーザー

Slide 6

Slide 6 text

弊社エンジニアのEmacs率100% 🎉 🎉

Slide 7

Slide 7 text

一番大事なことを言ったので 残りは誰得な話をします

Slide 8

Slide 8 text

端末の機能 macOS shell Emacs macOS shell Emacs A 行頭に移動 行頭に移動 行頭に移動 N 下に移動 履歴の下に移動 下に移動 B 左に移動 左に移動 左に移動 O 1行挿入 改行 1行挿入 C 中断 prefix P 上に移動 履歴の上に移動 上に移動 D 右文字削除 右文字削除/入力終了 右文字削除 Q 出力再開 次の文字そのまま E 行末に移動 行末に移動 行末に移動 R 履歴を上に検索 上に検索 F 右に移動 右に移動 右に移動 S 出力停止 下に検索 G 中断 中断 T 左右の文字入替 左右の文字入替 左右の文字入替 H 左文字削除 左文字削除 左文字削除 U 行頭まで削除 繰り返し I タブ タブ V 下スクロール 次の文字そのまま 下スクロール J 改行 改行 W 左の単語削除 範囲削除 K 行末まで削除 行末まで削除 行末まで削除 X prefix prefix L 再表示 再表示 再表示 Y 貼り付け 貼り付け 貼り付け M 改行 改行 Z 停止 停止/最小化

Slide 9

Slide 9 text

シェルの機能か端末の機能かの簡単な見分け方 端末上で cat コマンドを実行してキー入力してみる $ cat
 hoge^A^B^E^F^G
 


Slide 10

Slide 10 text

端末? macOS ターミナル iTerm2 Tera Term PuTTY xterm などなど

Slide 11

Slide 11 text

これらは端末エミュレータ “エミュレータ(emulator)とは、ある装置やソフトウェア、 システムの挙動を模倣し、代替として用いることができるソフ トウェアなどのこと。そのように擬似的に別の装置やソフト ウェアの環境を再現することを「エミュレーション」 (emulation)という” https://e-words.jp/w/エミュレータ.html

Slide 12

Slide 12 text

端末(物理) VT100 ● 1978年 ● 80桁 x 24行 ● 高機能(当時) ● かなり人気だったらしい ● デファクトスタンダードになる ● たいていの端末エミュレータでサポート https://ja.wikipedia.org/wiki/VT100

Slide 13

Slide 13 text

端末 ● 端末で「A」キーを押すと0x41 データがホストに送信される ● ホストが 0x41 データを送信すると端末に「A」が表示される ● 端末で送受信するデータは基本的に文字 ● 文字しか送受信できない ● 矢印キーとかファンクションキーの入力は? ● 画面上の任意の位置にカーソルを移動するには? ● 色を変えるには?

Slide 14

Slide 14 text

エスケープシーケンス ESC + いくつかの文字の組み合わせで一つの機能を表現 xterm の場合: ● 右矢印キー(kcuf1) : ESC O C ● カーソル位置移動(cup) : ESC [ row ; col H ● 文字色変更(setaf) : ESC [ 3 color m エスケープシーケンスは端末によって異なる

Slide 15

Slide 15 text

terminfo データベース 端末ごとのエスケープシーケンス定義 $ infocmp
 # Reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color
 xterm-256color|xterm with 256 colors,
 am, bce, ccc, km, mc5i, mir, msgr, npc, xenl,
 colors#0x100, cols#80, it#8, lines#24, pairs#0x10000,
 acsc=`affggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
 bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
 clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r,
 csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
 cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
 cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
 cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
 dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
 ...


Slide 16

Slide 16 text

TERM環境変数 ● 現在の端末の種類を示す ● 端末の機能を使いたいプログラムはTERMの値から現在の端末名 を得てterminfoデータベースを参照 ● 使ってる端末とTERM変数の値を合わせておかないと動きがおか しくなる

Slide 17

Slide 17 text

豆: tput コマンド tput コマンドでエスケープシーケンスを出力できる シェルスクリプトで文字に色をつけたいときとかに便利 $ tput setaf 1 | od -tx1c
 0000000 1b 5b 33 31 6d
 033 [ 3 1 m
 0000005
 $ tput setaf 1; echo hoge
 hoge
 


Slide 18

Slide 18 text

最近の端末はだいたい256色表示できる for c in $(seq 0 255); do tput setaf $c; echo -n ■; done


Slide 19

Slide 19 text

サーバー側の端末機能

Slide 20

Slide 20 text

行編集 ● 改行するまではプログラムにデータは渡さない ● BS(0x08)またはDEL(0x7F)で一文字消したり ● control W(0x17)で単語を消したり ● control U(0x15)で行削除したり ● control D(0x04)で入力を終わらせたり ● 矢印キーやcontrol A,B,E,Fでの移動とかはできない $ cat
 abcdefg⏎ ← 入力
 abcdefg ← エコーバック


Slide 21

Slide 21 text

シグナル ● control C でプログラムが終了する (SIGINT) ● control Z で停止 (SIGTSTP) ● control \ でコアダンプして終了する (SIGQUIT) フロー制御 ● control S で出力停止 ● control Q で再開

Slide 22

Slide 22 text

stty - 端末の設定

Slide 23

Slide 23 text

設定一覧 $ stty -a
 speed 38400 baud; rows 24; columns 80; line = 0;
 intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
 eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
 werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
 -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
 -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
 -iuclc -ixany imaxbel -iutf8
 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
 echoctl echoke -flusho -extproc


Slide 24

Slide 24 text

control C でも control D でも終わらなくする control S で停止しないようにする bash等で control S でヒストリの前方検索ができるようになる $ stty intr undef eof undef
 $ cat
 ^C^C^C^D^D^D
 
 $ stty stop undef
 


Slide 25

Slide 25 text

エコーバックしない パスワードの入力とかにいいかも $ stty -echo
 
 $ echo -n "Password: "; stty -echo; read pw; stty echo; echo "\nyour password is $pw"
 Password: (入力が見えない)
 your password is hogehoge
 
 


Slide 26

Slide 26 text

行編集モードオフ 1バイトずつプログラムに渡される $ ruby -e 'loop{puts $stdin.read(1)}'
 abcd⏎ ← 入力
 a
 b
 c
 d
 
 $ stty -icanon; ruby -e 'loop{puts $stdin.read(1)}'
 aa
 bb
 cc
 dd
 


Slide 27

Slide 27 text

端末がらみのシグナル SIGHUP ● 端末が切断されたときにプロセスに対して送られる ● デフォルト動作は終了なので何もしてなければプロセスが終了する ● デーモンに設定ファイルをリロードさせる用途は何由来なんだろ 🤔 ● 端末閉じるとバックグラウンド実行したやつも終了することもある ● disown で端末から切り離せる $ sleep 99999 &
 [1] 99179
 $ jobs
 [1] + running sleep 99999
 $ disown %1
 $ jobs 
 $ 


Slide 28

Slide 28 text

SIGTSTP ● control Z で停止したときに送られる ● デフォルト動作は Stop SIGCONT ● シェルの fg / bg コマンドでプロセスを再開したときに送られる ● デフォルト動作は Continue SIGTSTP を無視すると control Z で止まらなくなる $ bash -c 'trap "" SIGTSTP; sleep 9999'
 ^Z^Z^Z
 


Slide 29

Slide 29 text

SIGWINCH ● 端末の大きさが変更されたときにプロセスに対して送られる ● デフォルト動作は無視 ● 画面サイズが変更されたことをプログラムから知ることができる ● vim など画面サイズが動作に影響するプログラムで使用される $ ruby -e 'trap(:SIGWINCH){p :SIGWINCH}; sleep'
 :SIGWINCH ← 画面サイズが変更する度に出力される 
 :SIGWINCH
 :SIGWINCH


Slide 30

Slide 30 text

おわり