MW211 EXIT

devlog
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
PHP/file関数の排他制御
2013年02月21日
「file()」や「file_get_contents()」では排他制御ができない。

排他制御には「flock()」が必要で、この引数の一つがファイルポインタで、
つまりは、ファイルポインタがないと排他制御ができないのだが、
「file()」や「file_get_contents()」はファイルポインタがない
(敢えて意識しないような作りの)関数だからだ。

ま、読み込む分には、リトライとか必要ないからそれでいいのかもしれないが、
書き込みとセットで「読み込み~書き込み」の間を独占したい場合には、
排他制御が必要となってくる。

ということで、実現方法としては、ダミーの排他用ファイルを用意して、
そちらで排他の真似事のようなこと(といっても思いっきり排他だけど)をする。

  (1) 排他用ファイルをロックする
  (2) 「file()」とかを使って読み込む
  (3) 「fopen()」「fwrite()」「fclose()」を組み合わせて書き込む
  (4) 排他用ファイルをアンロックする

これにより、(1)~(4)の区間が排他占有となり、(2)と(3)も排他占有となるという寸法。
┌──────────────────────────────────────┐
│$fp = fopen('lock.txt','w');                                                │
│flock($fp, LOCK_EX);                                                        │
├──────────────────────────────────────┤
│fclose($fp);                                                                │
└──────────────────────────────────────┘
「flock()」の対義語的な「funlock()」(そんなのないけど)は、
「fclose()」が内包してくれてる感じかな。

追記:と思ったら、PHP5.3.2以降ではアンロックを
      「fclose()」が内包してくれない仕様になってしまった
…というわけで続く。。。
分類:PHP
PostgreSQL/条件分岐UPDATE文
2013年02月20日
条件によりUPDATEしたい値を変えたい場合には、CASE文が使える。
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 列 = (CASE                                                          │
│                WHEN 条件 THEN 値                                           │
│                ELSE           値                                           │
│              END);                                                         │
└──────────────────────────────────────┘
CASE文の前後を囲む括弧はなくてもよいみたい。
分類:PostgreSQL
PostgreSQL/ランダムな並び替え
2013年02月19日
「ORDER BY」句に「random()」を使う。

こんな感じ。
┌──────────────────────────────────────┐
│SELECT 列 FROM 表 ORDER BY random();                                        │
└──────────────────────────────────────┘
分類:PostgreSQL
前へ 1 2 3 次へ