dup

dupはファイルディスクリプタを複製する。

Man page of DUP

"test.txt"をopenで開いて、その時のファイルディスクリプタdupに渡すと、新しいファイルディスクリプタが返される。
そのファイルディスクリプタも"test.txt"を指すので、複製といえる。

"ABC"を古いファイルディスクリプタに、"DEF"を新しいファイルディスクリプタに書き込む。

$ vi dup.c
$ gcc dup.c -o dup
$ ./dup
oldfd = 3
newfd = 4
$ ls
dup  dup.c  test.txt
$ cat test.txt
ABCDEF$

両方とも"test.txt"に順に書き込まれた。

Sample/unixsyscall/dup/dup/src/dup at master · bg1bgst333/Sample · GitHub

kill

killは、プロセスにシグナルを送る。

Man page of KILL

名前からして、プロセスを終了させるシステムコールに感じそうだが、必ずしもそうではない。
あくまで、シグナルを送るのであって、送るシグナルがプロセス終了の場合が多いだけ。

forkをして、親プロセスも子プロセスも1秒ごとに出力するのだが、親プロセスはiが5の時、killでSIGKILLを送信する。

$ vi kill.c
$ gcc kill.c -o kill
$ ./kill
pid = 4204
I am parent, pid = 4204, child = 4205
I am child, child = 4205
I am parent, pid = 4204, child = 4205
I am child, child = 4205
I am parent, pid = 4204, child = 4205
I am child, child = 4205
I am parent, pid = 4204, child = 4205
I am child, child = 4205
I am parent, pid = 4204, child = 4205
I am child, child = 4205
kill child = 4205 success!
I am parent, pid = 4204, child = 4205
I am parent, pid = 4204, child = 4205
I am parent, pid = 4204, child = 4205
I am parent, pid = 4204, child = 4205
I am parent, pid = 4204, child = 4205
$

子プロセスは5回出力後に消えてしまう。

Sample/unixsyscall/kill/kill/src/kill at master · bg1bgst333/Sample · GitHub

pause

pauseはシグナルが発生するまで待つ。

Man page of PAUSE

SIGALRMが発生するまで待つ。

10秒経ったらSIGALRMが発生するので、それまで待っているかどうか。

$ pwd
/home/bg1/project/cloud/github.com/Sample/unixsyscall/pause/pause/src/pause
$ ls
pause.c
$ gcc pause.c -o pause
$ ls
pause  pause.c
$ ./pause
pause before!

で、しばらく待っていると、

sig = 14
This is SIGALRM!
pause after!
$

10秒後にこうなる。
ちゃんと10秒待ってた。

Sample/unixsyscall/pause/pause/src/pause at master · bg1bgst333/Sample · GitHub

Activity.onCreateDialog

Activity.showDialogを呼ぶと、Activity.onCreateDialogが呼ばれ、中でダイアログ生成処理が行われるが、showDialogに渡すIDを切り替えることで、onCreateDialogに渡るIDの違いによって生成するダイアログのスタイルを変えることが出来る。

Activity  |  Android Developers

activity_main.xmlで、

Buttonを2つ用意。

MainActivity.javaで、

button1ならDIALOG_ID_1、button2ならDIALOG_ID_2をshowDialogに渡す。

onCreateDialogに渡されるIDがDIALOG_ID_1ならタイトルやメッセージを"Activity.showDialog(1)"に、DIALOG_ID_2なら"Activity.showDialog(2)"とする。

2つのbutton
2つのbutton

button1を押すと、

showDialog(1)
showDialog(1)

showDialog(1)で、
button2を押すと、

showDialog(2)
showDialog(2)

showDialog(2)となる。
showDialogに渡すIDごとにダイアログを切り替えられる。

Sample/android/Activity/onCreateDialog/src/Activity at master · bg1bgst333/Sample · GitHub

SetROP2

SetROP2を使うと、背景色の上に描画色を描画する時の、ビットピクセル操作のモードを変更できる。
(こういう処理をラスタオペレーションというらしい。)

SetROP2 function (wingdi.h) | Microsoft Docs
ラスタオペレーション

WM_PAINTで、

		// 画面の描画を要求された時.
		case WM_PAINT:		// 画面の描画を要求された時.(uMsgがWM_PAINTの時.)

			// WM_PAINTブロック
			{

				// このブロックのローカル変数・配列の宣言と初期化.
				HDC hDC;		// デバイスコンテキストハンドルを格納するHDC型変数hDC.
				PAINTSTRUCT ps;	// ペイント情報を管理するPAINTSTRUCT構造体型の変数ps.
				HPEN hOldPen;		// SelectObjectされるまで使っていた古いペンのハンドルhOldPen.
				HBRUSH hOldBrush;	// SelectObjectされるまで使っていた古いブラシのハンドルhOldBrush.

				// ウィンドウの描画開始
				hDC = BeginPaint(hwnd, &ps);	// BeginPaintでこのウィンドウの描画の準備をする. 戻り値にはデバイスコンテキストハンドルが返るので, hDCに格納.

				// 2つの白い矩形を描画.
				Rectangle(hDC, 10, 10, 100, 100);	// 左上
				Rectangle(hDC, 60, 60, 160, 160);	// 右下

				// 新規に作成した赤いペンと赤いブラシを選択.
				hOldPen = (HPEN)SelectObject(hDC, hPen1);	// hPen1を選択.
				hOldBrush = (HBRUSH)SelectObject(hDC, hBrush1);	// hBrush1を選択.

				// 赤い矩形を描画.
				Rectangle(hDC, 300, 300, 400, 400);	// Rectangleで矩形を描画.

				// 新規に作成した青いペンと青いブラシを選択.
				(HPEN)SelectObject(hDC, hPen2);	// hPen2を選択.
				(HBRUSH)SelectObject(hDC, hBrush2);	// hBrush2を選択.

				// 青い矩形を描画.
				Rectangle(hDC, 350, 350, 450, 450);	// Rectangleで矩形を描画.

				// 元に戻す.
				(HPEN)SelectObject(hDC, hOldPen);	// hOldPenを選択.
				(HBRUSH)SelectObject(hDC, hOldBrush);	// hOldBrushを選択.

				// ウィンドウの描画終了
				EndPaint(hwnd, &ps);	// EndPaintでこのウィンドウの描画処理を終了する.

			}

			// 既定の処理へ向かう.
			break;	// breakで抜けて, 既定の処理(DefWindowProc)へ向かう.

とした場合、

デフォルト
デフォルト

デフォルトは、そのまま重ね合わせるのでこうなる。
しかし、

SetROP2で、背景と描画色が同じなら反転するR2_XORPENをセットすると、

R2_XORPEN
R2_XORPEN

こうなる。
左上は、背景が白で、描画する矩形も白なので黒になり、矩形が重なる部分はさらに反転して白になる。
右下は、色が変わってしまう。

Sample/winapi/SetROP2/SetROP2/src/SetROP2 at master · bg1bgst333/Sample · GitHub

Activity.showDialog

AlertDialogを直接showするのは、本当はよろしくないようなので、Activity.showDialogを使う。
(といっても、これもdeprecatedされてるのだが。)

Activity  |  Android Developers
AlertDialog#show()とActivity#showDialog() - nakawai’s diary

Activityにダイアログの管理を任せておけるのでいいらしい。

Buttonを配置して、

ダイアログの生成処理は、onCreateDialogに書いておいて、クリックされたらshowDialogを呼ぶだけ。

buttonを押すと
buttonを押すと

buttonを押すと、

ダイアログが表示される
ダイアログが表示される

ダイアログが表示される。
OKを押すと閉じる。

Sample/android/Activity/showDialog/src/Activity at master · bg1bgst333/Sample · GitHub

Canvas

Canvasの上に、座標を指定してコントロールを配置する。

Canvas Class (System.Windows.Controls) | Microsoft Docs
WPF4.5入門 その14 「レイアウトコントロールのCanvasとStackPanel」 - かずきのBlog@hatena

座標を指定
座標を指定

Canvasの中にButtonを配置して、Buttonのプロパティのような感じでCanvasのプロパティ"Canvas.Left"とか"Canvas.Top"とか座標を指定する。
(このような子要素で親のクラスのプロパティを指定できるようなものを添付プロパティという。これについてはいずれ扱う。)

実行時
実行時

実行するとこうなる。

Sample/wpf/Canvas/Canvas/src/Canvas_ at master · bg1bgst333/Sample · GitHub