エ ン ジ ニ ア で あ り 続 け ら れ る か は 自 分 で 決 め ら れ る 。
ISSN 2187-9443

特集 ついにユニケージがAWSに登場！

「AWS Tukubai」
を試す
シルネン・ブヤンジャルガルの海外開拓レポ

B.W.カーニハン先生にお会いしてきました！
TechLION再録

田中邦裕

エンジニアと経営と、
日本と海外と浮川初子氏に訊く、
技術者哲学

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

From Editor『UNIX という考え方』（マイク・ガンカーズ著）によれば、人間が作ることができるのは 3 つの段階からなるシステムしかありません。
その最初の段階 " 第 1 のシステム " は、1 人か、せいぜい数人の小さなグループが作った、無駄がなく俊敏なシステムです。
最小限のコストで高い性能を実現するそのシステムのコンセプトは、人間の創造力を刺激します。
やがて、そのコンセプトに惹かれて集まってきた多くの専門家が、次の段階 " 第 2 のシステム " を作り出すのです。
この " 第 1 のシステム " が誕生してから " 第 2 のシステム " に発展するまでは、ほとんどの場合、孤独な
長い道のりを経なければなりません。
最初は誰にも理解されない。だが、あきらめないで根気強く、そのシステムの素晴らしさを説き続けているうちに 1 人、2 人、さらに長く続けていれば 10 人…100 人と、指数的に理解者が増えていきます。
B.W. カーニハン教授によって評価されたことは、
ユニケージ開発手法が " 第 1 のシステム " の段階を終え、" 第 2 のシステム " に移行する時期が近いことの証しでもあるのでしょう。
しかし、さらに長い道のりを歩き続けて、" 第 3 のシステム " を作り出せたとき、それまでの努力が " 実った " と言えるのです。
USP MAGAZINE 編集部

Contents
特集

ついにユニケージが AWS に登場「AWS Tukubai」を試す… …………………………… 3

うにっくすなやつら

第5回

長谷川猛…

………………………………………………………………………… 15

シルネン・ブヤンジャルガルの自立への挑戦、情報整理技術の開拓

スズラボ通信漢の UNIX

第2回

第7回

第 2 回…

………………………………… 20

すずきひろのぶ… …………………………………………………………………………… 26

後藤大地………………………………………………………………………………………………… 30

浮川初子氏に訊く、技術者哲学………………………………………………………………………………… 34
ユニケージエンジニアの作法

第8回… ……………………………………………………………………… 40

UNIX ネイティブの電子工作塾

第3講

大野浩之

今私たちは何を学ぶべきか

第 10 回

高嶋健人… …………………………………………………… 44

大岩元……………………………………………………………………… 48

IT 美女図鑑 ―― 高坂いくこ… ……………………………………………………………………………………… 50
TechLION 再録

田中邦裕が語るエンジニアと経営と、日本と海外と… …………………………………… 52

中小企業手作り IT 化奮戦記
シェルスクリプト大喜利

第8回

菅雄一……………………………………………………………………… 59

第 10 回… ……………………………………………………………………………… 62

Tech 数独 … …………………………………………………………………………………………………………………………… 66
天地概況 奈須蛍路 ／ 編集後記… …………………………………………………………………………………………………… 67※ 薄字の記事はよりぬき版には収録されていません。是非正式版をお求めください。

2

USP MAGAZINE 2013 autumn

特集

ついにユニケージが AW S に登場「AWS Tukubai」 を試す
USP MAGAZINE 編集部

シェルスクリプトによるシステム開発。データベースアプリケーションを一切使わず、テキストファイルだけで業務システムを組み上げる。しかも動作は高速で、開発期間も短い……。もしそんな噂を耳にしたのなら、その正体は usp Tukubai かもしれない。
一部の人に知られるのみで、ほぼベールに包まれた存在であった usp Tukubai が、2013 年 8 月、
Amazon Web Services (AWS) に登場し、使いたい時に使いたい分だけ、誰でも気軽に利用できるようになった。
果たして usp Tukubai とはいかなるものであるのか。本特集では、これを提供する「AWS
Tukubai」の使い方を紹介しつつ、その実力の程を探っていく。

第1 章―３分でわかる「AWS Tukubai」
2013 年 8 月、シェルスクリプトによる本格的システム開発環境「usp Tukubai」が、AWS上に AMI（仮想マシン）という形で登場したという報道がなされた。これを「AWS Tukubai」と呼ぶことにするが、それは一体何物なのだろうか。本章ではまず、AWS Tukubai とはどういうもので、どんなメリットがあるのかを、3 分程度で理解できるよう、簡単に紹介しよう。

Q1.AWS Tukubaiって何？
A1.シンプルで高速な開発環境「usp Tukubai」のAWS提供版
これまで一部の企業にのみ供給され、一般ユーザー

ブラウザーから、クリック一発！

には「シェルスクリプトベースにも関わらず、動作が高速で、コストパフォーマンスも高いらしい」といった噂が聞こえてくるのみだった usp Tukubai。これを AWS 上で誰でも手軽に使えるようにしたものが
AWS Tukubai である。
AWS 上で供給するメリットは誰でも使えることのみならず、初期費用ゼロかつ使用した時間分だけ料金を払えばよい点にある。ゆえに、必要な時だけ使いたいというオンデマンドな用途に最適である。

頼んだ時だけ、Tukubai サーバーが仕事しにやってくる。

Q2.昨年出た「Open usp Tukubai」と何が違う？
A2.平均20倍以上の処理速度と200以上のコマンド
AWS Tukuai で 提 供 さ れ る ビ ジ ネ ス 版 は、Open usp
Tukubai（Open 版）を大幅に超える 200 個以上のコマンドを収録。しかも全て C 言語で書かれれており、Open 版に比べ、平均 20 倍以上の速さ ( 編集部比 )で動く。

例 え ば、Tukuabi コ マ ン ド で 定 番 の self（SQL で は
SELECT によるカラム抽出に相当）を用いた 100 万行のカラム抽出では、同じ AWS インスタンス上で実行したOpen 版と速度比較してみたところ、約97倍となった。
コマンドの豊富さも見逃せない。Open 版では現在 52
個のコマンドが提供されているが、AWS Tukubai ではその 4 倍以上の 221 個もある。SQL で設計されたシステムの移植に便利な tag シリーズコマンド、Microsoft Excel

ファイルを読み書きできる rexcel,wexcel コマンドの提供など、ビジネスシーンへの対応がより強化されている。

4

USP MAGAZINE 2013 autumn

self コマンドの速度比較
ビジネス版
Open 版

0.23 秒

22.0 秒

100 万行のデータから一つの列を抽出する作業を、同じ c1.xlarge インスタンスにて実行。

ビジネス版のみ提供される主なコマンド
名称

機能概要

calsed

文字列A を文字列 B に変換 ( 軽量 sed)

fsed

特定フィールドを対象にした sed

htableHTML の <table> 内データ抽出

pad0

指定フィールドを 0 パディング

tag*

SQLライクなデータ処理コマンド群*excelx

Microsoft Excel ファイルを読み書きbb

Bashコード美化 (beautifier) フィルタ

他多数

特集― ついにユニケージが AWS に登場 「AWS Tukubai」を試す

Q3.AWS Tukubaiの利用料金は？
A3.初期費用0で、1時間0.6(注1)ドルから利用可能
AWS は、仮想マシン (VPS) 等を提供するサービス。VSP は何といってもハードウェア購入の初期負担無しに始められるのがメリットだが、AWS はありがたいことに、殆ど ( 注 2) が従量課金制。つまり「使った分だけ課金。使わなければ 0 円」。一時的に Tukubai を使いたい、試してみたい、というオンデマンド
用途には最適と言えるだろう。具体的な価格については、表１、表２を参照してもらいたい。
表１．AWS Tukubai 仮想マシン（インスタンス）の主要ラインナップおよび価格
インスタンス
仮想CPU数*2 ECU*3 メモリ
タイプ *1t1.mcro64bit × 1

1 630MiB

m1.mediumm1.large

64bit × 1
64bit × 2

2 3.75GiB
4 7.5GiB

m1.smallm1.xlarge
m2.xlarge

m2.2xlarge
m2.4xlarge
m3.xlarge

m3.2xlargec1.mediumc1.xlarge

hi1.4xlarge

64bit × 1

64bit × 4

1

1.7GiB

815GiB

64bit × 2

6.5 17.1GiB

64bit × 8

26 68.4GiB

64bit × 4
64bit × 4
64bit × 8
64bit × 2
64bit × 8

64bit × 16

13 34.2GiB
13

15GiB

5

1.7GiB

26
20

30GiB
7GiB

35 60.5GiB

１時間使用料 （単位米ドル）
ネットワーク
パフォーマンス usp Tukubai
EC2
合計
*4

非常に低

0.60

中
中

0.60
0.60

低

高
中
中
高
中
高
中
高

10 ギガビット

0.02（注1）

0.62（注1）

0.60

0.06

0.66

0.60

0.48

1.08

0.60
0.60
0.60
0.60
0.60

0.12
0.24
0.41
0.82
1.64
0.50
1.00

0.72
0.84
1.01
1.42
2.24
1.10
1.60

1.20

0.145

1.345

1.20

3.10

4.30

1.20

0.58

1.78

*1 デフォルト設定のディスク容量はどれも8GiB。別途追加料金により増設可能である（EBS）他、各インスタンスタイプに応じて一定量の揮発性ディスク領域（インスタンスストレージ : 電源断時に失われる）を無料で増設することも可能。
*2 Tukubai コマンドは並列処理に向いているため、仮想 CPU 数が多いほど性能が上がり易く、お勧めである。
*3 ECU とは、CPU 性能を相対的に示すための Amazon による評価値（例 : c1.medium の CPU 性能は t1.micro の 5 倍）
*4 課金は、電源投入直後、及びその後 1 時間毎に行われる。従って、一瞬でも電源投入すると 1 時間分の課金が行われる。

表２．AWS のその他主な課金条件 *1
項目

価格（目安）EBS アクセス (IOPS) 使用料

スタンダードボリュームの場合、一時間フル稼働させたとして概ね 0.036 米ドル *2

EC2 →インターネット宛データ転送料 *3

最初の 1GB までは毎月無料
以降毎月 10TB までは 1GB あたり 0.12 米ドル

EBS（不揮発ディスクスペース ) 使用料

1GB あたり月 0.1米ドル*1 詳しくは、Amazon EC2 料金表のページを参照されたい。 http://aws.amazon.com/jp/ec2/pricing/*2 表の価格は参考値。詳細な条件によって実際の価格は変化する。
*3 インターネット→ EC2 宛のデータ転送は無料である。

注1

AWS 新規登録から 1 年間は、最小マシン構成の t1.micro を選ぶとそのマシンの課金分 (1 時間 0.2 米ドル ) が毎月実質無料になる。
詳しくは「AWS 無料利用枠」で検索。

注2

ただし EBS と呼ばれるディスクスペースは、稼働させていなくてもディスクスペースを貸りているだけで料金が発生する。その他、主な課金条件を表２にまとめてあるので参照してもらいたい。

Q4.どうやって使うの？
A4.次章でじっくり解説！
AWS なら、自分でマシンを構築するより遥かに簡単に始められる。だが、一部に英語表記の手続き画面があるなど、AWSを使った事のない人には少々難しいかもしれない。そこで AWS 初心者向けの始め方マニュアルを用意した。早速、次ページを開こう！

5

第２章―AWS Tukubai をはじめてみる。
昨年の Open usp Tukubai に続き、AWS 上でビジネス版 usp Tukubai が提供されたことで、より身近になった Tukubai。ただ、使い始めるまでの手続きは、AWS 初心者には少々難しいかもしれない。そこで
AWS Tukubai を使い始めるまでを手取り足取り紹介しよう。また、説明ビデオ ( 約 8 分 ) も公開されているので、そちらを参考にするものよいだろう。→ http://www.youtube.com/watch?v=Yxop1Wrjc-M

１. AWS を始める
1） AWSサインアップのため、ブラウザーから http://

aws.amazon.com/jp/free/ へアクセス。新規サインアップ者は１年間「無料利用枠」を使えるので、参考に読んでおこう。読んだら「サインアップ」開始だ。

2. マーケットプレイスで
Tukubai を取得

3） こ こ は AWS に サ イ ン イ ン し た 直 後 の 画 面 だ。
（AWS を以前から利用していて、サインアップ済の人はここから始める）

この画面の右上の「アカウント / コンソール」内にある「AWS Management Console」を選ぶ。

2） 指示に従い、名前や利用料金支払いのためのクレ
ジットカード番号等を入力していく。イタズラサ
インアップ防止の為、途中で電話による認証がある。（こちらの声を音声認識するぞ。スゴい！）そしてサインアップ完了後、下の画面に。そうしたら「AWS Management Console の起動」を選択。

4） 一番左の列にある「EC2」を選ぶ。（Tukubai は
EC2 の中で提供されているのだ）

ココをクリック

コレ（EC2）を選択

6

USP MAGAZINE 2013 autumn

特集― ついにユニケージが AWS に登場 「AWS Tukubai」を試す
5） EC2 ダ ッ シ ュ ボ ー ド 画 面 に 到 着。 こ こ か ら

8） 商品詳細画面。左下にマシン構成、右下に価格表し、作る。そのため「Launch Instance」をクリック。

あり）がある。確認したら「Continue」
をクリック。

Tukubai 入り仮想マシン (= インスタンス ) を取得（仮想マシンが置かれる地域によって若干価格差

ココをクリック

価格表6） Tukubai 入り仮想マシンは AWS マーケットプレ

イスで提供されている。よって、左サイドの「AWS

3. マシンスペックを決めるという検索キーワードを入れて、検索 (Go) する。

9） この画面で、仮想マシンのスペックを決める。だMarketplace」を選択した後、右上に「Tukubai」

が AWS 用の公開鍵 / 秘密鍵を持っていない場合

2. “Tukubai” と打ち込んで検索は、画面左下にある「Key Pair」項目内の「1.Visit
the Amazon EC2 Console」にて、予め鍵を作らねばならない。( 作ってある人は手順 12 へ )1. Marketplace を選択

鍵を作ってない場合
ここをクリック

7） 見 つ か っ た！ そ こ に 表 示 さ れ て い る 品 名“Unicage (usp Tukubai) Data Analytics Platform”
をクリック。

10）こんなふうにして鍵を作る。途中で入力を求められるのは鍵の名前であり、パスフレーズではない。
だから分かりやすい名前を付けておこう。

品名（Unicage）
をクリック

7

第２章―AWS Tukubai をはじめてみる
11）鍵が発行されると秘密鍵がダウンロードされるの4.Tukubaiマシンを使う

ウザーを手順 9 の画面に切り替え、再読み込み

14）再び EC2 ダッシュボード画面。今度は左サイドで適宜保管しておくこと。ダウンロード後、ブラ(F5) させる。これで AWS 用の鍵の登録は完了だ。

メニューの「Instances」を選ぶ。

12）さて、仮想マシンのスペックを決める。左上に「1-Click Launch」と「Launch with EC2 Console」の 2 つの決め方が用意されているのだが、AWS
初心者は前者が絶対オススメ。ということで、「1-Click Launch」からマシンを選択する。すると右の価格表が自動的に選択されるので確認しよう。（ここで仮想マシン「Standard Micro(t1.micro)」を選
ぶと、利用 1 年未満なら毎月最初の 750 時間は、EC2 の分($0.02/hr) が無料になるぞ） 決めたら右上の「Accept

Terms & Launch with 1-Click」をクリック。

15）するともう動き出して (running) いる。ここでその仮想マシンをクリックすると、やがて画面底部に、アクセス用のアドレス (Public DNS) 等が表示される。このアドレスはメモしておこう。

1. 1-Click Launch を選択
3. ココをクリックして決定

2. マシンスペックを選択

チェックを入れて……

このアドレス（Public DNS）をメモすること！

価格表13）この画面に来たら、裏では仮想マシンが生成され、起動が行われている。つまり課金が始まって い る と い う こ と。 さ あ、「AWS Management
Console」へ戻って使い始めよう。

ココをクリック

8

USP MAGAZINE 2013 autumn

16）ログインしよう。まず AWS が用意しているターミナルによるログイン方法の解説から。これを使う場

合は上部メニューの「Action」から「Connect」を選ぶ。

特集― ついにユニケージが AWS に登場 「AWS Tukubai」を試す
17）先程ダウンロードした秘密鍵のパスを指定して「Launch SSH Clinet」を押す。すると Java アプレッ
ト版のターミナルが起動する。( 要 Java Runtime
Environment)

他の SSH クライアントからログインする場合

手順 16 から……もちろん SSH やいつも自分
16'）で使っているターミナルソフトでログインすることもできる。先程の公開鍵、および先程メモしておいた Public DNS のアドレスに対し、root としてログインすればよい。

1. 秘密鍵を保存した場所を入力

2. ここをクリック

ログイン成功。はじめまして！
18）ターミナルが起動し、20）最後に、仮想マシンの止め方。EC2 ダッシュボー

ド画面にて、対象の仮想マシンを選択 ( チェック )している状態で、上部メニューの「Action」の中の「Stop」を選べば止まる。止めないと 1 時間毎に課金され続けるので注意。ただし、ディスク(EBS) 使用料は Stop しても課金され続ける。まあ
1GB あたり月 0.1 ドルではあるのだが……。これ「Setting」内の「Terminal」の設定をいじれば、
19）
日本語表示にだって対応させることができる。

も止めたい場合は、Stop ではなく Terminate をして、その後 EBS を Delete する。もちろんその場合、ディスクの内容は破棄されるので注意！

Stop ならマシン停止、Terminate ならマシン破棄

AWS Tukubai を使い始める方法はおわかりいただけ
これで、Linux マシンとして普通に使えるぞ！

ただろうか？

次章では、様々なデモを紹介しよう。

9

第３章―実力がよくわかる、Tukubaiデモ５選「AWS に usp Tukubai が登場した」とはいうものの、その usp Tukubai（Tukubai）は一体、どんなことができて、どれくらい速いのか? そこで編集部では、今回独自に組んだベンチマークプや過去に収録した Tukubai レシピ、更にはリリース元の USP 研究所が提供しているデモプログラムや教材を動作させ、Tukubaiの実力の程を検証した。これらのプログラムは公開しているので皆さんも是非試してもらいたい。

準備．デモプログラムのインストール
AWS Tukubai の実力を体験するためにより抜いた

これを解凍し、生成されたディレクトリの直下にある

デモプログラムを UEC サイトに用意した。まずはINSTALL.sh を実行すれば準備完了だが、一つだけ注意！

こ ち ら（https://uec.usp-lab.com/201309-

uspmag-sample.tgz）をダウンロードしてもらい$$tar jxf 201309-uspmag-sample.tgz$$cd TukubaiDemo$$./INSTALL.sh

マシンにはダウンロードを行うための wget コマンド

Web ア プ リ の デ モ を 含 ん で い る た め、 前 述 のが入っていないため、先にインストールしておく）

INSTALL.sh は Apache の設定 (httpd.conf) とファイアたい。
（ただし、作成したばかりの AWS Tukubai 仮想$$yum -y install wget$$wget https://uec.usp-lab.com/201309-uspmag-sampl$
e.tgz

ウォール (iptables) の設定を書き換える。それらを既に弄っている場合は、INSTALL.sh の冒頭に記されている説明に基づいて、手動でインストールを行う。

デモ１．帳票を作成する
まずは小手調べ……、というわけでもないが Tukubai
コマンドの基本が短く凝縮された例を紹介したい。
解凍したディレクトリの中にある SALES_REPORTというディレクトリに入ってもらいたい。入ったらそこに、report というファイルがあるのでこれを実行してみよう。
$$cd TukubaiDemoディレクトリ /SALES_REPORT$$./report

これは同じディレクトリにある、商品原価・売価マ
スタ（PRICE）、売上（SALES）、部門マスタ（CATEGORY）、
部門名マスタ（CATEGORY_NAME）の各ファイル（テーリスト１．売上データに基づく帳票出力結果
1 売上レポート2
3 部門 種別      数量    売上    粗利   利益率%
4 =============================================
5 001  野菜     327,537 175,521  40,401    23.0
6 002  果物     255,235 144,118  33,202    23.0
7 003  魚類     339,523 195,023  41,661    21.4
8 004  肉類     114,795  72,395  12,906    17.8
9 005  調味     217,198  81,404  20,373    25.0
10 006  雑貨     115,552  46,375  10,695    23.1
11 007  パン      49,472  38,238   6,614    17.3
12 008  冷凍      72,660  28,241   7,173    25.4
13 010  飲料     125,012  72,688  17,021    23.4
14 011  酒類      24,259  12,075   3,165    26.2
15 =============================================
16 @@@  ****   1,641,242 866,078 193,210    22.3

ブル）に基づいて右のような帳票を出力するものだ。
SQL の世界で言うならビューに相当するし、その場合になっている。このスタイルこそが Tukubai プログ

実行を終えたら、report のソースコードを眺めてみまた、その実行に要した時間にも注目してもらいたてもたらいたい。15 個のコマンドがパイプで繋がれ、い。売上データは約 300万行あるが、c1.xlarge インス

工場の製造ラインのごとく逐次実行されるようになっ

タンスなら約 3 秒で処理が終わるのである。同じデーていることがわかる。やるべきことは上から下へと素タの処理をリレーショナルデータベースでやったとし直に書かれ、各行も人間にとって理解し易い処理単位

たら、果たして同程度の時間で終えられるだろうか。

は SELECT 文を使えば恐らく同じことができる。

10 USP MAGAZINE 2013 autumn

ラミングの真髄なのである。

特集― ついにユニケージが AWS に登場 「AWS Tukubai」を試す

デモ２．1000 万件データ処理ベンチマーク
次は Tukubai コマンド 1 つ 1 つの処理能力を評価

マンドといった CPU に相応の負荷をもたらすコマンするためのベンチマークをしてみよう。このデモは、

ドが 2 個増えても並列実行で吸収できるということ

解 凍 し た デ ィ レ ク ト リ 直 下 の BENCHMARK と い うであろう。コマンドを実行するのに要した CPU 時間

ディレクトリの中に用意されている。

の合計値 (2 行目 ) は増えているので、仕事量はきち$$cd TukubaiDemoディレクトリ /BENCHMARK

んと増えていることがわかる。

「ソート」の威力が凄まじい

テストデータを生成

ソートもまたビジネス版 Tukubai の威力が発揮さ最初に、ターゲットとなるテストデータを生成しよれる部分だ。msort という強力なソートコマンドが用う。まずは次のプログラムを実行してしばし待とう。

意されており、
これはソートをオンメモリで行う上に、$$./make_TESTDATA_ja.sh 10000000 > TESTDATA

マルチコア対応。早速試してみよう。
サンプルデータを、第一に 4 列目 ( 日付 ) の昇順、引数の 0 の数は 7 つ、つまり 1000 万だ。これで第二に 2 列目 ( 都道府県名 ) の昇順でソートしてみ

TESTDATA というファイルに 1000 万行からなるラン

よ う。SQL 的 に 言 え ば SELECT * FROM TESTDATA

ダムなデータが生成される。
データは、4 列で構成されており、1 行目から順に、

ORDER BY DATE ASC, PREF ASC; である。

id( 受 付 番 号 )、pref( 都 道 府 県 名 )、balance( 収 支 )、$$time msort key=4@2 TESTDATA > OUTPUT

date( 日付 ) である。ベンチマーク用のデータなので、-p8 というオプションを付ければ 8 コアで処理する。

あまり深い意味は無いことをご了承いただきたい。

$$time msort -p8 key=4@2 TESTDATA > OUTPUT

基本中の基本「列の抽出」

結果を表３にまとめた。1000 万行ソートが 13 秒

全データの中から東京都の経費列のみを抜き出しで終わるというのは驚異的だと思う。ちなみに標準でて み よ う。SQL 的 に 言 え ば SELECT balance FROM

入っている GNU 版 sort コマンドにも全く同じ処理を$$time cat TESTDATA | selr 2 '東京都' | self 1 > O$
UTPUT
real    0m1.182s
user    0m0.694s
sys     0m0.490s

C 言語の鬼は伊達じゃない

TESTDATA WHERE pref = ' 東京都 '; 的な作業だ。

編 集 部 で 試 し た マ シ ン は c1.xlarge（Xeon E5410

させてみたが、その速度差 93 倍 !! …雲泥の差だった。

Tukubai コマンドは、C 言語熟練者の手で徹底的にチューニングされているといい、ご覧のとおり速い。
コマンドのヘルプが man2 コマンドで見られるの2.33GHz、8 コア）であったが、結果はご覧のとおり

で、他のコマンドもベンチマークテストしてみるとよ

2 秒足らずであった。

いだろう。ヘルプは、環境変数 LANG に ja_JP.UTF-8抽出するだけでなく、もちろん値の加工もできる。

を設定しておけば日本語版になる。例えば sm2 とい

例えば上記の値の合計を求めてみよう。これも SQL

うコマンドの日本語 man は次のようにして見られる。

的 に 言 え ば SELECT SUM(balance) FROM TESTDATA
WHERE pref = ' 東京都 '; 的な作業だ。

$$time cat TESTDATA | selr 2 '東京都' | self 1 | t$r -d , | sm2 0 0 1 1 | comma 1 > OUTPUT
real    0m1.188s
user    0m0.724s
sys     0m0.492s

CPU コアが 8 つのマシンであるため、tr や sm2 コ$$export LANG=ja_JP.UTF-8$$man2 sm2
表３．1000 万行ソート対決！

GNU 版 sort

20分16 秒98

msort

22秒 75c1.xlarge（Xeon 2.33GHz、論理 CPU 数 8）上での比較

msort(8パラ)

13秒15

11

第３章―実力がよくわかる、Tukubai デモ５選

デモ 3．ルービックキューブと帳票、宝くじ
次に紹介するデモは、本誌 Vol.5 と 2012 autumn で紹介した、Open usp Tukubai 用レシピ 3 本だ。AWS
Tukubai は、Open 版のものも当然動く。しかも速い！

上面 (Up) を時計回りに 90°回転

ルービックキューブシミュレーター
1 つ目は色鮮やかなルービックキューブシミュレー

背面 (Back) を
反時計回りに 90°
回転

ターの紹介だ。解凍したディレクトリの中の RUBIK_CUBE というディレクトリに入り、rubik_cube という
シェルスクリプトを実行してみよう。

画面１．ルービックキューブシミュレーター

$$cd TukubaiDemoディレクトリ /RUBIK_CUBE$$./rubik_cube

すると画面１のように、正面、上面、右面、背面、底面、左面の現在の色配置が表示される。ここでそれぞれの頭文字（F,U,R,B,D,L）をタイプするとその面が90°回転する。小文字ならば反対方向に回転する。プロンプトにある英字の羅列は答えを示しており、一手目からその通りにタイプすると色が揃う。( 終了は “q”)
このデモは Tukubai が業務システムのみならず、

写真１．画面に出力された帳票を紙に印刷

数理操作にも活用できることを示している。是非ソー
スコードも見てその様子を実感してもらいたい。

部門トレンド（帳票デモその２）
2 つ目は帳票デモだ。本章の最初にデモした帳票よりもさらに複雑である。解凍したディレクトリの中の
BUMONTREND というディレクトリに入り、同名のシェルスクリプトを、とにかく実行してもらいたい。

画面２．宝くじ当せん番号照会アプリ

この時、ターミナル画面の文字数は縦横共に大きめにしておくのがおすすめである。
$$cd TukubaiDemoディレクトリ /BUMONTREND$$./BUMONTREND

画面に出力されるのは商品部門・地域別の売数推移の帳票だ（写真１）。ここまで綺麗に表示できるなら、大掛かりな帳票エディター等使わずにプレーンテキス$$cd TukubaiDemoディレクトリ /LOTTERY/SHELL$$./LOTTERY.DB

これは宝くじの公式ページ HTML から、当せん番号の抽出を行うものである。終わったら次に、Web
ブラウザーから次の URL を開いてもらいたい。

トで出して印刷するので十分に思えてこないだろうか。

http://第2章の手順15で得られたアドレス /TukubaiDemo/LOTTERY/CGI/LOTTERY.CGI

宝くじ番号照会 Web アプリ

れる。ここで、実際のジャンボ宝くじの番号や組番号、3 つ目は、ちょっとイジワルなジャンボ宝くじ当選

抽せん回を入力すればよい。Ajax でリアルタイムに、

番号照会 Web アプリだ。まずは、次のように打ち込

現在までの入力で当たっている可能性のある金額が表

んで、LOTTERY ディレクトリの中の LOTTERY.DB と示される。大抵は、最後の桁まで入力し終えたところ

いうシェルスクリプトを実行してもらいたい。

でドボン（０円）になるという、イジワル仕様だ。

12 USP MAGAZINE 2013 autumn

すると画面２のように当せん番号照会画面が表示さ特集― ついにユニケージが AWS に登場 「AWS Tukubai」を試す

デモ 4．個性的 Tukubai コマンド 59 連発！
AWS Tukubai には 200 種類以上ものコマンドがあ含まれていたら誤動作するから。もちろん予めエス

るが、ここではページの許す限りそれらを紹介しよう。

ケープしてやればいいんだけど、なんて面倒臭い！そまずは、解凍したディレクトリの中の SHORTDEMO

んな時には calsed が超便利。grep に対する fgrep みディレクトリに移動しよう。準備はいいかな？

たいなもので、文字に対して一切特殊な反応をしない。

$$cd TukubaiDemoディレクトリ /SHORTDEMO

先の例ならこう書けば解決。あぁ便利、しかも速い！

コマンド 59 連発！

$$cat NAME_TMPL.txt | calsed "##NAME##" "$a"

★ CSV ファイルを読みたい！…sed,AWK でも頑張れ★ SQL ライクに列を指定したい…リレーショナル DB

ンマ、引用符（“”）が含まれてても大丈夫。サンプルを基本的に列番号で行う点だろう。「列名で指定できの sample.csv を生で見てから、fromcsv に掛けてみよ。

ないの？」実はできる！ Tukubai には tag で始まるコ

ばできるが、fromcsv なら超簡単。値として改行やカ$$cat sample.csv       ←まずは元の中身を確認$$fromcsv sample.csv   ←そしたら使ってみよう!

から乗り換える時、気になるのは列（カラム）の指定

マンド群（現在 51 個）があり、それらを使えば OK。
対象となるデータの 1 行目を列名と見なし、その名前★ Excel ファイルを読み書きしたい！…確かに Excel

で指定できるのだ。例えば self コマンドに対応するのファイルがシェルスクリプトで一気に弄れたらさぞ便

は tagself コマンド。試しに ID、姓、名の 3 列からな利だろう。それなら rexcelx と wexcelx。第 1 引数かるサンプル名簿 members.txt から姓だけ取り出そう。

ら順に、シート番号、セル範囲（左上）、セル範囲（右下）、
ターゲット Excel ファイルと指定すれば OK。試しに、$$tagself "姓" members.txt

AWS Tukuabi 価格表を記したサンプル pricelist.xlsx を★このマシンの CPU は何コア？…並列処理が得意な

読んでみよ。
$$rexcelx 1 B5 F20 pricelist.xlsx | keta             見難いので桁揃えしている↑

1 番目のシートの、B5 ～ F20 の範囲にある値を抜き出した。
「本当に合ってる？」と思うなら、元のTukubai を使いこなすなら知っておきたいところ。でも、どうやって知ればいいのか。知っててたとしても調べ方は OS によってバラバラで面倒。それならcorenum コマンド。実行すれば素直にコア数を返す。

pricelist.xlsx を Excel で開いてみればいい。

$$corenum★バイナリコード混じりファイルに困っている？…そ★巨大ファイルの分割…ローテーションをさせ忘れてトファイルでたまにそういうことがあって、表示が乱10000 行毎に分割したいと思った時、さあどうやる？

れて厄介だ。そういう時は utf8nude。これに掛ければ、

while 文 !? いやいや多分遅くて日が暮れる。そんな時

UTF-8 に準拠しないバイナリデータを除去する。

は gyocut コマンド。下記のように書け、動作も速い！

うそう、HTTP POST で届くデータや破損したテキス

試しにビープ音を鳴らすコード（0x07）を混ぜたサ
ンプルテキスト beep.txt を utf8nude に掛けてみよ。
$$cat beep.txt    ←まず元の中身を確認(音が鳴る)$$cat beep.txt | utf8nude     ←これは鳴らない！

★余計なことしない sed…例えば、テキストファイル

巨大なログファルイができてしまった！

とりあえず$$seq 1 100000 > many.txt     ←10万行のfile作成$$gyocut -10000 few.%02d many.txt      ↑few.01～10という10個のファイルに分割される★ファイル末尾の改行コード…これが有ったり無かったりすると煩わしいので無ければ付けたいと思うこと

NAME_TMPL.txt 内の “##NAME##” の部分をシェル変がある。そんな時は kaigyo コマンド。たったそれだ

数 a に代入された文字列に置換したいと思った場合、けのためのコマンド？…そう。でも結構便利よ。

$$cat NAME_TMPL.txt | sed "s/##NAME##/$a/g"$$echo -n hoge           ←これは鬱陶しい！
$$echo hoge | kaigyo     ←kaigyoコマンド付ければ$$echo -n hoge | kaigyo←これも鬱陶しくない。

と書くのはアウト！ナゼなら、a に “/” や “&” や “\” が13

第３章―実力がよくわかる、Tukubai デモ５選

デモ 5．サンプル Web 帳票システム「USP ストア」

最後に紹介するデモは、Web ブラウザーから帳票を閲覧する業務システム「USP ストア」である。
このアプリケーションは、シェルスクリプトによるシステム開発方法を学ぶために制作するサンプルアプ
リケーションであり、USP 研究所の「教育講座」のれる商品コードを入力し、時間帯別販売状況に関する帳票を閲覧するものである。PLU を指定する他、閲覧した日付の指定、及び販売状況を比較したい過去の日付を設定するようになっている。
従ってこのシステムは、まず各商品の PLU コード

K3 クラスのカリキュラムになっている。（興味のあるを知らなければ検索できないのだが、何も入力しなけ方は、本誌 2013 summer 号を参照されたい）今回はれば「PLU コード=04953762353135、プレミアムチー

特別にそのプログラムを収録させたもらった。

ズケーキ」が自動的に入力されるようになっている。

デモの使い方Web ブラウザーから次の URL を開いてもらいたい。
http://第2章の手順15で得られたアドレス /TukubaiDemo/USPSTORE/CGI/JIKANTAI.CGI

また用意されている売上データもサンプルであるため、ここには 2009 年、2010 年の 3 月頃のものしかない。そこで、次の URL へアクセスすることで生データを見られるようにしてある。
（画面３）すると本ページ冒頭のような画面が表示される。

http://第2章の手順15で得られたアドレス /TukubaiDemo/USPSTORE/POMPA/

この画面は、PLU（プライスルックアップ）と呼ばこれを見ながら、様々な PLU コードや日付を入力した場合の動作を見てみるとよいだろう。

個性が強いが万能な Tukubai
このように Tukubai は、データベースアプリを凌売上データ等の生データファイル

ぐデータ管理、帳票作成、数理計算、そして Web ア
プリケーションまで何でもこなす。
また、ソースコードや格納データを覗けばそれがいかに実現されているかもわかるだろう。
個性は強いが、

PLU マスタデータ
ファイル

画面３．各種生データを見られる

14 USP MAGAZINE 2013 autumn

何でもこなす Tukubai に、是非親しみを感じてもらえればと思う。

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

第8回
業務アプリを作るのだ！の巻

菅 雄一

アプリの開発の目的は「情報の収集れなかった。私のいる本社では、社員てはならないという、難しい課題にぶと共有化」だ。例えば、日頃の商品販

全員が同じ部屋にいるため、連絡事項

つかってしまった。

売情報を収集する事で、売れ筋商品やや会議室予約機能などは、ホワイト

季節変動がわかる。経費削減や業務改

ボードやメールで事足りる。敢えてグ

役員予定表

善案を共有できれば、社内全体に利点

ループウェアを使う利点がなかった。

営業所からの電話で「○○本部長のがある。さらに、営業マンが営業ノウ利点が示せない状態では稟議を挙げて予定は？」という問い合わせがある。

ハウを共有すれば、営業力の強化になも却下されるし、実際、却下された。

本社の壁の張り紙に役員予定表がる。
「情報」を資産と見て、情報資産

最初からグループウェアでは敷居があったが、社内向け Web で閲覧できを運用する道具としてアプリがある。

高い。そこで予算をかけず、かつ、気たら便利だと思った。

ところで Linux には、無料のプログ

軽に使ってもらえる物から導入する事

しかし、そんな物はネットで無料配

ラム言語やアプリ開発環境がある。こにした。まずは Web 掲示板を思いつ布していないので、自作アプリの挑戦

れらを使わないのはもったいない。そいた。掲示板を使って、本社や営業所になった。CGI のサンプル集を見るとこで今回はアプリ開発の話を書く事ににいる社員同士が、経費削減や業務改

Perl が多かったので、Perl の本を片手した。

善を提案し合う事で、情報共有ができに見よう見まねで、自作 CGI を作成

グループウェアとWeb 掲示板る。そして便利さを知ってもらう事で、した。

利用する人が増えるかもしれない。すだが、実際に使いはじめると、予定

ぐに無料の Web 掲示板の CGI プログ表を作成している担当者から「使い勝2000 年、Linux で サ ー バ ー を 構 築

ラムをダウンロードして、使用するこ

手が悪い」とか「張り紙も作っているした。丁度その頃、「ナレッジマネーとにした。最初は書き込み自由で行ので、二度手間」と言った意見が出てジメント」という言葉が流行っていた。

なったので、仕事以外の世間話や、面きて、長続きしなかった。現在でも張情報共有化の事で、それを実現させる

白い内輪ネタを書いてくれる人が何人り紙が続いている。

のはグループウェアだという。IT を活かいた。それが功を奏したのか、読み用して、業務改善や企業業績が向上す

書きする人も増えてきた。

PostgreSQL と PHP に出会う

れば、IT 先進企業として雑誌に掲載さしかし、あまりにも度が過ぎる書きれる。そうなれば、私は有名人になれ込みが出てきたため、業務以外の内容

るかもしれない。

が禁止になり、結局、掲示板は使われそんな欲求も働き、まずはサイボー

なくなってしまった。

2001 年、オープンソース・データ
ベースの PostgreSQL と出会う。
データ検索システムが構築できるとズのお試し版を Linux サーバーにイン

全員が節度を保ちながら、利点を感思った。しかし、PostgreSQL と Webストールしてみたが、ほとんど利用さじつつ、利用しやすい環境を整えなくと連動させるためには、仲介するプロ

59

グラム言語を学ぶ必要があった。
ところが、シェルスクリプトや Perlのサンプル集がなかった上、Java はた。そこで Web 上でのデータ検索シト検索可能の宣伝チラシを FAX で配ステムを作る案件が浮上した。

布したりした。

当初、外注する予定だったが、私はその結果、ネット検索する顧客が増

サンプル集を見た瞬間、難しいと思い、 「 折 角、PostgreSQL や PHP が あ る のえ、当番制で行なっていた休日出勤を及び腰になってしまった。

にもったいない」と思った。そこで外廃止する事ができた。

カレンダー式掲示板の導入

そこで、メーリングリストでお勧め注依頼する前に、検索システムの原型の言語を聞いたところ、「PHP が手っを作れば良いと考え、突貫工事で作成取り早い」と勧められた。

した。

外出予定や来客予定などの連絡事項

PHP は オ ブ ジ ェ ク ト 指 向 言 語 だ。

自社開発すれば経費削減になるの

は、メールが主流になると、メールのだが実際には、オブジェクトの概念をで、褒めてくれるかと思いきや、逆に整理を行なっても、見落とす問題が出知らなくても問題はなく、手続き型言上層部から「勝手な事をするな」と言てきた。他にも、複数人にメールを送語として扱えるため、初心者でも触りわれてしまった。しかし、既に原型がる際に、送り漏れも発生する。

やすい言語だ。特に、一度でも C 言

できてしまったため、私が作った物が語を勉強した人なら、覚えやすい。

採用された。

そこで、各人がカレンダー式の掲示
板に予定を書き込めるようになれば便まずは商品名検索システムから作る検索に使うデータは、データベース事にした。基幹業務システムは AS400化されていなかった。そのため、デー

カレンダー式の掲示板を探してみるで運用している。

タベースに格納するための入力作業がと、PHP で作られたプログラムを発以前から商品コードブック代わり必要だった。担当部署の同僚が、目を見した。しかし、そのままでは使えなに、AS400 上や Web 上で商品検索で赤くしながらデータ入力や確認作業にいので大幅に改造した。

きれば便利だと思っていたが、当時の追われていたが、データベース化する

AS400 では高価なミドルウェアが必事で、管理しやすくなった。

要であり、予算面で不可能だった。

利だと考えた。

導入した結果、連絡事項や社員の予定がカレンダーに書き込まれるように

検索方法、データの規格などの関係

なり、各人の予定が把握しやすくなっ

そこで、AS400 の商品マスターをで、担当部署の意見を聞きながら検索た上、メールの見落としなどが減った。

CSV ファイルに落とし込み、それをシステムの改良を繰り返し、完成させた。

まさに情報の一元管理と共有化の効果

PostgreSQL に格納した。

ところが、Web 検索サービスを開だった。

Web 上で手軽に、商品名の一部か始したものの、利用者は伸び悩んだ。

ら商品コードを検索したり、反対に商考えられる原因は、当時パソコンを品コードから商品名の検索が可能に使っている顧客が少なかったこと、さ2006 年、 基 幹 業 務 で 使 っ て い る

なった。コードブックから探す手間をらに電話だと「○○のデータをくれ」

AS400 を買い換えた。その時、AS400

省けるようになり、社内での評判は良で済むが、検索システムだと、パソコに 接 続 す る Client Access の Linuxかった。

ンを起動させ、Web に接続し、デー版 が IBM の サ イ ト で 無 償 配 布 さ れ

Web データ検索システム
構築

タ検索するという手間がかかることて い る の を 知 っ た。ODBC 接 続 でだった。

AS400 と Linux が 連 動 可 能 に な る た

AS400 との連動

顧客は利点がないと使ってくれな

め、ODBC を 活 用 す る と、Web 上 で勤務先では、あるデータを顧客に提い。この当たり前な事に気づき、携帯AS400 のデータ検索ができる。（図 1）

供していた。顧客から電話で問い合わ

でも閲覧できるようにしたり、電話でせがある度に、データ一覧表からデーのデータ問い合わせがある度に、ネッ

タを探して、FAX で送っていた。

odbc_connect(); を使って DB サーバーに接続

１日 40 ～ 50 件の問い合わせがあり、 処 理 に 手 間 が か か っ て い た 上、
365 日対応を謳っていたため、休日はクライアント

Linux

ODBC

持ち回りで電話当番をしていた。私も当番に入れられていたので、休みたいのに休日出勤をした事が何度もあっ

60 USP MAGAZINE 2013 autumn

Apache+PHP

図1

web からの AS400 のデータ検索

AS400

DB2

中小企業 手作りIT化 奮戦記
き込みを行なっても、部門長といった閲覧・評価する側が、それに対して何Apache+PHP+FPDF
クライアント

ODBC

Linux

AS400 の実績データ

PDF で出力

図2

AS400

DB2

PDF 帳票生成

これによって高価なミドルウェアの対策を取る事にしている。

らかのコメントをしない限り、営業マ
ンは「読んでくれていない」と思うし、
Web 日報以外にも、紙で営業日報を書いていたら、二度手間になるため、活用する気が失せてしまうという結果になった。つまり、閲覧・評価側の立場の人が、営業マンの報告を読むだけ購入の必要性がなくなった。しかし、主な対策法を２つ挙げてみた。１つでなく、営業マンと対話するという姿

ClientAccess について日本語の資料が目はクエリーの無害化だ。無害化対策

勢でコメントをする必要がある上、既ない。英語と格闘になった上、設定のをしていない掲示板で、書き込み中に、存の手書き日報の廃止という事をしな

方法は手探りだった。七転八倒の末、HTML 文 の 終 了 を 意 味 す る </hrml>

ければ、使われないシステムになって連動が可能になり、わざわざ CSV ファ

タグを記入し、それをサーバーに送るしまう。

イルに落とし込み、PostgreSQL へ格と、掲示板が尻切れトンボになる場合納する手間もなくなった上、更新し忘がある。これは、掲示板に書き込んだ

シェルスクリプトについて

れによるデータの不整合の問題が解消</html> を、 ブ ラ ウ ザ が HTML 文 の

私の勤務先では基幹業務を AS400された。

一部と判断するからだ。掲示板が途中で稼動させている。データを Linux 上

現時点でのデータ閲覧が可能になる

で表示終了になる程度なら笑い話で済の CSV ファイルへ容易に落とし込む事で正確な販売履歴などが検索・閲覧

むが、場合によってはタグ記号を悪用仕組みがないため、残念ながらシェルできる上、伝票検索を行なう事で伝票したクロスサイトスクリプティングとスクリプトで業務アプリを作る機会が漏れや記入間違いを発見しやすくないう問題が発生するおそれがある。対ない。だが、シェルスクリプトは手軽

り、在庫管理にも役立った。

策方法は、タグで使われる「<」「>」

で便利な道具だ。ファイルそのものを

AS400 内のデータを補完する形でなどの文字を、「&lt;」や「&gt;」といっデータベースとして扱い、コマンドでPostgreSQL を使う事で、顧客情報のた特殊文字に変換する処置を施す事

必要なデータの取り出しや集計ができ

書き込みなどを行なえるようになった。

だ。幸い、PHP には変換関数があるる。Linux の勉強会で、シェルスクリ

ので、それの活用をお勧めする。

プトを使って家計簿を作っている主婦

また、PHP の無料 PDF 生成ライブ
ラリの FPDF を使う事で、AS400 の実
績データを基に PDF 帳票作成も可能

２つ目はデータベースと連動させる
場合の、SQL インジェクト対策だ。

に会った事がある。
私 自 身、 業 務 ア プ リ で は な い が、になった。AS400 で帳票を作成した

もし、何の対策も行なっていなけれLinux のログを見たり、ログの集計を場合、ファイル化するためのツールは

ば、SQL 文を含んだクエリーを送り込行なうのにはシェルスクリプトを使っ高価だったため、紙で印刷する必要がまれ、データベースの中身を覗き見さている。

あった。だが、PDF 帳票生成が可能れる危険性がある。「'」の文字を「''」になった事で、メールでの実績表の配に変換するなどして、SQL インジェク

布が可能になった。（図 2）

トを防止する必要がある。

Web アプリの注意点

活用されなかったアプリの話

Web アプリの場合、外部の不特定アプリ開発をしたものの活用されな

多数の人が接続できるため、セキュ

かった例はいくつもある。共通した原リティー対策は必須になる。私自身、因は、使う側が利点を感じなかった事

最初は Web アプリの脆弱性を知らなだ。上層部の指示で、簡単な Web 営

かったため、何ら対策を行なっていな

業日報や、Web 目標管理表などを作っかったが、Web アプリの脆弱性のセたのだが、あまり活用されなかった。

ミナーや本を読んで以来、可能な限り、業務命令で、営業マンが日報への書機会があれば、シェルスクリプトで業務アプリを組んでみたいと思う。

61ɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔ₻₏₷₏₻ɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔংٛȇȸ̽͂͜଑̩ȹ༎ਬಿȆ͙̥ͭ

ٝ
ల਱

₻₏₷₏₻

ΏͿσΑ·ςίΠఱ‫ܔ‬၌

皆様こんにちは。今月もシェルスクリプト大喜利（略です。そもそも JM にも載っていません。逆にシェ

して sh 大喜利）のコーナーがやってまいりました。

ルスクリプトにとって不可欠な awk や sed 等は秋といえば季語的にも虫の声。時代と共に自然が減っ

OK です。JM にもありますし。でも、よっぽど面てあまり色々な虫の声が聴けなくなったと嘆くことなかれ。今はインターネットで、実に様々な虫の声が聴白ければ、Perl とかもなきにしもあらず ??
ࡼȂġOpen usp Tukubai(iuuq;00vfd/vtq.mbc/dpn0) もける時代でもあります。
「コオロギ 鳴き声」で検索した

使用 OK ！

らコオロギ類の鳴き声をまとめているサイトを見つけれないと採用はキビシいですよ〜。

たんですが、コオロギと名の付く虫の声が 28 種類もあ

ルールもおさらいしたところで、さあ始めましょう !

りました。どれも聞き覚えがあって「アレとかソレも、ུ๔‫ٳ‬ই

みんなコオロギだったのか」と驚かされました。
さて、これまた驚きの連続、シェルスクリプト大喜利。
まずは本コーナーのご説明からいきましょう。

ΏͿσΑ·ςίΠఱ‫ܔ‬၌͉͂ΏͿσΑ·ςίΠఱ‫ܔ‬၌අခ͈σȜσ

但し、使う意義がそれなりに感じらɃల֚࿚ɄĲ ȡ ů Ȫů ͉֨ତ́ঐ೰ȫ ͈ুடତ͈ಎͅంह̳ͥ ȸΑηΑତȹ ͬ஠̀‫ͥ͛ݥ‬ΏͿσΑ·ςίΠͬ੥̞̩̺̯̞̀ȃ

すっかり恒例になったした第一問の整数数列問題。
えぇ〜、今回で 5 回目でございます。
スミス数ってのは、元の数の各桁の数字の和と、素֚Ȃġsh 大喜利はクイズやテストではありませぬ。なの

因数分解してできた数字の各桁の数字の和が同じになで決まった答えというものはないのです。あえてるものを言うんだそうです。例えば、666。各桁の和言うなら面白いスクリプトが正解！

は 6+6+6 で 18。一方素因数分解すると 2*3*3*37 なඵȂġ面白いスクリプトとは、例えばこんなもの。
ͼȂġ人が考えつかない意外性がある

ので、2+3+3+3+7 でやはり 18、というわけです。
さて今回はまず、非常にオシい解答からご紹介。

υȂġ美しい、芸術的、記述がシンプル、高速、などɝ̤̯͈ٜ͂͂ͭ൞

ΧȂġアイデア・こだわりが光る२Ȃġス ク リ プ ト 動 作 環 境 は Linux と し、 基 本 的 に

2!$"0cjo0ti
3!gps!j!jo!%)tfr!2!%2*<!ep
4!!!!!o>%)gbdups!%j!}!tfe!(t0])\1.:^]*0]2!0h(*5!!!!!\!%)qmvt!%|o&;+~*!.fr!%)qmvt!%|o$+;~*!^!''!fd
ip!%j
6!epofLinux JM(iuuq;00mjovykn/tpvsdfgpshf/kq0) に 記

Tukubai には、plus という、与えられた引数の総和載されているコマンド及び機能のみ使用可能としを返すコマンドがあるんですけど、それを使ってくれます。これは多くの人が楽しめるようにするためてます。factor の返す元数と素因数のアラビア数字をなのです。（JM にあるので、C シェル系での解答

1 文字ずつ分割し、元数と素因数の区切りである ":"ΣȂġネタになるバカバカしさ、くだらなさがあるなど。でも最後のは段位強制返還の恐れありよ。:-)

も OK ！

̜͂ ŬŴũȂ ŻŴũ ͜ ŐŌ ̱̱̹͘ͅ）অȂġsh 大喜利はシェルスクリプトを披露する場なので、őŦųŭ ͞ œŶţźȂ őźŵũŰů ͉̈́̓ঀ̻̽͝Θι

MAGA INE 2013
MAGAZIN013
3 autumn
aut mn62 USP MAGAZINEの両端で分けて plus コマンドにそれぞれ流し込んで和が等しいかどうか見てるのです。
いやぁ、plus なんてコマンドがあるのによくぞ気徹底仕事術！
仕事術！
C U I 徹底仕ΏͿσΑ·ςίΠఱ‫ܔ‬၌
が付いてくれた！

エラい、……だけどこの解答、不正解なんだなぁ。ΑηΑତ͉ளତͬ‫̞̈́͛܄‬のだ。理由は素数はそれ以上素因数分解できないから。なので、factor コマンドの後に素数を除外する 1 行が必要なのだ。Tukubai コマンド使ってくれてるのでオマケしたいところではあるけど、残念ながら౲պ̴̈́ͣ。

ɝ෎͝Ȋ̤ಋȊ̯͈ٜͭ൞
2!$"0cjo0ti
3!gps!o!jo!%)tfr!2!%2*<!ep!g>%)gbdups!%o*<!fdip!%|g$+!~!}!ghsfq!(!(!?0efw0ovmm!''!\!%))%)fdip!%g!}!us!;!(]o(!}!tfe!(2t0])\1.:^]*0]2,0h(!}!tfe!(3t0!+])\1.:^]*0.]20h(!}!us!.e!(]o(!}!tfe!(t0,.0.0(***!>!
(1(!^!''!fdip!%o<!epof

投稿者コメント「ワンライナーを目指してみました。

ɝŵůŢŻŶŬŢ ̯͈ٜͭ൞
2!$"0cjo0ti
3!tfr!2!%2!}!ybsht!.o!2!gbdups!}!us!.e!;!}!bxl!(OG?
3|qsjou!%2<qsjou!#Y#-%2<%2>##<qsjou!#Z#!%1~(!}!tf
e!(0_\YZ^0t0])\1.:^]*0]2!0h(!}!bxl!(OS&4>>2|qsjou<ofyu~!|gps)j>3<j=>OG<j,,*|u,>%j~<qsjou!u<u>1~(!}!
bxl!(OS&4>>2|o>%2<ofyu~!OS&4>>3|y>%2<ofyu~!|jg)%2>>y*|qsjou!o~~(

これは素晴らしい !! for、while 等のループ文ナシに見事にワンライナー。しかも他を圧倒して速いです！
コメントによると「元の数値を、各桁に分解されるものとは別にストリーム内に保持することで、シェル変数とループ文から解放されました」とのことです。
いやぁ、それにしてもこれは速い！

最初の factor

for 文は消せませんでしたが」ということです。コー

の実行のところも xargs でやってしまってるし、そう

ドを読んでみると、factor が返す文字列の ":" の前後

やってσȜί໲ͬྫ̩̳̭͂ͭ̈́͜ͅ௸̩͈̥̈́ͥȊȁこれ

で行を分け、数字を 1 桁ずつ分解すると共に、上のは२౲਎ဓ。
それくらいの衝撃はあるね。
これで六段！

行には "+" を付け、下の行には "-" を付け、元に戻し◇て全部足し合わせて 0 になるかどうかを見てますね。

さて、つづいて第二問！

うーん、これは面白いやり方だね。ワンライナーらɃలඵ࿚Ʉ

しいごちゃごちゃ感。そしてちゃんと事前に素数を候଎͈̠̈́͢ Ĵ ࣐ Ĵ Ⴅ

補から除く処理もあるし、申し分ナシだ。よし、֚౲ȪႥ‫͉ۼ‬฼‫ڙ‬ΑβȜΑ਎ဓ。これで二段だ。

ɝŌ ̯͈ٜͭ൞
2!$"0cjo0ti
3!h!)*!|!fdip!%))!%)fdip!%+!}!tfe!.f!(t0])\1.:^]*0]2,0h(!.f!(t0%010(*!**<!~
4!tfr!2!%2!}
5!xijmf!sfbe!j<!ep
6!!!gbdups!%j
7!epof!}8!xijmf!sfbe!k!g<!ep
9!!!j>%|k&;~:!!!jg!\!.o!#%)fdip!%g!}!hsfq!(!(*#!^<!uifo21!!!!!jg!\!%)h!%j*!.fr!%)h!%g*!^<!uifo22!!!!!!!fdip!%j23!!!!!gj
24!!!gj
25!epof

続いては常連の K さん。いつもありがとうござい◇◇問題文がちと長いですが。

⁬⁪⁫
́ߊ୨̞ͣͦ̀ͥȫ ͈Ĵ ͈̾έ͹ͼσ̦̜ͤ

hoge.3hoge.2hoge.1̳͘ȃ Ⴅ༷࢜ͬ Ź ৊Ȃ ࣐༷࢜ͬ ź ৊Ȃ έ͹ͼσ‫༷ͬ࢜ۼ‬Ż ৊̱͂Ȃ ŹĮŻ ໹࿂́ ĺıɋȂ ĲĹıɋȂ ĳĸıɋٝഢ̵̯ͣͦ
ͥΏͿσΑ·ςίΠ̷̸ͬͦͦ੥̞̩̺̯̞̀ȃĺıɋٝഢࢃ͈ ũŰŨŦįĲ ͉ Ĳ ࣐࿒̥ͣਜ਼ͅ ȨŢġłġĲȩȂ ȨťġŅġĵȩȂ ȨŨġňġĸȩ ͂̈́ͦ͊ୃٜ̱̳͂͘ȃ

3D プリンターも珍しくなくなって、時代は 3D ！
UNIX コマンドも 3D 対応しなきゃ、というわけでこのお題です。要素は 33 個だし回転方向は x-z 平面だけ、と限定的なお題にしたんですが、それらを一般化した解答まで届いちゃったりして、恐れ入りました。

ɝŵŰŮŪ ̯͈ٜͭ൞

前者は処理全体を一つのループで囲んでいるけど、こ2!$"0cjo0cbti
3!dpm>(]8!]5!]2!!]9!]6!]3!!!]:!]7!]4(!$!!:1ɋဥ
4!$dpm>(]:!]9!]8!!]7!]6!]5!!!]4!]3!]2(!$!291ɋဥ
5!$dpm>(]4!]7!]:!!]3!]6!]9!!!]2!]5!]8(!$!381ɋဥ
6!qbtuf!.e(!(!iphf/+!}!tfe!(t0])\_!^+]*!+])\_!^+]*!
+])\_!^+]*!+])\_!^+]*!+])\_!^+]*!+])\_!^+]*!+])\_!^+]*!+])\_!^+]*!+])\_!^+]*0(#%dpm#(0(!}!uff!?)
tfe!(t0!!/+00(!?!ofxiphf/2*!}!uff!?)tfe!(t0/+!!])/+]*!!!/+0]20(!?!ofxiphf/3*!}!tfe!(t0/+!!!00(!?!
ofxiphf/4

ちらはループが小分けになっていて効率的に動くのか

なんと AWK 版、sed 版、Tukubai 版の 3 つを送っます。さて、求め方は factor の返す文字列を ":" で分
けて、両側の数字の総和が等しいかどうか見るというのはやはり同様ですね。ただし、総和を求めるのがシェル関数になっているのが特徴的。
これは、熱ゃ ! お茶 ! さんの解答と比較して速かった。

な？

いいねぇ、֚౲਎ဓ。これで八段だ。

そして最後に今回の最優秀解答。

て く れ ま し た。 ど れ も 3 フ ァ イ ル を 横 (y 方 向 ) に連結したうえで列を入れ替えるということをやっ63
6
3

ているわけですが、列を入れ替える操作は AWK やɝńķŉĹŐĸ Ȫ·΀ϋȫ ̯͈ٜͭ൞

Tukubai(self コマンド ) だと何の面白味も無くあっさ

2!$"0cjo0ti
3!g>%|2&/+~4!o>%)mt!%g/+!}!xd!.m!}!us!.De!1.:*5!gjmft>%)zft!%g/!}!ifbe!.o!%o!}!bxl!(CFHJO|PST>#!
#~|qsjou!%1!OS~(*
6!dbtf!%3!jo
7!!!:1*!!b>.2<!c>.%o<!d>%))o+o,2**!<<
8!!!291*!b>%o<!c>.2!<!d>1!!!!!!!!!!<<
9!!!381*!b>2!<!c>%o!<!d>1!!!!!!!!!!<<:!!!+*!!!fyju!2!!!!!!!!!!!!!!!!!!!!<<
21!ftbd
22!gjfmet>%)bxl!.w!o>%o!.w!b>%b!.w!c>%c!.w!d>%d!(23!!!!!!!!!!CFHJO|
24!!!!!!!!!!!!!!gps!)y>o<!y?1<!y..*!|
25!!!!!!!!!!!!!!!!!!gps!)z>1<!z=o<!z,,*!|
26!!!!!!!!!!!!!!!!!!!!!!qsjoug)#%&e-#-!b+y,c+z,d*<
27!!!!!!!!!!!!!!!!!!~
28!!!!!!!!!!!!!!~
29!!!!!!!!!!~(*
2:!qbtuf!%gjmft!}!bxl!(|qsjou!(%|gjfmet&-~(~(!?!%g/1
31!gps!gjmf!jo!%gjmft<!ep
32!!!!!gjfmet>%)bxl!.w!y>%|gjmf$$+/~!.w!o>%o!(33!!!!!!!!!!!!!!CFHJO|
34!!!!!!!!!!!!!!!!!!gps!)z>2<!z=>o<!z,,*!|
35!!!!!!!!!!!!!!!!!!!!!!qsjoug)#%&e-#-!o+)y.2*,z*<36!!!!!!!!!!!!!!!!!!~
37!!!!!!!!!!!!!!~(*
38!!!!!bxl!(|qsjou!(%|gjfmet&-~(~(!%g/1!?!%gjmf
39!epof
3:!sn!%g/1

りできてしまうのであえて sed 版を採用しました。実
行するとカレントディレクトリーにある hoge.{1,2,3}を元に newhoge.{1,2,3} に回転後の値を書きだします。
うーん、アタクシの気まぐれなのかもしれないけど、列の並べ替え後、新しい 3 つのファイルになる区切り位置に 2 連続 ,3 連続の半角スペースを入れてるあたり、この sed 版はいいね。AWK のように列番号をダイレクトに指定できない sed でも、これでウマいこと左、中、右で三分割してる。よし、੝౲਎ဓ。

ɝŌ ̯͈ٜͭ൞
2!$"0cjo0ti
3!gps!{!jo!2!3!4<!ep
4!!!bxl!(|gps)y>2<!y=>4<!y,,*!qsjou!y-!OS-!(%{(-!%y~(!
%2/%{
5!epof!}6!dbtf!%4!jo
7!!#y{:1#!}#{y381#*!tpsu!.l!2o-2!!.l!3o-3!!.l!4os-4!<<
8!!#y{291#}#{y291#*!tpsu!.l!4os-4!.l!3o-3!!.l!2os-2!<<
9!!#y{381#}#{y:1#!*!tpsu!.l!2os-2!.l!3o-3!!.l!4o-4!!<<:!!#z{:1#!}#{z381#*!tpsu!.l!3o-3!!.l!4os-4!.l!2o-2!!<<21!!#z{291#}#{z291#*!tpsu!.l!4os-4!.l!3os-3!.l!2o-2!!<<22!!#z{381#}#{z:1#!*!tpsu!.l!3os-3!.l!4o-4!!.l!2o-2!!<<
23!!#yz:1#!}#zy381#*!tpsu!.l!4o-4!!.l!2o-2!!.l!3os-3!<<
24!!#yz291#}#zy291#*!tpsu!.l!4o-4!!.l!3os-3!.l!2os-2!<<
25!!#yz381#}#zy:1#!*!tpsu!.l!4o-4!!.l!2os-2!.l!3o-3!!<<26!ftbd!}
27!bxl!(CFHJO|y>2<!z>2<!{>2<!pvu>#(%3(/#{~
28!!!!!!|jg!)y!">!4*!|29!!!!!!!!!qsjoug)#&t!#-!%5*!?!pvu
2:!!!!!!!!!y,,31!!!!!!!~!fmtf!|
32!!!!!!!!!qsjoug)#&t]o#-!%5*!?!pvu
33!!!!!!!!!y>2
34!!!!!!!!!jg!)z!">!4*!|35!!!!!!!!!!!z,,36!!!!!!!!!~!fmtf!|
37!!!!!!!!!!!z>2
38!!!!!!!!!!!{,,
39!!!!!!!!!!!pvu>#(%3(/#{
3:!!!!!!!!!~
41!!!!!!!~
42!!!!!!~(

来ました、一般化。これは回転軸を一般化してくれ

こちらは K さんが難しいと言っていた X,Y,Z のサイズを一般化してます。ただし、回転方向は固定なようで、第二引数で "90","180","270" を指定するみたいです。また、こちらは第一引数で指定したファイルに上書きするので 90 で 4 回実行すれば元に戻ります。
これまたいいねぇ！どうやってサイズを一般化してるのかと思えば、AWK で AWK のソースコードを作ってるのか。よし、֚౲਎ဓ！

これで三段だ。

この 2 人が協力したら完全な一般化バージョンも完成するかもしれないな。いずれにせよ、これで UNIX
コマンドの 3D 化も安泰だ。
（ホント？）◇◇◇

さて最後、変り種の三問目ですよ。

てます。引数 1,3 で入出力ファイル名 ( 拡張子無 ) を、

Ƀల२࿚Ʉ

引数 2 で回転方向と量を指定するようです。コメンųŦŷ ΋ζϋΡ̽̀౶̳̥̽̀͘ȉ‫͈࣐ڎ‬໲লպ౾ͬऒֲ‫ͅݙ‬

トによれば、更に X,Y,Z のサイズも一般化したかった̳͈̳̫ͥ̈́ͭ́̓͜ȤȤȃ ̭͈ͦঀ̞ൽͬ‫̢̞̯̺̩̀ޗ‬ȃ

そうですが、さすがにそれは難しかったそうです。

これ、皆さん使ったことありますか？

いやぁ、なかなかやるね！ 回転を実現するやり方
3

アタクシ、

何に使ったらよいのかさっぱりわからなかったのでおも、3 個の要素を全て縦に並べ、回転の都合に合わせ題にしてみたのですが、お蔭様で色々来ました。

֚౲਎ဓ。
てソートしてて面白い。
よし、
おっと九段だ！

ɝͼΗυȜ̯͈ٜͭ൞

そして、一般化した解答がもう一つ来ました。

MAGA INE 2013
MAGAZIN013
3 autumn
aut mn64 USP MAGAZINE

2!tm!}!sfw

徹底仕事術！
仕事術！
C U I 徹底仕ΏͿσΑ·ςίΠఱ‫ܔ‬၌
コメント「rev を使えば忌々しい汽車を破壊できます」……って、おいおい！

とうございました。

ْ̭̻͈̽࿂́͘෫ٟ̯ͦ

ൎࣂఱ༡ਬ̲̞̥ͥ̈́͝ȊȊȁそれだったら、"sl | head -c 1" とかで瞬殺する方がいいような……。いや〜けしからんなー。
これは久しぶりに֚౲‫ޑ‬ଷ༐‫ۺ‬だ！

はい、初段ね。

ɝŵŰŮŪ ̯͈ٜͭ൞

ষ͈̤ٝఴ֚Ȃġ1 〜 n（n は引数で指定）の自然数の中に存在する

2!$"0cjo0cbti
3!fyqboe!%2!}!zdbu!.1!.!=)tfe!(t0/+00h(!%2*!}!sfw「ズッカーマン数」を列挙するシェルスクリプトを書いてください。

こちらは、引数で与えられたファイルの文字の並びඵȂġ今 回の rev コマンドの解答を見ていて、このコマを左右入れ替えるものだそうです。単なる rev と違っ

ンドはテキストファイルの全行を右揃えするのにて、全行がちゃんと右揃えになります。ちなみに第二応用できることを気付かされました。そこで問題。

問の Tukubai 版の応用でできてしまったそうです。

与えられたテキストファイルをセンタリングするなるほど Tukubai の ycat を使うとこんなに簡単にできてしまうのか。ファイルの文字位置が反転して気持ちーなー。しかも、この後更に rev に通せば元のテキストを右揃えしたことになるじゃないか！

よし、֚౲਎ဓ。これで二段だ。

シェルスクリプトを書いてください。
センタリング（中央寄せ）とは、
こうやって各行内の中央に文字列を寄せる編集操作ですよ२Ȃġこ のシェルスクリプト大喜利で過去に、head にɝ̧̯͈ٜ͂ͭ͠൞

ムチャクチャ巨大な数の行数指定を与えたり、あ2!fdip!#५ུ५#!}!bxl!(|qsjou<qsjou~(!}!tfe!(3t0])/+]*0fdip!#]2#!}!sfw0f(!}!vojr!}!xd!.m!}!bxl!(%2?2|qsjoug!#opo.#~|qsjou!#qbmjoespnf#~(

るいは mkdir でムチャクチャ深いディレクトリを

これは回文 (palindrome) か否かを判定するワンラ

そこで、そんなふうにして何かムチャクチャ巨大

イナーだそうです。但し sed は GNU 版専用とのこと。

な事やらせるシェルスクリプトと、結果何が起こ

はい、回文判定への応用は、アタクシも来ると思っるかを教えてください。（バージョン番号や、GNUてたんだよね。AWK の対応次第だけどマルチバイト

版か BSD 版か等、再現に必要な環境も教えてくだにも対応してるし、いいね。֚౲਎ဓ。これで三段だ。

さい）でも、౿ྵഎ̈́అ‫ͬٺ‬ဓ̢ٜͥ൞͉Θι͢Ȋɝ‫׺‬ඵ࣢̯͈ٜͭ൞

掘るなどした珍解答がありました。

ൎࣂ͈̱̥̹

2!dbu!==MJTU!}!sfw!}!tpsu!.l!3-3!}!sfw
3!uisff-4!Uijt`jt`uif`uijse/
4!pof-2!!!Uijt`jt`uif`gjstu/
5!uxp-3!!!Uijt`jt`uif`tfdpoe/
6!MJTU

お題への解答は、お名前（ペンネーム）、解答したいお題番号、解答スクリプト、簡単な補足の四点セット
で下記の宛先へ。一人何問でも何個でも解答可！ 尚、

コメント「列の文字列を右から左にソートしたい場

次回締め切りは ĲĲ ࠮ ĳĶ ඾ Ȫ࠮ȫ ࡿஜ ı শとします。

合に rev は重宝しますよ。わりと有名では？」という

しかもその間は何度でも解答の修正を受け付けます。

ことで、恥ずかしながら「なるほど！」と思いました。
この解答は今回一番実用的なものかのしれないな。

̤ఴ̱̱̓̓͜௣̩̺̯̽̀Ȝ̞

もしかしたら rev コマンドの作者もこういう用途を想お 題 の 投 稿 も 大 募 集。 こ っ ち は 締 め 切 り な し で定してたのかもしれない。まぁ、この解答の例文からずーっと募集中。そして、考えてくれた方にも段位をいくと数字が複数桁になったらダメになっちゃうけど授与します。自分で出題して解答するのも、OK ！

ね。でも教えてくれてありがとう、֚౲਎ဓ。これで
四段。
◇

◇

◇

といったろころで本日の大喜利はこれにてお開き！
読者の皆さん、投稿してくれた皆さん、今回もありがൎࣂ୶
どちらも投稿先は、白ければ（ワリと）何でもあり！

です。面じゃんじゃん投稿

待ってます !

65
6
5

TechLIONUSP 友の会

技術の草原で百獣の王を目指す
シェルスクリプトを極める勉強会コミュニティ（会員数：約 480 名）

http://www.usptomo.com/

エンジニアたちの新感覚トークライブ！

http://techlion.jp/

USP MAGAZINE バックナンバー 好評発売中 !
vol.0 2011 spring~vol.5 2012 summer

vol.6 2012 autumn vol.7 2013 wintervol.8 2013 spring

vol.9 2013 summer

なさい
在庫終了
です。

USP MAGAZINE は、世界初のシェルスクリプト技術情報誌。でもご存知のとおり、シェルスクリプトはグルー言語。
OS 深層から様々な言語・アプリの話まで、さらには技術の先にいるエンジニア達にもスポットを当てます。
目指すは、シェルスクリプト力とエンジニア達の地位向上！

定期購読又はバックナンバーをお申込みいただくと、PDF 版が無料で手に入ります。
ご購入、お申込みはこちらから⇒

USP 出版

定価 500 円（本体価格 476 円）

ごめん

自炊不要

発行人 當仲寛哲
発行・発売 有限会社ユニバーサル・シェル・プログラミング研究所〒105-0003 東京都港区西新橋 3-4-2 SS ビル 3 階 電話 03-3432-1174 発行日 2013 年 9 月 20 日

www.doorkeeper.jp

USP MAGAZINE 2013 autumn Vol.10

Doorkeeper は、 イベントを通じてコミュニティを運営するイベント主催者のためのプラットフォームです。
イベントのお申込みやイベント参加者の管理など、 運営に関する様々なことをサポートしています。