弐条海月の とはずがたり

そこはかとなく書き綴るブログなるもの

簡易データベースの仕様

Windowsで動作するインタプリタ型のプログラム言語「HSP(Hot Soup Processor)」で開発した仕事用の検索アプリと簡易データベースのお話。テキストファイルから簡易データベースを作成する部分のソースを流用して別なアプリを開発していた時に、より効率の良い簡易データベースの仕様を思いついたのです。そこで、本家の検索アプリ用簡易データベースも次期アプリの開発に向けて仕様変更しようと考え、いろいろと検討をしておりまして…ほぼ固まった仕様について書いておこうと思います。

まずは検索アプリのこと

まずは簡易データベースを用いた検索アプリの仕様から。テキストファイル1つを1行にまとめ、1日に数十のテキストファイルを1ファイルにしてから、さらに1年ごとにまとめて簡易データベースを作成し、それを全文検索できるというものです。強力なAND検索とOR検索機能を有しており、仕事上で大いに役立っております。社内のサーバーに保存していた2001年から2012年2月現在(約166,000個のテキストファイル)から検索できるのが強みです。

ただし、検索速度はマシンパワーに依存します。過去1年分の検索だと、参照する簡易データベースは1ファイル(約12MB)になり、これを読み込んでから検索をかけるので、読み込みの時間がマシンパワーに比例しているようです。ですので2001年から現在までの検索ですと、1年ごとに約12MBのテキストファイルをロードして検索し結果を変数に溜めていくのでさすがに時間がかかります。私が仕事で使っているWindows98SE、Pentium3 999MHZ、メモリ512MB、HDD20G(7200回転)ですと1年分の検索が3秒ほどかかりますので、検索終了から結果表示までに40秒ほどがかかることになります。それでも以前の環境に比べるとずっとラクなので文句を言う人がおりませんけれども。開発した私としては、現状で満足してはいけないので、さらに速度を改善する必要があると思ったのです。

見直したのは、純正の拡張プラグインを使っている検索処理とは違い、自前の処理の部分。その中で1行ずつ処理するところで時間がかかっているのではないかと考え、簡易データベースの仕様を変更することにしたのです。

実はすでに一度、簡易データベースの仕様変更を行っておりまして…。この時は古い順番から格納していたテキストデータを新しい順から格納するようにしました。なぜならば検索結果は新しい順に表示するため、簡易データベースも新しい順番にしたほうが効率がよいからです。

今回で2度目となる簡易データベースの仕様変更では…1行1ファイルのテキストの格納方法を改めます。以下に従来の例を示します。

<;txt120217>;<;header>;¶ファイル名…AAA#NO-01<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120217>;
<;txt120217>;<;header>;¶ファイル名…BBB#NO-01<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;¶¶テキストの内容¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120217>;
<;txt120217>;<;header>;¶ファイル名…CCC#NO-02<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶テキストの内容¶¶<;txt120217>;
<;txt120218>;<;header>;¶ファイル名…XXX#NO-01<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120218>;
<;txt120218>;<;header>;¶ファイル名…YYY#NO-02<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;¶¶テキストの内容¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120218>;
<;txt120218>;<;header>;¶ファイル名…ZZZ#NO-02<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶テキストの内容¶¶<;txt120218>;

かなり分かりにくいですね(笑)。「¶」は1行にまとめるために改行を変換したものです。検索結果を取得し、テキストの内容を表示する際に改行コードに戻すようにしています。とりあえず分かりやすくするために改行を入れてみます。

<;txt120217>;
	<;header>;¶ファイル名…AAA#NO-01<;/header>;
	<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;
	テキストの内容…¶テキストの内容…¶¶
	<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
<;txt120217>;
<;txt120217>;
	<;header>;¶ファイル名…BBB#NO-01<;/header>;
	<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;>
	テキストの内容¶¶
	<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
<;txt120217>;
<;txt120217>;
	<;header>;¶ファイル名…CCC#NO-02<;/header>;
	<;txtname>;¶テキストのタイトル1¶<;/txtname>;>
	テキストの内容…¶テキストの内容…¶テキストの内容
<;txt120217>;
<;txt120218>;
	<;header>;¶ファイル名…XXX#NO-01<;/header>;
	<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;
	テキストの内容…¶テキストの内容…
	<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
<;txt120218>;
<;txt120218>;
	<;header>;¶ファイル名…YYY#NO-02<;/header>;
	<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;
	テキストの内容
	<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
<;txt120218>;
<;txt120218>;
	<;header>;¶ファイル名…ZZZ#NO-02<;/header>;
	<;txtname>;¶テキストのタイトル1¶<;/txtname>;
	テキストの内容…¶テキストの内容…¶テキストの内容
<;txt120218>;

一応タグについて説明しておきます。<header>の中はファイル名…AAA。後の「#NO-01」というのはグループ化されたテキストであることを示します。およそ3~6本くらいのテキストがそれぞれグループ化され、日によって変わりますがグループの総数は8~24程度になります。だいたい平均すると1日に50本程度のテキストファイルをまとめることになります。

<title>というのはテキストファイルの中についている見出し的なものです。タイトル1ならhtmlでいう<H1>、タイトル2なら<h2>…そんな感じ。テキストによってタイトルが1~4本くらい付きます。
テキストの内容…これはその名の通りテキストの中身です。現在の仕様ではタグは付けておりません。厳密なXML形式である必要もないですし、少しでも付けるタグを減らしてファイルサイズを小さくしたいので、今後も付けないかもしれません。

<picture>は参考画像があれば…そこにファイル名を入れます。ファイル名の後の「#」以降は写真の説明分です。このタグの中身は複数の画像ファイルに対応しています。

そして、新しい仕様へ…

さて、新しい仕様では、年月日の「年」が2桁になっているのを4桁に修正し、1日分のテキストファイルをひと組の<年月日タグ>で囲むことにします。下に例を示します。

<;20120217>;
	
		<;header>;¶ファイル名…AAA#NO-01<;/header>;
		<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;
		テキストの内容…¶テキストの内容…¶¶
		<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
	
	
		<;header>;¶ファイル名…BBB#NO-01<;/header>;
		<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;
		テキストの内容¶¶
		<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
	
	
	<;header>;¶ファイル名…CCC#NO-02<;/header>;
	<;txtname>;¶テキストのタイトル1¶<;/txtname>;
	テキストの内容…¶テキストの内容…¶テキストの内容
	
<;20120217>;
<;txt120218>;
	
		<;header>;¶ファイル名…XXX#NO-01<;/header>;
		<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;
		テキストの内容…¶テキストの内容…
		<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
	
	
		<;header>;¶ファイル名…YYY#NO-02<;/header>;
		<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;
		テキストの内容
		<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;
	
	
		<;header>;¶ファイル名…ZZZ#NO-02<;/header>;
		<;txtname>;¶テキストのタイトル1¶<;/txtname>;
		テキストの内容…¶テキストの内容…¶テキストの内容
<;txt120218>;

そして、1ファイル1行だったのを1日分を1行にまとめてしまいます(笑)。こうすることで総行数が激減します。1行ごとに処理をしているため、さらなる速度向上が望めるのではないかと思います。また、年月日を正確にタグ付けする副産物として、特定の年月日のテキストを一覧表示させることができるようになります。

改善要望を聞くと…

このアプリをよく使っている人たちに意見を求めたところ「テキストファイルだけでなく画像も観ることができたら嬉しい」という意見をもらいました。現在のバージョンでは画像があるディレクトリに移動することはできるのだけれど、自分で確認しなくてはなりませんでした。しかし、参考画像ファイルはEPSのため、残念ながらHSPでは扱えない画像形式。そこで…EPSに変換する前のjpg画像をサーバーから引っ張り出して、それをプレビュー出来る機能を付けようと思います。

現在は色々な作業があるため、すぐにバージョンアップできないのが残念なところです。年明けに仕事使っているWindowsを入れ替えたところ、なぜか従来の「HSP3.2」が動かなくなり、「HSP3.3」で新規開発する必要に迫られているのです。しかも多用していた外部プラグインまでもが動作しないため、外部プラグインに頼らず基本・拡張命令と自作の文字処理モジュール「kurage_mod」を使って開発…というより移植する感じになろうかと思います。いずれにしても、時間を見つけてゆるゆると進めていきたいと思っております。


その名は「H2Viewer」

Windowsで動作するインタプリタ型プログラム言語「HSP(Hot Soup Processor)」のヘルプファイルを参照するのに、Windowsのアプリケーションを動かすことのできるエミュレーター「Wine」上でも動作し、強力な検索機能を備えたヘルプビューワ、名付けて「H2Viewer」を開発しているところです。仕事で使うアプリ開発がネットブックに入れたUbuntuや自宅のMacでもできたら便利だなぁ…というのか開発に至った動機です。純正のヘルプビューア「HSP Document Library」は、IEこと「Internet Explorer(インターネット・エクスプローラー)」を描画エンジンに用いているので「Wine」上ではエラーを出して動かないのです(単に動かす方法が別にあるのに私にそれができないだけかもしれませんが…)。そこでブラウザに依存せずに動作するヘルプビューワを自分で作るしかない…そう考えたのでした。また、せっかくなので検索機能を強化してより軽快で使い勝手のよいものにする方向で開発を進めております。今日はそんなお話。

すでに何度も説明しているのだけれど…膨大な量のテキストファイルから検索するために簡易データベースを作成した経緯があるので、その仕様を改良して新しい簡易データベース作成アプリを先に開発しました。このアプリは簡易データベースの管理・更新も受け持っており、当初はサブアプリケーションとしてヘルプビューワの起動前に立ち上げるつもりでしたが、思ったよりソースがコンパクトに仕上がったため、ヘルプビューワのソースに組み込み、ひとつのアプリケーションとして開発することにしました。

現在取り組んでいるのは、簡易データベースの内容を取り出して表示する部分の処理です。HSファイル毎に格納されている命令の解説を自由に取り出し閲覧することができるところまではできました。あとは大きなものとして検索機能の実装があります。そのほか命令の解説文の整形(できれば色分け表示ができるようリッチテキスト仕様にしたいところですが…)、関連項目へのリンク方法の模索、閲覧履歴をもとにしての「戻る」「進む」機能の実装などがあります。

やはり、どうせ作るなら純正の「HSP Document Library」とは違うベクトルで開発していきたいものですからね。「HSP Document Library」は前述の通りブラウザベースのため、リンクを使って次々に関連項目に飛べるなど、よく考えられた作りになっています。しかし、私の低スペック環境が原因かもしれませんがアプリケーションの起動が遅く、検索結果が表示されるまでにかなりの時間がかかる点が残念です。また、これも上記にありますが想定外の使用だから仕方のないことにしろ「Wine」での起動ができないのは私にとっては致命的です。そこで、ブラウザから離れてテキストベースのヘルプビューワを作成するのです。また、検索機能を大幅に強化し、AND検索やOR検索を可能にします。これは冒頭でも書いた簡易データベースによる検索アプリのエンジンを利用して、HSファイルを簡易データベース化することで実現するものです。

20120305-074222.jpg写真の画面が開発中の「H2Viewer」のものです。アプリケーションの左側上部に検索窓を備えております。右側のコンボボックスは、検索時にHSファイルの絞り込みオプションとなるほか、通常の閲覧時にはHSファイル毎の命令を呼び出すきっかけにもなります。写真ではちょうど私が自作したモジュール命令「kurage_mod」のHSファイルが選択され、左側のリストビューには「kurage_mod」の命令26個が表示されておりますね。ここで各命令を選択しますと、ウィンドウ右側に命令の解説が表示される仕組みです。次々と命令の解説を閲覧できるので、命令と仕様をただ眺めるのも楽しいはず(笑)。

で、開発途中に気付いたこと…。「H2Viewer」のウィンドウはリサイズ可能にしているのだけれど、現状では左側と右側の比率を変更することができません。リストビューの中で命令の簡単な説明文がはみ出しているのに、それを調整する手段が現在のところないのです。以前、私が開発したアプリケーションの中に、オブジェクトをクリックしたら左右の比率を変えるという機能を付加したものがありました。その原理を応用すればとりあえず問題は解決するのだけれど…オブジェクトのサイズがクリックするたびに変わるのはちょっと気持ち悪かったりもするので…今回は別な方法を模索したいと思います。


簡易データベースの作成アプリ…

MacやLinux(Ubuntu)でエミュレーター「Wine」を使って、Windows用のインタプリタ型プログラム言語「HSP(Hot Soup Processor)」で作ったのアプリケーションを動かそうと思っております。ところが「HSP」でのアプリ開発を「Wine」でやる際に、ヘルプビューワ「HSP Document Library」のエラーがネックになります。そこで自分で開発した検索アプリのエンジンを利用して独自のヘルプビューワ(検索アプリ)を作ることにしました。まずは検索を最適化するためのサブアプリケーション(簡易データベースの作成用アプリ)を開発しておりまして、それがようやく完成。アプリ名を「HStoDB」と名付けました。今日はそのあたりのお話。

以前にも書きましたが、自分で開発した検索アプリは膨大なテキストを1ファイル1行として1年分を1ファイルにまとめた簡易データベースを作成、ここからAND、ORの全文検索が可能というものです。今回はその検索アプリの簡易データベースの作成アプリのソースを流用しながら開発を進めましたが、途中で簡易データベースの新しい仕様を思いついたのでそれを盛り込んでみることにしました。

今までの「1ファイル1行」という小さな概念から、1日数十になるファイルをすべてまとめて「1日1行」という考え方に以降するというものです。ソースは新規に書き直すことになりましたけれども、基本的な処理は変わらないのでスムーズに開発は進み、とりあえずの完成までこぎつけたのです。

とは言ってもまだGUIを整えておりません。HSPはGUI作成が面倒くさいのです。HSP3.0あたりからプログラム初心者にも優しい機能(ドラッグ&ドロップでソースを組むことができたり、スニペット的な機能だったり)が色々と付いてきているのだけれど、ある程度従来の不便な環境に慣れている自分には返って取っつきにくいのです。

簡易データベースの仕様

HSPのヘルプビューワ用のファイルである「HSファイル」の説明をしておきます。HSファイルは、特定の記号で区切った単なるテキストファイルです。これをヘルプビューワが読みとってHTML化し「Internet Explorer」のブラウザコンポーネントを利用して表示しているのです。それが「Wine」上ではエラーを出すので動かない…というわけなのです。このHSファイルを簡易データベースがするのが今回開発したアプリの目的です。

HSファイルの中にはプログラムの各命令文に関する記述があります。そのそれぞれを取り出してタグの中に入れ、最終的にHSファイル1つを1行にまとめ、HSファイルの名前のタグで挟んで簡易データベースに載せます。あとはそれをHSファイルの数だけ繰り返して簡易データベース「DBファイル」が完成。これも実は単なるテキストファイルです。ここでアプリ名を「HStoDB」にした理由が分かる仕組みです。HSをDBにするので「HStoDB」。実に安直ですね(笑)。

結びに

そして面白いことに、今回作ったヘルプビューワ用簡易データベース作成アプリが、もともと原案だったはずの検索アプリの簡易データベース作成アプリの次期バージョンのベースになる予定です(笑)。これが完成すれば仕事で使ってもらっている検索アプリの速度がさらに高まり便利になると思います。こうやって良いソースを取り入れてプログラムを更新していけるのも、自分で開発することのメリットであり、何より仕事の醍醐味であると思いますね。

簡易データベース「DBファイル」の仕様に関する詳しい話は次回にでもしようと思います。


HSP用文字処理モジュール「kurage_mod」の解説完成

Windowsで動作するインタプリタ型プログラム言語「HSP(Hot Soup Processor)」でのプログラム開発に役立つ、文字処理に特化した自作モジュール「kurage_mod」の解説がようやく完成しました。解説をアップしていなかった18の命令を一気に更新していますよ(笑)。

解説を追加した命令は「K_AFTER_GET」「K_BEFORE_GET」「K_BETWEEN_DEL」「K_BETWEEN_GET」「K_CHK_DIR」「K_CHK_GYO」「K_DEL_CR」「K_DEL_GYO」「K_DEL_LF」「K_EI_HAN」「K_EI_ZEN」「K_FOOT_DEL」「K_HEAD_DEL」「K_NUM_ZEN」「K_NUM_HAN」「K_REP_S」「K_REP」「K_XML_ADD」です。下書きはできていたのだけれど、まとまった時間がなかなかとれず作業しておりませんでした。

「kurage_mod」の解説の詳細およびダウンロードはこのサイト『弐条海月の「とはずがたり」』のコンテンツ『HSP用文字処理モジュール「kurage_mod」のページ』をご覧ください。同ページの中ほどにある表の命令名に詳細へのリンクを貼っております。


HSP用モジュール「kurage_mod」の解説…更新

Windowsで動作するインタプリタ型プログラム言語「HSP(Hot Soup Processor)」のための、文字処理に特化した自作モジュール「kurage_mod」の解説を更新しました。いくつかの命令の解説を更新しておりますので、「kurage_mod」の解説の詳細およびダウンロードはこのサイト『弐条海月の「とはずがたり」』のコンテンツ『HSP用文字処理モジュール「kurage_mod」のページ』をご覧ください。同ページの中ほどにある表の命令名にリンクを貼っております。そこから各命令の詳細についてのページに飛ぶことができます。


固定ページ

最近の投稿

カテゴリー





カレンダー

2024年5月
 12345
6789101112
13141516171819
20212223242526
2728293031  

過去の日記はこちら

キーワードで検索