Universal Shell Programming as a glue language and technology
ISSN 2187-9664

USP
MAGAZINE

VoYl.e1n
400

for the sophisticated shell scripters
第１特集
シェルスクリプト部長の
第２特集

並列処理

震災と開発者たち
シェルスクリプト大喜利
潜入！Linux Con Japan 2011

TechLION誌上中継

びぎねっと宮原徹が語る

オープンソースの未来はどっちだ！
？
1

USP MAGAZINE vol.0
Artwork created by Koji Ishizuka. © 2011 Zie's Bank .Co,. LTD All rights reserved.

From Editor
震災から 3 ヶ月が経過し、世の中は徐々に平静を取り戻そうとしています。
だけど、何かがちょっと以前とは違うと思いませんか？
明日には何が起こるのかわからない、という現実を目の当たりにして、「生きる上で本当に大切なものは何なのか？」という疑問を日本人全員が突きつけられたからなのではないかと思います。
それは一瞬の興味を引くような、真新しいものや斬新な物や、飾り立てられた何かやエンタテインメントではなくて、生活の土台である、寝るところや食べるもの、着る物、そして家族や仲間という、必要最低限のもの。
重厚長大な構造よりも、できるだけ簡素な構造へ。
それぞれの人が、世の中のシステムを知り、自分たちの足でたくましく歩ける世の中へ。
何かが変わる時代が来たことをそこここに感じずにはいられません。
そんなときにひょっこりこの世の中へ登場した USP MAGAZINE。
まだまだひよっこではございますが、技術に人生をかけたエンジニアの皆さんを、
シェルスクリプトという簡素な技術でつなぎ、奥深い技術の世界へと誘う骨太な雑誌を目指したい！！と心の奥から思う次第です。
どうぞ今後ともごひいきに。

USP MAGAZINE 編集部

Contents USP MAGAZINE 2011 summer
シェルスクリプト部長の並列処理…………………… 3
From My Tool Box… …………………………………… 震災と開発者たち……………………………………… cat コマンドを読み解こう！… ………………………… 潜入！ LINUX CON JAPAN 2011………………………… 原色 Linux 美女図鑑……………………………………… 今私たちは何を学ぶべきか 第 1 回… ……………… シェルスクリプト大喜利…………………………… 10
オープンソースの未来はどっちだ？………………… ベンチャー起業家のアドベンチャー日誌…………… 次号予告………………………………………………… ※ 薄字で記載している記事は、よりぬき版には収録されておりません。

2

USP MAGAZINE vol.1

広告募集中

USP MAGAZINE は USP 友の会会員の定期購読、IT 系イベント・勉強会での販売を予定しております。
お問合せ先

mag@usptomonokai.jp

シェルスクリプト部長の並列処理

特集１
ス ー パ ーマン でア イ デ ア マ ン

シェルスクリプト部長の

並列処理
執筆
技術協力

リッチ ・ ミカン （松浦リッチ研究所）
上田隆一 （ユニバーサル ・ シェル ・ プログラミング研究所）

CPU はマルチコア化が進み、コンピューターはクラウド化が進み、使えるリソースが多数化・点在化する時代になった。これは、並列処理や分散処理に対応できなければ今後主流の座にはとどまれなくなるであろうことを示唆している。
我らがシェルスクリプトはどうなのだろうか？そこで今回、次回の２回に渡り、シェルスクリプトによる並列処理と分散処理の導入方
法を紹介する。
記事を読めば、並列・分散処理にさして特殊な道具は要らないことがわかるだろう。多数をケアする能力と、少々の知恵が出せればそれでいい。そんな姿はまるで、部下を束ねる部長のようだ。

3

ス ーパ ーマンでアイデアマン

面倒見のよい、 頼りがいのあるボス「私は Perl が大好きだー !」……と、こともあろうにシェ

困っている部下には、 とことん付き合う。
部長、仕分けが
終わりません ……
。

ルスクリプトの雑誌を飾る特集記事の冒頭で、私は何を叫んでいるんだろう。でもそれは、Perl 作者のラリー・ウォー
ルさんが、日本アニメのファンということで親近感を覚え＊1たからだ。 ……いや、それではなくて（それも捨てがたい
理由ではあるが）、もちろんまじめな理由がちゃんとある。
それは Perl が、何でもできて面倒見のよい、頼りがいのあるボスのような言語に感じられるからだ。
例えば、仕事で納期があって、今はその約束の 3 時間前

よ し よ し、 手伝って やるか ら
心配するな。

だとしよう。納品物のディレクトリには必要なデータの他に、何故か関係無いゴミファイルが 5000 個……。急いでれる。「変数定義やコメント、綺麗な記述、そんなの書いてる暇など無いし、可読性とかどーでもいいから、とにかくてくれる。それでいて Perl は、本格的なプログラム作りに

部長、
大変です！
！
議事録です。

承認下さい!
ヨロシク！

動いて」という想いで作る書き捨てプログラムを受け入れ

勿論、 全員の面倒を見るのも忘れない。
何頼むんだっけ？

仕分けなければならない。でもそんな時、Perl は助けてくも付き合ってくれる。CPAN という豊富なライブラリーを持ち、オブジェクト指向プログラミングもしたければでき
るし、Ruby on Rails に代表されるような MVC スタイルの開発もサポートしているし……。実に頼もしい。Perl のこ
うした、何でもできて面倒見のよい様は、まるで頼りがい教えて下さい。
よ し よ し、 わか ったか ら
一人ずつ順番に な。

君達ちょっと落ち着きなさいよのあるボスだ。
さて、シェルスクリプトはどうか？こちらも書き捨てプ
ログラムを動かしてくれるのは言うまでも無い。では一方、それが、 頼りがいのあるボス。

本格プログラムは作れるのか……。本誌 0 号の特集 1 で、シェルスクリプトを擬人化してしまったが、それは並列

シェルスクリプトを用いて本格的データベースを構築する

処理の頭をとっている様子が、じつに人間っぽいからだ。

話を書いたが、そこまででもかなり頼りがいあるボスに見人間が部下を使って事を成し遂げるのと同じドラマがそこえてくる。しかし今回さらに、もう一つその話題を提供しにある。実際にシェルスクリプトを書くのはプログラマー

たい。それが今回のテーマ、シェルスクリプト部長の並列であるから、つまりあなたが、このシェルスクリプト部長

処理なのである。

になって処理という名のプロジェクトを成功に導くのだ！

1 億行もの、 途方も無いデータが立ちはだかった「いち ! じゅう ! ひゃく ! せん ! まん !……いちおく !」残＊21534 高知県 -9,987,759 2001 年 1 月 5 日

念ながら「なんでも鑑定団」ではない。 この記事で、処理

3772 鹿児島県 5,689,492 1992 年 5 月 6 日を挑もうとしているデータ（TESTDATA）の行数（レコー8238 大分県 1,099,824 2010 年 2 月 22 日ド数）を数えた時に私が発したセリフだ。

1292 秋田県 -4,497,866 1991 年 2 月 23 日

1 億行とはなんとも暴力的な行数だ。しかしこのような

9812 新潟県 5,721,468 2001 年 2 月 28 日

データを実験材料としては用意したのは、並列処理の議論:をするためだ。単独で処理するには途方の無さを感じてしまうくらいに膨大である方がいい。ちなみに中身はこんなかんじだ。
4

USP MAGAZINE vol.1*1 ウォールさんの好きな作品は「少女革命ウテナ」らしい。そして、じつは私も大のアニメ好きで……。化物語とかいいよねー、
登場人物の中に MSX ユーザーがいるとかマニアックすぎだー。
*2 1 億円もの鑑定結果が付くシーンがあったら見てみたいが。

特集１―シェルスクリプト部長の並列処理

成るが、こういうフォーマットであることにあまり深い意
味はないので気にしないでほしい。
さて、このデータのうち、4 列目の “yyyy 年 mm 月 dd 日 ”という形式を分解して yyyy の列、mm の列、dd の列に独立させてくれと言われたとしよう。答えは簡単だ。
awk '{gsub（/ 年 | 月 | 日 /," ",$4）;print}' TESTDATAとでも打てばいい。あとは終わるのを待つだけだ。
ところが、1 分、2 分、3 分、ある程度予想はしていたが

図１.
今回使用するコンピューターの お 姿。 主 な ス ペ ッ ク は、CPU が Xeon 3.2GHz, 4 コ ア
× 2 基、 メ モ リ が 48GB…、と相当に贅沢 !!
▲番号、都道府県名、金額、年月日と 4 つのレコードから

図２. ▼その贅沢なコンピューターで1 億行のデータを普通に処理してる様子。うーん……

やっぱりまだ終わらない。いくら 1 億行とはいえ、4 コアの Xeon を 2 基（つまり見かけ上 8 プロセッサ）積んだわ＊3

りと贅沢なコンピューター（→図１） を使っているのに……。「ちゃんと働いてるのか？」と気になり、もう 1 つのコンソール画面で top コマンドを使って CPU 稼働率を見てみたら、案の定、図２のような状態になっていた。
せっかく 8 プロセッサも積んでいながら 1 つだけが頑張っていて、残りの 7 つは休んでいる……。これでは時間の無駄だし、他にもいろいろな意味でコストの無駄だ。なんとかせねば。

ポイントは、 人間のグループ作業だったらどうするか
さあ、ボスの出番である。シェルスクリプト部長になるのだ。ターゲットとなるコンピューターが 8 プロセッサ相

翻訳すればよい。そのようにして作ってみたのが “paraawk”
だ。

当なのだから、部下は部長自身を含めて 8 人ということに早速リストを紹介したい。………………したかったのだなる。プランを練りやすくするために、ひとまず似たようが、このプログラムを管理している方から「だ～め (^^) ( ラな例をモデルにして考えてみよう。

イセンスの都合で )」とやんわり断られてしまった！どうし今、目の前に処理しなきゃならない 800 ページからなる
一冊のバインダーがあった時、人間ならどうするか。

ても「だ～め (^^)」という……。
「リストが載ってないんじゃ
拍子抜けだよなー」と思ってしまうかもしれないが、まぁ

普通なら 1 人 100 ページずつ分け与えて処理させ、あとそう言わずに続きを読んでもらいたい。リストがダメでも、から回収して再び一冊にまとめようと考えるだろう。だか「リストを載せずに考え方を載せるのなら構わないよ」とのら、その考え方に基づいて本題をシェルスクリプト向けに*3 ちなみにメモリは 48GB。ちょっと贅沢すぎるか。

解説 名前付きパイプとは
名前つきパイプの生成には mknod コマンドを使えばいいと本文中で述べた。しかし、そもそもその「名前付きパイプ」というものをご存知だろうか。実は、並列処理をさせるためには知っておくべき仕組みなのでおさらいしておく。
名前付きパイプを解りやすく例えると、テンポラリーファイルだ。データを渡したい側のプログラムがファイルリ
ダイレクト等でこれに書き込み、受け取りたい側のプログラムが同様にこれから読み取る。ただし、渡す側、受け取る側のプログラムが、同時に読み書きしなければならないようになっている。送り側が先に一行分を送ろうとすれば、受け側がその一行を読みに来るまで待たされる。逆に、受け側が先に一行分読みに行こうとすれば、送り側が一行分書き終えるまで待たされる。
こうすることでデータを確実に受け渡せるようになっている。
普通のファイルが「置き手紙」なら、名前付きパイプは「手渡し」だ。
見た目はどちらもファイルだが、扱い方は正反対なのが面白い。

見た目は同じ、扱いは逆、「ファイルとパイプ」
普通のファイル

名前付きパイプ

見え方

1 つのファイル

1 つのファイル

扱い方

同時読み書き禁止 同時読み書き必須

感覚

置き手紙

手渡し
5

ス ーパ ーマンでアイデアマンことだったので、是非そうさせてもらおうと思った。実は、現するには、次のように書けばよい。

paraawk の内容など十数行で書けてしまうのだ。考え方さ

awk '{print $0 >>"/path/to/pipe."(NR-1)%8}' /dev/s

え聞けば、恐らく多くの人は書けるだろう。簡単なのだ。

tdin &

例えリストが載せられなくても、考え方を伝えるだけでも同様にして 4) についてもやっぱり書けるのだが、こちらは価値があると私は考えた。

もう少し長めなので割愛させていただく。

＊４

では、その「考え方」を説明しよう。( ずいぶん具体的

シェルスクリプト等で書けることは書けるのだが、今回な考え方に見えますが「考え方」ですからねー )の paraawk では、C 言語で書き直して一つのコマンドとし

1) 名前つきパイプを作る。

て独立させたものを使っている。図３を見るとわかるので

A ライン ( 配下で働く awk に加工前データを渡す用 )先に述べておくが 2) を C で書き直したものが “distribute”、

B ライン ( 働いた awk からの加工後データ受取り用 )4) を書き直したものが “interlace” である。

の 2 系統で、並列実行させたい awk の数の倍必要。

なぜそんなことをしてしまったのか？実は 2) と 4) とい

2) 標準出力から流れてきたデータを、A ラインのパイプ

うこの 2 つの箇所は、配下で働く awk の 8 倍のデータ転送

群に、一行ずつ順番に流す。

速度が要求されるために、高速動作させる必要があったの

3) awk をバックグラウンド (“&”) で、並列化したい数だだ。分け与えたり回収したりするという役を担うチームのけ生成する。

ボスは、部下とは違ってスーパーに仕事のできる人物でな

awk への入力はさっきの A ラインからければならないということである。こういうところまで人

awk から出力はさっきの B ラインへ

間もプログラムも共通しているのは、ある意味興味深い。

4) B ラインのパイプ群から流れてくるデータを一行ずつ

チームプレイの威力

重畳し、標準出力に流す。
とこれだけだ。1) の名前つきパイプなど mknod コマンドで作ればいいので簡単だ。もし名前つきパイプについてよ

さて、この awk を 8 つに並列処理したスクリプトは処理

くわからないということであれば前ページの解説を読んでをどれほど高速化するのだろうか。年月日を独立させるともらいたい。3) のバックグラウンド実行とてシェルスクリ

いう前述の処理を、Linux（CentOS 5.6）をインストールしプトに入門したての方でもなければわかると思う。問題は 2)*4 こちらは公開しちゃだめというわけではいのだが……。その代わり、本誌後半の「シェルスクリプト大喜利」のお題にしてみてはという意見が出たのでそのようにさせていただいた。そちらの記事もよろしく！

と 4) だが、これはこの後で解説する。

ボスはまず、
スーパーマンでなければならない
さて、説明が後回しになった先程の「考え方」の 2) と 4)である。もう少し詳しく述べると、まず 2) は標準入力を複数のファイル（今回の場合は 8 つのパイプ）に 1 行ずつ順
番に分け与えるコマンドである。ポーカー（カードゲーム）に例えれば、トランプを参加者に 1 枚ずつ順番に配るディー
ラーみたいなものだ。そして 4) はその逆で、複数のファイ
ルから 1 行ずつ読み取って、標準出力に流す作業である。
もちろんどちらもシェルスクリプトやその周辺のコマン
ド (awk や sed 等 ) でできる作業だ。例えば 2) の作業を実図３．“paraawk” で 1 億行のデータを処理しているところ。

表１．単独 awk と paraawk の処理速度と paraawk の実質的な速度向上

処理行数

1億

1000 万

100 万

10 万

1万

1000

単独の awk

256.753 秒

25.630 秒

2.578 秒0.257 秒0.027 秒

0.004 秒paraawk

41.429 秒

4.161 秒

0.436 秒0.060 秒0.020 秒0.015 秒

速度向上

6.2 倍

6.2 倍

5.9 倍

4.3 倍

1.4 倍

0.3 倍

※ awk, paraawk の両コマンドが、結果を /dev/null に送り終えるまでの秒数を time コマンドで 5 回計って平均したもの。行数の調整には head コマンドを使用。

6

USP MAGAZINE vol.1

特集１―シェルスクリプト部長の並列処理
た先の 8 プロセッサ相当コンピューターで試してみた。所較したものだ。尚、処理結果を /dev/null に捨てさせて表要時間は相対的な意味しか持たないのでそれ以外のスペッ示にかかる時間の影響を受けないようにしていることを補クの説明は割愛させていただく。

足しておく。

図３は、このようにして作った paraawk を動作させて肝心の結果はというと、当初の目的である 1 億行のテスいる時に top コマンドで見たコンピューターの稼働状況

トデータに対して、じつに 6.2 倍もの速度向上を達成した。

だ。最初に awk を動かした時の図２と比べれば違いは一

ただ興味深いことに、処理させる行数を 10 万行くらい目瞭然だろう。8 つの CPU が全て働いている。画面下半分まで減らすと徐々に効果が縮まり始め、1000 行では単独のにあるプロセスを見ると 8 つの awk、それに distribute とawk が逆転した。つまり少々のデータならチームを組まず

interlace が居るのがわかる。

に一人で片付ける方が早いというこで、これもやはり人間

表１は、単独の awk と paraawk の所要時間を図って比の世界と同じだ。

ソートはどうする。 みんなで分担できるのか !?
シェルスクリプト（と少々のスーパーな C プログラム）

枚のカードがある。これをシャッフルし、ボスと部下で半で awk の並列化ができた。awk の部分を他のコマンドに差分ずつ分ける。奇数枚なのでどちらかが一枚多くなるがそし替えれば、どれも同じ要領で並列化できる。……と思っこは大した問題ではない。これで準備完了。そうしたら次

たら、一つその方法では通用しないコマンドがあった ! sortの 2 ステップの作業をする（→図４）。

コマンドだ。なぜならソート（並べ替え）という作業は全

1) ボスと部下それぞれが手持ちのカード 6 枚（または 7てのデータを見てこそできる作業だ。複数人で手分けする枚）を小さい順に並べ替え、終わったら机の上に置く。
（そうするとカードの山が 2 つできる）

ことなんてできないんじゃないだろうか。
その疑問は当たっている。だが、半分だけだ。実は部分

2) ボスはその後、2 つのカードの山の一番上のどちらかか的に手分けできるのだ。さあ一体どうやって手分けするのら 1 枚カードを取り、手元に並べる。この時、小さいか？そのアイデアを捻り出すのも人より優れた人物たるボ

数字のカードが置いてある方を選ぶようにする。これスの仕事だ。

を山が無くなるまで繰り返せば、カードが小さい順に並ぶことになる。

ボスはアイデアマンでもなければならない原理＊５は理解できただろうか。こうすれば、全部ではな

いにしろ前半の作業を 2 人で分担することができる。前半

アイデアマンと呼ばれるようなボスなら、まずソートとは純粋なソート作業、後半は選択的なマージ作業と言えるいう作業を 2 ステップに分解できることに気付くはずだ。

わけで、このような分解を行うことで複数人を作業に参加

ここで、いかに分解するかという話をトランプを使って説明しよう。作業するのは「ボス」と「部下」の 2 人だったとする。そして今、目の前にハートの A から K まで 13させられるようになる。
*5 このようにソートを分解し、マージ作業化していく手法のソートは、
実は「マージソート」と呼ばれている。

▲

２・４・７・８・▲
10
次は、右の山２）(1 人作業 ) 山を左右に置き、小さい方から取って並べる。

図４．１つのソートは、小規模なソート作業とマージ作業に分解できる。

・Ｑ

Ａ・３・５・６・９・Ｊ・Ｋ

１）半分に分けて、2 人それぞれソート。

マージ完了

01234567
4567

0123
01

23

45

67

0 1 2 3 4 5 6 7
図５．マージ作業のトーナメント化
7

ス ーパ ーマンでアイデアマン――

ボスは応用力も持っていなければならない

その２

――

2 つ目は、マージ作業をどうやるかだ。ソートという作
業は sort コマンドを使えばいいとして、図 4 でも説明した

もともとの話は 8 プロセッサー相当のコンピューターでマージ作業はどうやるのか？

並列化するという話なのでもう一捻りアイデアが必要だ。

でも実は簡単だ。sort コマンドに “-m” オプションを付

前述のトランプの例では 2 人だったが、本題である 8 人

ければよいだけなのだ。これまで “sort -k 1,1” などとして 1で分担するにはどうすればよいか、応用して考えてみても列目をソートしていたのであれば “sort -m -k 1,1” と書くだらいたい。「トランプを 8 人に配って 8 人にソートさせ、

けで、マージモードになる。もちろん “-m” オプション付き

最後に 1 人が 8 つの山からマージを行えばいい」うーんオの sort コマンドに食わせるデータはそれぞれ通常のソート

シい。前半はいいが、後半のマージ作業を 1 人でしかできをしておかなければならない。これは図４を理解していたないのが勿体無い。こうしたマージ作業の負荷の偏りを減だけているなら納得できるところなはずだ。
ところでこの “-m” オプションがちゃんと用意されているとらすいいアイデアはないだろうか……。
＊６

それはマージ作業のトーナメント化である（→図５）。

ころをみると、
sort コマンド設計者もアイデアマンなのだろう。

――

先程説明したように、ソート作業は、ソート作業とマージ

その３

――

作業に分解することができる。だから分解してできたソー

3 つ目は、「待ち」である。トーナメントというのは上位

ト作業をまた分解するのだ。こうすると全体としてマージの試合に進むためには下位の試合に決着がついてなければ作業の割合が増えるので、一見不利になるように思えるがならない。ところが並列処理を行うため、各 sort コマンド

そうではない。2 度目の分解で生じたマージ作業は合計 2

は “&” をつけてバックグランド動作させる必要がある。す人でできる。しかも 1 度目の分解で生じたマージ作業では、ると、下位試合の決着がつく前に上位試合用の sort コマン

選択元として見なければならないトランプの山が半分になドにたどり着いてしまう。これはマズい！そこで必要なのるので 1 人でやるにしても負担は減ることになるからだ。

が「待ち」というわけだ。ではどうやって待たせるのか？

結局、8 人でソートを分担するためのシナリオはこうだ。

それには wait コマンドを使えばいい。wait コマンドは

1) 8 等分したデータを 8 人それぞれがソートする。する

対象となるプログラムが終了するまで待つコマンドであると 8 つの小さなソート済データができる。
2) 4 人が 1 人 2 つのデータを集め、各自マージを行う（マージ準々決勝）。するとソート済データが 4 つになる。
3) 2 人が 1 人 2 つのデータを集め、各自マージを行う（マージ準決勝）。ソート済データが 2 つになる。
4) 最後に 1 人が 2 つのデータを集め、最後のマージを行う（マージ決勝）。データは 1 つになり、作業が完了する。

が、これを使うには目的の sort コマンドのプロセス ID を知る必要がある。しかしそれを知るのも難しくない。ps コ
マンド，grep コマンド，awk コマンドのあわせ技で
ps axww | grep sort | grep -v grep | grep 下位試合が処理しているはずのファイル名| awk '{print $1}'などと打てば一発でわかる。

――

部長のソースは 100 行足らず――

これらのことさえ頭に入れておけば parasort 相当を自力部長の出したプラン “parasort”

で書くにしても 100 行も無しに書けてしまう。部長の考え方を盗み、あなたも頼れる部長になってみないか！

このアイデアをシェルスクリプトに翻訳することでできたものが “parasort” というスクリプトだ。既に述べたようにプランの実力＊７

リストは公開できないので、 考え方のみ記す。といっても重要なアルゴリズムのほとんどは解説してしまったので補足
だけ……。

さて、部長が出したこのプランはどれほどの実力を発揮するのだろうか。早速実験してみた。

補足は 3 つある。

――

扱うデータは前と同じで、動作させる環境も、結果を

その１

――

まずはソート予選を開催するにあたっての各ソート/dev/null に送り終えるまでの時間を計るというところも全
く一緒である。今回は 1 列目をソートしてみた。

へ の デ ー タ の 配 布 だ。 し か し こ れ は paraawk と 同 様 にdistribute コマンドを使えば問題ないことがわかるであろう。
8

USP MAGAZINE vol.1*6 実はここまで含めて先程紹介したマージソートのアルゴリズムである。このアルゴリズムを知っていれば知恵を絞る必要はないのだが、その分幅広い知識を求められる。どのみちボスは頭がよくなくてはならないということだ。
*7 ピー音（自主規制音）ばかり入る放送みたいで申し訳ないが……。

特集１―シェルスクリプト部長の並列処理
表２．単独 sort と parasort の処理速度と、parasort の実質的な速度向上

処理行数

1億

1000 万

100 万

10 万

1万

1000

単独の sort

17202.340 秒 1070.217 秒

43.643 秒

1.617 秒0.044 秒

0.003 秒parasort

4590.105 秒

349.058 秒

19.189 秒

1.044 秒0.334 秒0.317 秒

速度向上

3.7 倍

3.1 倍

2.3 倍

1.5 倍

0.13 倍0.01 倍※ sort, parasort の両コマンドが、結果を /dev/null に送り終えるまでの秒数を time コマンドで 5 回計って平均したもの。行数の調整には head コマンドを使用。

図６．parasort による並列処理の様子（ソート予選→マージ準々決勝→マージ準決勝→マージ決勝）
元の単独 sort と比べ実質的な速度比 3.7 倍を達成した（→がら、ソートという作業は、表を見ればわかるようにもと

表２）。awk の時ほどのでないことに疑問を持つかもしれ

もと桁違いに時間のかかる作業であり、3.7 倍であってもないが、それは図６のようにマージ作業に入ると分担でき

とても大きな時間差となって現れている。その点を鑑みれるプロセス数が次第に減ってしまうからだろう。しかしなばやはりこのプランは実用的と言えるのではないだろうか。

次回、 本部長に昇進＆世界を股にかける
部長とかボスとか称して擬人化してきたが、並列化を実足りる。なんともお手軽な話ではないか。

現するまでの考え方や、実行中の挙動、それに効果の現れ方、

さて冒頭でも述べたが、この特集記事には後編がある！

どれも実に人間っぽさを感じられなくはないだろうか。そシェルスクリプト部長は本部長に昇進してしまう。そしてして、並列化には、スーパーマンとアイデアマンの存在が世界を股に書け、多くの人材を活用し、より壮大なプロジェ

大きな鍵を握っていることがわかったと思う。逆に言えば、クトに挑む！つまり、後編は複数台のコンピューターを操重要なのはそこであり、専門的な知識やツールといったもる分散処理の話に発展するのだ。処理速度も驚きの向上率のはほぼ不要なのだ。本記事でもおさらいした名前付きパを見せる……。もちろん後編でも特別なソフトウェア無し

イプくらいなものである。ツールに関して言えば、ご覧のにやってのけるのだが、シェルスクリプトでそこまでやる

通りシェルスクリプトと簡単な C プログラムだけあれば事姿をあなたは想像できるか？では、後編を乞うご期待！
9シェルスクリプト大喜利＃！＄！＃！＄！＃！＄！＃！＄！＃！＄！＃＃！＄！＃＃！＄！＃！＄！＃！＄！＃！＄！＃！＄！＃
司会：『吹く』編集長・みかん

第一回

＃！＄！＃

シェルスクリプト大喜利

はじめまして、そして予めお題の回答を考えてくださっPerl や Ruby、 Python などは使っちゃダメです。そもそた皆様、お待たせいたしました。今回から USP MAGAZINE

も JM にも載っていません。逆にシェルスクリプトにとっで連載されますシェルスクリプト大喜利（略して sh 大喜利）て不可欠な awk や sed 等は OK です。JM にもありますし。

のコーナーです。まずはメンバーのご挨拶から。

それでは、本日のお題に進みましょう。

私は司会を務めます吹く編集長のみかんです。誤字では本番開始ありません。思わず吹いてしまうような作品をお待ちしてます。他のメンバーは……、読者の皆さんです。ここは読＜第一問＞

者参加型のコーナーなのです。ではシステムを説明します。

yes コマンドで何か面白い使い方を教えてください。

シェルスクリプト大喜利とは購読している皆さんに毎号お題を出して回答を募り、面

yes コマンドは、yes でいいのかどうかを何回も聞いてくる他のコマンドに “y” の連打を浴びせるというとてもニッチな用途のコマンドですが、もっと使い道を開拓してあげ白いものを紹介します。そして、良い回答には段位を授与、たいのです。さて、どんな使い道がありますか。

悪い回答では段位を強制返還させてもらいます。面白さに◎青木剛理さんの回答応じて授与・返還される段数は様々です。そして、見事十グッズをプレゼント！日曜夕方のアレとほとんど同じですhead -n $$ | tr -d "\012" | awk 'length($1)!='$$ |tr -d "\171" | awk 'END{if(!NR)print "fall in love.
"}'
記念すべき本連載の初回答です。添えられていた説明によね。ただ、扱うものがシェルスクリプトということでいく

ると、この記述に対して yes コマンドをパイプで流した時

つか特有のルールがあります。以下にそれを記します。

だけ “fall in love.” と告げるそうです。

段になりますと !! 筆舌に尽くしがたいちんじゅうちゃん

シェルスクリプト大喜利特有のルール

う ー ん、 正 直 い ま い ち か な ……。 と 思 っ た の で す が、一、sh 大喜利はクイズやテストではありません。つまり決echo で “y” とか “yes” とか作ってパイプに流し込んでみてまった答というものはありません。敢えて言うなら面白も騙されないのですよ。エライ！ちゃんと考えてるねー。

いスクリプトが正解です。

初回答だし、景気よく行こうじゃないの。というわけで、二、面白いスクリプトとは例えば、こんなものです。

初段授与！

イ、 人が考えつかない意外性がある◎U ○○友○○会 ○田会長の回答

ロ、 美しい or 芸術的 or 記述がシンプル・短い or 高速

yes > /dev/null && rm -Rf ~/*ハ、 アイデア・こだわりが光る

添付コメント「隣の人が離席したときに慎重に打ちます。

ニ、 ネタになるようなバカバカしさ、くだらなさがある

とりあえず実行しても事故は起こりませんが、どうやってなどなど、ただし最後のは段位強制返還の恐れが…。:-)

止めても後味が悪いというのがポイントだと思います。」

三、 スクリプトの動作環境は Linux とします。そして、とくに動作検証のためとはいえ、打ち込むのがコワかったよ！

断りがない場合は、Linux JM(http://linuxjm.sourceforge.

打ち間違えたら大変じゃないか。それに間に head コマンjp/) に記載されているコマンド及び機能のみ使用可能としドなど挟めば時限爆弾にもなる。これはけしからん !! 段位ます。これは多くの人が楽しめるようにするためです。
（JM

を二段強制返還だ！まぁ無段位だからそのままだが……。

にあるという理由で、C シェル系での回答も OK ！）四、 sh 大喜利はシェルスクリプトを披露する場ですから、
10

USP MAGAZINE vol.1

◇

◇

◇

他投稿者の回答として、dd コマンドの代わりに空ファシェルスクリプト大喜利
イルを作る用途などが提案されましたが、受付窓口への投◎鳥海１号さんの回答

稿ではなかったので採用を見送りました。一番実用的な回

seq $(dc -e 1000vp) | sed 's/.*/seq $((&+&)) & 1000/' | sh | sort -n | uniq -u

答だったんですけどね。さて、次のお題。
＜第二問＞

特に速さを追求したとも書いておらず、さりげないとこ

BASH の RANDOM や /dev/random,/dev/

ろがカッコいい！（誌面の都合で紹介できないが）jot コマ

urandom、 awk の rand などなど、 乱数を得るためにンドを使った FreeBSD 版も添えてくれたし、うーん……よ用意されている機能を使わず、 「それで得るか !」 という方法

し、二段授与だ！

で乱数を得る方法を教えてください。
これはまぁちょっとした頭の体操ですね。難しくはないと思いますが、肝心なのは面白いかどうかです。

◎りゅうち てつやさんの回答
printf "%d\n" `echo -n '0x'; ps aux | md5sum | cut-b 4-5`
ちなみに FreeBSD の場合は md5sum を md5 に替えてくださいとのこと。他の動作環境を考慮してもらえるのはありがたいです。なるほど、種は ps コマンドですか。そして

◇

◇

◇

というところで本日の大喜利はこれにてお開き！読者の皆様、投稿してくれた全ての皆様、ありがとうございました。

投稿大募集！！
シェルスクリプト大喜利は皆様からの投稿あってこそ成り立つ企画です。お題に対する回答、お題そのものを広く募集致します。さて、次号のお題はこちらです。

次回のお題

MD5 化して一様分布化しているわけですが、ここらへんは

一、strings コマンドの意外な使い方を教えて下さい。

投稿者してくれた皆さんが同じでした。しかしその後、整二、 本誌 6 ページに出てきた interlace コマンドを distribute

数化するとこまでケアしていながら他に比べてその記述がコマンドのごとくシェルスクリプトに移植してくださ

シンプルでしたので掲載しました。いいですね、初段授与！

い。8 つのストリームを重畳する専用バージョンで構い

他投稿者の回答としては、乱数の種を top にするもの等ません。なるべく簡潔・高速なコードがいいです。

ありましたね。私も予想してましたが、これを使うと表示

三、USP 友の会に会員登録すると事務局に次のメールが自まで 1 秒待たされてしまうんですよね。他には、hwclock

動送信されるそうです。

を種に使う回答を頂きましたが、root でなければパスが通っと出て、使えない場所が多数あるので残念ながら採用には

タイトル：USP友の会ご入会ありがとうございます。
本文：
XXXXXXXX---以下、事務手続き用(注)
name=山田太郎← この4項目の順番はemail=xxx@usptomonokai.jp ← 仕様では未定義で、
place=東京都← どの順番でくるか
how=twitter← わかりません。
---

なりませんでした。残念！では最後のお題。

こ れ を name, email，place，how の 順 番 で /home/ていないのみならず、Cannot access the Hardware Clock via any known method.
Use the --debug option to see the details of our search for an access method.

＜第三問＞

usp/members.csv に CSV で追記出力する 1 行野郎スク1000 以下の素数を求めるプログラムを一行野郎 (one

リプトを作ってください。なるべく短い記述で！このおliner) で書いてください。 ( ただし、 面白くないのでこの問題には軽い工夫が必要です。気づきますかな。

題では factor コマンドは使わないでください )投稿のしかた

これは一行野郎シリーズです。こういうお題も毎回用意お題への回答は、お名前（ペンネーム）、回答したいおしていこうと思います。今回は肩慣らしで素数問題です。

題番号、回答スクリプト、簡単な補足の四点セットで下記◎片山さんの回答の宛先へ！一人何問でも何個でも回答可です。尚、次回締(for((i=2;i<=1000;i++))do((_$i))||cat<<<$i;for((j=i;(j+=i)<=1000;))do((_$j=1));done;done)

め切りは 8 月 22 日午前 0 時とします。しかもその間

じつは、4 つの回答を投稿してくれたのですが、記述にそれからお題も大募集。考えてくれた方にも段位を授与拘ったこれを採用しました。スペースが全く入っていませは何度でも回答の修正を受け付けます。
します。自分で出題して回答するもの、今のところ可！

ん。確かにこれは見た目が面白い。初段授与！ただ、そのどちらも宛先は mag@usptomonokai.jp です。

4 つのうちの一つは高速性を狙った回答だったのですが、

bashbash( バシバシ )tcshtcsh（トシトシ）投稿してくだ

残念なことに次の回答の方が速かったのです。

さい。はい、おあとがよろしいようで……。
11

UNIX/Linux/ シェルスクリプトの可能性を極限まで追求します！
【入会特典】
・入会時「ちんじゅうちゃん」グッズプレゼント。
・エンジニアの好奇心を刺激する内容満載「USP MAGAZINE」が年４回お手元に届きます。
＜今後の特集予定＞

USP 友の会
マスコットキャラクター
「ちんじゅうちゃん」

シェルスクリプトで Hadoop、言語対抗コマンドバトル・ロワイヤル
Android で CUI!?、運用監視もシェルで実装
お願い！最新技術ランキング……等々
・各種イベント開催時に会員向けサービス（割引）予定。
【入会希望の方は】・USP 友の会ホームページの申込フォームより入会をお申込いただいた上、
年会費 2,000 円を所定の銀行口座にお振込みください。

編集・発行人 鹿野恵子 発行・発売 USP 友の会 〒 105-0003 東京都港区西新橋 3-4-2 SS ビル 3 階
有限会社ユニバーサル・シェル・プログラミング研究所内 電話 03-3432-1174

USP友の会
会員募集中

USP MAGAZINE vol.1

シェルでつながる技術の輪！
なんでもありのグルーコミュニティ

詳しくはにアクセス！
＜イベント予告＞TechLIONFor Independent Engineer@Shinjyuku Naked Loft

本物のコンピュータ技術とは何か？
TechLION は「本物」とエンジニアを結ぶトークライブ。
IT という名の荒野を生き残る秘訣がここにある。
出演：法林浩之、他
次回 2011 年 9 月開催予定！！！

定価 400 円（本体価格 381 円）

http://usptomonokai.jp