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

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

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

>

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

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

UncheckedIOException

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

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

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

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

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

不正ポインタ

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

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

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

[C] マクロトークンの文字列化

マクロの文字列化演算子

Cのマクロで数値定数が存在する場合にログに数値のみではなく、定数名を出力したい場合がある。
こういうときはマクロの文字列化演算子(#)を使う。
#define STR(S) #S

#define ORANGE 1
#define APPLE  2
#define GRAPE  3

...
 printf(STR(ORANGE) "\n");
上記の例だと、以下のようにマクロが展開され、標準出力に ORANGE と出力される。
 printf("ORANGE" "\n");