USP研究所ロゴマーク

ユニケージ FAQ

Ⅰ. よくあるご質問

Ⅰ-1. データベース(DBMS)を使わないでシステムを作るってどういうことですか?

まず最初に、「データ」と「データベース」の違いについてお話しします。
「データ」は、住所録や販売結果などの情報のことを示します。「データ」をコンピュータの中でどのように保存するかは、いくつかのやり方があります。

(1)「ファイル」として保存する
ExcelファイルやPower Pointファイルなどがこれにあたります。

(2)「データベース」に保存する
「データベース」とは正確には「データベースマネージメントシステム(DBMS)」と呼び、その正体はソフトウエアです。DBMS というソフトウェアにデータを保存するには、各データベースメーカが提供する SQL というコンピュータ言語を使って、データを保存するための命令をします。
DBMS も基本的にはデータをファイルに保存していますが、保存されるファイルはデータベースメーカー特有のフォーマットを持っていて、SQL を使わずにその中身を読むのは非常に難しくなっています。
最近では、中身を読みにくいファイルを避けるという傾向があり、データベースも XML 形式とか Json 形式と呼ばれるテキストファイルで保存できるように改良されてきてはいますが、多くが SQL を使わないと中身を読むのが難しいです。
(ちなみにエクセルファイルもパワーポイントファイルも現在はXML形式のテキストファイルです。)

ユニケージではデータを「(2) DBMS に保存」ではなく「(1) テキストファイルとして保存」しています。

データベースでは SQL を使って DBMS に保存すると前述しましたが、ユニケージではコマンドという基本的な命令文を使ってデータを直接ファイルに保存します。
ユニケージには多くのコマンドがあり、SQL が持っている機能を全てカバーしています。
例えば、SELECT 文という SQL の機能は、self というコマンドが提供しています。self コマンドは直接ファイルを読んで、ファイルに結果を保存します。
逆に DBMS は、その機能がデータベースメーカーが提供している SQL の機能に限られます。例えば、ORACLE にはできて MySQL には出来ない、という機能があったりします。データベースメーカーはその提供している機能でお互い競い合っています。

ユニケージはデータベースは使いませんが、このようにデータの保存のやり方が違うだけで、機能的には問題ありません。だから、データベースを使わないでもシステムが作れるわけです。
						

Ⅰ-2. データベース(DBMS)を使わない理由を教えてください。

ユニケージのコマンドは、全てのデータベースメーカーが提供する機能をカバーしています。加えてデータベースが扱うのが不得意な履歴データや不定形データを扱うコマンドもあり、ユニケージの方がより柔軟なシステムを構築するのに優れているため、DBMS を使う理由がないのです。

DBMS の制約がないため、自由に機能を実現することが可能になります。
DBMS は単純なデータ処理を行う場合は、確かに便利ですが、ビッグデータや履歴データ、不定形のデータを取扱うのは不得意です。またIoTなど多くの分散コンピュータを扱うのも便利ではありません。また、DBMS 自体のバージョンアップは今まで作ったプログラムの改変を伴うことが多く、システムを維持するのも大変です。

ユニケージ は、DBMS よりもより OS に近いところで動作するため、自由にファイルを配置したり、コマンドを作成することによって、シンプルな処理から複雑な処理まで、幅広く対応することが可能です。
						

Ⅰ-3. データベース(DBMS)と共存は出来ないのですか?

出来ます。そのためには各 DBMS に接続できるクライアントコマンドを利用します。

例えば、SQL Server に接続するには、unixODBC と FreeTDSをインストールし適切な設定を行えば下記のコマンドで DB にシェルスクリプトからアクセスできます。
$ tsql -S mssql -U username -P password
Oracle ならば、Instant Client パッケージをインストールして sqlplus コマンドを使います。ユーザー情報などDBで一元管理されている情報をDBより取り出してユニケージで利用するときなどに使います。トランザクションデータなどは、DBからCSVファイルに出力してもらいそれをシェルスクリプトで利用するケースが多いです。
						

Ⅰ-4. UIはどうやって作るのですか?

UIを作る手段にこだわりはありません。html, Ruby, .NET, REACTなど様々な手法で開発が可能です。ユニケージはデータベースの代わりや、サーバ側の処理のためなどに使います。
						

Ⅱ. コマンド・ユニケージ技術に関するご質問

Ⅱ-1. 排他制御はどうするのですか?

ulock コマンドを使用します。ulock コマンドはロックファイルを排他的に作成します。また、そのロックファイルが存在する間は、待ち続けます。

例)ulock コマンドの実際の記述例
if ulock lockfile; then

	###############################
	# 排他的に行いたい処理を記述
	###############################

	# 最後にロックファイルを消去する
 rm lockfile
fi
ulock コマンドにはタイムアウトや古いロックファイルの消去、シェアードロックなどの機能もあります。
						

Ⅱ-2. リレーションはどのように行うのですか?

ユニケージで使用するデータは整理されたテキストファイルです。リレーションを実現するために、ユニケージでは、ファイル同士を連結し、連結結果を標準出力にだす各種コマンドが用意されています。列数/項目指定、InnerJoin/OuterJoin など様々なバリエーションがあります。

例)Masterの1列目とTranの2列目をキーにして2つのファイルを連結
$ cat MASTER
001 Japan
002 America

$ cat TRAN
a 001 100
b 001 200
c 002 300
d 003 400

$ join1 key=2 MASTER TRAN > RESULT
$ cat RESULT
a 001 Japan 100
b 001 Japan 200
c 002 America 300

						

Ⅱ-3. エラーハンドリングはどうなっていますか?

シェルスクリプトでは各コマンドの終了ステータスコードを捕捉することができます。bash においては、パイプでつながれた各コマンドの終了ステータスは配列変数 PIPESTATUS に収められ、それが全部0なら正常終了と見なされます。

例)エラーハンドリングのコード例。plus コマンドは引数の数値をすべて足した結果を標準出力に出します。
function ERROR_CHECK()
{
	[ $(plus ${PIPESTATUS[@]}) -eq 0 ] && return 0
	echo error:$1
	exit 1
}

command1   |
command2   |
command3   > result
ERROR_CHECK $LINENO

					

Ⅱ-4. ロールバックは出来ますか?

ユニケージのコマンドは入力ファイルを処理して別の出力ファイルに結果を書き出します。つまりどの時点においても、処理の元ファイルと結果ファイルは別であり、重要なファイルは常に保存しています。

例えばマスターの更新では、次のようにすべての更新前後のファイルを残します。シンボリックリンクでファイルを同名参照できるようにします。リンクを切り替えるだけでいつの時点にでもロールバックすることができます。
if ulock lockfile; then
	time=$(date +%Y%m%d%H%M%S).$$
	upl key=1 MASTER TRAN > MASTER.$time
	rm MASTER
	ln -s MASTER.$time MASTER
	rm lockfile
fi

						

Ⅱ-5. データアクセスに対するセキュリティはどうなっていますか?

一般にユニケージでデータアクセスに対するセキュリティ対策を講じるときは、クライアント側は、一旦ウエブサーバーとCGIなどのプログラムを介してデータにアクセスするようにシステム構築し、直接データを持っているサーバーにログインして端末操作できないようにします。その上で、権限体系によるデータのアクセス制御はアプリケーションで実装します。

個人情報などの重要情報は暗号化コマンドを使います。復号時にもパイプを使ってストリーム処理しますので、処理途中にファイルやメモリ上に展開されることはありません。
						

Ⅱ-6. コマンドインサートなどの攻撃に対する対処はどうするんですか?

ユニケージによる入力データはファイルに納め、ファイルのままコマンドのみで加工するのを基本とし、データをシェル変数にセットすることを少なくしています。データのチェックもファイルに対して行うことができるコマンドが用意されています。

さらに、exec/eval/:/source コマンドのチェックシェル変数を行の先頭においていないかのチェック awk の system 関数などのチェックができる「お作法チェッカー」スクリプトがあり、不法アクセスを誘引する記述の排除を行います。
						

Ⅱ-7. ウエブアプリケーションをCGIで記述するとプロセス過多にならないですか?

プロセス数が数千程度だと今の標準的なサーバーだと問題はありません。万オーダーになってとるべき対策は、CGI 内部で次のような処理順番待ちを行う仕組みを入れます。

semwait --less_than 10 "semaphore.*"
touch semaphore.$$
##############
# 実際の処理
##############
rm semaphore.$$

これで解決しないようなオーダーのアクセスに対しては FastCGI 設定してウエブアプリケーション自体をサーバー化してプロセス数を増やさないようにします。
						

ページトップに戻る

©2021 Universal Shell Programming Laboratory