Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

【読書メモ】 Twitter|Facebookで今すぐ使える中国語・韓国語表現600

Twitter|Facebookで今すぐ使える中国語・韓国語表現600 ([テキスト])

Twitter|Facebookで今すぐ使える中国語・韓国語表現600 ([テキスト])

のじゃロリおじさん以降、Vtuberを追っかけているのですが
このVtuber、お隣の中国や韓国でも結構人気で動画のコメントに中国語やハングルがでてくる事があります。
Duolingoの2番目の言語として韓国語選んだ事もあって、
コメント理解と語学学習を兼ねる目的で購入。

【読書メモ】 あなたの人生の物語 (ハヤカワ文庫SF)

あなたの人生の物語 (ハヤカワ文庫SF)

あなたの人生の物語 (ハヤカワ文庫SF)

映画「メッセージ」の原作の他、短編が8篇ほど入ったSF本です。
著者のテッド・チャン氏はテクニカルライターを自称しているものの、
世間の評価は寡作だが凄い作品をつくるSF作家……という感じ。

シェルスクリプトの関数の引数として文字列をわたすと行頭スペースが勝手にパースされたりする件

……printfやechoで、行頭のスペースが消されて見えなくなるというあれが。
スクリプトの方はちゃんと整形していても、出力でお節介されたらたまりません。

shunit2でテストをやろうとした時、先頭にスペースがあって然るべき文字列として渡しても、
スペースを削除して勝手に整形されてしまうので用意したテスト結果と一致しないという事態が発生します。

この場合、テスト結果と実行体を同じ表示形式で読むなりの工夫が必要になってきます。

$ echo -n " 123" 
 123

$ echo -n " 123" | hexdump 
0000000 20 31 32 33                                    
0000004

$ printf " 123" | hexdump 
0000000 20 31 32 33                                    
0000004

$ echo `echo -n " 123"` | hexdump 
0000000 31 32 33 0a                                    
0000004

$ echo -n `echo -n " 123"` | hexdump 
0000000 31 32 33                                       
0000003

$ printf `echo -n " 123"` | hexdump 
0000000 31 32 33                                       
0000003

$ hexdump <<< `echo -n " 123"` 
0000000 31 32 33 0a                                    
0000004

$ hexdump <<< "`echo -n " 123"`" 
0000000 20 31 32 33 0a                                 
0000005

ビッグエンディアンで数バイト格納されているデータをsedやawk でパースする

ビッグエンディアンで2バイト、1バイト、1バイトと格納されている文字列が来ていたとします。
こいつをリトルエンディアンで置き換えるには先頭だけ入れ替えてあげればいいですね。

$ echo AD7399AF | sed -e "s/\([1-9A-F]\{2\}\)\([1-9A-F]\{2\}\)\(.*\)/\\2\\1\\3/g"
73AD99AF

ビッグエンディアンで2バイト毎が3個……とかいう構成なら、sedで1バイト(=2文字)に切り分け、
awkのprintf フォーマットをつかってこう書いた方が楽かも……

$ echo AD7399AF51CD | sed 's/.\{2\}/& /g' | awk -F " " '{printf $2$1 $4$3 $6$5}'

awkで16進数1バイトな文字列を取り扱う

実際のところ

たとえば"0F"といった感じの値で出力されてくる場合、
文字列の頭に"0x"とつけて、printfで出力してやれば10進数になります。

$ awk 'BEGIN { val="0x""0F"; printf "%d",val }'
15 

演算してからの格納もOK

$ awk 'BEGIN { val="0x""0F"; val=val+ "0x01"; printf "%d",val }'
16

$ awk 'BEGIN { val="0x""0F"; val=val+ 1; printf "%d",val }'
16

awkの出力はprint/printfコマンド毎に指定できる

awkの出力はprint/printfコマンド毎に指定できます。
他の言語だと死ぬほど面倒な処理も、awkだとさすがのスマートさです。

実際のところ

$ echo 1,2,3 | awk -F "," '{printf "%04d", $1 > "file0001.txt"; printf "%04d", $2 > "file0002.txt" }'

中身をみると……

$ head file000*
==> file0001.txt <==
0001
==> file0002.txt <==
0002

パイプでawkスクリプトに繋ぐ場合、変数はもちこせる

パイプでawkを使ったとき、その変数は共通で持ち越せます。
……今まで使ってて気づかんかったんかという話ですが……

実際のところ

seqで10行作って、BEGINでcntを定義、毎回2足していくという単純なモンの場合……

$ seq 1 10 | awk "BEGIN {cnt = 0}; {print cnt; cnt = cnt + 2;}"
0
2
4
6
8
10
12
14
16
18