めざましテレビ

今日の早耳ムスメ長谷川潤ちゃん,お題は「クール派! フェミニン派! ミリタリーファッション」.
こ,これはつまり,カッコいい系 vs かわいい系じゃないっすか!?
雑誌ではお馴染みの対決企画が早耳にも.
でもでも...
クール?? フェミニン??
どっちの CD もイマイチ魅力がないような.ゴチャゴチャしすぎなんだよね.
潤ちゃんの私服 (?) のシンプルなスタイルが最高だと思ったのは私だけ?


それにしても...
潤ちゃんの後にスタジオだなんて...
もはや落差じゃなくて,異次元ですね.
かわいそうにナカミー,失笑してたじゃないですか.
もしかして罰ゲームですか?
裏で賭でもやっていて,ナカミーが負けるとスタジオですか?
きっとそうに違いない!!

Prolog 写経記 その 32 substitute_all/4

(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.

Prologユーティリティライブラリ

Prologユーティリティライブラリ

今日は substitute_all/4 を写経します.

解説

substitute_all(X, Y, List1, List2)List1 に現れる要素 X のすべてを Y に変更した新しいリストを List2 として返す.

ふむ.Java でいうと今度こそ Collections#replaceAll(List, Object, Object) ですね.

モード

substitute_all(?, ?, ?, ?).

おっと,今度は全ての変数が入出力両用に.

定義

では,こいつの定義を写経しませう.

substitute_all(_, _, [], []).
substitute_all(X, Y, [X | List1], [Y | List2]) :-
	X \== Y, !,
	substitute_all(X, Y, List1, List2).
substitute_all(X, Y, [Z | List1], [Z | List2]) :-
	substitute_all(X, Y, List1, List2).

さすがに今回は conc/3 を使っていませんね.
2番目の節に出てくる \== は両辺のリテラルが一致しない場合に成功する組み込み述語らしい.
普通の = は比較演算子というより同一化するという意味合いが強くて,

2 ?- X = a, X = Y.

X = a
Y = a 

Yes

となるのに対して,== だと

3 ?- X = a, X == Y.

No

と,こっちの方は具体化された値が等しいかどうかをチェックする模様.
\=\== はそれぞれの否定.


ともあれ (JW),2 番目の節は第 3 引数で与えられたリストの先頭の要素が X と一致した場合に第 4 引数で与えられたリストの先頭の要素を Y にするわけですね.
3 番目の節は第 3 引数で与えられたリストの先頭の要素が X と一致しなかった場合はそのまま〜ってこと.特にガードが入ってないけど 2 番目の節にカットが付いているから一致した場合ここには来ない,と.

では使用例を写経しませう.

4 ?- substitute_all(0, 1, [1, 0, 1, 0, 0], L).

L = [1, 1, 1, 1, 1] 

Yes
5 ?- substitute_all(x, y, [t, v, z], Y).

Y = [t, v, z] 

Yes

6 ?- substitute_all(X1, X2, [b, a, c, a, d], [b, d, c, d, d]).

X1 = a
X2 = d 

Yes
7 ?- substitute_all(1, 2, List, [3, 2, 4, 2 ,5]).

List = [3, 1, 4, 1, 5] 

ふむ.
まぁこんな感じだよねぇ.うんうん.


Prolog 本

Amazon に注文してあった Prolog 本が 3 冊ばかり届きました.
予定よりちょっと遅かったのですが,先に買った本がまだ片づいていないのでもっと遅れてもよかったんだけどなぁ.


Programming in Prolog: Using The Iso Standard

Programming in Prolog: Using The Iso Standard

普通に入門書っぽい.サイズがコンパクトでよさげ.
和書で言うと 「Prolog 入門 (isbn:4274073084)」に近い雰囲気?


The Art of Prolog: Advanced Programming Techniques (Logic Programming)

The Art of Prolog: Advanced Programming Techniques (Logic Programming)

こっちはハードカバーでちょっと大きめ.おいらのカバンには入らないな.
こちらも入門書っぽい構成.上の本とほとんど同じ内容のような...


The Craft of Prolog (Logic Programming)

The Craft of Prolog (Logic Programming)

こっちもハードカバーだけど,幅がちょっとだけ狭くて少し薄いのでおいらのカバンでも入るかも.
これはなかなか期待大です.
まずは Preface より.

There are a lot of introductory Prolog books around. This is not of them. Think of it as "second steps in Prolog".

かぁっこいいぃ〜.
さらに Introduction より.

This is not an introductory Prolog textbook.
・・・
It isn't even a second Prolog textbook.
・・・
No, this isn't a textbook at all.

かぁっこいいぃ〜.
ちなみに,中略したところにはオススメの textbook が紹介されています.
最初の textbook としては...

そして second textbook としては...

そうですか.先に「Programming in Prolog」を読んで,それから「The Art of Prolog」を読んで,その後に「The Craft of Prolog」を読めばいいわけね.
先は長いな...
っていうか,他にも既に購入済みの Prolog 本,注文済みで未発送の Prolog 本があるわけですが...
心より恥じる.


JCSP による SQL 並列実行

Java で CSP (Communicating Sequential Process) を実装した JCSP というプロダクトがあります.
http://www.cs.kent.ac.uk/projects/ofa/jcsp/
developerWorks で解説記事の翻訳が出ているので知ってる人も多いよね.


この JCSP,数値計算などではともかく業務アプリケーションではなかなか使いどころが思いつかなかったりするわけですが,一つひらめいたのが SQL の並列実行.
うちの場合,ブラウザからのリクエスト一発で SQL を 100 回以上発行するような処理が結構あったりします.金融資産のポートフォリオ求めたりする場合とか.
その場合の SQL って,他の問い合せ結果には依存しない,並列に実行できそうなものが結構多かったりするんですよね.


そんなわけで,SQL 文字列なんかをチャネル (キューのようなもの) にどんどん流して,プロセス (CSP 用語のプロセス,実際はスレッド上で実行される) で並列に実行すればいいんじゃないかと妄想してみました.
それぞれのプロセスは自分専用の XAConnection を持ち,チャネルから取得した SQL の実行を延々続けます.
結果の返ってきた SQL を処理したプロセスはチャネルから次の SQL を取得して実行することで,コネクションをフル活用することが出来ます.
その際には適切な XidXAResource に設定して SQL を実行することで,複数のトランザクションが入り乱れても安心♪
RDBMS 側のリソース (CPU や IO 等) に余裕があれば,一つのコネクション上で直列に実行するよりトータルの処理時間を短縮できるかも!?


そんなわけで (どんなわけで?),職場の Oracle でこっそりと試してみたのですが,結果はイマイチ...
全く想定していなかったのですが,Oracle では同一のグローバルトランザクションに属する SQL の実行は直列化されてしまうようです.
例えば A,B,C という 3 つの SQL があり,その処理時間が A > B > C だとします (10 秒と 1 秒と 0.1 秒みたいな).
Xid を設定せずに,個別の (文単位) トランザクションとしてこれらを並列に実行すると,結果は C,B,A の順で返ってきます.


しかし,それぞれのコネクション (XAResource) に同じグローバルトランザクション ID を持つ (ブランチ識別子は当然別) Xid を設定すると,結果は A,B,C の順で返ってきます.
並列といっても各 CSP プロセスはチャネルから SQL を取り出した順で実行を始めるわけですが,そのままの順で結果が返って来ちゃうのです.0.1 秒で終わるはずの SQL (C) の結果が返ってくるのは 11 秒 (A + B) 後.(;_;)
これじゃあコネクションを複数使う意味がないよ... しくしくしく.
っていうか,JCSP や XA のオーバーヘッドが大きい分だけ不利だし... しくしくしく.


read only トランザクション専用に限定すれば,文単位トランザクションにすることにより多少は並列実行による恩恵を得られそうですが,それも期待したほどではなく,あまりメリットはなさそう.
無念だ.


いい感じで行けそうだったら

Open Multithreaded Transactions: A Transaction Model for Concurrent Object-Oriented Programming

Open Multithreaded Transactions: A Transaction Model for Concurrent Object-Oriented Programming

の PDF をじっくり眺めて (読むのは辛い) ちょっと本格的に取り組んでみようかと思ったのに.しくしくしく.
せっかく今日 Prolog 本と一緒にが届いたのに.トランザクション絡みの記事が 2 本あったのに.しくしくしく.

CanCam 10 月号 エビちゃんベストセレクション 24

CanCam2005年10月号の蛯原友里ちゃん

CanCam から,お気に入りの蛯原友里ちゃんを紹介しようというこのコーナー.
今日も ef-de とのタイアップ「めちゃモテ♥エレガンス,はじまる!」から P285 の友里ちゃん.
右端に友里ちゃんと頭をくっつけているところがちょっとだけ見えているのはおいらの頭です.
嘘です.ごめんなさい.本当は茉希ちゃんです.
まぁ,妄想だけなら何でもありってことで.
そんなわけで (どんなわけで?),やっぱり CanCam 買うしか!!