スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
拍手コメントを見る

ハッピーハロウィン!

20091031095837
変わり映えしないポーズですが…

お散歩仲間からちゃっかりお菓子を頂いてました。

タロママさん、ありがとうございます。
スポンサーサイト
拍手コメントを見る

[2] SQL と ロト6

2009/11/01 内容変更。"NO"カラム名を"DRAW"に変更しました。

ロト6のデータをSQLでいろいろやってみよう!・・・のパート2です。
前回は、各数字の出現頻度を出力するビューを作成しました。

元となるテーブル Loto6Result は毎週木曜日の抽選会の後で毎回アップデート(手動)するわけですが、前回作成したビュー v_freq6 も当然ながらそのときの最新データを元に出力されます。

さて、では抽選回のn回目までの集計結果が見たい!という場合はどうでしょうか?
もう一歩進んで、n回目からn+m回目まで見てみたいという場合はどうでしょうか?

v_freq6 は全データを対象にしているので、n回までといった事はできません。

こんなときは、SQL関数を利用するという手があります。
関数ですから引数を持たせることができて、範囲指定もお茶の子さいさいになるはずです。

とりあえず作成するSQL関数は以下の3つとします。
1:最新のすべての集計結果を返すもの(つまり、v_freq6 の結果と同等)
2:初回からn回目までの集計結果を返すもの
3:n回目からn+m回目までの集計結果を返すもの

では、1番目のSQL関数を作ってみます。
-- sql example 2-1
-- 全データをもとにした各数字の出現頻度を求めます。

CREATE OR REPLACE FUNCTION f_freq6()
RETURNS table (value integer, total numeric) AS
$$
SELECT value, total FROM v_freq6;
$$
LANGUAGE SQL;


使い方は、SELECT * FROM f_freq6(); です。
v_freq6 と同じ結果を返すだけなのに、わざわざ関数にする必要があるの?と考えたりもしますが、2番目と3番目の関数名との統一のためと思ってください。
そう、引数さえ違えば、同一の関数名が使えるんですね。いわゆるオーバーライドというやつです。

次に2番目、といきたいところですが、よくよく考えてみると、、、
2番目の「初回からn回目までの集計結果」というのは、「1~n回目」という事になります。
なので、「n回目からn+m回目までの集計結果」を返す SQL関数を用意しておいて、n に 1 を渡すことと同じになります。

というわけで、3番目の関数を先に作ります。基本的に、中身は v_freq6 と似ていますが、WHERE 句を用いて取得する範囲の指定を行っています。
-- sql example 2-2
-- 開始、終了の指定範囲における各数字の出現頻度を求めます。

CREATE OR REPLACE FUNCTION f_freq6(s integer, e integer)
RETURNS table (value integer, total numeric) AS
$$
SELECT value, SUM(freq) as total
FROM (
SELECT ID1 AS value, COUNT(ID1) AS freq FROM Loto6Result
WHERE DRAW BETWEEN $1 AND $2 GROUP BY ID1
UNION ALL
SELECT ID2, COUNT(ID2) FROM Loto6Result
WHERE DRAW BETWEEN $1 AND $2 GROUP BY ID2
UNION ALL
SELECT ID3, COUNT(ID3) FROM Loto6Result
WHERE DRAW BETWEEN $1 AND $2 GROUP BY ID3
UNION ALL
SELECT ID4, COUNT(ID4) FROM Loto6Result
WHERE DRAW BETWEEN $1 AND $2 GROUP BY ID4
UNION ALL
SELECT ID5, COUNT(ID5) FROM Loto6Result
WHERE DRAW BETWEEN $1 AND $2 GROUP BY ID5
UNION ALL
SELECT ID6, COUNT(ID6) FROM Loto6Result
WHERE DRAW BETWEEN $1 AND $2 GROUP BY ID6
) t
GROUP BY t.value
ORDER BY total DESC, value;
$$
LANGUAGE SQL;

ながったらしいですね。同じようなことが沢山記述されています。
各SELECT文は結局、WHERE 句の指定により範囲 n ~ n+m まで取得するように条件付けられているだけですので、こいつをまとめて別関数にしてしまいましょう。
-- sql example 2-3
-- 開始、終了の指定範囲のレコードを取得します。

CREATE OR REPLACE FUNCTION f_Result(s integer, e integer)
RETURNS table(DRAW integer, ID1 integer, ID2 integer, ID3 integer, ID4 integer,
ID5 integer, ID6 integer, IDB integer, DATE DATE) AS
$$
SELECT DRAW, ID1, ID2, ID3, ID4, ID5, ID6, IDB, DATE FROM Loto6Result
WHERE DRAW BETWEEN $1 AND $2
$$
LANGUAGE SQL;

sql example 2-3 で作った f_Result(s, e) を利用して、sql example 2-2 を改造します。
-- sql example 2-4
-- 【2-2改造】 開始、終了の指定範囲における各数字の出現頻度を求めます。

CREATE OR REPLACE FUNCTION f_freq6(s integer, e integer)
RETURNS table (value integer, total numeric) AS
$$
SELECT value, SUM(freq) as total
FROM (
SELECT ID1 AS value, COUNT(ID1) AS freq FROM f_Result($1, $2) GROUP BY ID1
UNION ALL
SELECT ID2, COUNT(ID2) FROM f_Result($1, $2) GROUP BY ID2
UNION ALL
SELECT ID3, COUNT(ID3) FROM f_Result($1, $2) GROUP BY ID3
UNION ALL
SELECT ID4, COUNT(ID4) FROM f_Result($1, $2) GROUP BY ID4
UNION ALL
SELECT ID5, COUNT(ID5) FROM f_Result($1, $2) GROUP BY ID5
UNION ALL
SELECT ID6, COUNT(ID6) FROM f_Result($1, $2) GROUP BY ID6
) t
GROUP BY t.value
ORDER BY total DESC, value;
$$
LANGUAGE SQL;

・・・ややスッキリ。って大したことないですけど(^^ゞ

最後に引数を1つしか持たない2番目の関数を作ります。
-- sql examle 2-5
-- 初回から指定回数までの範囲で数字の出現頻度を求めます。

CREATE OR REPLACE FUNCTION f_freq6(e integer)
RETURNS table (value integer, total numeric) AS
$$
SELECT value, total FROM f_freq6(1, $1);
$$
LANGUAGE SQL;


それぞれ、次のように利用可能です。

SELECT * FROM f_freq6(); -- 全データ
SELECT * FROM f_freq6(5); -- 初回から5回まで
SELECT * FROM f_freq6(8, 10); -- 8回から10回まで


最後におまけとして、初回から第469回(2009/10/29) までの全データを用いた出現回数ベスト5とワースト5を書いておきます。

ベスト5
順位数字出現回数
13079
22077
23777
43176
43676

ワースト5
順位数字出現回数
382158
383458
40256
413255
421452
432443


もうひとつおまけに、469回までの出現頻度のチャートをつけます。
確率の線をつけましたが、回数を重ねる毎に実データはこの線に近づくはずです。
つまり、現状谷になっている部分の出現確率は高くなり、山になっている部分は低くなるはずなんですが、、、理想と現実は違うようですね。
469回までの出現頻度

たぶん、to be continued... (ぁゃιぃ)

拍手コメントを見る

テーマ : データベース
ジャンル : コンピュータ

TortoiseSVN で複数の bugtraq を利用する方法

TortoiseSVNbugtraq は、コミットログにバグ追跡システムとの連携を関連付ける機能として非常に便利です。Notes/Domino を利用した構築方法は、過去のこの記事に書いてあります。
ただし、Version 1.6.6 現在に至るまで、複数のバグ追跡システム等への連携はとれません。

例えば、運用面か何かで、バグ追跡システムのサーバー引越しなどが発生し、引越し先では新たに発見した問題以降が登録されたとしたら、これまでのコミットログに記述した課題番号付きログが無用の長物になりかねません。

こりゃ、困ることになるな、と少々頭をひねってみました。

通常は、bugtraq:url にバグ追跡システムの URL とともに、文書を特定するための %BUGID% を記述します。%BUGID% は変数扱いで、コミットログに入力した文書IDが代入されます。
ユーザーはコミットログに付加された文書IDをクリックすれば、目的の文書が存在する URL に TortoiseSVN が変換してくれて、ブラウザで表示できるというわけです。

簡単に書くと、こんな感じ。

TortoiseSVN -> バグ追跡システムの該当文書

そーか。bugtraq:url に直接バグ追跡システムのURLを記述するから運用規模が狭くなっているのだ!と気が付いて、次のような事を思いつきました。

bugtraqPortal.html (仮称)を間にかませて、bugtraqPortal.html にて目的の url を分岐させてみてはどーでっしゃろ!?

簡単に書くと、こんな感じ。

TortoiseSVN -> bugtraqPortal.html (どのシステムを利用するか判断)
--> Aのバグ追跡システムの該当文書
--> Bのバグ追跡システムの該当文書

結論からいうと、出来ました。

これをうまく利用すれば、一方はバグ追跡で、もう一方は仕様文書へのリンクなどコミットログに貼りつけるといったような運用が可能になります。

詳細を書く前に、決め事があります。
文書IDの書式を特定しておきます。

例えば通常利用している文書ID(チケットIDとも言う)の書式が XXXX-YYYYYY だとします。
X には、大文字のアルファベットのみが入り、
Y には、大文字のアルファベットと数字が入ります。
正規表現で書けば、次のようになります。
X は [A-Z]{4}
Y は [A-Z0-9]{6}

こいつに細工をします。コミットログに文書IDを記載するときに、



XXXX-YYYYYY
-Zn
↑ ↑
文書ID システム識別子



のように、"-Zn" といった suffix をつける方向で話を進めます。
言うまでもなく、追加した "Zn" が、今回の bugtraqPortal.html に通知して「どのシステム利用するか」を特定させるための識別子です。

なお、過去のコミットログには、XXXX-YYYYYY が存在することも考慮して、"-Zn" が付かないケースも想定しておきます。
ですので、%BUGID% 変数には、既存の "XXXX-YYYYYY" または、今回拡張した "XXXX-YYYYYY-Zn" が入ってくる事になります。

TortoiseSVN の属性 bugtraq:url には、次のように指定します。ただし、後述の html が正しく動くか確認してからの作業になるので、実際には最後に行います。

bugtraq:url http://hoge/bugtraqPortal.html?%BUGID%

コミットログに記載された、"XXXX-YYYYYY(-Zn)" を特定するために、bugtraq:logregx の指定も必要です。こちらも、後述の html が正しく動くか確認してからの最後の最後の作業になります。

1行目:[A-Z]{4}-[A-Z0-9]{6}(-Z[0-9]+)*
2行目:([A-Z]{4}-[A-Z0-9]{6}(-Z[0-9]+)*)

※今回はコミットログ中のどこに、"XXXX-YYYYYY(-Zn)" が現れてもリンクをはらせたいので、1行目と2行目はほぼ同じです。

では、キモとなる %BUGID% を受け取る側の bugtraqPortal.html の中身です。

受け取った引数(%BUGID%)を分岐判断させ、目的の文書にリダイレクトさせるために、JavaScript を利用しました。


<html>
<head>
<title>bugtraq portal</title>
<script type="text/javascript">
<--
// デフォルトのurl
var url='http://issues/current/';

// URLの引数部分 '?' 以降を取り出し、一時変数 arg に代入します。
var arg = location.search;

// 引数の変数部分の文字列を取り出し、arg に再代入します。
arg = arg.substring(1,arg.length);

// arg から 文書ID部分のみを取り出し、一時変数 docID に代入します。"
// "XXXX-YYYYYY" 部分なので、index = 0 から 11文字分となります。

var docID = arg.substring(0,11);

// arg から分岐先の識別子 "Zn" を取り出し、一時変数 urlID に代入します。
// "Zn" 部分なので、13文字目以降を利用します。index は0から開始なので注意

var urlID=arg.substring(12);

// 分岐処理
switch(urlID)
{
case 'Z0':
url = 'http://issues/backup_000/';
break;
case 'Z1':
url = 'http://issues/backup_001/';
break;
default:
// 箸にも棒にも引っかからないケース
//url = url;
break;
}

// リダイレクト
setTimeout("link()",0);
function link() {
location.href = url + '?id=' + docID;
}
-->
</script>
</head>
</html>


この bugtraqPortal.html を http サーバーに保存しておきます。

TortoiseSVN の属性である、bugtraq:url と bugtraq:logregx を前述の方法で指定登録して利用します。

例)
コミットログに、"XXXX-YYYYYY-Z1" が書き込まれれば、リンクを自動作成し、そのリンクをクリックすると、
http://hoge/bugtraqPortal.html?XXXX-YYYYYY-Z1 が呼び出され、
呼び出された bugtraqPortal.html は次のURLにリダイレクトします。
http://issues/backup_001/?id=XXXX-YYYYYY 拍手コメントを見る

テーマ : ソフトウェア開発
ジャンル : コンピュータ

tag : TortoiseSVN bugtraq

あまりの大勝にびっくり

20091026004606
川崎フロンターレがホームであの華麗なるパスサッカー広島に7-0と大勝しました。

首位キープです(^^)v

写真はびっくりドンキーのカレーハンバーグ(300グラム)(^^ゞ 拍手コメントを見る

SQL と ロト6

2009/11/01 記事内容変更。"NO"カラム名を"DRAW"に変更

ロト6は、43個の数字のうちから重複しないものを6つ選んで買う一口200円のクジですが、先週で467回となっていました。

気が向いたときに一口だけ購入していたのですが、いい加減回数も増えてきているので、サンプリングしてみよっかな?という気になってきました。

出目の傾向がつかめたら、限られた数字の中から実際に買う番号をピックアップすれば済むって寸法です。毎回毎回43個から6個選ぶ必要がなくなるだけでもストレスから解放される、、はず。

なんて邪推はおいておいて、単純に「なんちゃって予想できるのかな?」という知的好奇心が70%くらいを占めています。・・・たぶん。

さてと、

自宅のPCにはDBが入っていないので、MySQLPostgreSQL のどっちが良いのか考えましたが、これまでに使ったことがない PostgreSQL に手を出してみようと思いまして、おもむろにインストール。。

あっさりとインストールは終わりましたが、立ち上げてみると業務で使っている Microsoft SQL Server と使い勝手が違うため、違和感ありありで凹みそうになりました。

データベースやテーブルを pgAdminIII というプログラムから作ると、余計な事に名称をダブルクォーテーションで囲ってくれてます。
ダブルクォーテーションで囲まれたデータベース名やテーブル名だけでなく、カラム名など、全てがケースセンシティブになるようです。
うぎゃ、面倒くさぁ。。。

と思いましたが、コマンドプロンプトから作ればいいんじゃん!という事で最初のハードルは突破。

作ったテーブルはこんな感じ。
回数#1#2#3#4#5#6bonus#開催日
DRAWID1ID2ID3ID4ID5ID6IDBDATE

DRAW はロトの抽選回数。
ID1 ~ ID6 にはそれぞれ6個の数字。
IDB はボーナス数字。
DATE は抽選日。

ということで、467回分の記録をこのテーブルに書き込んでいく作業から開始です。
ロト6の本家に過去データがあるので、それを加工しつつ、、少々お時間頂いております・・・みたいな。
思ったよりも面倒だ、、いやいや負けるなおとっつぁん!これも自己啓発だぜ、動機がどうであれな。

なんとかレコードの登録は済みました。

ここで、ちょっとした傾向がわかったので、つかみで公表しておきます。

確率の問題なのですから、1~43の数字が満遍なく出現しているのかと思いきや、なんとまぁ、出現率の高い数字と出現率の低い数字には倍違うことがわかりました。

ぱんぱかぱーん、発表します。
間違いここから~
467回中、77回も登場したのは、「37」。およそ6回に1度はでる事になります。
467回中、35回しか登場しなかったのは、「24」。およそ13回に1度しかでない。
~間違いここまで
467回中、78回も登場したのは、「30」。およそ6回に1度はでる事になります。
467回中、43回しか登場しなかったのは、「24」。およそ10回に1度しかでない


ま、これで言えるのは、「24」は選ぶな、って事だけですね。
・・・ほら、これだけで、42個から6つを選べばよくなりました、、、よね?

では、今回の最後に、この結果を導き出すに至った、SQL を書いておきます。
もっとスマートな方法があったらご指導いただければ幸いです。

-- のちのち使えそうなので、view として定義
-- 1~43の出現数を出します。
-- デフォルトソートは出現数の降順です。
-- 利用するときは、普通に
-- select * from v_freq6
-- でどうぞ。

CREATE OR REPLACE VIEW v_freq6 AS
SELECT value, SUM(freq) as total
FROM (
SELECT ID1 as value, COUNT(ID1) as freq FROM Loto6Result GROUP BY ID1
UNION ALL
SELECT ID2, COUNT(ID2) FROM Loto6Result GROUP BY ID2
UNION ALL
SELECT ID3, COUNT(ID3) FROM Loto6Result GROUP BY ID3
UNION ALL
SELECT ID4, COUNT(ID4) FROM Loto6Result GROUP BY ID4
UNION ALL
SELECT ID5, COUNT(ID5) FROM Loto6Result GROUP BY ID5
UNION ALL
SELECT ID6, COUNT(ID6) FROM Loto6Result GROUP BY ID6
) t
GROUP BY t.value
ORDER BY total DESC;
-- 以上


・・・ to be continued ・・・(ほんとかな?) 拍手コメントを見る

テーマ : データベース
ジャンル : コンピュータ

tag : ロト6 PostgreSQL MySQL

また当たった!

20091017150939
プロバイダーの懸賞に応募したら、また当たっちゃいました。

次は宝くじか?

あ、でも買わないと当たらないのか… 拍手コメントを見る

トリック オア トリート

20091016181557
ハロウィンって事で、行きつけのペットサロンにてジャック・オー・ランタンのマントを頂きました。

朝日より夕日で撮るべきだったと後悔… 拍手コメントを見る

言いたくないが

10/14 はサッカー日本代表 vs トーゴ代表戦でした。
結果は、5-0 でホーム日本の勝ち。

さて、この試合。右サイドバック、左サイドバック、左サイド、ボランチと、どっかのチームの選手の固まりが挙って登場しました。

左サイドバックの選手は代表でもポジションほぼ固定な人なので、そのポテンシャルの高さは認めざるを得ませんが、

困ったことに、、

右サイドバック、左サイド、ボランチの選手達が自信を持ってしまったことです。

いや、ま、リーグ戦などで拝見しても良いプレーヤーだなぁとも思っていたし、代表にとっても非常に喜ばしいことなんでしょうけどね。

君たち、11/03 のナビスコカップ決勝戦では暴れなくていいですからね。 拍手コメントを見る

いつかその日まで

    『2009年9月をどう過ごしました?』

何かと忙しくしていたような、そうでないような。
昼夜逆転してしまったような、意外とそうでないような。
ただ、あっという間でした。

    『2009年10月をどう過ごしていますか?』

目の前のことをコツコツとこなすようにしています。
明るい未来を夢見るように努めています。
ただ、気が付くとため息ついていたりしています。

    『2009年11月をどう過ごしたいですか?』

安穏といきたいですが、そうも言ってられないでしょう。
ひきつづき、目の前の障害を乗り越えるように努力はしているでしょうね。
ただ、地味に、ですが。

いつかその日まで。 拍手コメントを見る

台風一過

20091008121614
びょ~ん 拍手コメントを見る

FT-86コンセプト発表

SUBARU と TOYOTA のコラボ車、FT-86 コンセプトが東京モーターショーで出品されるようです。
FT-86 コンセプト

SUBARU の BOXER エンジン(NA) を積んだ FR スポーツカーとのこと。
写真は、トヨタブランドのものだからかもしれませんが、セリカっぽく見えます。
スバルブランドだとどのような顔立ちになるのか興味深いです。

FT-86 の"86"は、走り屋さんに大人気の往年の名車 AE-86 カローラレビン・トレノから持ってきたとのこと。
F、T はそれぞれ、富士重工とトヨタの頭文字でしょうかね?

市販車となった暁には、トヨタの手心が加わって、その内装には文句つけにくいものになるのかもしれません。SUBARU車の内装は評判悪いですからね。
僕自身は気にしてません。内装に金かけるくらいなら、メカに注力してよっ!って思いますから。

2011年末に販売開始目標だとか。
お金貯めなきゃ!! 拍手コメントを見る

tag : FT-86 SUBARU TOYOTA

大君と書いて TYCOON

タイトルを訂正しました。
誤:大空(×)
正:大君(○)
---- on 2009/10/06

日曜日の昼食に、横浜ベイサイドの TYCOON に行ってまいりました。
約20年ぶりです。TYCOON に行ったのは。
そのときは夜に学生時代の仲間と行って、クローズドマジックなんてサービスを見せてもらって目が白黒
した覚えがあります。

「また来よう!」と思っていたんですが、20年経ってました。にゃはは。

ちなみにこの店は、屋内でもペット同伴可なんですね。
TYCOON はペット同伴可


さて、今回は義弟家族との会食だったのですが、いやまぁ、なんというか連れてきた赤ん坊が、「おりこうさん」でですね、びっくりしました。

僕が持っていた赤ん坊の印象は、

  • 眠くなるとぐずり、
  • 夜泣きのための睡眠不足で目の下に隈をつくっている両親が居る。

だったのですが、まぁ、なんと。すっと寝て、さっと起きて。ケラケラとよく笑い、本当に可愛い子でした。

まぁうちのモーフィーも、店長さんらしき白髪長髪のおっちゃんに一度ほど威嚇したくらいで(オイオイ)、あとはイイコにしてましたが、そりゃま、そうです。人間に例えると30超えているはずなので、おっさんいい加減に落ち着けよ、ってな感じですけど。

なお、晴天だったためか、殆どの客はテラスに陣取り、屋内で店員さんを呼び止めるのに苦労しました。晴れて暖かく風の無い日は、テラスの席を取ったほうがよいかもしれません。
ついでの情報ですが、一応、財布にはあまり優しくないお値段設定です(笑)。

さて、次回は20年後でしょうか。 拍手コメントを見る

tag : TYCOON

ブログ内検索
プロフィール

雷ぶ

Author:雷ぶ

最近の記事
最近のコメント
最近のトラックバック
カテゴリー
月間アーカイブ
ブロとも申請フォーム

この人とブロともになる

RSSフィード
リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。