有限会社 岡田電工

トピック


最近の仕事や気になることについてご紹介します。

  1. けむり・熱感知器(2007年10月2日)
  2. 蓄熱暖房機(2007年10月2日)
  3. AV変調器(2007年10月30日)
  4. 地図ソフト(2007年12月8日)
  5. データベースでレコードを挿入(したように見せる)?(2007年12月8日)
  6. 長いフォームフィルタ(2007年12月11日)
  7. RegExp 正規表現(2008年1月18日)
  8. コスモシリーズ ワイド21 埋込スピーカターミナル(2008年2月4日)
  9. Perl:どちらも含むマッチング(2008年2月11日)

Banner

1. けむり・熱感知器

消防法の改正に伴って、けむり・熱感知器の設置工事が行われるようになりました。 AC電源で動くもの、集中管理ができるものなど多々種類がありますが、いちばんシンプルなものは電池で動作するものです。 難点は、電池には寿命があるということですが、最近の感知器は音で電池切れを警告してくれます。 たとえば、こうした感知器です。

けむり・熱感知器

一般的に高い所にとりついているものなので、電池交換は気をつけて行ったほうがよいですね。

(更新:2007年10月2日)

戻る

2. 蓄熱暖房機

北海道のオール電化での暖房器具に「蓄熱暖房機」というものがあります。 よく、「ちくだん」と呼ばれたりします。 この中には石に似たブロックが入っていて、これに熱を蓄え、そこから放出される熱で暖をとります。 この工事も電気工事のひとつになるのですが、この石を運んだり、積んだりというのが、けっこうたいへんな作業です。 これを現場まで運ぶ方も大変だと思います。 それで、こうした台車を作ったりするわけです。 (作ったはいいんですが、これもけっこう重いです。)

蓄暖

(更新:2007年10月2日)

戻る

3. AV 変調器

マスプロ電工 AV変調器 VMD3M です。
ビデオデッキが出始めたころは、テレビ側にテレビとビデオの切替えがなくて、テレビのチャンネルをひとつビデオ用に使っていました。 このマスプロ電工 AV変調器はそんな装置です。 入力されたビデオやカメラのAV信号をテレビ信号(UHF)に変えて出力します。 用途としては、 といったところでしょうか。 でも、これでまた、テレビアンテナケーブルの配線やテレビコンセント工事が増えてしまうわけです(テレビ用コンセントの数も後々のことを考えると多めがいいですね)。
使い方、使用上の注意等、詳しくはマスプロ電工様のWEBサイト、http://www.maspro.co.jp/ でご覧になれます。ご興味のある方はどうぞ。

AV変調器 AV変調器

(更新:2007年10月30日)

戻る

4. 地図ソフト

仕事をする上で地図はかかせません。紙だった地図も今ではCDやDVDディスクに収まっています。 仕事柄、ゼンリンの住宅地図をよく参照します。 ゼンリンには色々な地図製品がありますが、住宅地図のほかに電子地図帳Z Professional5(以下地図帳Z)というパーソナルな製品があります。 この地図帳Zを使って、目的の場所を探し出して登録・緯度経度チェック、地図上で距離計測や面積計算、3D表示で建物の高さ関係のイメージを得る(あくまで参考)といったことを行ったりもしました。
この地図帳Zを使っていて便利だなと思った機能に外部データ取り込みがありました。 この機能を使えば、ある作業で100件のデータがあるとして、それをひとつひとつ地図帳Zで登録修正することなく、登録情報をデータベースや表計算ソフトで作成・管理し、CSV出力したものを配布、読み込ませれば最新のデータにできました。
外部データ取り込みにはCSVデータを準備する必要があります。 地図帳Zの画面上に表示するわけですから、地図帳Zに関連したデータ(地図帳とリンクできるデータ)が含まれていなければなりません。 そのデータには「住所文字列」「緯度・経度」「郵便番号」等があります。 地図上での表示位置を気にしていたので、「緯度・経度」でのリンクをとったりしていました。
そのCSVデータを使った例として、以下のような使い方がありました。
  1. 地図帳Zに外部データを取り込みます。 「データ展開→外部データ取り込み→図形に保存」のような手順になります。 取り込むと地図上にマークが現れます。 以下の画像はその一例です。
    → Jpeg画像:1の画像を開く(約50KB)
  2. 北海道の上にある赤いマークが登録されたデータです。
  3. マークをクリックすると、その情報が別のウィンドウで表示されます。 これは外部データであるCSVに書き込まれているデータです。
    → Jpeg画像:3の画像を開く(約50KB)
  4. ウィンドウ内のフォルダを参照をクリックすると、マークに関連したウィンドウが開きます。 このウィンドウに表示されているものはフォルダで、ウィンドウ内を右クリックすると、通常のフォルダと同じようなメニューが表示されます。 このフォルダにはマークに関連した書類や画像などのファイルを貼り付けておきます。
    → Jpeg画像:4の画像を開く(約50KB)
これが正規な使い方かはわかりませんが、地図を中心に作業するには便利かなと思いました。 こちらのページ(クリックすると移動します)に少し細かい説明を掲載しました。お時間つぶしにどうぞ。

(更新:2007年12月8日)

戻る

5. データベースでレコードを挿入(したように見せる)?

Accessデータベースのレコードの集まりであるテーブルは表計算のExcelの表のように見えます。 Excelでは自由に行を挿入、コピーしたりできますが、Accessではレコードは常に追加されるもので、通常では必ずテーブルの最後に表示されます。 でもせめて外見だけでも目的の位置にコピーされたかのようにしたいと思うことがありました。
そこで選択したレコードを、上か下のどちらかに挿入コピーしたように見える方法を考えました。 順番を指示するためのフィールドを設け、それを利用して並べ替えます。
  1. テーブルにフィールド「オーダー」をあらかじめ作成しておきます。このフィールドのデータは数値型Doubleとします。 「オーダー」のデータは、1001、2001、3001〜、といったように1000毎に上がっていくように設定します。
    並べ替えは、この「オーダー」による昇順とします。
  2. フォーム内サブフォームにテーブルのレコードを表示し、上下方向にコピーしたいレコードを選択し、ボタンで作業を指示します。
    → Jpeg画像:フォーム例の画像を開く(約50KB)
  3. 例えば上方向にコピーする場合は以下のように処理します:
    • -1 コピーしたいレコードを選択します(レコードAとします)。 このとき、レコードAのレコード番号を取得し、RECORD_Aとします。
    • -2 レコードAの「オーダー」をORDER_Aとします。
    • -3 一つ前のレコード(レコードBとします)の「オーダー」をORDER_Bとします。
    • -4 レコードAのコピーとなる新しいレコード(レコードCとします)の「オーダー」をORDER_Cとします。 ORDER_Cは、ORDER_AとORDER_Bの間の値に設定します。
    • -5 DoCmd.RuncommandでレコードAをコピーし貼り付けます(貼り付けられたレコードはレコードCです)。
    • -6 レコードCの「オーダー」をORDER_Cに設定します。
    • -7 サブフォームのレコードを「オーダー」の昇順で並べ替えます。
    • -8 サブフォームのレコード上でRECORD_Aに移動します。これで上方向にコピーしたように見えました(汗)
      → Jpeg画像:フォーム例の画像を開く(約50KB)
    • 以上の作業の間は、Echo Flase、True等を使って、DoCmdによる激しい移動を見せないようにした方が良いです。。
    • FilterOn=Trueになっている場合は、FilterOn=Falseにしてからコピー・貼り付けを行い、その後に再度FilterOn=Trueにします。
    • 右クリックメニュー等でフィルタをかけている場合は、右クリックメニューや、アイコンから解除するのではなく、フォームのボタンで解除します。
    • フォーム上での表示状況によっては、いきなり下側にレコードが現れたりして戸惑うことがあります。
    • 複数のレコードを選択しても、その先頭のレコードしかコピーされません。
  4. 下方向にコピーする場合は、選択したレコードの次のレコードをレコードBとして考え、コピー後のレコード移動はRECORD_A+1になります。
サンプルのデータベース(copyins.mdb)はこちらです。 WindowsXP+Access2000で作成しています。

→ mdbファイル:データベースファイルを開く(LZHによる圧縮ファイル、約33KB)

注意: 問題ないとは思いますが、どんなものだか...
このファイルの利用によってPCやプログラム、保存データ等について何か問題が起きても責任はもてません。
(更新:2007年12月8日)

戻る

6. 長いフォームフィルタ

フォームを使っていて全文検索みたいなフィルターが欲しくなって作ったフォームです。 考え方は簡単なのですが、長いスクリプトになりました。 レコード内の全フィールド(9個)に対してフィルターをかけます。 フィールド内のマッチングとフィールド間のマッチングそれぞれにORかANDを指定します。
  1. フォーム画像。
    → Jpeg画像:フォーム例の画像を開く(約60KB)
  2. フィルタキーワード
    マッチングさせたい文字列を入力します。複数の文字列がある場合は、半角スペースで区切ります。
  3. フィールド内 OR/AND
    2つ以上の文字列がある場合、ORならどれかを含む、ANDならすべてを含むフィールドとマッチングします。
  4. フィールド間 OR/AND
    ORならレコード内のフィールドの内どれかに含まれる、ANDならずべてのフィールドに含むという条件になります。 ANDはあまり使い道がありません(全てのフィールドに同じデータが入っていることがめずらしいと思うので)。
  5. フィルタボタン
    フィルタをかけてマッチングするフィールドを含むレコードを表示させます。
  6. リリースボタン
    フィルタを解除します(フィルタに*を指定します)。
  7. サブフォーム表示切替
    サブフォームをフォームとデータシートのいずれかに切り替えます。
サンプルのデータベース(filterDB.mdb)はこちらです。 WindowsXP+Access2000で作成しています。

→ mdbファイル:データベースファイルを開く(LZHによる圧縮ファイル、約33KB)

注意
毎回ではありますが、このファイルの利用によってPCやプログラム、保存データ等について何か問題が起きても責任はもてません。
(更新:2007年12月11日)

戻る

7. RegExp 正規表現

VBとかVBAのスクリプトで文字列を比較、操作する場合、Likeやワイルドカード、InstrにReplaceといった関数を使ってました。 その他にPerlのような正規表現も使えます。 そこで、HTMLファイル内の必要な文字列(リンク)とマッチングさせるような正規表現について考えてみました。 パッとできるかと思ったら頭をひねってしまった。 結局以下のような例が出来上がりました。 ?の使い方がポイントかなあと思います。
  1. <b>まずこれがほしい。</b><br><b>次はこれ。</b><br><b>その次はこれ。</b><br>
    → 表現例:<b>(.*)</b> = 最初の<b>から最後の</b>をひとつとしてマッチ
    → 表現例:<b>(.*?)</b> = 各<b></b>にマッチ

  2. <a href="../w/ここは色々">ここも色々</a>
    → 表現例:<a href=\42\.\./w/.*?>(.*?)</a>

  3. <dl><a name="docその後は数字.html"></a><dt><b>色々</b>もしかすると何か入ってる<br>
    → 表現例:<dl><a name=\42REF[0-9].*?></a><dt><b>(.*?)</b>(.*?)<br>

  4. <dt class="AAAとBBBとCCCだけ"><a name="pの後は色々">色々</a></dt>
    → 表現例:<dt class=\42(AAA|BBB|CCC)\42.*? name=\42p.*?>(.*?)</a>
マッチングは、検索対象が存在するファイルに改行があっても、それに対応した表現があるようです。 しかし、そこまで頭を使いたくなかったので、改行(ついでに前後の空白)の無いファイルを作って、 それを検索することを考え付きました。
Open outFile For Input As #1
Open saveFile For Output As #2
Do While Not EOF(1)
    Line Input #1, strLine1
    strLine1 = Replace(strLine1, Chr(10), "")
    strLine1 = Replace(strLine1, Chr(13), "")
    strLine1 = Trim(strLine1)
    Print #2, valStr5; ← 最後に;を指定して改行せずに連続して書き込み
Loop
Close #1
Close #2
対象となるファイルから1行読んではマッチング、また1行読んではマッチングでは、 改行をまたがった文字列のマッチングができない他にRegExpが提供するいいところを利用できません。 たとえば、RegExpではマッチした個数を教えてくれます。 マッチしたものは0から始まるインデックスを持つので、その個数とインデックスを利用して Forなどの繰り返し処理ができます。
Dim reStr As RegExp
Dim reMat As MatchCollection
Dim reItem As Match
dim dString as String ← 検索対象のあるファイル

Set reStr = New RegExp
reStr.Pattern = "<b>(.*?)</b>" ← 正規表現パターン
reStr.Global = True
reStr.IgnoreCase = True ← 大文字小文字を無視
Set reMat = reStr.Execute(dString) ← 正規表現に合ったマッチコレクションを作成
If reMat.Count > 0 Then ← マッチコレクション内の個数
  For reCount = 0 To reMat.Count - 1
    Set reItem = reMat.Item(reCount) ← マッチコレクション内からマッチを取り出す。
突っ込みどころが満載ですが、結果としてRegExpを使うとスクリプトが簡単になりました。 マッチコレクションも、データの個数(マッチした個数)がわかるので、レコードを操作したい場合には便利です。 ただ、検索するファイルの大きさ、マッチした個数、英数字のみ、漢字を含むといったケースで、処理時間もずいぶん違うようです。 (使ったPCがCeleron300MHz・・・)

ちなみにこちらの用語辞典検索(ページを開く)のデータベースは、下記のように作成したものです。
XMLrequestでHTMLファイル収集 → RegExpでマッチング → Accessデータベース格納 → CSV出力

(更新:2008年1月18日)

戻る

8. コスモシリーズ ワイド21 埋込スピーカターミナル

スピーカーやオーディオターミナルといえば、松下電工フルカラー系の「オーディオ用信号コンセント(WN4821)」があります。 最近はコスモシリーズ ワイド21でもターミナルを出しているんですね。

スピーカターミナル WTN4101W WTN4102W
(松下電工さんのホームページより)

これならプレートのサイズも合うし、見た目も他のプレートと同じですっきりします。
メーカーHP: http://biz.national.jp/Ebox/switch/switch24.html
参考ページ: http://biz.national.jp/Ebox/ecomets/index.html
(型番「WTN4101W」または「WTN4102W」で検索してみてください。)

(更新:2008年2月4日)

戻る

9. Perl:どちらも含むマッチング

Perlには[ | ]を使った選択マッチングがあります。 これは[ A | B | C ]だったら、AまたはBまたはCのいずれかを含むものとマッチングさせるようです。 これを使うとOR論理のようなマッチングが簡単にできてとても便利だなあと思います。 しかし、AND論理、「A かつ B かつ〜」、いわゆる「しぼり込み」で検索したいケースの方が多いように感じられます。 それではANDでマッチングさせたいときはどうするかと思い悩みました。 結局、下のような付焼き刃スクリプトを考えました。
$sStrが「AAA BBB CCC DDD...」のようにマッチング語句をスペースで区切った文字列であるとします。 この各マッチング語句を検索対象となる$sLine内で探します。
選択マッチングによるOR論理みたいなマッチング

my @sStr;
@sStr = split(/\s/,$sStr);
→ $sStrはスペース区切りの文字列で、これをスペースで分ける
$sStr = join("|",@sStr);
→ @sStrを[ | ]でつなぎ合わせる(選択マッチング文字列にする)
if($sLine =~ /$sStr/g){(以下はマッチしたときのブロック)
→ 検索対象となる$sLineで$sStrを探す
上記の場合は、$sStrの長さ(スペース区切りの語句数)に制限がないと思います。
AND論理みたいにする

my @sStr;
@sStr = split(/\s/,$sStr);
→ $sStrはスペース区切りの文字列をスペースで分ける
if($sLine =~ /@sStr[0]/i && $sLine =~ /@sStr[1]/i && [以下続く]){(以下はマッチしたときのブロック)
→ 検索対象となる$sLineでそれぞれの語句(@sStr)をマッチさせる
→ 語句(@sStr)は0から始まる番号で指定する。4語句に対応させたければ0から3までのマッチングが必要。
上記ではスクリプトで指定した語句数以上のマッチングは行いません。 逆に、指定した語句数以下の語句が指定されても、不足分の語句は無視してマッチングされるようです。
本当なら、foreachとかexistsとか使えば、語句数の制限なしに、マッチングができるだろうなと思います。 しかしあまり考えると知恵熱が出ます。

(更新:2008年2月11日)

戻る

ページトップに戻る


Copyright(c) 有限会社 岡田電工 Okada Denko Ltd. All Rights Reserved.

HP開設 2003年
更新 2007年10月
更新 2007年12月
更新 2008年1月
更新 2008年2月