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)

2017年4月3日月曜日

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

マクロの文字列化演算子

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

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

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

2017年3月29日水曜日

[LL] Let's LL

社内の技術発表会で発表した資料をSlideShareに投稿しました。
CやJavaプログラマがLLにも目を向けてみるって感じの内容です。

Let's LL
https://www.slideshare.net/t_ichioka_sg/lets-ll

2017年3月27日月曜日

[Windows] コマンドプロンプトで文字列入出力のTips

PowerShellとかありますが、なんだかんだ言ってWindowsのバッチファイルって、何気に使うと便利な場面多いですよね。
でも、Unixのシェルほど融通が効かないので困ってしまうことも多いよね。

なので、ちょっと文字列入出力について、まとめ。

リダイレクトやパイプの文字を出力する

リダイレクト(<>)やパイプ(|)の文字をechoでそのまま出力しようとしても、当然コマンドライン制御文字として判定されてしまうため、うまくいかない。

2017年3月21日火曜日

[unix] スティッキーなビット?

Unixのファイル権限

Unixのファイル権限は読み/書き/実行が4/2/1のビットで表されていて、ファイルの"オーナー/グループに所属するユーザ/それ以外"がそれぞれが8進数の1桁に割り当てられている。
例えば、あるファイルが
  • オーナーは読み書き実行OK
  • グループに所属するユーザは読み実行のみOK
  • それ以外は読み実行のみOK
であれば、"755"ということになる。

でも、もう一つ上の桁がある。