未来に活きる！現場で使える！

組織文化を変える汗と涙の物語

アジャイル改善塾
中小企業手作り 化
IT 奮戦記ユニケージエンジニアの作法

データモデリングIPv6 新時代を体感しよう！

Artwork created by Koji Ishizuka. © 2014 Zie's Bank .Co,. LTD All rights reserved.

04

特集 エンジニアになりたい！
新人の為のUNIX基礎講座
中村和敬

10
12

人間とコンピュータの可能性
大岩元

第20回

未来に活きる！現場で使える！

データモデリング 第10回
熊野憲辰

15

ユニケージ開発手法 コードレビュー 第9回

20

中小企業手作りIT化奮戦記

24「シェル芸」に効く

大内智明
菅雄一

GNU AWK

処方箋 その3

斉藤博文

28

第14回

シェル芸勉強会後追い企画

Haskellでやってはいかんのか？ 第9回
上田隆一

32
36

教えて先輩♡ サーバー運用お助けTips
濱田康貴

第5回

組織文化を変える汗と涙の物語

アジャイル改善塾
山海一剛

第8回

38

漢のUNIX46

法林浩之のFIGHTING TALKS

48

ユニケージエンジニアの作法

52

スズラボ通信56

IPv6新時代を体感しよう！ 第5回

62

アイアムソーリー、ハウアーユー？

後藤大地

第17回

法林浩之

第7回

松浦智之

すずきひろのぶ

第12回

波田野裕一

シェル魔人/編集後記

USP 友の会
マスコットキャラクター
ちんじゅうちゃんエンジニアになりたい！
新人の為のUNIX基礎講座
について詳しい人に教えてもらったよ！～～ 抽象化
Writer：中村和敬 協力：莖田浩明、
星春菜

どうしたら先輩たちみたいにシス

パソコンは「パーソナルコンピュータ」、つまり個人用

テム開発を出来るようになるんだコンピュータの略称です。
コンピュータは
「計算機」
、
計

ろう?

そういえば今まであんま算をする機械の事です。
現代のコンピュータはCPU、メ

り意識せずにパソコンを使って

モリ、
HDD、
キーボード、
ディスプレイ等、様々な部品できたけど、パソコンの事何にも知出来上がっています（Fig. 1-1）。
この中では、CPUが計らないな。そもそもパソコンって算を行う部品で、CPUとメモリの組み合わせがコンなんなのかな？

ピュータを作るための最低限の部品です。

Fig. 1-1 コンピュータの色々な部品
これだけは必要！

HDD
モニタ

メモリ
キーボード

CPUはメモリ上に記録されたプログラムに従って動作し、計算を行います。例えるなら、CPUは非常に計算の速い人で、メモリ上に記述した計算問題を解いてくれるというふうに言えるでしょう。

010101010101010101010101
010101010101010101010101
010101010101010101010101
010101010101010101010101
010101010101010101010101

ただし、CPUもメモリも電子機器なので、計算をお願いするには電気信号を使わなければなりません。

42014 December!?

大学でコンピュータの抽象化を研究していた、
ちんじゅ子さん

入社1年目のちんじゅ太くん

IT企業に流れ着いたちんじゅ太君。入社してから雑用をこなしていますが、空いた時間の傍ら、ユニケージを勉強しています。
でも、コマンドコマンド、ってみんな言うけど、一体なんのことかさっぱりわかりません。
そんな時、USP
マガジンで新人向けに優しい記事を作ってくれるという企画があるということで、先輩社員のちんじゅ子さんに思い切って質問してみました。

一方で、コンピュータの他の部品、
HDD、キーボード、
ディスプレイ等も電気信号によって動作します。
CPUはメモリの力を借りながら、
電気信号を受け取って、計算し、電気信号を送り出します（Fig. 1-2）。
①

Fig. 1-2 CPUの挙動

この性質を使用すると、コン①電気信号を受け取る
②計算する

メモリ

ピュータの他の部品との間で意味のある信号のやり取りをする事ができます。

③電気信号を送り出す
②

③
例えば、
CPUはキーボードからFig. 1-3 CPUによる部品の制御

送られてきた信号から、キー
ボードのどのキーが押された①押されたキーボードのキーに対応する電気信号を送り出すのかを知る事ができます。
そして、
ディスプレイに対して、押されたキーに対応する文字を ディスプレイに表示するための信号を作り出して送る事ができます（Fig. 1-3）。

②信号に対応する文字を

メモリ

算出

このような仕組みにより、電気信号でしかお話できないコン
ピュータの部品と人間との間で、情報をやり取りする事が出来ます。

A③モニターに文字を表示する信号を送信

なんだかコンピュータって難しそう？？？

5コンピュータは複雑な機械です。
しかしその背後にある考え方は非常にコンピュータってす

単純なものです。
それは、色々な物事をシステムとして理解する考え方

ごく難しそうで、なです。
システムは一般的な考え方ですが、IT系企業でシステムと言った

んだかよくわからなら、大抵の場合コンピュータを組み立てて作った、コンピュータシステム

いや。

を指します。
システムが何については、色々な説明の仕方があります。
コ

こんなんで僕にシスンピュータについて理解する場合は、入力と出力のあるもの、という説

テム開発が出来るの明の仕方がよいでしょう（Fig. 2-1）。
このとき、入力と出力がどのように行かな。

われるかについては、気にする必要はありません。

Fig. 2-1システムには入力と出力がある

身近にある計算をする機
械として、最もコンピュー

システムは何か入れるとタらしいコンピュータは

Fig. 2-3システムを繋げて大きなシステムに
4

エンジニアになりたい！新人の為のUNIX基礎講座

電卓です。電卓は、キーされ、液晶画面を通じて

何か
出てくる

2

12

計算結果を出力する機
械です（Fig. 2-2）。

1

み立てる事ができます（Fig. 2-3）。
システムの繋ぎ方に

3－

ステムを繋ぐ事で、複雑なシステムを組足算＋ システム掛算
× システムを押す事で数式を入力

system3

このように単純なシは特に制限はない
ので、もっと複雑な引算システム

繋ぎ方をする事もで

９

きます（Fig. 2-4）。

Fig. 2-2 電卓システムとその仲間
Fig. 2-4 もっと複雑なシステム

同じ種類のシステム

計算式を入力

1+2

7

8

1

2

4
0

5
.

1

9 ÷

9

4

4

0

6

0

0

1

9

4

4

0

6

0

6

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

2

1

9

5

2

2

4

0

6

1
3

0

6

僕たちも
仲間だよ！

6 ×
3 －

＝ ＋

×

×

0

0

×

×

0

0

3
計算結果が出てくる

×

×

0

0

ます。
そのように説明することで、実はそろばんや手回し計算
機は、電卓と同じ種類のシステムだと理解する事が出来るよ
うになります。

1
3
3
1
3
3
1
3

電卓をシステムとして説明する場合、「電卓は数式を入力されると、計算結果を出力するシステムである」という説明になり

3

×

×

0

0

3
1
3

1
4
1
4
1
4
1
4

2
2
4
2
2
4
2
2
4
2
2
4

一方で、あるシステムを繋ぐ事 が 出 来 た からと

2
4
×

×

0

0

×

×

0

0

いって、出来たシステム
が正しく動作するとは限りません。複雑な繋ぎ方で組み立てられたシステ
ムは、正しく動作するか×

×

どうかも分かりにくくなり

0

0

ます。

×

×

0

0

コンピュータなどの、複雑なシステムを組み立てる時 に は 、一 定 の 型 に従って小さなシステムを組 み 立 てる 事 で 、そう

さて、入力と出力のあるシステムの重要な特徴として、
あるシ

いった問題を回避しています。
日常生活や企業の業務で発生ステムの出力を別のシステムの入力に繋げて、新しいシステする情報を処理するためのシステムの場合は、単純な型のみムを作る事ができるという点があります。

でシステムを組み立てる事ができます。

実際の電子機器を繋ぐ場合には、それぞれの間で適切な変換器を通じて通信をするなどして、電気信号の形式が合うよ

あれれ?なんか簡単そうに思えて来たぞ?

うにしなければなりません。
しかしシステムとして見た場合にコンピュータはなんだか難しそうだったけはそういった事を気にする必要はありません。

ど、
システムとして考えれば良いのだね。

62014 December

システムとしてのコンピュータと、実際の電子機器としての

うーん、システムの事はな

コンピュータとの間には大きな隔たりがあります。
この間をん と な く わ か っ た 。で も埋めるのが、
オペレーティングシステム

やっぱりコンピュータは(OS: Operating System)と呼ばれる

難しいなぁ。

プログラムです。

コンピュータは色々な部品によって構成されています。それぞれ

また、部品には同じ目的のものがあります。例えばUSBメモの部品はシステムです。各々の部品は異なる(電気信号の)言葉をリ、DVDドライブ等は、全て異なる種類の部品ですし、それ使います（Fig. 3-1）。
同じ種類の部品であってもメーカーや機種がぞれのメーカー毎にも操作方法が異なります。
しかし、
これ

異なれば、
やはり異なる言葉を使います。

らの部品は、いずれもデータを保存する目的で使用される部品同士をそのまま繋いでも、言葉が違うのでシステムとして動ものです。

作する事ができません。

OSはこれら同じ目的の部品の重要ではない違いについては隠し、重要な事柄のみを見えるように、見え方を変えてくれます。
この事を抽象化といいます。

Fig. 3-1 色々な部品から構成されるコンピュータ
HDD

▲△▲
▲△▲

@@@
@@@

Fig. 3-3 OSの提供する抽象世界と実際のコンピュータ①バーチャルなコンピュータに対するユーザの操作
A

WWW
WWW

メモリ

●◇●
●◇●

バーチャルなコンピュータOS

DVDドライブ②-1 ユーザの操作をバーチャルなコンピュータに反映

ユーザ

CPUはメモリの力を借りて計算をする事によって、自分以外の部品

メモリ

実際のコンピュータHDDの様々な言葉を使う事ができます。CPUを通すことで、コンピュー
タの部品を繋ぐ事ができるようになります（Fig. 3-2）。
さらに、
キーボードやディスプレイといった入出力装置を操作することで、コンピュータを使用する人間、ユーザとの対話もできるようになります。
Fig. 3-2 CPUとメモリを通じて部品を繋ぐ事が出来るようになる
HDD

@@@
@@@

▲△▲
▲△▲
WWW
WWW
WWW
WWW

OSはコンピュータを抽象化して、ユーザには抽象化された、バーチャルなコンピュータを見せてくれます（Fig. 3-3）。
これにより、ユーザはシステムとしてコンピュータを操作する事

A
▲△▲
▲△▲

②-2 ユーザの操作に対応する
実際の操作ができます。
ユーザがバーチャルなコンピュータを操作すると、OSは実際のコンピュータを操作して、対応する実際の操

@@@
@@@

作を行います。

メモリ

A
●◇●

何気なくパソコンを使っていた
けど、OSが人間に使い易くてわか●◇●り易い様に色々動いてくれてた

DVDドライブ
ユーザ

んだね！

7

OSがどのようにコンピュータを抽象化してなるほど…

ユーザに提供するかUNIX系OSを取り上げて説明しましょう。
UNIXは1969年、アメリカの電話会社、AT&Tのベル研究所で開発さ

じゃあ、OSはコン

れたオペレーティングシステム(OS: Operating System)です。
そのピュータをどんな後、UNIXの設計をまねたOSが幾つも開発されました。

ふうに抽象化してLinuxやFreeBSDはそうして開発されたOSで、こういったOSはUNIX

くれているの?

系OS(UNIXライクシステム)などと呼ばれています。

エンジニアになりたい！新人の為のUNIX基礎講座

コンピュータの部品として、
まず記憶装置が挙げられます。

HDD、USBメモリ、DVDといった記憶装置は、それ自体には

HDD、
USBメモリ、DVD(とDVDドライブ)等は記憶装置です。

ファイルやディレクトリのような仕組みはなく、単純に一つの記憶装置はデータを保存する目的で使用される部品です。

データを記録する部品です。

UNIX系OSは記憶装置をファイルとディレクトリという形式でUNIX系OSは記憶装置の、データを記憶する領域を細切れに抽象化します。ユーザはファイルとディレクトリを操作するこして管理することで、記憶装置に複数のデータを記録できるよとで、データを保存したり読み出したり、整理できるようにしうにします。
このひとかたまりのデータがファイルになります。

ます（Fig. 4-1）。

言ってみればUNIX系OSは、
一つの記憶装置を、
あたかも複数の記憶装置のように見せかけてくれます（Fig. 4-2）。

Fig. 4-1 記憶装置をファイルとディレクトリとして抽象化
HDD

さらに、
ディレクトリという形で階層構造の中でファイルを管理するための仕組みを提供しています。

USBメモリ

また、
もう一つ重要な部品として、CPUとメモリが挙げられます。
これらは計算をするため、
つまり、プログラムを実行する目

DVDドライブSSD

的で使用される部品です。
また、動作中のプログラムを、
プロ
セスと言い、
UNIX系OSは動作中のプログラムをプロセスという形で抽象化し、操作できるようにしてくれます（Fig. 4-3）。

抽象化

Fig. 4-3 プロセス
メモリ

ﬁle
ﬁle

プログラム１

プログラム プログラム
１
2
プログラム2

ﬁle

ﬁle
抽象化

Fig. 4-2
一つの記憶装置を複数のファイルに見せかけてくれる

１つのHDDをプロセス 1(プログラム1)

プロセス 2(プログラム1)

プロセス 3(プログラム2)

一つのCPUは、そのままでは一度に一つのプログラムしか実行できません。
UNIX系OSは、プログラムの走行を中断したり再開したりする

ﬁle

ﬁle

ﬁle

複数の
ファイルに
見せてくれる

CPUの機能を用いて、一度に複数のプログラムが実行されているかのように見える機能を提供しています。
UNIX系OSはこの機能により、一つのCPUをまるで複数のCPUであるかのように見せかけてくれます。

82014 December

ファイルとプロセスは、UNIX系OS上でシステムを作る際の基本

パイプという仕組みを提供しています。

的な要素です。
プロセスは、
ファイルに対して、データを読み出し

このような仕組みをプロセス間通信と呼びます。

たり、書き込んだりする事ができます。

実はインターネットもプロセス間通信の仕組みの一つ

UNIX系OSは、ファイルとプロセスに加えて、プロセス同士を繋いですが、今回はパイプに限定して説明します。

でプロセスの間でデータのやり取りが出来るようにするために、
Fig. 4-4 ファイルとプロセスとパイプ

標準出力
プロセス

プロセス

パイプ

プロセス
書く

標準入力

読む
ﬁle

ﬁle

UNIX系OSのプロセスには、入力専用の口と出力専用の口

そうか、プロセスでファイルを読みがあります。
それぞれ、標準入力と標準出力と呼びます。

書きして、さらにパイプでプロセス

UNIX系OSを使用すると、プロセスの標準出力と標準入力を繋げてシステムを作るんだね。

を繋いでシステムを組み立てる事ができます（Fig. 4-4）。

なんだか自分にもシステ

UNIX系OSはコンピュータを抽象化し、ユーザがプロセ

ムを作れそうな気がしてスを繋いで、
システムを組み立てることができるように来たぞ!!

してくれます。UNIX系OSは、OSの本体であるカーネル

でも実際にどうしたらいいの?

と、直接ユーザとやり取りをするシェルの、二つの要素から出来ています。
ユーザはシェルを通じてカーネルを操作して、
システ

Fig. 5-1 シェルとカーネルとシェルスクリプト

ユーザの
操作

ムを組み立てます。
シェルに対する操作は、通常キー
ボードから文字列を入力して行います。操作の手順

or

シェルスクリプトは、文字列のデータとして表現出来るので、ファイルに保存する事もできます。
ファイルに格納された操作の手順を、
シェルスクリプトと呼びます（Fig. 5-1）。

シェル

シェルスクリプトの書き方を学ぶと、UNIX系OSを用いて簡単にシステムを組み立てる事が出来ます。

カーネル

操作
バーチャルなコンピュータ操作なるほど、システムを組み立てるための操作の手順をファイルに保存

実際のコンピュータしたものがシェルスク
リプトか。
シェルスクリプトが書

メモリ

ければ色々なシステムを作れるということだね!ようし!!書き方を勉
強してみよう!!

9

第十二回

ユ ニ ケ ー ジ エ ンジニア の 作法
監修: USP 研究所エンジニア まとめ: 松浦智之

ユニケージとは、 ソフトウェアにおける一つの型である。
ことわり
そこにはどんな作法があり、 どんな理があるのか。
これまで口伝によって伝えられてきた作法を今、 文章として残す。
前回に引き続き、 コードの添削を通じて、 データの持ち方を考える。

作法その十三、 マスターデータは たくさん分割・複製してもよい
前回の連載では、アマチュアプログラマーが書いたを確認しながら利用してみました。その結果、OAuth

プログラムをユニケージエンジニアに添削してもらのような複雑な認証も要らず、簡単にデータを取り出

い、そこから作法を学ぶという形式で議論を行いましせることがわかったため、週末を使って一気に試作アた。その進め方が好評だったこと、またユニケージエ

プリケーションを作ってみました。

ンジニアが実戦の場で書いたプログラムを見ていく連

列車接近情報表示アプリ「メトロパイパー」

載「コードレビュー」が始まっていることもあり、本連載ではもう一度添削を受ける形式で、私が執筆を担当させていただきます。

こうして試作したのが「メトロパイパー」というア

東京メトロ の「オープンデータ活用コンテスト」
今年 9/12 から 11/17 までの間、東京メトロが「オープンデータ活用コンテスト」 を催していました。
*1

プリケーションです。
駅へ行くと「○○行の電車が 2 つ前の駅を出発している」といった情報が電光掲示板で見られたりしま
すが、以前からあの情報が、どの駅についても駅にいなくても見られればと思っていました。例えば近くの

これは東京地下鉄株式会社（東京メトロ）が、自社喫茶店で時間を潰している時、30 分に 1 本の快速電の路線や駅の設備、時刻表、運賃などの情報、そし車が 2 つ、3 つ前の駅に来ているとわかればそろそろてさらに、運行状況や列車が今どの駅に在線してる駅へ向かおうと思えます。また駅のホームに発車時刻

かといった現在のデータに至るまで、様々な情報をぎりぎりに到着して電車がいなかった時、それはもうWebAPI を通じて公開するので、それを用いて世の中出発してしまったのか、遅れていてまだ来ていないのの役に立つアプリケーションを開発してくださいといか、
任意の駅の接近情報が見られればすぐわかります。

う趣旨で開かれたコンテストです。

Web から操作できるものも後から作りましたが、応募して賞金を狙わずとも、鉄道の、しかも今の情

基本はコマンドで、知りたい駅と行きたい方面の駅ナ

報が取得できるという仕様に心惹かれるのは、鉄道オンバー（例えば、丸ノ内線大手町駅なら M18）を引

タク、ソフトウェア開発者である方なら、十分理解し数で与えると画面 1 のようなテキストを返します。

ていただけるのではないでしょうか。更に「ユニケージの作法に基づき、シェルスクリプトでこれを開発できるのか確かめてみたい」という欲求もありました。
コンテストの応募受付が始まって早速、ユーザー登録を行い（登録しないと API は利用できない）、仕様48

2014 December

その後、Web ブラウザーからも使えるようにしました。*2
画面 2 がその画面です。まず画面上部左側の select*1 http://tokyometro10th.jp/future/opendata/ユニケージエンジニアの作法
ボックスで知りたい駅を選ぶと路線が確定しますので、Ajax を利用して右側の select ボックスに該当路線の駅ナンバーの選択肢を書き入れます。後はそれを$ ./VIEW_METROLOC.SH Z08 Z01
2014/10/05 23:26:26 現在

これらのプログラム一式は、GitHub に置いてありま.. Z14 押上
各停 中央林間行 ( 東急電鉄車両 ).. |↓急行 中央林間行 ( 東武鉄道車両 ).. Z13 錦糸町.. |.. Z12 住吉.. |.. Z11 清澄白河.. |.. Z10 水天宮前.. |.. Z09 三越前.. |>> Z08 大手町
各停 中央林間行 ( 東急電鉄車両 ).. |.. Z07 神保町.. |.. Z06 九段下.. |.. Z05 半蔵門.. |.. Z04 永田町.. |.. Z03 青山一丁目 急行 中央林間行 ( 東急電鉄車両 ).. |.. Z02 表参道.. |.. Z01 渋谷
各停 中央林間行 ( 東急電鉄車両 )$す *3 のでご覧になってみてください。

画面 1． 接近情報取得コマンドの実行例

選択すれば裏側で先程のコマンドが実行されて在線状況が確認できるというわけです。

各プログラムは三つの役割に分類されるプログラムは大きく三つに分かれます。一つ目は、最初に駅名や路線名のコードと名称の情報を WebAPIから取得し、マスターファイル群を作るためのプログ
ラム（MK_METRO_MST.SH）。二つ目は、現在の在線状況を WebAPI に問い合わせ、先程作ったマスター
ファイル群と結合して最終的なテキストを生成するプログラム（VIEW_METROLOC.SH など）。三つ目は、二つ目のプログラムを Web インターフェースに対応させるため、Web ブラウザーからのリクエストに応えるプログラム（GET_LOCINFO.AJAX.CGI など）です。

マスターファイルは二種類
プログラム本体同様に重要なのがマスターファイルです。どの列車（行先・種別・車両製造会社）が今どの駅にいるかといった情報は全て内部コードで返ってきますので、最終的にこれを人間にわかりやすい名称に変換しなければなりません。各コードと名称の対応
も WebAPI や指定 Web ページをアクセスすることでわかるようになっていますが、名称はめったに変わるものではなく、インストール時に一度わかれば十分です。そこでマスターファイルを用意するのです。
マスターファイルは二種類用意しました。一つは東京メトロの駅名のマスターファイル（SNUM2RWSN_
MST.TXT）、もう一つはそれ以外（路線名や列車種別名、他社線を含む行先駅名、車両製造会社名）のマスター
ファイル（METRO_VOC_MST.TXT）です。東京メト
ロの駅名マスターだけなぜ独立して持たせているかというと、その主な理由は、内部コードと駅名以外に駅画面 2． Web ブラウザーから使えるように対応したもの

指摘その一、
データはまず絞り込みから
さて、ユニケージエンジニアにこのアプリケーションを添削してもらいました。

ナンバーがあるためです。先程お見せしたように、コ

前回の PalPay 決済アプリケーションに比べると、

マンド引数では駅ナンバーを受け付けるようにしていユニケージらしくなっているという評価でしたが、そるため、単純に内部コードと名称の対応だけ持っていれでも指摘が無いわけではありません。

ればよいその他のマスターデータとは構造が違うためです。

*2 http://lab-sakura.richlab.org/METROPIPER0/*3 https://github.com/ShellShoccar-jpn/metropiper049

駅ナンバーマスター（SNUM2RWSN_MST.TXT）

路線名マスター
各種名称マスター

1: 駅ナンバー 2: 路線コード 3: 路線名 4: 駅コード
5: 駅名
6: 方面コード（METRO_VOC_RW_MST.TXT）（METRO_VOC_MST.TXT）

1: 各種コード
2: 各種名称

1: 路線コード
2: 路線名

駅名マスター（METRO_VOC_STN_MST.TXT）

SNUM2RWSN_<路線コードA>_MST.TXT

1: 駅コード
2: 駅名※ 路線、駅、種別など全てを含む

1: 駅ナンバー 2: 路線名 3: 駅コード 4: 駅名 5: 方面コード

SNUM2RWSN_<路線コードB>_MST.TXT

1: 駅ナンバー 2: 路線名 3: 駅コード 4: 駅名 5: 方面コード

SNUM2RWSN_<路線コードC>_MST.TXT

列車種別名マスター

1: 駅ナンバー 2: 路線名 3: 駅コード 4: 駅名 5: 方面コード（METRO_VOC_TYPE_MST.TXT）

SNUM2RWSN_<路線コードD>_MST.TXT

1: 駅ナンバー 2: 路線名 3: 駅コード 4: 駅名 5: 方面コード

1: 種別コード
2: 種別名:
路線毎の 駅ナンバーマスター（SNUM2RWSN_ <路線コード>_MST.TXT）

図 1． 駅名マスターは、路線毎に 1 ファイル作る

grep と sort の順序が逆
まず指摘されたのは Web 対応のために作ったプロ
グラムである GET_SNUM_HTMLPART.AJAX.CGI でした。これは画面 2 の説明の際に出てきたもので、画面上部左側の select ボックスで知りたい路線の駅名を選択した際、右側の select ボックスにその路線の駅だけに絞り込んだ選択肢を生成するものです。
リスト 1 にその指摘箇所を抜粋します。駅マスター

ファイルから指定された路線（Web ブラウザーが指定した路線の頭文字が $rwletter に格納されている）

図 2． 各種名称マスターは、その種類毎に 1 ファイル作る
リスト 1． GET_SNUM_HTMLPART.AJAX.CGI（抜粋）:111 # --- HTML 本体を出力 ------------------------112 cat "$Homedir/DATA/SNUM2RWSN_MST.TXT"|
113 # 1: 駅ナンバー (sorted) 2: 路線コード 3: 路線名
114 # 4: 路線駅コード 5: 駅名 6: 方面コード#
115 awk '{print substr($1,1,1),$0}'|
116 sort -k1f,1 -k2,2|
117 awk '{print $2,$4,$6}'|
118 uniq|
119 # 1: 駅ナンバー (sorted) 2: 路線名 3: 駅名 #120 grep -i "^$rwletter" データの絞り込みは、|早い段階で行うべき。
121 mojihame -lFROM_SNUM_LIST $Tmp-htmltmpl :の駅ナンバーと路線名、駅名を駅ナンバー昇順で返そます。この部分はコマンドを起動する都度実行されま

うとしていますが、120 行目で実行している指定路線

すが、駅マスターファイルから部分的に切り出していへの絞り込み grep は、むしろ 112 行目の cat の直後

るに過ぎません。駅マスターは都度変わるデータではにやるべきという指摘です。特に sort コマンドの計ないので毎回作るのは無駄な作業です。毎回作るくら

算量は、行数が n 倍になれば n 倍では済みませんの

いなら作り置いておけばいいという指摘でした。

で他のコマンドよりも影響が大きいのです。

指摘その二、
マスターデータは、適宜分割・複製
更に重要な指摘を受けました。今度は、現在の在線状況を調べてマスターデータと結合し、最終出力を作るためのプログラム（VIEW_METROLOC_*.SH）でした。

毎回加工せず加工済データを作り置くべき

そうすれば毎回の処理も軽くなるうえ、プログラムも短くなります。在線状況を調べるプログラムは調べる作業に徹し、都合の良いマスターデータ作成はマスターデータを作るプログラムに任せるべきなのです。

兼ね合わせたテーブルにしない
また、同じくリスト 2 の 261、266、271 行目についても指摘されました。
ここでやっていることはそれぞれ、列車種別名の結リスト 2 を見てください。まずは 236、241 行目の合、行先駅名の結合、車両製造会社名の結合です。先join コマンドです。ここでは駅を表す内部コードを駅に説明したとおり、METRO_VOC_MST.TXT というのナンバーに変換するために、そのための変換表ファイ

は自社駅名以外の各種名称を引くためのマスターファル（$Tmp-sc2snum）と結合するという処理を行ってイルなのですが、「なぜ一つのファイルのままなのか。

います。このファイルは 131~142 行目で生成してい種別マスター、
行先駅マスター、
車両製造会社マスター

50

2014 Decemberユニケージエンジニアの作法
リスト 2． 添削対象の、VIEW_METROLOC_0.SH（抜粋）:
130 # --- 当該路線駅ナンバーマスターファイルの作成 ----------------------131 cat $Homedir/DATA/SNUM2RWSN_MST.TXT |132 # 1: 駅ナンバー 2: 路線 code 3: 路線名 4: 路線駅 code 5: 駅名 6: 方面駅 code
133 grep -i "^${from_snum%[0-9][0-9]}" | # 指定路線のみに絞り込む
134 tee $Tmp-this-rw-stn-mst| # 指定路線の路線駅マスター
135 awk '$6!="-"'> $Tmp-dirstns # 方面駅 code を持つ駅のみに絞り込む
136
137 # --- 駅 code から駅ナンバーを引くマスターファイルを作る ------------この一時マスターファイルを、
138 cat $Tmp-this-rw-stn-mst |毎回作成するのは計算の無駄。
139 # 1: 駅ナンバー 2: 路線 code 3: 路線名 4: 路線駅 code 5: 駅名 6: 方面駅 code
しかもコードも長くなる。
140 awk '{print $4,$1}'|
別のプログラムで作り置き
141 # 1: 路線駅 code 2: 駅ナンバー
しておけば、計算量も減るし、
142 sort -k1,1> $Tmp-sc2snum
131-142 行目のコードは不要になる。
:
234 # 1: 方面 code 2: 発車駅 code 3: 到着駅 code 4: 種別 code 5: 目的駅 code 6: 車両所有業者 code
235 sort -k2,2|
236 join -1 1 -2 2 -o 2.1,2.2,1.2,2.3,2.4,2.5,2.6 $Tmp-sc2snum |237 # 1: 方面code 2: 発車駅 code 3: 発車駅ナンバー 4: 到着駅 code 5: 種別 code 6:目的駅 code 7: 車両所有業者 code
238 awk '{print $1,$3,$4,$5,$6,$7}'|
239 # 1: 方面 code 2: 発車駅ナンバー 3: 到着駅 code 4: 種別 code 5: 目的駅 code 6: 車両所有業者 code
240 sort -k3,3|
241 join -1 1 -2 3 -a 2 -o 2.1,2.2,2.3,1.2,2.4,2.5,2.6 $Tmp-sc2snum |242 sed 's/ / - /'|:260 sort -k2,2|
261 join -1 1 -2 2 -a 2 -o 2.1,2.2,1.2,2.3,2.4 $Homedir/DATA/METRO_VOC_MST.TXT - |262 sed 's/\([^. ]\{1,\}\) /\1 \1 /'|263 awk '{print $1,$3,$4,$5}'|
それぞれ、
264 # 1: 現在居る 3 桁駅ナンバー 2: 種別名 3: 目的駅 code 4: 車両所有業者 code#
・列車種別名265 sort -k3,3| ・行先名266 join -1 1 -2 3 -a 2 -o 2.1,2.2,2.3,1.2,2.4 $Homedir/DATA/METRO_VOC_MST.TXT - | ・車両製造会社名
267 sed 's/\([^. ]\{1,\}\) /\1 \1 /'|を JOIN しているだけなのに、
268 awk '{print $1,$2,$4,$5}'|
混ざっているせいで、無駄な計算が発生している。
269 # 1: 現在居る 3 桁駅ナンバー 2: 種別名 3: 目的駅名 4: 車両所有業者 code#
270 sort -k4,4|
そのうえ、
271 join -1 1 -2 4 -a 2 -o 2.1,2.2,2.3,2.4,1.2 $Homedir/DATA/METRO_VOC_MST.TXT - |どの行が何の名称を272 sed 's/\([^. ]\{1,\}\) /\1 \1 /'|JOIN しているのか分かりづらい。
273 awk '{print $1,$2,$3,$5}'|:と、分けるべき」という指摘でした。（図 2）

ると、支配を受ける親が複数あることは不自然なので、

sort）で扱わねばならない行数が減り、処理が軽くなことはすべきでないように思えます。

分けていれば、まず、一度の join（及びそのためのマスターデータを複製したり、分割させたりといった

ります。そして、ソースコードも分かりやすくなり

しかしユニケージでは、マスターデータとて必要なます。今は 3 つとも結合するファイル名が METRO_

らば気にせず分割・複製を行うそうです。理由は、今

VOC_MST.TXT なので、それぞれの join が一体何を結見てきたとおり、無駄な処理を発生させないことと、合しているのかはっきりしないのです。

プログラムを分かりやすくするためです。一般的に、

実は先程の $Tmp-sc2snum も同様で、133 行目でマスターデータを分割・複製することを懸念する直接路線の絞り込みを行わず、keycut（Tukubai コマンド）的な理由は、それによってデータの不整合が生じやすなどを用い、始めから路線毎に分けたマスターファイ

くなることであろうと思われますが、元データに変更

ルにしておくべき、とも指摘されました。（図 1）が生じた時には速やかに複製先にも反映させるなどしマスターらしいマスターに拘らず真に必要な形式のデータを作成せよ
マスターデータの「マスター」とは（親機・子機の）親、あるいは（主従の）主という意味です。そう考えて、しっかりした管理を怠らなければよいのです。
そもそも、何のためにマスターデータを作るのか。
それは最終的に得たいデータを効率よく生成するためであって、マスターらしいマスターデータを作るためではないはずです。
51

ア！
ニケージエンジニ
これであなたもユ

ユニケージ開発手法教育講座「ユニケージ開発手法教育講座」は、ユニケージ開発手法におけるデータ管理の方法や、オリジナルコマンドの使用方法などをハンズオン形式で具体的に学べる講座です。UNIX の基礎からユニケージ開発手法による開発プロジェクトの進め方まで、ユニケージエンジニアとしてのトータルスキルを習得できます。

http://www.usp-lab.com/LECTURE/CGI/LECTURE.CGI
ジ
ユニケー
講座
基礎技術

充実中！
続々と新講座もK - BASIC

ユニケージ基礎編

K - WEB

WEBアプリケーション編

K - BATCH

バッチ処理編（ウェブアプリケーション処理）

K - ARCH

ユニケージアーキテクチャ編

K - SETUP

ユニケージ開発環境セットアップ編

K - UNYO

システム運用・管理編

K - PROJECT

プロジェクトマネジメント・人材育成編

K - SQL

速習：SQL からの移行編

K - STAT

ユニケージにおける統計コマンド編

UNIX 初心者のための講座などもご用意しています。
技術の草原で百獣の王を目指す
エンジニアたちの新感覚トークライブ！

http://techlion.jp/

上記のサービス内容は 2014 年 11 月現在のものです。最新の情報はホームページにてご確認ください。

ISBN 978-4-9048-0714-9
C3455 ￥500

USP 研究所
定価（本体 500 円＋税）