MW211 EXIT

devlog
C言語/数値型
2013年03月04日
数値型に関連するデータは以下の通り。
┌─────────┬──────────┬────┬─────────┬──┐
│signed char       │unsigned char       │ 1バイト│charは文字型専用  │ 2桁│
├─────────┼──────────┼────┼─────────┼──┤
│       short      │unsigned short      │ 2バイト│正式にはshort int │ 4桁│
├─────────┼──────────┼────┼─────────┼──┤
│       int        │unsigned int        │ 4バイト│ 2バイトの場合あり│ 9桁│
├─────────┼──────────┼────┼─────────┼──┤
│       long       │unsigned long       │ 4バイト│正式にはlong int  │ 9桁│
├─────────┼──────────┼────┼─────────┼──┤
│       long long  │unsigned long long  │ 8バイト│後から追加        │18桁│
├─────────┼──────────┼────┼─────────┼──┤
│       float      │unsigned float      │ 4バイト│                  │38桁│
├─────────┼──────────┼────┼─────────┼──┤
│       double     │unsigned double     │ 8バイト│                   308桁│
├─────────┼──────────┼────┼─────────┼──┤
│       long double│unsigned long double│ 8バイト│10バイトの場合あり 308桁│
└─────────┴──────────┴────┴─────────┴──┘
        ※(char型以外)「signed」は付けても付けなくても同じ
        ※桁数はフルに収まる桁数(もし「~127」ならば「~99」まで収まるから2桁)
分類:C/C++
C言語/isdigit()の引数がint型
2013年03月02日
「isdigit()」は「'0'~'9'」なら真(0以外)を返却し、
それ以外なら偽(0)を返却する便利な関数だ。

なのでその定義が「bool isdigit(char c);」とかと思ったら、
「int isdigit(int c);」なのだ。

ま、関数の型のintは、0からそれ以外で解釈するからいいとして
なんで引数はint型なの?

型に従って変換とかすると(「isdigit(atoi('1'))」みたいに)、偽になってしまう。

これは、数値の「0~9」は「0x00~0x09」で、
文字の「'0'~'9'」は「0x30~0x39」の違いがあって、
「0x30~0x39」なら真って判定しようと待ち構えていたら
「0x00~0x09」が入力されたのでアウト(偽)!って判定したってことらしい。

この場合は直接(「isdigit('1')」みたいに)でいいらしい。

なんだかややこしいC言語の世界。

int型は最速なんです、便利なんです、万能なんですってことなんだろうか。
ま、変換だなんだで時間をくうよりは少々わかりにくくてもダイレクトにってのが
C言語だからね(だからとっつきづらいし、罠が多い(覚えてらんないよ))。

つーから、マジマジと定義を見るまでint型に気づかなかった(反省)。
分類:C/C++
設計/エラー対処のパターン
2013年03月01日
エラーが発生した場合に対処するパターンとしては以下がある。

・気にしない                      →気にしなくていいのなら
・既定値だと解釈する              →そういうことも織り込み済みなら
・違う処理を試す                  →試す価値があるのなら
・入力や処理をやり直す(限度あり)  →何回かやればうまくいきそうなら
・再起動する                      →チャラにしたらうまくいくかもしれないなら
・上位に通知(継承)する            →自己解決できないのなら
・打ち切る                        →お手上げ

どれもエラーログとかに発生自体を記録しておくことになるであろう。
分類:設計
Paint.net/枠をつける方法
2013年02月28日
画像の周囲を囲いたい場合の方法。

メニューから、「イメージ→キャンバスサイズ」を選択し
「アンカー」を「上下中央」(つまりど真ん中)に設定し、
「幅」および「高さ」を微妙に広げる(対称的に広がるので偶数分広げる)。

広がった部分が白地キャンバスとなるので、「魔法の杖」の「許容範囲0%」で
その部分を選択する。(うまく選択できるかな?)

そんで、そこに「ペイント缶」で色(黒とか)を投入。

ってな感じです。
分類:Paint.net
C言語/Windows系の排他制御
2013年02月27日
「LockFile()/UnlockFile()」もしくは「LockFileEx()/UnlockFileEx()」を使う。

ま、順番的には以下のような感じなのだろう。
┌──────────────────────────────────────┐
│CreateFile(~)                                                              │
│LockFile(~)                                                                │
│UnlockFile(~)                                                              │
│CloseHandle(~)                                                             │
├──────────────────────────────────────┤
│CreateFile(~)                                                              │
│LockFileEx(~)                                                              │
│UnlockFileEx(~)                                                            │
│CloseHandle(~)                                                             │
└──────────────────────────────────────┘
違いは「LockFileEx()」は排他ロック(LOCKFILE_EXCLUSIVE_LOCK)の
指定ができるらしい(これを指定しないと共有ロックとのこと)。

詳細についてはおいおい調べていく。
分類:C/C++
C言語/UNIX系の排他制御
2013年02月26日
UNIXのファイル排他制御機構としては、「fcntl()」と「flock()」がある。
「fcntl()」は細かくてややこしいので置いといて「flock()」について。

基本的な仕様としては以下のような感じ。
┌──────────────────────────────────────┐
│flock(*ファイルポインタ, LOCK_SH);  …共有ロック                            │
│flock(*ファイルポインタ, LOCK_EX);  …排他ロック                            │
│flock(*ファイルポインタ, LOCK_UN);  …アンロック(fclose()でもやってくれる)  │
└──────────────────────────────────────┘
「fopen()」で「*ファイルポインタ」を取得するので、
そいつを指定してロックをかけたり、はずしたり(アンロック)する。

流れとしてはこんな感じか。
┌──────────────────────────────────────┐
│FILE *fp = fopen("出力ファイル.txt","a");  // 追加モードでOPEN              │
│flock(*ファイルポインタ, LOCK_EX);         // 排他ロック                    │
│fwrite("追加", sizeof("追加"), 1, *fp);    // 追加書込                      │
│fclose(*fp)                                // CLOSEと共にアンロック         │
└──────────────────────────────────────┘

ちなみに、以下みたいに、排他の種別を変更することができる。
┌──────────────────────────────────────┐
│flock(*fp, LOCK_SH);                                                        │
│flock(*fp, LOCK_EX)                                                         │
└──────────────────────────────────────┘
でも、実体としては一回アンロックを挟んでいるので、
他にロックをとられる場合がありうる。
分類:C/C++
PostgreSQL/時刻型→数値型
2013年02月25日
to_char()で文字型にしてから、to_number()で数値型にする。
直接ってのはないようだ
┌──────────────────────────────────────┐
│SELECT to_number(to_char(now(),'YYYY'),'9999');                         →年│
│SELECT to_number(to_char(now(),'MM'),'9999');                           →月│
│SELECT to_number(to_char(now(),'DD'),'9999');                           →日│
│SELECT to_number(to_char(now(),'HH24'),'99');                           →時│
│SELECT to_number(to_char(now(),'MI'),'99');                             →分│
│SELECT to_number(to_char(now(),'SS'),'99');                             →秒│
└──────────────────────────────────────┘

…と思ったら、あった。直接ってのが。「extract()」を使う。
┌──────────────────────────────────────┐
│SELECT extract(YEAR FROM now());                                        →年│
│SELECT extract(MONTH FROM now());                                       →月│
│SELECT extract(DAY FROM now());                                         →日│
│SELECT extract(HOUR FROM now());                                        →時│
│SELECT extract(MINUTE FROM now());                                      →分│
│SELECT trunc(extract(SECOND FROM now()));                               →秒│
└──────────────────────────────────────┘
秒に関しては端数(ミリ秒)も付随してしまうので
「trunc()」で切り捨ててしまった方がいいかも。
分類:PostgreSQL
設計/排他制御(2)共有ロックと排他ロック
2013年02月24日
排他制御の宣言について代表的なものとして
「共有ロック」と「排他ロック(占有ロック)」がある。

この二つの関係について、もし先約があって、そこで宣言しようとした場合、
ロックができる場合(○)と、ロックができず待機となる場合(×)を以下にまとめた。
┌────┬─────┐
│        │   先約   │
│        ├──┬──┤
│        │共有│排他│
├─┬──┼──┼──┤
│宣│共有│ ○ │ × │
│  ├──┼──┼──┤
│言│排他│ × │ × │
└─┴──┴──┴──┘
「排他」は何らかのロックがかかっていると待機するという潔癖症。
「共有」は「排他」がかかっていると待機するという控えめな性格。
ただし、「共有」同士なら気にせず共有してしまう。

「共有ロック」は読込系で、「排他ロック」は書込系で使う。

読込時は他に影響を与える訳ではないので占有する必要がないように思えるが
読み込んでいる横から書き込まれるとぐちゃぐちゃになってしまう。
だから、最小限「読み込んでる時には書き込まないでくださいね」と宣言する。
分類:設計
設計/排他制御(1)排他とは
2013年02月23日
排他制御とは、同時に複数から操作させると不都合な場合に、
占有を宣言して独占的に操作させるようにする仕組みである。
ファイルの書き込み処理などが対象となる代表例である。

占有を宣言することをロックといい、その解除を宣言することをアンロックという。

ファイルの書き込みなどの対象となる処理を行う前に、
占有を宣言して承認されればその後は独占状態となる。

占有を宣言しても既に先に宣言しているものがいれば、
それが終わるまで待つことになる。

排他制御は各々が占有を宣言(=お伺いを立てる)するというルールを遵守することに
よって初めて成り立つもので、各々でそれを漏らさないことが前提条件となる。
ま、これはUNIX系の場合。

Windows系などでは、ファイルOPENとかと一体となって
自動的強制的に排他制御が行われたりしているようだ。
分類:設計
PHP/ファイルの排他制御
2013年02月22日
まず、「flock()」の第二引数は以下の三つ。
・「LOCK_SH」…共有ロック
・「LOCK_EX」…排他ロック
・「LOCK_UN」…アンロック
#Windows版は対象外の「LOCK_NB」については端折ります。

つまり、先日言ってた「funlock()」的なものは
「flock(■,LOCK_UN)」ということになる。

次に話は変わって、ファイルにデータを書き込むタイミング。
「fwrite()」ではなく「fclose()」なんですよこれが。
「fwrite()」は仮のバッファに溜め込むようなもんで、
「fclose()」で初めて日の目を見るわけです。

なので、以下のようにした場合、排他区間は②~④となり、
④~⑤が非排他区間となってしまう。
┌──────────────────────────────────────┐
│$fp = fopen('ouput.txt','w');  …①                                         │
│flock($fp, LOCK_EX);           …②排他                                     │
│fwrite($fp, '出力');           …③排他                                     │
│flock($fp, LOCK_UN);           …④排他                                     │
│fclose($fp);                   …⑤←重要                                   │
└──────────────────────────────────────┘
⑤が終わって初めて遠足、いや排他を終えなきゃならないのに、フライングとなる。

つーことで、「fclose()」でアンロックも兼ねてくれるなら、
自発的にアンロックしちゃダメってのが一昔前の常識だったわけです。
#「fclose()」の中のロック解除の順番はファイル出力の後なんだよねという
  疑問があるかもしれませんが、その辺はちゃんと考慮してくれてるみたいです。
┌──────────────────────────────────────┐
│$fp = fopen('ouput.txt','w');                                               │
│flock($fp, LOCK_EX);                                                        │
│fwrite($fp, '出力');                                                        │
│fclose($fp);                                                                │
└──────────────────────────────────────┘

し・か・し、PHP5.3.2で仕様変更が発生して「fclose()」が
アンロックをやってくれなくなった。
#この原因は、どうやらバグ対応みたい(ファイルを二重に開いた場合とからしい)
  とにかく、クローズに徹して余計なことはしないってことかな

じゃ、どうする?
仕様変更を見なかったことにする?(ロックが解除されません)
手動でアンロックする?(排他が保証されません)

う~ん、身動きがとれない。。。

で、解決策。「fclose()」がやってくれている重要なファイル出力作業を
「fflush()」で先にやっちゃえばいいらしい。
┌──────────────────────────────────────┐
│$fp = fopen('ouput.txt','w');  …①                                         │
│flock($fp, LOCK_EX);           …②排他                                     │
│fwrite($fp, '出力');           …③排他                                     │
│fflush($fp);                       ←重要                                   │
│flock($fp, LOCK_UN);           …④排他                                     │
│fclose($fp);                   …⑤                                         │
└──────────────────────────────────────┘
これなら、排他は保証されるし、排他も解除できる。
分類:PHP
前へ 1 … 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 … 156 次へ