2017年5月22日月曜日

[unix] 標準出力の接続先によって、動作を変える

[unix] パイプ処理時のバッファリングではgrepやsedに出力のバッファリングオプションがオプションがあるのを見た。
他にも出力先によって、動作が変わるコマンドはある。

lsの出力

例えば、lsも出力先が端末だと、ファイル名を適当に区切って並べてくれるけど、出力先がパイプだと、ファイル名を縦に並べる。
むしろ、縦に並べる方が本来で、端末の場合は見やすくしてくれていると考えた方がいいかもしれない。

2017年5月15日月曜日

[unix] パイプ処理時のバッファリング

xargsで出力を遅延させる

フィルタの役割をするコマンドは大抵バッファリングするので、teeとかでデバッグしていると、フィルタリングされたテキストがすぐに端末に表示されないことがある。
何かバッファリングの効果を目に見えるように再現できるいい方法はないかなと思ってやってみたけど、xargsを使って、無理やり出力を遅延させるのがわかりやすいかなぁ。

例えば、これだとコマンド実行の2秒後に"2"が表示される。
$ seq 10 | xargs -I% sh -c 'sleep 1; echo %' | grep 2
2
$

2017年5月8日月曜日

[sed] sedのホールドスペースの練習

[awk,Ruby,C#,Java]いくつかの言語でフィボナッチ数生成でawkとかを使ってフィボナッチ数列を生成したけど、sedでこれができないかなーと思ってやってみた。

sedでフィボナッチ数列生成

sedは数値演算を直接サポートしていないので、文字列の長さを数字とみなしてみる。

2017年5月1日月曜日

[awk] awkで指定行毎に改行除去

行区切りのデータを適当な行数でまとめるで paste を使って、指定行毎に改行を除去する方法を書いたけど、改めて見ると、こんなの awk で簡単にできるじゃん。

指定行毎に改行を除去するってのは
1
2
3
4
5
6

2017年4月24日月曜日

[Windows] パイプでつないだコマンドはサブシェルで実行される

echo foo | set /p x= で x は設定できない

[Windows] コマンドプロンプトで文字列入出力のTipsでは改行なしのメッセージを set /p を使って出力した。
>set /p x=hello<nul & echo world
hello world

>

これを使って、別のコマンドの出力をパイプを通して変数に格納できないかなと思ってやってみたら、できなかった。

2017年4月17日月曜日

[Java] Streamで例外処理を扱う

UncheckedIOException

Java8から UncheckedIOException という例外が追加されている。

https://docs.oracle.com/javase/jp/8/docs/api/java/io/UncheckedIOException.html

これは文字通り、RuntimeExceptionを継承した非検査例外だけど、なんでこんな例外が追加されたんだろうか。

例えば、Streamを使って、ファイルの内容をすべて標準出力に出力しようとすると、こんな感じになる。

2017年4月10日月曜日

[C] ポインタのアドレス参照範囲と未定義処理

不正ポインタ

CでNULLポインタや解放済みのメモリ領域を指すポインタ(ダングリングポインタ)を参照すると、未定義の動作となる。
バッファオーバーランとかの書き込みではなく、厳密にいうと参照だけで未定義動作になるんだね。

ただし、ポインタが指している領域ではなく、ポインタが保持している値(アドレス)そのものについてはルールが違う。

NULLポインタの場合はポインタの値を参照していい。そうじゃないと、そもそもNULLかどうかのチェックができないよね。
    /* これはできるよね! */
    if (p == NULL)