日本ソフトウェア科学会第 33 回大会 (2016 年度) 講演論文集

ユニケージ開発手法 〜 usp Tukubai コマンドを用いた シェルスクリプトによる企業システム開発
中村 和敬

當仲 寛哲

本稿では Unix コマンドのセットである、 Open usp Tukubai と、それを Unix シェルを通じて用いる新しいシステム開発手法、ユニケージ開発手法を紹介する。本手法は主に企業システムの開発に於いて実績がある。本手法はUnix シェルのパイププログラミングをベースとして、シンプルなパターンにしたがってシステムを開発する手法であり、プログラミングの経験がない人々も容易に習得する事が可能である。同時に、本手法により開発されるシステムはブラックボックス部分が無いため理解が容易であり、保守運用時の困難が発生しない。また、スケールアウトが容易であるため、大規模システムであっても安価なハードウェアを用いて構成する事が可能である。

8.

拘束的なユーザーインターフェースは作るな

1 Unix 哲学とユニケージ開発手法

9.

全てのプログラムはフィルタとして振る舞え

1969 年に開発された Unix は、その後紆余曲折をUnix シェルは、 Unix 哲学に基づいたプログラミ

経ながらも普及を続けてきた。2001 年には Mac OSXングが出来るようになっている。まず、Unix のシェの基盤に採用された。さらに 2016 年には Windows

ルコマンドは、標準入力からデータを読み込み、何ら10 でも Linux サブシステムという形ではあるが取かの処理をして、標準出力に結果を出力するという、り入れられ、Unix の世界はますます広がりをみせてフィルタとして作成されている。また、 Unix にはプいる。

ロセスの標準出力と別のプロセスの標準入力を接続

Unix はその初期から、現在 Unix 哲学と呼ばれるしてデータが流れるようにする、パイプというシステようになる、システム開発に関する経験に基づいた規ムコールが用意されており、シェルから利用出来るよ範を蓄積してきた [2]。Unix 哲学と呼ばれるものにはうになっている。これを利用して、シェルをつうじてさまざまな形があるが、そのうちのひとつは以下のよコマンドを次々と接続してパイプラインを構築するうなものである。

プログラミングのスタイル (以下パイププログラミン

1.

小さいものは美しい。

グ) は、Unix を利用する多くの人々から支持を得て

2.

各プログラムは一つの事を上手くやれいる。

3.

できる限り早くプロトタイプを作れ

4.

効率よりも移植しやすさを選べ

もっぱら日常の簡単なデータ処理を行うために利用さ5.

単純なテキストファイルにデータを格納せよ

れ、企業システムのような大規模なシステムを開発す6.

ソフトウェアの効率を優位さとして利用せよるためにはあまり使われてこなかった。

7.

シェルを利用して効率と移植性を高めよUnicage - Enterprise System on Shell Script with usp
Tukubai Commands
Nakamura Kazutaka
Tounaka Nobuaki, ユニバーサ
ル・シェル・プログラミング研究所, Universal Shell
Programming Laboratory Ltd..

しかし、このパイププログラミングは、これまでは

1. 1 ユニケージ開発手法
このような現状に対して Unix 哲学に基礎をおき、これを企業システム内製化のために拡張した規範がユニケージ開発手法 [4] である。ユニケージは全ての

データを行指向スペース区切りのテキストファイルにトを作成し、この問題に対処している。このシェルコ格納し、パイププログラミングによってシステムを構マンドのセットが Tukubai コマンド [1] である。

築するシステム開発手法である。有限会社ユニバー

Tukubai コマンドは Unix 哲学 (1, 2) に基づいてサル・シェル・プログラミング研究所によって提唱さ設計されている。そのため、特定の業務のためのコマれ、企業システム内製化に 20 年の実績がある。

ンドではなく、厳選された汎用的なデータ処理のためユニケージのカバーする領域はプログラムのパターのコマンドとなっている。また、コマンドのオプションからプロジェクト運営まで多岐にわたる。以下ではンも極めて少ない。これにより、総数で 300 以下でユニケージの Unix 哲学との対応、さらに発展した部あり、また主に使用するコマンドは 50 個程度に抑え分について簡単にみていく。

る事に成功している。この主に使用するコマンドに加え、典型的な記述のシンプルなパターンを覚えること

1. 2 Tukubai コマンド

によって、一般的な業務システムのほとんどを記述す

POSIX [3] で定義されるシェルコマンドには awk

る事ができる。Tukubai コマンドを使用した場合のが含まれる。awk はチューリング完全であるため、記述の例は後述する。

POSIX の範囲で定義されるコマンドのみを用いてTukubai コマンドには、商用版の usp Tukubai コも、あらゆる処理を記述する事が可能である。しかマンドと、オープンソースの Open usp Tukubai とし、そのままではプログラムが複雑になってしまうがある。商用版はオープンソース版にくらべ高速化ケースが多々ある。と、さまざまな細かい機能の追加が行なわれている。

例えば以下のような、各フィールドに売上日時

本稿では商用版の usp Tukubai を説明に用いる。

(YYYYMMDDHHMMSS)、商品コード、売上個数の格納されたファイル、“売上データ” があるとする。

1. 3 シェルの利点と欠点

レコードは売上日時、商品コードの順でソートされてシェルには、それ自体いくつかの利点があり、またいる。

欠点がある。

201608220833 123456 10

まず、シェルのパイププログラミングで記述された201608221012 123456 3

処理は高速である。この理由は第一に、シェルのパイ

201608231022 123456 6

ププログラミングは初めから複数のプロセスを起動す

201608220823 234561 1

るため、マルチコアプロセッサの性能を有効に活用す201608220921 234561 3る事ができるからである。かつては複数の CPU を搭

201608230951 234561 4載した計算機は HPC 用途などの限られたものであっ

この時、ここからそれぞれの商品の売上個数を求めたが、近年の CPU は複数の演算ユニットの搭載される awk スクリプトは以下のようになる。

たマルチコアプロセッサが一般的になっており、この

NR==1{ item_id = $2; num = 0; }利点が一般的に役立つものになってきている。第二item_id!=$2{ print item_id, num;に、シェルコマンドは任意のコマンドで実装し、最適

item_id = $2; num = 0; }化を施す事ができる。そのためパイプで接続された各item_id==$2{ num += $3 }段の処理は可能な限りの高速化を施すことができる。

END{ print item_id, num; }その一方でシェルでシェル変数を用いた通常の命令

こういった記述を合計を求めようとする度に、毎回型のプログラミングを行なうと、実用的な性能を得処理対象のデータに合わせて書きかえる事は初心者る事ができない。ユニケージではシェル変数の利用はにとって困難なだけでなく、バグの温床にも繋がる。

処理全体のコンフィグレーションのための利用にとどユニケージでは、業務システムを開発する上で極めめ、主要な処理はパイププログラミング記述するようて頻繁に出現する処理についてシェルコマンドのセッ勧めている。

また、シェルは並列分散処理を用意に実装する事が当者がシステムのどの部分を編集してよいのか、ディできる。シェルはそもそもプロセスの起動と管理のたレクトリツリーを見ることでわかるように工夫してめのプログラムであり、コマンドのバックグラウンドいる。

起動の機能が標準で実装されている。また、 Unix は処理からネットワークを通じて使用することが一般的

2. 2 依存関係の排除であったため、ネットワークを経由して処理を起動す

ユニケージでは、スクリプト間の依存関係を極力排るための仕組みがシェルからシームレスに利用するこ除する。似たような処理が有る場合でもすべてコピーとが出来る。

によって対処し、シェル関数、シェルの source コマ
ンドによるインクルード、スクリプト化による再利用

2 ユニケージとプロジェクト運営などは行なわない。これは、システム上に業務とは無Unix 哲学の多くは設計に関する規範であるが (1, 2,関係な依存関係が出来てしまうことを避けるためで

4 〜 9)、プロジェクト運営に関するものもある (3)。

ある。依存関係が存在するとすると、ある変更を加えユニケージ開発手法では、これをさらに推し進め、企る際に必ず影響範囲の調査が必要となる。ユニケージ

業システム内製化のためのプロジェクト管理の規範をはこれを排除することで容易にシステムを改変する提案している。

事を可能にし、柔軟なシステムの更新が可能であるようにしている。

2. 1 データ基盤系とアプリケーション系

一方で、ユニケージでは入力データを段階的に加工

まず、ユニケージはシステムをデータ基盤系とアプして出力データを得るので、入力データ、出力データリケーション系に分ける。データ基盤系は業務の遂行の関係から発生するデータの依存関係ができてしまに伴いシステムに入力された全てのデータを、業務にうことは不可避である。この整理方法については後述

使用しやすい形に整理して、 Unix ファイルシステムするレベル分けによって整理する。

上で提供する。アプリケーション系はデータ基盤系のこのように、ユニケージではデータ基盤系とアプリ提供するデータを使用して、業務に必要な加工情報をケーション系にシステムの階層を分割する。そのイン作成し、出力する。

ターフェースは Unix ファイルシステムである。スク

データ基盤系はデータベース部分である。更新処理など間違いが許されない処理が多く含まれる。データリプト間の依存関係は排除し、データの依存関係のみに集中して開発できるようにする。

基盤系の開発、保守運営はユニケージ、業務の両面に熟練した開発者が担当する。

3 Unix ファイルシステムによるデータ管理

一方でアプリケーション系はより業務に近い部分でUnix 哲学では、データの集合や、処理に伴い変化ある。業務の変化に合わせて素早くシステムを更新しするデータを、どのように管理するかについては述べてゆく事が求められる。データ基盤系はシステム全られていない。また、どのようにテキストファイルに体で共通であるが、アプリケーション系は部署毎、業データを格納すれば、性能の高いシステムを開発が出務毎などの単位で開発され、その開発、保守運営は、来るかについても述べられていない。ユニケージで業務知識はあるものの、ユニケージに関しては初心者

は入力から出力までのデータを 5 段階のレベルに分の開発者が担当する。

け、さらにディレクトリとファイルの命名規則を工夫

データ基盤系と個々のアプリケーションは、表 2. 1の様に別々のディレクトリにて開発する。
それぞれの開発担当者は担当のディレクトリを指定され、それ以下のファイルツリーを操作する事ができる。ディレクトリを分けることで、それぞれの開発担して、データを整理して間違いなく、高速に処理を行うための規範を提案している。

/DATA

データ基盤系のデイレクトリ/DATA/SHELL

データ基盤系のスクリプト類/DATA/LV1

レベル 1 データが格納されるディレクトリ

/DATA/LV2

レベル 2 データが格納されるディレクトリ/DATA/LV3

レベル 3 データが格納されるディレクトリ

/APP

アプリケーション系のディレクトリ/APP/ABC

アプリケーション ABC のディレクトリ/APP/ABC/SHELL

アプリケーション ABC のスクリプト類の格納されるディレクトリ/APP/ABC/LV4

アプリケーション ABC のレベル 4 データが格納されるディレクトリ/APP/ABC/LV5

アプリケーション ABC のレベル 5 データが格納されるディレクトリ
表1

ユニケージのディレクトリツリー

3. 1 5 段階のレベル分けによるデータの整理

ベル 1 データの内容を全て含むように行なわれる。

ユニケージでは、入力データを受け取り、段階を

レベル 3 データは取込まれたレベル 2 データを、多追って加工して、出力する。この時に発生する全てのくの業務で使用しやすい形に加工したデータである。

データを以下のような 5 段階のレベルに分類する。

システムのアプリケーションは基本的にレベル 3 デー

• レベル 1: 入力データ (非テキストデータ可)タを参照して出力データであるレベル 5 データを作• レベル 2: 確定データ成する。レベル 3 データの作成には場合によっては• レベル 3: 整理データ

レベル 2 データに加えてレベル 3 データを利用して• レベル 4: アプリケーションデータ作成することもある。この詳細については後述する。

• レベル 5: 出力データ (非テキストデータ可)

レベル 3 データは RDBMS でのテーブルのようなもっとも基本となるのは、レベル 1 とレベル 5 の位置づけのデータである。レベル 3 データは通常 1データである。これはシステムの入力データと出力テーブルあたり 1 ファイルに格納される。RDBMSデータそのままである。ユニケージでは、内部では全と異なる点は、レベル 3 データの種類はあとから幾てのデータはテキスト形式であるかうが、この二つのらでも増やしてもよいという点である。ユニケージはレベルに限っては対向システムに合わせるため、テキ個々のテーブルの設計に時間をかけず、直感的に必要スト形式ではないこともある。

なものを作成して、アプリケーションの需要に応じてレベル 1 発生単位でファイルに格納される。例え種類を増やしていく事で対応する。

ば、業務にともない伝票が 1 枚起こされるたびに、レシステムのうち、このレベル 1 からレベル 3 まで

ベル 1 データのファイルが一つ作成される。レベルを作成する部分が、先ほど述べたデータ基盤系であ1 以上のデータは、全て直接的もしくは間接的にレベる。データ基盤系は全てのアプリケーションにデータル 1 を加工した結果である。そのため全てのデータを提供する。業務上、データから何らかの情報を引きを保存し、常にシステムの任意の時点の状態を再現出出す必要がある場合、その業務毎にアプリケーション来るようにする。

を作成する。各アプリケーションはレベル 3 データを

レベル 2 データはレベル 1 データをシステムにと用いてデータを加工し、レベル 5 データを作成する。

りこんだデータである。この時点で入力データの形式

このとき、処理速度を改善したり、シェルスクリプのチェックやテキストへの変換を行なう。通常レベル

トを簡潔に記述するために、中間的な形式のデータ1 データの取り込みはある程度まとまった単位で行なを作成する事がある。これがレベル 4 データである。

われ、レベル 2 データは複数のレベル 1 データからその場合、レベル 5 データは、レベル 3、4 の両方を作成される。これらの処理は、レベル 2 データはレ用いて作成される。また、テーブルの更新を高速に行うために、レベル 5 データを、レベル 1、3、4 のデーかかるだけではなく、データの内容を理解することもタを使用して作成することがある。

むずかしい。

いずれの場合であっても、自分より高いレベルのこのような場合、テーブルのキーと値で分割し、商データを参照してデータを作成してはいけない。この

品番号と商品名、商品番号と部門、商品番号と原価、ようなルールをにより、依存関係がおのずと入力からといった形で格納されたファイルを、“商品台帳. 商

出力へと流れるようになる。

品番号 商品名”、 “商品台帳. 商品番号 部門”、 “商3. 2 データの分割とルに格納する。すると、それぞれのファイルのサイズ

品台帳. 商品番号 原価” といった形で命名したファイ

ファイル/ディレクトリの命名規則によるがキーと値のみデータ量となる。そして使用時には処理の高速化

loopj コマンドを利用して必要なフィールドを接続しレベル 1 からレベル 5 までのデータは、表 2. 1 のようなディレクトリ中に配置する。
レベル 3 データは通常 1 テーブルあたり 1 ファイルに格納するが、なかには非常に大きなテーブルもて利用する。
例えば、商品名と原価が必要な場合、 loopj コマンドを以下のように使用する。

loopj num=1 商品台帳. 商品番号_商品名 \存在し、そのため処理速度が問題になる事がある。こ

商品台帳. 商品番号_原価のとき適切な条件でファイルをいくつかに切り分け、別々のファイルに格納することによって性能が改善される。

3. 2. 0. 1 レコードの内容による分割
第一の分割の方法はレコードの内容で分割する方法である。
例えば以下のような、各フィールドに商品番号、商品名、部門 (商品の種類)、原価、売価の格納されたファイル、“商品台帳” があるとする。

4 テキストファイルによるデータ保持とシェルスクリプトによる処理
近年のシステム開発では、RDBMS などのアプリケーションを利用してデータを管理する事が多い。しかしユニケージでは全てのデータを Unix のファイルシステムを利用して管理し、データは行指向スペース区切りのテキスト形式で管理する (5)。
そして、データの格納されたテキストファイルを、123456 商品Ａ 食品 123 234

シェルコマンドを利用したパイププログラミングに234561 商品Ｂ 雑貨 234 345

よって処理し、検索、更新、さらにその他の集計など

345612 商品Ｃ 雑貨 456 567といった処理を行なう (7)。こういった処理は、典型

仮に食品のみ、あるいは雑貨のみ処理を行なうよう的な記述のシンプルなパターンを覚えることによっな業務が多い場合、このファイルは食品の商品台帳とて、一般的な業務システムのほとんどを記述する事が雑貨の商品台帳に分割して、“商品台帳. 食品”、“商できる。

品台帳. 雑貨” といった形で命名したファイルに格納

以下では典型的な記述のパターンをみていく。個々する。すると、それぞれのファイルのサイズは必要なのコマンドの詳しい説明については、 usp Tukubai

レコード分となり、不必要なレコードを読み出すため付属のマニュアルを参照されたい。の時間が必要なくなる。

3. 2. 0. 2 フィールドによる分割
第二の分割の方法はフィールドによって分割する方検索のパターン
検索を行なう際には、 selr コマンドなどを利用する。例えば前述の商品台帳から部門が食品のデータの法である。先ほどの商品台帳は簡単のため 5 フィー

みを抜き出す処理は以下のようになる。

ルドから成っていたが、実際の業務に使用する商品台

selr 3 食品 商品台帳

帳は 100 フィールド以上からなることも珍しくはない。そのようなデータは処理のために読み出し時間がすると、商品台帳から食品のレコードのみが抜き出され、以下のように出力される。

123456 商品Ａ 食品 123 234

201608221012 123456 商品Ａ 食品 123 234 3 702

突き合わせのパターン

201608231022 123456 商品Ａ 食品 123 234 6 1404

売上データから売上金額を算出するためには、売上201608220823 234561 商品Ｂ 雑貨 234 345 1 345

データと商品台帳を突き合せる必要がある。その際に201608220921 234561 商品Ｂ 雑貨 234 345 3 1035

は join2 コマンドを使用して以下の様に記述する。

201608230951 234561 商品Ｂ 雑貨 234 345 4 1380

join2 key=2 商品台帳 売上データ処理のパターンの組み合わせ

join2 コマンドは、 POSIX に定義される join コ

ここまで join2 と lcalc を使用して、1 レコード毎マンドを元に、使いやすいように仕様を変更して作りの売上金額を算出した。これをもとに、日毎の商品の直したコマンドである。他に join0、 join1 などがあ売上高を算出してみよう。まずは、必要なフィールドる。元の join コマンドと同様に突き合わせるキーはを選択し、また売上日時は日付の形に変換する。それソートされている必要がある。上記のコマンドの出力には self コマンドを使用して以下のように記述する。

は以下の様になる。

join2 key=2 商品台帳 売上データ |201608220833 123456 商品Ａ 食品 123 234 10

lcalc ’$0, $6*$7’

201608221012 123456 商品Ａ 食品 123 234 3

self 1.1.8 2 3 8201608231022 123456 商品Ａ 食品 123 234 6

この出力は以下の様に、売上日付、商品番号、商品201608220823 234561 商品Ｂ 雑貨 234 345 1

名、売上金額となる。

201608220921 234561 商品Ｂ 雑貨 234 345 3

20160822 123456 商品Ａ 2340

201608230951 234561 商品Ｂ 雑貨 234 345 4

20160822 123456 商品Ａ 702

処理のパターン

20160823 123456 商品Ａ 1404

Tukubai コマンドには企業の業務システムにおけ20160822 234561 商品Ｂ 345

る典型的な処理については、簡潔に記述することがで20160822 234561 商品Ｂ 1035

きるコマンドを用意している。

20160823 234561 商品Ｂ 1380

例えば、 1. 2 節で取り上げたそれぞれの商品の売|

これに sm2 を適用して日毎の商品の売上高を算出

上個数を求める処理は、sm2 コマンドを使用して以する。

下のように記述する。

join2 key=2 商品台帳 売上データ |sm2 key=2 val=3 売上データ

lcalc ’$0, $6*$7’|

元の awk スクリプトと比べてはるかに簡潔になっself 1.1.8 2 3 8|ており、同時にバグが入り込む余地が減っている。こsm2 key=1/3 val=4の出力は先ほどの awk スクリプトと同様に、以下のすると以下のように売上日付、商品番号、商品名、ようになる。

売上高が出力される。

123456 19

20160822 123456 商品Ａ 3042

234561 8

20160823 123456 商品Ａ 1404上では join2 コマンドを用いて商品台帳と売上デー

20160822 234561 商品Ｂ 1380

タを突き合わせた。この出力を元にそれぞれのレコー

20160823 234561 商品Ｂ 1380

ドについて売上金額を求めるには、先ほどの join2 コ

更新のパターン

マンドの出力にパイプで lcalc を接続して以下のよう売上データ、商品台帳ともに更新されることがあに記述する。

る。以下では商品台帳の更新方法を見て行く。まず、

join2 key=2 商品台帳 売上データ |商品台帳の更新データは以下のように、各フィールド

lcalc ’$0, $6*$7’に商品番号、商品名、部門 (商品の種類)、原価、売201608220833 123456 商品Ａ 食品 123 234 10 2340 価、更新処理、更新日時の格納された LV2 データ、“商品台帳. 更新データ.2016082408” があるとする。

ければならない。そこで、 delr コマンドを使用する。

123456 商品Ａ 食品 234 345 更新 201608240822

up3 key=1 商 品 台 帳 商 品 台 帳. 更 新 デ ー345612 商品Ｃ 雑貨 _タ.2016082408 |_削除 201608240822

456789 商品Ｄ 食品 567 789 新規 201608240822

getlast key=1

商品番号 123456 のレコードは、これは商品台帳にdelr 6 削除

同一の商品番号のレコードが既に存在し、また更新処|

この出力は以下のようになる。

理フィールドからその既存レコードに対する更新処

123456 商品Ａ 食品 234 345 更新 201608240822

理であるとわかる。商品番号 345612 のレコードも、234561 商品Ｂ 雑貨 234 345

商品台帳に同一の商品番号のレコードが既に存在す

456789 商品Ｄ 食品 567 789 新規 201608240822

るが、更新処理フィールドから削除処理であるとわか

最後に、 delf コマンドを使用して、商品台帳に必る。商品番号 456789 のレコードは、これは商品台帳要ない、更新処理、更新日時の二つのフィールドを削に同一の商品番号のレコードが存在しない。更新処理除すると新しい商品台帳が作成される。

フィールドから新規に作成されるレコードであるとわ

up3 key=1 商 品 台 帳 商 品 台 帳. 更 新 デ ーかる。

タ.2016082408 |この更新データともとの商品台帳は、まず以下の様

getlast key=1|に up3 コマンドを使用して順序を維持したまま、商delr 6 削除|品番号をキーとしてマージする。

delf 6 7

up3 key=1 商 品 台 帳 商 品 台 帳. 更 新 デ ー
タ.2016082408

この出力は以下のようになる。

123456 商品Ａ 食品 234 345

この処理の出力は以下のようになる。

123456 商品Ａ 食品 123 234

234561 商品Ｂ 雑貨 234 345
456789 商品Ｄ 食品 567 789

123456 商品Ａ 食品 234 345 更新 201608240822

さて、この出力を元の商品台帳に上書きすれば更234561 商品Ｂ 雑貨 234 345

新は完了である。これには以下の様に、一度一時ファ345612 商品Ｃ 雑貨 456 567

イルに書き出してから mv コマンドでリネームする。

345612 商品Ｃ 雑貨 __削除 201608240822

up3 key=1 商 品 台 帳 商 品 台 帳. 更 新 デ ー456789 商品Ｄ 食品 567 789 新規 201608240822

タ.2016082408 |ここで、それぞれの商品番号のレコードの一番最後

getlast key=1|のレコードが最新のレコードである。そこで、パイプ

delr 6 削除|

で getlast コマンドを接続して、最新のレコードを取delf 6 7 > 商品台帳.new得する。

mv 商品台帳.new 商品台帳

up3 key=1 商 品 台 帳 商 品 台 帳. 更 新 デ ー

ここで mv により行なわれる i ノードリンクの張タ.2016082408 |り替えは、同じパーティション上で行なわれる場合

getlast key=1

Unix 上でアトミックな処理となる。そのため、商品すると、以下の様にそれぞれの商品番号の最後のレコードが出力される。

台帳が更新途中の不完全な状態で読み込まれる可能性を排除する事ができる。

123456 商品Ａ 食品 234 345 更新 201608240822
4. 1 おわりに234561 商品Ｂ 雑貨 234 345
345612 商品Ｃ 雑貨 _削除 201608240822

ここまで述べたように、ユニケージでは Unix の456789 商品Ｄ 食品 567 789 新規 201608240822

ファイルシステムと、シェルコマンドを用いてシステ

このうち、更新処理が削除のフィールドは排除しなム開発を行なう。一方で、従来の手法で OS に Unix_を採用していたとしても、さらに RDBMS や開発言保守運用時の困難が発生しない。

語について学ぶ必要がある。そのため、ユニケージはこのブラックボックスが存在しないという特徴と、システムを開発するにあたって学ぶべき事柄が少なくシェルの並列分散処理を容易に実装可能であるというて済む利点がある。Tukubai コマンドを使用すると特徴との相乗効果から、ユニケージによって開発されしても、その数は Java の標準クラスなどと比べてはたシステムはスケールアウトが容易であり、大規模シるかに少ない。さらに、いくつかのパターンを覚えるステムであっても安価なハードウェアを用いて構成す事で、一般的な業務システムのほとんどを記述するる事が可能である。

事が可能である。そのため、プログラミング経験はないが、業務知識は豊富な業務の現場で働いている人々

参 考 文 献が、自分の使うシステムを自分自身で開発する事を可[1] : usp Tukubai, 2016 年 8 月 22 日閲覧. https://uec.usp-lab.com/TUKUBAI/CGI/TUKUBAI.CGI?POMPA=ABOUT.
[2] Gancarz, M., 桂, and 芳尾: UNIX という考え方:
その設計思想と哲学, オーム社, 2001.
[3] The IEEE and The Open Group: The OpenGroup Base Specifications Issue 7 IEEE Std 1003.1,
2013 Edition, 2013.
[4] ユニバーサル・シェル・プログラミング研究所: ユニ
ケージ原論, ユニバーサル・シェル・プログラミング研
究所, 2010.

能としている。
さらにこうして開発されたシステムはブラックボッ
クスのないシステムとなる。従来手法では RDBMSなど多くの外部アプリケーションを用いる。そのため、その部分はブラックボックスとなり、トラブルの解決や性能の向上の際の障害となっていた。ユニケージにより開発されたシステムはそのような事がなく、