2005年09月09日

売切れご免!お客様感謝セール

いつもお世話しております。
『かしらもんじ でぇ〜』管理人の『guy』です。
私のホームページより、
英語教材を購入頂いたかた、
出会いサイトに会員登録頂いたかた、
記事で紹介した書籍や商品を購入頂いたかた、
ご贔屓くださいまして、ありがとうございます。
皆様の目的が達成できますよう、
皆様の今後のご繁栄を願っております。

特に書籍の売上比率が高いこともあり、
皆様へ何か還元できないかと考えていたところ、
私が個人的にITコンサルティングをしております
文具製造メーカーの社長様より、
『バブル期に某有名ブランド向けに製作したブックスタンドが、
新品在庫で倉庫に保管してあるので好きにしていいよ。』
とのお話がありました。


今回は、『お客様感謝セール』の冠で、
このブックスタンドを格安にて販売いたします。
欲しいと思われたかたは、商品説明を御覧いただき、
下記記載のオークションサイトで入札頂くか、
数量と希望価格を明記しオークションサイトQ&A宛に連絡ください。

商品名
ブックスタンド
サイズ
巾620×奥235×高215(mm)
材質・色
スチール(メラミン焼付け塗装)・白
重さ
2.4kg
耐重
約25kg
その他
引き出し2個・(写真2枚目参照)中仕切り2枚付き。
部品・組み立て説明書あり。
定価
7,000円
開始価格
1,500円

オークションサイト

Copyright guy@かしらもんじ でぇ〜

posted by guy at 00:54 | キャンペーン

2005年09月07日

DVDを簡単にダビングする方法

大型で強い台風14号が九州地方へ上陸し、
けさにも近畿地方再接近とのことですが、
皆様はいかがお過ごしでいすか?

海の中は徐々に暖かくなり透明度が増し、
ダイバーに都合の良いコンディションとなりますが、
台風の発生や台風が日本へ接近する確率が高まり、
海上では想像を越える高波が発生する場合もあります。
過去のダイビングで、台風により船が欠航し離島へ足止め、
飛行機をチャーターし本土へ帰還した経験を思い出します。
これから台風の季節、風雨が強く外出が億劫となる日は、
インドアライフを満喫する生活も一つの選択かと思います。

さて今回はインドアライフを楽しんで頂くため、
私も愛用する便利なデジタルビデオ編集機を紹介します。
機能概要および機能詳細は下記の表を参照してください。

プロスペック(PROSPEC)社の
デジタルビデオ編集機DVE774は、
専用接続ケーブルが2本付属するので、
購入後、再生機と録画機の間に設置し即使用できます。
お気に入りの映像、大切に保管しておきたい映像を
デジタルビデオ編集機を使用し綺麗にのこ(録画)して下さい。

【注意事項】
本機のノイズリダクション回路は、
本来の映像信号以外の全ての信号をノイズと扱うので、
DVDやビデオテープのコピープロテクト信号も除去します。
子供達向にポケモン、ディズニー、スタジオジブリから、
新作の映画、プロモーションビデオまで全てコピーできますが、
市販のまたはレンタルのDVDやビデオテープ中に、
無断複製禁止の注釈がある物をダビングすることは違法です。

商品名称
デジタルビデオエディターDVE774
機能概要
※1
DVE774は、高画質・高機能を追求した、新設計・最高級デジタルビデオ編集機です。従来品(DVE773)と比べ4倍のダイナミックレンジを実現した新開発高画質デコーダーに加え、新たにノイズリダクション回路を搭載。色合い調整・明るさ調整に加え、さらに画質補正機能も強化しましたので、水平解像度450本以上の高画質での録画・編集・再生が可能です。DVE774は、高画質でDVD-R/RW/RAMなどに保存しておきたいハイクオリティ指向のAVファン必需品です。
機能詳細
※1
・ダイナミックレンジ4倍で高画質
従来品(DVE773)と比べ4倍のダイナミックレンジを実現した新開発高性能デコーダーと、大容量4Mbit画像メモリーを搭載。DVE774に入力されたアナログ信号は、画像信号部分だけがデジタル信号に変換され、この画像メモリーに蓄えられあとデジタル画像補整を行い、正規の垂直・水平同機信号及びカラーバースト信号と合成されて、アナログ信号として出力されます。この先進の画像処理により、余計なノイズを除去し、高画質なビデオ編集を実現しました。

・ノイズリダクション機能
新開発映像ノイズリダクション機能を搭載。受信状態が悪いチューナーから録画したり、ダビングを繰り返したビデオテープなどのザラツキノイズを低減。MPEGなど画像圧縮して記録した映像のブロックノイズ低減にも有効です。また、モード設定により残像イメージを残して動きを表現する特殊再生機能としても使えます。

・色あい調整機能(11段階)
ビデオカメラなどの撮影時に適正なホワイトバランス設定されていない映像も、色あい調整機能により、簡単に正しい色に補整することが可能。肌色をナチュラルに再現することができます。調整段階は赤方向5段階/オリジナル/緑方向5段階の合計11段階。

・明るさ調整機能(11段階)
ビデオカメラで撮った暗い映像や、輝度劣化した古いテープなども、明るく輝度の補正が可能。撮影済みの暗い映像が鮮やかに蘇ります。調整段階は輝度(暗)5段階/オリジナル/輝度(明)5段階の合計11段階。

・スチル&フラッシュモーション機能
大容量映像メモリーを活用したデジタル静止画機能搭載。決定的映像の瞬間を止めて鑑賞・編集することが可能です。

・デジタルTBC機能
高性能デジタルTBC(タイムベースコレクター)機能により、画面のブレを引き起こす同期信号の時間軸方向の乱れを補正し、テープの伸びや回転ヘッドの走行ムラによって生じる画面の歪みやブレ(揺れ)を除去。古いテープやレンタルビデオ、ビデオカメラ等で撮影したテープなども安定した高画質で再生・編集することが可能です。

・カラーバー信号出力機能
モニターの色調整の基準となるカラーバー信号出力が可能。録画ビデオテープの最初に5秒間程度録画しておくことにより、モニターの色相調整や色再生機能の確認が可能です。

・大画面プロジェクター対応
プロジェクターなど、大画面での再生時に表面化するスキュー歪みを補正し、クリアな映像を実現。ホームシアターファンの必需品です。

・DVD/D-VHS録画対応
大容量画像メモリーと高性能デジタルD/Aコンバーターにより、高次元のデジタル信号処理を行っていますので、D-VHSデッキの録画はもちろん、DVD-R/RW/RAMレコーダー、また最新のHDDレコーダー、PC録画にも対応しています。

・S端子/ピン端子入出力対応
本体底面のビデオ信号切換スイッチをS側にするとセパレート信号入出力(S端子)、CMP側にするとコンポジット信号入出力(ピン端子)と機器を選ばずそれぞれの信号に対応可能です。
※1 機能概要、機能詳細は
デジタルビデオエディターDVE774の説明部より抜粋しています。

家族との良い思いでや、
感動する映像の記録と保管に、
商品のご購入はこちらからどうぞ!


記事で取り上げた機種になります。
性能と価格で一番バランスが取れた機種です。



DVE774の後継機種になります。
ドットマトリクスLCD、リモコン付属、
従来機と比べダイナミックレンジ4倍、
メモリー2倍のハイスペック機種です。



DVE774の機能を継承し、
省コストを追求した機種です。
ノイズ除去の機能は十分で、
安価に購入できる入門機です。

Copyright guy@かしらもんじ でぇ〜

posted by guy at 13:14 | ライフスタイル

2005年08月18日

再帰呼出しの基本は階乗計算ですよ!

再帰呼出しとは、
ある目的のために作られた関数が、
自分自身を再び呼び出すことで目的が達成出来る場合、
自分自身から自分自身を関数呼出しすことを指します。

プログラミングの基礎演習分野で、
大学の講義や新人研修で広く利用される題材を例に、
今回は再帰呼出しプログラミングをDelphiで習得しましょう。

皆さん小中学校時代の算数で、「階乗」について習いましたね。
念のため復習しておきますから、思い出してくださいね。

0の階乗=1
1の階乗=1
2の階乗=2×1
3の階乗=3×2×1
4の階乗=4×3×2×1

言い換えると、
nの階乗=n×(n−1)の階乗となります。
具体的なプログラミングサンプルを見ての通り、
再帰呼出しなんて全然臆する事はありません楽勝です。
あなたも必要なタイミングで再帰呼出しを利用し、
エレガントなプログラミングを心がけてください。

ただし、MS-DOS(歳がバレますね。笑い)や、
組込みソフトウェアなどメモリ制限や制約の多い中で、
再帰呼出しは実行時スタックを消費することをお忘れなく。

See you again!

使用例
procedure TForm1.Button1Click(Sender: TObject);
 //----------------------------------------------
 function _Factorial(pNumber: Integer): Integer;
 begin
  if (pNumber = 0) or (pNumber = 1) then
   Result := 1
  else
   Result := pNumber * _Factorial(pNumber-1);
 end;
begin
 Edit2.Text :=
  IntToStr(_Factorial(StrToIntDef(Edit1.Text,0)));
end;


関連書籍


Copyright guy@かしらもんじ でぇ〜

posted by guy at 22:49 | 教育編

2005年08月17日

インファーノMP7.5カスタマイズ計画

※2005年7月19日の日記より
皆さんはこの3連休をいかがお過ごしでしょうか?
私たち家族は、土曜日の子供たちの
幼稚園夏祭りに始まり、
日曜日にインテックス大阪で開催された
ロボット博覧会に参加し、
月曜日は朝から海水浴へ、
夕方には温泉でべとつく体をリフレッシュ、
晩は天保山の花火大会、
海遊館ナイトツアーと忙しなく動き回っておりました。

家族サービスを口実に毎週末家族をリードしますが、
今回一番楽しんでいたのは、
他でもなく私かもしれません。(笑い)
午前零時過ぎ、子供たちは心地よい疲れの中、
溢れんばかりの思い出を胸に、ようやく眠りに入りました。
ようやくこれから自分の時間が始まります。
只今記事を編集中です。
(さてと、やることが沢山あって大変です。)

3連休は時間を確保できなかったのですが、
私の中で小さなブームになっている遊びがあります。
今回は車好きの私が継続し、
没頭中のラジコンカーを紹介します。
模型とはいえ、実車の基本的な
チューニングに通じる要素が多く、
車を想い通りカスタマイズできる魅力はとても面白いと思います。

皆さんも気の合う仲間と週末、ビール片手に気楽に、
ドライビングやレースを楽しんでみてはいかがではょうか?
(お酒飲んでも飲酒運転で捕まる事はありません。笑い)

【画面イメージ1】

MP7.5P1.jpg
※写真はMP7.5 SPORTSをベース車にカスタマイズしています。

MP7.5 SPORTS
【オススメ度】★★★★★
全長
496 mm
全幅
307 mm
全高
189 mm
ホイールベース
323〜328 mm
重量
3,200 g
エンジン
排気量 / ボア / ストローク
GS−21R
3.49 cc / 16.4 mm / 16.5 mm
最高出力
hp / rpm
1.6 / 19,000

インファーノ MP-7.5 スポーツ レディセットは、
価格¥54,600(税込)で「KYOSHO」が生産しています。
要なラジコン店で実勢価格3万円代後半で販売されており、
セットの他に、送受信機用バッテリー、
グロー燃料、プラグヒーターを
購入すれば、だれでも簡単に走行可能です。

セットに付属のGS−21Rエンジンは、
リコイルスタータ付き1.6馬力と非力ですが、
初心者は、このエンジンで十分に経験を積み、
パワーソースをアップグレードすることをオススメします。

エンジンをはじめ、
豊富なオプションパーツが、
純正メーカーや、
サードベンダーから提供されていますので、
好きな人はカスタマイズに
夢中になりますので注意が必要です。(笑い)

それでは、MP7.5 SPORTSをベース車にした
マイマシーンのチューニング状況を紹介しましょう。

【画面イメージ2】

MP7.5P2.jpg

@
燃料フィルター/エアークリーナーを装着する。
エンジンをゴミやほこりから守り、エンジンの圧縮を長持ちさせるため、燃料フィルターと、エアークリーナーの装着は必須です。 初心者は特に忘れがちですが、エアークリーナーは走行後は予想以上に汚れますので、よく洗浄し必ずエアークリーナーオイルを十分染み込ませてください。 エアクリーナーにオイルが不足していると、エンジン内に砂などが混入し圧縮機能をすぐに奪ってしまいます。
A
25クラス用マフラーを装着する。
キット標準のノーマルマフラーを1クラス上の25エンジン用マフラーへ交換します。 ノーマルマフラー装着時と比べ排気効率がよくなりエンジンの回転が上がります。 エギゾーストノートも2サイクルレーシングバイクかと思わせる心地よいサウンドに変わります。 エンジンのフケがよくなるので、キャブレターのニードルバルブを開きぎみに設定し、多めに燃料を送ることでエンジンを内部から冷却して下さい。 ノーマルマフラー装着時と同じ設定や、それ以上ニードルを絞ると、エンジンがメルトダウンしますので注意してください。 模型エンジンでリーンバーンエンジンは経験上聴いたことがありませんので、パワーがアップするかといって希薄燃焼は厳禁です。
B
3Pクラッチを装着する。
マフラー交換後はエンジンの回転が上がりますので2Pクラッチのクラッチスプリングへの負荷は増大します。 特にギャップの多い路面をフルスロットで走行する場合、タイヤの路面追従能力が低下した一瞬の隙にエンジンの回転が上がり、2Pクラッチのクラッチスプリングが切れます。 私がドライブする場合は、2Pクラッチでは10分と持ちません。 クラッチトラブルの復旧は時間がかかり大変です。是非3Pクラッチの装着をオススメします。
C
スタビライザーを装着する。
スタビライザーは車体の左右のサスペンション間を鉄の棒で連結し、その鉄の棒から発生するねじれ剛性を利用し、車体のロールを押さえる働きを持っています。 スタビライザーの装着により、実車と同様にコーナリングをよりシャープに、ステアリング特性をよりクイックにできる効果があります。 スタビライザーは構造上とてもシンプルで安価ですから、必ず装着し、あなた好みのステアリング特性が出せるようにねじれ剛性を調整してください。
D
LSDを装着する。
キット標準ではフロント、リヤ、センターにディファレンシャルギアが装着されています。 デフギアは左右のタイヤに回転差を与え、滑らかなコーナリングを実現するために必要なのですが、ギャップの多い路面やコーナリング中のイン側タイヤのリフトなどでタイヤが空転しトラクションが逃げてしまいます。 LSD(リミテッドスリップデフ)はコーナリング時や加速時にタイヤの空転を制限し、トラクションロスを防ぐ機能を持ったギアとなります。 実車の場合、1ウェイ、1.5ウェイ、2ウェイと、加速時のみ空転を制限する物から、減速時も空転を制限する物まで3種類のLSDが存在しますが、模型の場合1ウェイで加速時のみ空転を制限するギアになります。 コーナーからの立ち上がりはノーマルより確実に早くなりますが、 コーナリング時常にアクセルオンのままであれば、車はアンダーステアがどうしても強くなります。

Copyright guy@かしらもんじ でぇ〜

posted by guy at 23:19 | ライフスタイル

2005年08月16日

Windowsのイベントログを書き込む方法

Windowsで24時間365日稼動を保証する
ミッションクリティカルな
アプリケーションを作成する場合などに、
アプリケーションで発生する警告や致命的エラーを、
管理者がすばやく検出し対処できる様に、
適切なソリューションを提供する必要があります。

Windowsのサービスやアプリケーションが出力する
システムエラー、セキュリティ警告、アプリケーションエラーなどは、
主にイベントログに出力される仕組みが出来ています。
しかし、随時発生するイベントを、
「イベントビューア」で確認していては、
管理者の負荷はとても高く、
現実的な運用管理とほど遠いものとなります。

世の中には、Windowsのイベントログにフィルタリングを行い、
必要な情報を管理者へメールで通知するツールや、
Windows XP/Windows Server 2003から
提供された「eventtriggers」コマンドを利用し、
必要なイベントを必要なタイミングで抽出し、
任意のスクリプトを実行できる
便利な運用管理ツール類が存在します。
フィルタリングし通知するツールは別途紹介するとして、

今回は、アプリケーションで、
Windowsイベントログの利用を検討されているあなたに、
WindowsAPI関数の「ReportEvent」を
利用した具体的なソリューションを、
Delphiのサンプルプログラムで紹介します。

サンプルプログラム実行前に
以下の手順を実行してください。


@
EventLog.mcファイルをコンパイルしEventLog.rcを作成する。
MC.EXE EventLog.mc
A
EventLog.rcファイルをコンパイルしEventLog.resを作成する。
BRCC32.EXE -32 EventLog.rc
B
EventLog.resファイルをEventLogTesterUnit.pasに登録する。
{$R EventLog.RES}
C
レジストリにEventLogTesterのエントリを作成する。
・HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
 Services\EventLog\Applicationキー配下に
 「EventLogTester」キーを作成する。
・HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
 Services\EventLog\Application\EventLogTesterキー配下に
 名前=EventMessageFile,種類=REG_SZ,
 データ=<EventLogTester.exeのフルパス>を作成する。
・HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
 Services\EventLog\Application\EventLogTesterキー配下に
 名前=TypesSupported,種類=REG_DWORD,
 データ=0x00000007を作成する。

全ソースは【続きを読む】をクリック!

使用例
procedure TForm1.btnReportEventClick(Sender: TObject);
const
 // イベント識別子
 EVENTID_INFOMATION = $400003E9;
 EVENTID_WARNING = $800003EA;
 EVENTID_ERROR = $C00003EB;
var
 lHdl: THandle;
 lMsg: String;
 lType,
 lEventID: Integer;
begin
 // イベントログのハンドルを取得する
 lHdl := RegisterEventSource(Nil, PChar('EventLogTester'));
 // ログに書込むイベントの種類を決定する
 case rgEventType.ItemIndex of
 0: // Information
  begin
   lType := EVENTLOG_INFORMATION_TYPE;
   lEventID := EVENTID_INFOMATION;
  end;
 1: // Warning
  begin
   lType := EVENTLOG_WARNING_TYPE;
   lEventID := EVENTID_WARNING;
  end;
 2: // Error
  begin
   lType := EVENTLOG_ERROR_TYPE;
   lEventID := EVENTID_ERROR;
  end;
 end;
 // メッセージをイベントログへ書込む
 lMsg := Format('%s', [edtEventMessage.Text]);
 ReportEvent(
  // イベントログのハンドル,
  // ログに書込むイベントの種類,
  // イベントの分類,
  // イベント識別子,
  // ユーザーセキュリティ識別子(省略可能),
  // メッセージにマージする文字列の数,
  // バイナリデータのサイズ(バイト数),
  // メッセージにマージする文字列の配列,
  // バイナリデータのアドレス

  lHdl,
  lType,
  StrToIntDef(edtEventCategory.Text,0),
  lEventID,
  Nil,
  1,
  0,
  @lMsg,
  Nil
 );
 // イベントログのハンドルを閉じる
 DeregisterEventSource(lHdl);
end;


【画面イメージ】

EventLogTester.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 21:21 | 運用管理編

2005年08月15日

XMLデータをアクセスする方法

XML形式の電子データに色々な情報を格納し、
情報を多目的に利用したいというニーズは多いことでしょう。
XMLは、文書コンテンツ管理、デジタル出版、
ナレッジマネジメント、企業間電子商取引などの
インターネットビジネスをはじめ、
アプリケーション間インターフェイスのソリューションとして、
最近では次世代の
ビジネス基盤とし大きな期待が寄せられています。

XML(eXtensible Markup Language)は、
あなたもご存知の通り、
データを構造化し記述するためのマークアップ言語です。
データを作成するユーザーが独自に設定した
「タグ」で、特定の文字列データを囲み、
データを構造的に埋め込んでいく言語のことです。

XMLは全然難しくありません。
あなたもこの機会にXMLをマスターし、
あなたがつくるアプリケーションに応用してください。

今回紹介するサンプルプログラムは、
Delphiの「XMLDoc」「XMLIntf」ユニットを利用し、
XMLデータからXMLタグを指定しそのデータ値を取得したり、
指定したXMLタグ配下のタグ情報を取得するプログラムです。

全ソースは【続きを読む】をクリック!

使用例
procedure TForm1.btnReadClick(Sender: TObject);
 //------------------------------------------------------------------------------
 procedure Doc2View(pXMLDoc: TXMLDocument);
 var
  lCnt: Integer;
  lMsg: String;
  lXMLNode: IXMLNode;
 begin
  memXML.Clear;
  // <Root.RowData>配下の<Country>タグのデータを抽出し
  // 画面に表示する

  lXMLNode := _XMLFindNode(pXMLDoc.Node, 'Root.RowData');
  if (lXMLNode = Nil) then Exit;
  for lCnt := 0 to lXMLNode.ChildNodes.Count-1 do
  begin
   memXML.Lines.Add('Country');
   lMsg := Format(' Name="%s",Capital="%s",Population="%s"',
    [_XMLGetNodeValue(lXMLNode.ChildNodes[lCnt], 'Name'),
     _XMLGetNodeValue(lXMLNode.ChildNodes[lCnt], 'Capital'),
      _XMLGetNodeValue(
       lXMLNode.ChildNodes[lCnt], 'Population')]);
   memXML.Lines.Add(lMsg);
  end;
 end;
begin
 mXMLDocument := _XMLLoadFromFile(edtXMLFileName.Text);
 Doc2View(mXMLDocument);
end;

//------------------------------------------------------------------------------
procedure TForm1.btnGetNodeValueClick(Sender: TObject);
begin
 // 指定されたタグのデータを取得し画面に表示する
 edtValue.Text :=
  _XMLGetNodeValue(mXMLDocument.Node, edtTag.Text);
end;


【XMLデータ】

country_xml.gif

【画面イメージ】

XMLTester.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 22:29 | XML編

2005年08月14日

Gスポットだけ攻めますか

緑の中を走る1本の道は何処へ続くのだろうか?
道はあぜ道から煉瓦造りの道へと時に姿を変え、
柔らかい日差しと、頬を撫でる心地よい風が、
私の冒険心を刺激する。
かつての主の栄枯盛衰が伺える中世の城や宮殿を、
遠目に見る景色は実に美しい。

ここは世界遺産に指定された首都エジンバラを
中心としたスコットランド地方である。
今もこんな「パブリック・フットパス」が、
たくさんあり、我々の心と体を癒してくれる。

首都エディンバラでは毎年8月から1カ月間、
世界最大の芸術祭「エディンバラ・フェスティバル」が
開催され街は芸術色に染まる。

何度となくエディンバラへ出張していた私は、
現地の仲間に誘われて、このフェスティバルを楽しんだ。
街角のアート、大道芸人のパフォーマンスなどを見て、
昼過ぎからパブへ行き「パイントグラス」片手に、
本場の「ギネスビール」を思う存分飲んでいた。

スコットランド地方の人たちは、ロンドン地方と違い、
のんびりしていて、親切で、意外にもシャイであるが、
祭りが人々の気を大きくするのか、
その夜、立ち寄ったディスコでは、
数人の地元の女の子が、私を取り囲んで服を脱がされ、
気が付けばトランクス1枚で
女の子たちと踊ったなんて思いでもある。

あなたもスコットランドを、
肌で感じてみたいとおもうかもしれません。
現在、UKではG8サミットが開催されており、
G8サミットを狙った同時多発テロ事件も起こりました。
渡英について、
皆様には十分注意していただきたいと思います。

それでは最後に、
テロとG8の話題をご紹介します。

FBI(連邦捜査局)によると、最近の爆破テロ事件は、
爆弾の起爆装置に携帯電話が使われることがあるとのこと。
我々にとって携帯電話は、
小さく手軽で必須の便利アイテムですが、
テロリストにとっても同様、いつでもどこからでも簡単に、
爆弾を起爆できる装置として便利なツールとなるわけです。

実に恐ろしい世の中です...

地球温暖化問題は、
ようやく米中が加わり、地球温暖化防止に向け、
途上国と協力しCO2排出の
削減方法を探るという進展がある一方、
世界貿易機関(WTO)のドーハ・ラウンド
(新多角的貿易交渉)の行方は、
各国とも自国の利益を譲らない姿勢で、
先行きは不透明のようですね。

外交というものはとても難しく思います。
地球規模という全体最適が必要なことと理解しながらも、
自国が利益を得るため、
相手に真面目に嘘をつかないとならないですから...

See you again!

関連書籍


Copyright guy@かしらもんじ でぇ〜

posted by guy at 16:28 | ライフスタイル

2005年08月13日

自己記述型データを名前でアクセスする方法

あなたがクライアント/サーバー型の
アプリケーションをつくる場合、
アプリケーション間で送受信するメッセージの
データ構造はどのように設計し実装していますか?
そんな迷えるあなたに、
自己記述型のデータ構造(Self Describe Data)!
ちょいとかじってみますか。

ひと昔前のプログラムが扱うメッセージのデータ構造は、
データだけを順に連ねたとてもシンプルな構造でした。
このメッセージを送受信するプログラムは、
データ構造を解釈するために、
データ構造をあらわす構造体をデータに被せ、
各項目にアクセスしていました。

このデータ構造はデータ自身から、
その構造を求めることが出来ず、
必ずデータ構造をあらわす入れ物が必要になると同時に、
各項目の並びや長さが厳密に規定されているため、
データ構造の変更に柔軟に対応できませんでした。

最近では、SOAPのXMLやSEMIのSECSといった
データ構造に代表される通り、
データがデータの中身である値と、その構造をあらわす
自己記述型のデータ構造が主流となっています。
今回はこの自己記述型のデータ構造を
実現するサンプルプログラムをDelphiでご紹介します。

サンプルプログラムの作成に当り、
2つのキーとなるクラスを作成しています。
「TDatumNode」はデータ構造内の
1項目(要素)をあらわすオブジェクト、
「TContainerNode」は
「TDatumNode」のオブジェクトや、
「TDatumNode」の派生である
「TContainerNode」のオブジェクトを
複数格納するコンテナオブジェクトとして機能します。
丁度、OSファイルシステムの
「ファイル」と「ディレクトリィ」の概念に相当します。
「ファイル」が「TDatumNode」に、
「ファイル」や「ディレクトリィ」を格納する
「ディレクトリィ」が「TContainerNode」に、
それぞれ対応するイメージだと思ってください。

それでは、お疲れ様です。
じっくりソースを解析し、色々と試して下さい。

全ソースは【続きを読む】をクリック!

尚、サンプルプログラムは
「TContainerNode」オブジェクトのデータを
ストリームに保存したり、読込んだりする
メソッドは実装しておりません。
データ構造内の1項目(要素)をあらわす
「TDatumNode」オブジェクトに、
格納できるデータは便宜上文字型のみとしています。
必要あらば、あなた自身で追加してください。(笑い)

【クラスダイアグラム】

DatumClass.gif

【画面イメージ】

DatumClassTester.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 07:22 | 通信編

2005年08月12日

プログラムに必要なパラメータをINIファイルから読込む方法

あなたがつくるアプリケーションプログラムは、
プログラムの動作や振舞いなどに必要な
パラメータをどのように読込み設定しているでしょうか?
INI形式やXML形式でファイルに持たせますか、
或いはレジストリに格納したり、
DBに格納したりと方法は幾つか考えられます。

Windowsのアプリケーションであれば、
パラメータをレジストリに格納することも可能ですが、
UnixやLinuxプラットフォーム上では、
レジストリの概念が無いので使用できません。
また、複数の端末で同じアプリケーションを稼動させる場合、
パラメータがDBで一元管理されているか、そうでないかで、
後の運用工数は大きく変わることでしょう。
どのような形でパラメータを設定し読込むかは、
アプリケーションの機能、各種制約、
運用などを十分検討して下さい。

前置はこれくらいにして、
とにかく手っ取り早く済ませたいと思うななたに、
今回はシンプルで使い勝手がよい、
INI形式のファイルを読込む方法を紹介します。

「Delphi」または「Kylix」の「IniFiles」ユニットにある、
「TIniFile」クラスを利用すると、
WindowsやLinuxといったプラットフォームを意識することなく、
いとも容易くINI形式のファイルが読込めます。
早速、お試しあれ!

全ソースは【続きを読む】をクリック!

使用例
procedure TForm1.btnReadIniFileClick(Sender: TObject);
var
 lSec,
 lItm: TStringList;
 lVal: String;
begin
 lSec := Nil;
 lItm := Nil;
 try
  memINI.Clear;
  if (FIni <> Nil) then FIni.Free;
  // INIファイルオブジェクトを作成する
  FIni := TIniFile.Create(
   ExtractFilePath(Application.ExeName) + edtIniFileName.Text);
  // セクション/アイテムデータを格納するため、
  // ストリングオブジェクトを作成する

  lSec := TStringList.Create;
  lItm := TStringList.Create;
  // セクションを読込み、
  // セクション分のループを実行し
  // 画面にINIファイルの内容を表示する

  FIni.ReadSections(lSec);
  while (lSec.Count > 0) do
  begin
   lItm.Clear;
   // セクション配下のアイテム情報を読込み、
   // アイテム分のループを実行し
   // 画面にINIファイルの内容を表示する

   FIni.ReadSection(lSec[0], lItm);
   memINI.Lines.Add(Format('[%s]', [lSec[0]]));
   while (lItm.Count > 0) do
   begin
    lVal := FIni.ReadString(lSec[0], lItm[0], '');
    memINI.Lines.Add(Format(' %s="%s"', [lItm[0], lVal]));
    lItm.Delete(0);
   end;
   lSec.Delete(0);
  end;
 finally
  if (lSec <> Nil) then lSec.Free;
  if (lItm <> Nil) then lItm.Free;
 end;
end;


【画面イメージ】

INIFileTester.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 06:24 | 起動編

2005年08月11日

SQL文をプログラムの実装から開放しチューニングする方法

経験の浅いデータベース
アプリケーションのプログラマは、
しばしばDBMS(ORACLEなどの
データベース管理システム)に対し、
重たいSQL文を発行する厄介なコードを
実装することがあります。
おそらく自分では無意識かつ
無頓着で、コンピュータが消費する
コストやパフォーマンスなど考える頭が無い開発者です。

しかし、あなたのプロジェクトはそんな開発者でも、
猫よりはましと思い協力してもらわなければ
いけない局面があることでしょう。
プログラムのパフォーマンスがSQL文が原因となる場合、
あなたは、どのように対処するのでしょうか?

SQL文の実行結果が遅い場合、
その責任を問うのは設計者にですか、
プログラマにですか?
それとも、幸いDBA(データベース管理者)が
チームメンバに居る時は、
DBAに責任を押し付けるのでしょうか?

その答えは状況によりそれぞれでしょうが、
SQL文がプログラムの中でゴリゴリに実装されていたのでは、
そのパフォーマンスを改善するにしても、
余りに貴重な時間を無駄に消費するこは間違いありません。

今回は前回と同様、
Delphiの「dbExpress」と「ORACLE」
データベースを利用する前提で、
問合せを実行するデータベースアプリケーションのSQL文を、
プログラムの実装から開放し、
SQL文を即座にチューニングできる
アプリケーションアーキテクチャをご紹介します。

全ソースは【続きを読む】をクリック!

この記事が、あなたがつくるプログラムの
アプリケーションアーキテクチャの参考になればと思います。
(Good luck!)

使用例
//------------------------------------------------
procedure CopyQuery2CDS(
 pQuery: TSQLQuery; pCDS: TClientDataSet);
var
 lCnt: Integer;
 lName: String;
begin
 pCDS.Close;
 with pCDS.FieldDefs do
 begin
  Clear;
  for lCnt := 0 to pQuery.FieldCount-1 do
  begin
   with AddFieldDef do
   begin
    Name   := pQuery.Fields[lCnt].FieldName;
    DataType := pQuery.Fields[lCnt].DataType;
    Size   := pQuery.Fields[lCnt].Size;
    Required := pQuery.Fields[lCnt].Required;
   end;
  end;
 end;
 pCDS.CreateDataSet;
 pQuery.First;
 while (not pQuery.Eof) do
 begin
  pCDS.Append;
  for lCnt := 0 to pQuery.FieldCount-1 do
  begin
   lName := pQuery.Fields[lCnt].FieldName;
   pCDS.FieldValues[lName] := pQuery.FieldValues[lName];
  end;
  pCDS.Post;
  pQuery.Next;
 end;
end;

//------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
 // DB接続オブジェクトを初期化する
 mDB := TSQLConnection.Create(Nil);
 mDB.DriverName := 'ORACLE';
 mDB.GetDriverFunc := 'getSQLDriverORACLE';
 mDB.LibraryName := 'dbexpora.dll';
 mDB.VendorLib  := 'oci.dll';
 mDB.LoginPrompt := False;
 mDB.Params.Values['DataBase'] := 'CONNECT_STRINGS';
 mDB.Params.Values['User_Name'] := 'USER';
 mDB.Params.Values['Password'] := 'PASSWORD';
 mDB.Open;
 // 問合せオブジェクトを初期化する
 mSQL := TSQLQuery.Create(Nil);
 mSQL.SQLConnection := mDB;
 // データソースオブジェクトを初期化する
 mDS := TDataSource.Create(Nil);
 mCDS := TClientDataSet.Create(Nil);
 dbgResult.DataSource := mDS;
 mDS.DataSet := mCDS;
end;

//------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
 // DB接続オブジェクトを廃棄する
 if (mDB <> Nil) then
 begin
  mDB.Close;
  mDB.Free;
 end;
 // 問合せオブジェクトを廃棄する
 if (mSQL <> Nil) then
 begin
  mSQL.Close;
  mSQL.Free;
 end;
 // データソースを廃棄する
 if (mDS <> Nil) then
 begin
  mDS.Free;
 end;
 if (mCDS <> Nil) then
 begin
  mCDS.Free;
 end;
end;

//------------------------------------------------
procedure TForm1.btnReadQueryClick(Sender: TObject);
begin
 // SQLRepositoryよりQueryNameで指定されたSQLを取得する
 mSQL.SQL.Text := Format(
  'select * from SQLREPOSITORY where QueryName = ''%s''',
   [edtQueryName.Text]);
 mSQL.ExecSQL;
 if (mSQL.RecordCount = 0) then
  raise Exception.Create(Format(
   '該当するSQLは見つかりません。(QueryName=''%s'')',
    [edtQueryName.Text]));
 // SQLRepositoryより取得したSQLを画面に表示する
 mSQL.Open;
 edtSQLText.Text := mSQL.FieldByName('SQLTEXT').AsString;
 CopyQuery2CDS(mSQL, mCDS);
 mSQL.Close;
end;

//------------------------------------------------
procedure TForm1.btnExecQueryClick(Sender: TObject);
begin
 // SQLに指定されたパラメータをバインドし実行する
 mSQL.SQL.Text := edtSQLText.Text;
 mSQL.Prepared := True;
 mSQL.Params.ParamByName(edtParameterName.Text).AsString :=
  edtParameterValue.Text;
 mSQL.ExecSQL;
 mSQL.Open;
 CopyQuery2CDS(mSQL, mCDS);
end;

end.


【画面イメージ】

QueryTester.GIF

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 06:41 | データベース編

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。