百日半狂乱

Shut the fuck up and write some code!!

awkで0~1の乱数を生成する

シェルスクリプトを書いていて、ふと0~1の乱数をお手軽に生成したくなったので、実験結果をメモ.

awkには組み込みでrand()という関数が用意されていて、例えば以下のような形で呼び出すたびに0~1の範囲の乱数を生成してくれる.

awk 'BEGIN{ srand('"$RANDOM"'); print rand() }'

ここでは環境変数RANDOMを組み込み関数srand()のseedとしている.組み込み関数についてはman awkを叩く.

続きを読む

世にも恐ろしいSIGPIPE、ソケットプログラミングの落とし穴

前回、「次回もシグナルのことを書く」と書いたのでシグナルのことを書く*1.

ソケットプログラミングの落とし穴は色々あるけど、ここでは個人的に嵌ったシグナル関連の落とし穴に関して書き殴る.

結論から書くと、コネクションが切れたソケットに書き込み(send(2)とかwrite(2)とか、同じものだけど)を行うと、SIGPIPEシグナルが発生してプロセスが強制終了するので、きちんとSIGPIPEシグナルをハンドリングしておこうという話.

以下では、サンプルコードを使って、実際にパイプの書き込み先をkillして、SIGPIPEの発生を疑似体験してみる.

*1:前回から115日が経っている.挫折したアドベントカレンダーもそうだけど、やはり連載宣言はするものじゃない.自分のような興味関心がブレまくる人間が連載宣言をしても、宣言した時をピークにモチベーションは下がり続ける.インプットのためのアウトプット、所詮メモの大原則を忘れている.

続きを読む

POSIX.1「signal(2)は古い、sigaction(2)を使え。」

過去に何回かシグナルに関する話をしたが、今回と次回もシグナルの話にしようと思う.

シグナルそのものについてはsignal(7)のmanページを参照する.

ここでは、シグナルを捕捉する側の話をする.

主に移植性の問題で、signal(2)ではなくsigaction(2)を使うべきだが、sigaction(2)はそのままだと使いにくいので、ラッピングして使い易くして、ちょっとだけ遊んでみた.

続きを読む

非再帰的makeでgoogletestのテストコードを含むソースツリーを管理するMakefileを書いた

場当たり的なMakefileで管理しているC/C++のコードの規模(数千行程度)がそれなりに大きくなってきた.

テストがないので大きな変更がしんどい.

テストがないのでバグを踏んでも何が原因かは勘とprintfデバッグ、辛い.

もういろんなところでテストがまったくないなんてありえないと言われている.

テストがないコードは全てレガシーコード.

どうせならTDD実践したい.

Linux上で、エディタはvimで、コードはGitで管理して...

C/C++だからテスティングフレームワークはgoogletestにしよう.

規模がある程度大きくなるので、分割コンパイル.

TDDなので、テストを書いたらすぐ実行したい.

なるべく早くフィードバックが欲しいので、変更を加えたソースファイルに関連するコンパイルのみが走って、なるべく早くテストを実行したい.

条件に当てはまる開発環境は?みんなはどうしているの?

googletestを使ってみた系の記事はサンプルコード以上の記述がない.

TDDBCで使ってるのはVC++かな?

OSSプロダクトはAutotoolsCMake?なんだかが深そう.

IDEの言いようのない裏で何やってるかわからない感.

ビルドプロセスは明確にしておきたい.

プレーンテキスト!!

テキストフィルタリング!!

CLI!!

黒い画面!!

etc...

と言った様々な想いとか趣味趣向などが交錯して、どうしても思い描いた開発環境が欲しくなって書いた.

Autotoolsから逃げて「巨人の肩に乗れ」という原則を思いっきり破っていて、やってて楽しい一方でモヤモヤした気持ちは今でも拭えてないけど、とにかく書いた.

もう環境を整えるのに時間かけたくないので、githubから落としてきたらすぐにでも始められるように小さなスクリプトも書いた.

Makefileと関連するシェルスクリプトgithubに上げた.

https://github.com/doi-t/nonrec-make-with-gtest

続きを読む