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

USP
MAGAZINE

VolY.e2n
400

for the sophisticated shell scripters
第１特集
シェルスクリプト本部長の分散処理

Netcatで世界を股にかける第２特集

USP友の会プログラミング道場
シェルスクリプトで思考のストレッチ
Linux女子部、語る！
Agile2011現地レポート

TechLION誌上中継

最後のRubyKaigiの裏側を高橋征義が語る

RubyとRubyKaigiから学んだこと
Artwork created by Koji Ishizuka. © 2011 Zie's Bank .Co,. LTD All rights reserved.

From Editor
コミュニティの担う役割に注目が集まっています。
ルールに縛られて、管理された下で行動するのではなく、個々の意志によって、人と人とがつながることで、様々な成果が生まれています。
人と人が何かの仕事によって結びつく根底にあるもの。
それは「志」であると、私たちは思います。
今月取り上げたコミュニティも、それぞれ何かの志を持って、広く世に何かを訴えかけようとしています。
言語開発者の支援、女性エンジニアの地位向上、Agile の普及…。
これほどまでに、コミュニティ活動が活発な業界が他にあるでしょうか？
さまざまな志が、IT 業界のいたるところで芽吹こうとしています。
志の芽を見つけ、大切に育てていくこと。
これが、雑誌の役割の一つなのでしょう。
そして、私たち USP MAGAZINE も、
以下の５つの志を掲げ、この変動の時代をいかに技術者として生きていくべきかを、皆さんと共に考える場でありたいと思っています。
（１）UNIX 哲学を学び、実践すること（Simple is Beautiful )（２）自律した技術者による協働を目指すこと（Independent Engineers）（３）手しごとと工夫を大切にすること（Craftmanship）（４）自然であること、Free であること（OpenMind）（５）本質を見極め、自分の頭で考え行動する技術者たること（Sophisticated Engineers）
USP MAGAZINE 編集部

Contents
シェルスクリプト本部長の分散処理………………… 3
シェルスクリプトで思考のストレッチ……………… Ruby と RubyKaigi から学んだこと ………………… シェルスクリプト大喜利……………………………… 9
シェルスクリプト事始め クラウド編……………… Linux 女子部座談会〜ロングキャリアのつくり方 … 今私たちは何を学ぶべきか…………………………… Agile Conference 2011 現地レポート ……………… ベンチャー起業家のアドベンチャー日誌…………… 次号予告………………………………………………… ※ 薄字で記載している記事は、よりぬき版には収録されておりません。

2

USP MAGAZINE vol.2

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

mag@usptomonokai.jp

特集１

NetcatưɭမǛᏂƴƔƚǔǷǧȫǹǯȪȗȈஜᢿᧈƷЎ૝ϼྸȁȁ৏ຊȁςΛΙȆη΃ϋȪઐ‫׆‬ςΛΙࡄ‫ݪ‬ਫ਼ȫܿ੅‫ފ‬ႁȁષനၦ֚ȪξΣΨȜ΍σȆΏͿσȆίυΈρηϋΈࡄ‫ݪ‬ਫ਼ȫஜ࣢͈ΏͿσΑ·ςίΠ໐ಿ͈‫ڰ‬࿬͉ࡉ̢̹̺̠̥̀ͣͧ͜ȃ๞͉Ȃ ζσΙ΋ͺ‫́ͭૺ̦ا‬ఉତ͈໐‫ ئ‬ȪɁაၑ ńőŖȫ ͬঀ̢̠̹ͥ̈́̽͢ͅ෸ࠊͅ಍࿒̱Ȃస‫̹̱ק‬ෝႁ͂‫ܥ‬ഢ͈၌̞̹ͺͼΟͺ́Ȃ ཛྷఱ̈́ၾ͈ηΛΏοϋͬਉ๶̩̭̱̹̈́͢ȃ ̺̦Ȃ ๞͈৘ႁ̷͉͈೾ഽ͉̥̹́̈́̽ȃ ଼‫ུ̀ͦͣ͛෇̦ض‬໐ಿͅઌૺ̱̹๞͉Ȃ ΥΛΠχȜ·̦ຽ‫̱ݞ‬̹࡛ેͬ௴̢Ȃ ଲ‫ٮ‬ಎ͈঑২ ȪɁγΑΠ΋ϋάνȜΗȜȫ ͈૽ऺͬൡ‫̱گ‬Ȃ ࢵ଼̈́ͥ‫̹ͣͬ͜ض‬̳͈̺̹̽ȃ
̞̠̫͉͂ͩ́ࣽٝȂ ΏͿσΑ·ςίΠͥ͢ͅ໦८ੜၑͬત̳ٚͥȃඅਂ̈́ΜȜσͅှ̴ͣȂ ͺͼΟͺ֚̾́ੳ໅̳͈̦ͥ໐ಿ͈঵̻ྙ͈̺̦̈́Ȃ ໦८ੜၑ̤̞ͅ
̷͉̀ͦ͜་̞ͩͣ̈́ȃ
3

0GVECV ưɭမǛᏂƴੑƚǔུ͉߯൚ͅ‫̧ͥ́́͜ة‬ി̺̈́
シェルスクリプト部長シリーズ、おかげさまで前編を読ै଎̧́̀͜ȤȤ

まれた方から「こんな手軽に並列化ができるのか！」と一部で好評を頂くことができた。名前付きパイプと “&”（バックグラウンド実行）というありふれた機能を使うという、が重要なのだ。そうであるからこそ定番レシピ、つまり常套手段として普及できるのだから。
レシピといえば、ちょっと宣伝になるが、先月「シェル

ĢĢ

←‡↧‡
₉ ↟ ⇀‡ⅾ⇅ ↇ

かしそのように、手軽で、何てことの無い手法であること

ຈफ़

಼୲ै଎

言われてみれば何てことの無い手法だったからだろう。しĢĢスクリプトシンプルレシピ 54」という書籍を USP 出版か
ら発行させていただいた。さすがに本誌で紹介しているよ

いないが、数字や文字の加工法、行や列ごとの処理方法、ファイルの操作方法などを網羅している。他言語では言語仕様
あるいは組み込み関数等で当たり前に用意されている基本
処理を中心に逆引きリファレンスにした本だ。「シェルスクの」と開発言語として見てこなかったとしたら、その考えががらっと変るかもしれない。
話を戻すが、シェルスクリプトは何でもできて実に頼もΡμΛǫ⌭ǳǤǤ⌐

リプトは MS-DOS のバッチファイルに毛の生えた程度のもↀↆ→↾⅕⅜”⅁ℶℵℶ⅁⅕⅃„ņŹŤŦŭ ͜ঀ̢ͥȃǫ⌭ǳǤǤ⌐

うな並列処理とか分散処理など高度な活用法はカバーしてしい奴だ。驚くなかれ、なんと音声合成して楽器の演奏も‫̧̀́́͜ة‬ှͦͥδΑȃ

できれば、点や線を引いて図形も描けるし、Excel や PDF̞͞Ȃ ̷ͦ౗́͜ఱ೷̧̥́ͥͣ

をも合成できるのだ！もちろんシェル自体にそのような機能があるわけではなく、各機能を呼び出しているに過ぎなではそんな、頼もしいシェルスクリプト部長の後編「本いが、シェルと親和性の高いコマンドが多数開発されてい部長編」をお届けしよう。物語は本部長に昇進した当日かる。これらの話は今後、本誌でも少しずつ紹介してきたい。

ら始まる。

ུ໐ಿȂ ૧̹̈́ηΛΏοϋͬྵ̶ͣͦͥȃ
本部長への昇進は単なるご褒美ではない。更なる高度なミッションを任せるためだ。就任当日、シェルスクリプト
本部長は息付く暇も無く新たなミッションを命ぜられた。
急激に伸びる自社サービスへの需要に応えるため、各国に存在する支社のリソースを動員して対応能力を上げよというミッションだった。
ここで一旦、本部長の物語から現実的な話に落とし込んでしまって申し訳ないが、前編のおさらいを兼ねて上記のミッションが意味している実際の話を説明しておく。上記
でいうサービスとは、前編でも扱った 1 億行もの膨大なレ
コード数のデータ（→リスト１）を加工する作業のことであり、また各国に存在する支社のリソースとはネットワー
クに繋がった何台ものホストコンピューターのことである。
4

USP MAGAZINE vol.2

リスト１．前編に引き続き扱う、１億行データ（抜粋）
番号 , 都道府県名, 金額 , 年月日の4フィールド構成
2645!ࣞ౶ࡇ!.:-:98-86:!3112 ා 2 ࠮ 6 ඾
4883!৅঱ോࡇ!6-79:-5:3!2::3 ා 6 ࠮ 7 ඾
9349!ఱ໦ࡇ!2-1::-935!3121 ා 3 ࠮ 33 ඾
23:3!ਝനࡇ!.5-5:8-977!2::2 ා 3 ࠮ 34 ඾
:923!૧‫!ࡇګ‬6-832-579!3112 ා 3 ࠮ 39 ඾
7894!ఱ໦ࡇ!7-231-291!2::3 ා 3 ࠮ 25 ඾
:88:!ࣞ౶ࡇ!.9-392-574!3116 ා 6 ࠮ 26 ඾
5734!୷ဩࡇ!:-233-324!3121 ා 4 ࠮ 26 ඾
3494!໶ࡩࡇ!.3-884-672!3118 ා 4 ࠮ 39 ඾
2417!გ‫ظ‬५ࡇ!.:99-423!3119 ා 23 ࠮ 8 ඾
9534!ോआࡇ!.4:8-963!3117 ා 22 ࠮ 4 ඾
5165!‫ؗ‬ථࡇ!:-865-258!311: ා 7 ࠮ 38 ඾
1986!୒૩ࡇ!4-591-163!3111 ා 7 ࠮ 5 ඾:975!୞୼ࡇ!.6-932-51:!2::4 ා 6 ࠮ 42 ඾ȁȁȁȁȁȁȁȁȁȁȇ

特集１―シェルスクリプトུ໐ಿの分散処理
つまり、前編で取り扱ったデータを、今度はさらに複数台

スによる並列化

写真１.

のコンピューターで分散処理させて、一層の処理速度向上

で 1 時 間 16 分を図ろうという話だ。

へ と 実 質 3.7 倍

本部長が活躍するコンピュー
ターの近景。
本当はあと2台あるのだがちょっと離れた場所にあって撮れてない。だが、見た目は同じ！

今回はコンピューター 4 台で挑む（→写真１）。各コンのスピードにすピューターのスペックは Intel Xeon W5580（3.2GHz 4 コア）

ることができたを 2 基搭載で 8CPU 相当、メモリ 48GB と、前回と同様でが、 今 回 は さ らある。同性能のコンピューターが 4 台に増えるのだから、にそこからどれ単純に考えれば処理速度は 4 倍である。前回、１台で実験だけ早くなるだ

した際、4 時間 46 分かかっていたソート処理を、8 プロセろうか。

ŔŔŉ ́೒ోȂ ŏŦŵŤŢŵ ́เ௣ȃ ไဥ຦́ম௷ͤͥȃ
並列・分散処理を考える時は「人間のグループ作業だっ

Netcat（SSH も）は TCP/IP の上に実装されるコマンドでたらどうするか」を考えるところから始めるとやりやすいとある。つまり世界中に張り巡らされたインターネットを、いうことは前編で示したとおりだ。人間がやる場合、今回のそしてその先に接続された世界中のコンピューターを行き話であれば次の 2 つの作業を思いつくだろう。一つは支社に来させることができる。まさに、Netcat で世界を股に掛け作業内容の通達を出すこと、もう一つは本社−支社間におけるというわけだ！

る品物（データ）搬送経路を用意することだ。当然本部長もこの 2 つは考えた。だが、こんなことは誰でも考える事だ。

＊１*1 Netcat は流すデータを暗号化しないので、実際に世界を股に掛ける場合は、流そうとしているデータのセキュリティには十分注意すること！

‫ܡ‬ం຦ͬဥ̞̀
൵ව΋ΑΠͬဲ̢͢

本社

支社※支社は複数ある

シェルスクリプト本部長が見せる真のアイデアはその先にあった。作業通達にしろデータ搬送にしろ、目的に応じたソフトウェアを開発すればできるに決まっている。だが元データ
ポートリッスン開始

本部長は、既存のコマンド群で実現できることに気づき、（加工済データ回収用）

導入コストをかけずにこの 2 つを実現する方法を提案した
のだった。

（ 受取

本部長のアイデアはこうだ（→図１）。まずは SSH を使う。
SSH といえばリモートログインでよく使うコマンドだが、している。今回は、このうちリモートコマンド実行の機能

工、
返送
）

ポートリッスン開始

リモートコマンド実行やポートフォワーディング、最近ではレイヤー２VPN にまで対応する等、実に様々な機能を有

作業
通達

、加

（加工依頼データ受取用）

分割を利用する。これを使って支社コンピューター上で並列処

加工理させるコマンドを実行させればよい。これで作業通達ができてしまうわけだ。ではデータ搬送はどうするか。既に自社でも加工

依頼
デー

タ

加工
（並列に）

名前を出しているが Netcat を使えばよい。Netcat はその名のとおり、いわばネットワークに対応した cat コマンド
であり、標準入出力を TCP や UDP ポートに繋ぐことができる。従って、Netcat にポートリッスンさせて本社からデー

結合

加工

ータ
済デ

タを受け取り、それを標準入出力経由で加工用コマンドに渡し、処理後のデータを再び標準入出力経由で Netcat に渡して本社に送り返すのだ。これまた聞けば、何てことの無い手法ではないか！

できあがり
図１．本部長のアイデア
5

0GVECV ưɭမǛᏂƴੑƚǔうしなければリッスンが終わるまで先へ進めず、リッスンུ໐ಿ̦੄̱̹ίρϋを終わらせるためのデータが流せないので沈黙してしまう。
それが済んだら 3) 以降で、加工依頼データの搬出と回収

このアイデアを利用し、本部長が提案したシェルスクリ
＊２

行うわけだが、3) では自分を含めた 4 台のコンピューターである。既にコメントとしてリスト内にで均等に分担させられるように仕分けをしている。ここで説明がなされているのでポイントのみ掻い摘んで説明する。

はソート対象のフィールド値の大小で仕分けている（39 〜

作業通達と搬送経路の確保という 2 つの仕事が必要であ42 行目）が、値が均等に分布しているならウマい仕分け方

プトがリスト２

るが、実際に行う場合、先にやらなければならないのは後といえる。さすがアイデアマンだ。

者である。ネットワークで A →→ B のうような経路を構築

ただし、このプランには少々横着している点がある（誌する場合、終端である “ → B” を先に作らなければならない。

面の都合でというのもあるが）。一つは sleep コマンドを始端である “A → ” は終端が既にできているこをと期待して使っている箇所（14,29 行目）だ。前者は本社コンピューターいるからである。今回の SSH による作業通達（26 〜 28 行目）のリッスンがちゃんと開始するであろうことを期待した待の中には始端を作る作業が含まれている。よって、加工済

ちであり、後者は支社コンピューターがちゃんとリッスン

データ回収のためのリッスン用 Netcat を、2) の SSH よりを開始するであろうことを期待した待ちである。逆に言えも先に 1) で実行する。また、それらは “&” を使ってバックグラウンド実行させるようにしているのもポイントだ。そ*2 リスト２の 28,50 行目に “> /dev/tcp/x/y” という記述がある。これは “| nc x y”に相当する Linux カーネルの機能だ。カーネルレベルの実装の方が速いのでこの記述を採用した。

リスト２．4 台のコンピューターでソートを分散処理するスクリプト “distsort.sh”$"0cjo0ti$$$!2*!\ ‫ࢥح‬फΟȜΗٝਓͅ๵̢̹੔๵ ^!$$$$$$$$$$$$$!!໐‫ͬضࠫॳ̥ࠗͣئ‬਋̫̹৾ͥ͛Ȃ$!!Ofudbu ́εȜΠͬςΛΑϋેఠ̱̤̩̀ͅȃ$
gps!j!jo!2!3!4<!ep!!$!...!঑২ o!̥͉ͣ!εȜΠ 21111,o ́਋̫৾ͥ!...
!!od!.m!2111%|j~!?!/0EbubGspn%|j~!'epoftmffq!2!$!̧̻ͭ͂ςΛΑϋેఠ̵̯̹ͥ͛ͅ઀‫ݝ‬গ$$$!3*!\ ުྩ͈೒ో ^!$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$!!TTI ͬঀ̞Ȃ‫ڎ‬঑২ͅȂո‫ͬྩު͈ئ‬೒ో̳ͥȃ$$!!!!2/!ུ২̥͈ͣ‫ࢥح‬ջှΟȜΗͬ਋̫̹৾ͥ͛
$!!!!!!!Ofudbu ́εȜΠ 21111 ͬςΛΑϋ̵͢$!!!!3/!එ̞̹ΟȜΗ͉Ωͼίࠐဇ́ qbsbtpsu ͅ௣ͤ$!!!!!!!໼ႥΕȜΠ̵͢$!!!!4/!‫̹̱ͣࢥح‬Ȃ‫ڎ‬঑২ဥུͅ২̷̸́ͦͦ
$!!!!!!!ςΛΑῢ̱̞ͥεȜΠͅ௣̫ͤ̾͢
$gps!j!jo!2!3!4<!ep!!!!!ɫ 37 ȡ 39 ࣐࿒ ; ैުඤယ!!tti!tijtib%|j~!#od!.m!21111!!!!!!!!!!!!!!}!]!!!!!!!!!!!!!!!!!!0ipnf0VUM0qbsbtpsu!.l2-2!!!]!!!!!!!!!!!!!!!!!!?!0efw0udq0ipotib02111%|j~#epoftmffq!2!$!೒ో̧̦࣐ള̜̠͈ͥ́ͧ́͘‫ݝ઀ۼ‬গ$$$!4*!\ ‫ࢥح‬ջှΟȜΗ͈ॽ໦̫ ^!$$$$$$$$$$$$$$$$$$$!!‫ڎ‬঑২ͅȂ௣ͥ‫ࢥح‬ջှΟȜΗͬॽ໦̫̳ͥȃ$!!) ࡓΟȜΗ͈Ȃల֚τ΋ȜΡ͈౵͈ఱ̧̯ͅ؊̲̀
$!!!ॽ໦̫̱̞̀ͥ *$6

USP MAGAZINE vol.2

dbu!/0UFTUEBUB!!!!!!!!!ɫ 4: ȡ 53 ࣐࿒ ; ॽ໦̫!}!]bxl!(|jg!!!!!)%2=#3611#*|qsjou!%1!?!#/0ebub1#~!!]!!!!!!fmtf!jg)%2=#6111#*|qsjou!%1!?!#/0ebub2#~!!]!!!!!!fmtf!jg)%2=#8611#*|qsjou!%1!?!#/0ebub3#~!!]!!!!!!fmtf!!!!!!!!!!!!!!|qsjou!%1!?!#/0ebub4#~~($$$!5*!\ ‫ࢥح‬ջှΟȜΗ͈เ੄ ^!$$$$$$$$$$$$$$$$$$$$$!!‫ڎ‬঑২̫࢜ͅȂ‫ࢥح‬ջှΟȜΗͬเ੄̳ͥȃ$!!൳শͅȂུ২́͜‫̳ͥͬࢥح‬ȃ$
gps!j!jo!2!3!4<!ep!!dbu!/0ebub%|j~!?!0efw0udq0tijtib%|j~021111!'
epof
dbu!/0ebub1!}!qbsbtpsu!.l2-2$$$!6*!\ ٝਓ̱̹‫ࢥح‬फΟȜΗ͈ࣣࠫ ^!$$$$$$$$$$$$$$$!!‫ڎ‬঑২̥͈ͣ‫ࢥح‬फΟȜΗ͈ൢ಍ͬఞ̽̀Ȃ$!!ࣣࠫ ) ௽̫̀ດ੔੄ႁͅ௣੄ * ̳ͬͥȃ$
gps!j!jo!2!3!4<!ep!!qje>aqt!byxx!}!hsfq!#od!.m!2111%|j~#!}!]!!!!!!!hsfq!.w!hsfq!}!bxl!(|qsjou!%2~(!!!a!!jg!\!.o!#%qje#!^<!uifo!!!!xbju!%qje!3?0efw0ovmm!!gj!!dbu!/0EbubGspn%|j~epof$$$!7*!\ ࢃইྎ ^!$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$!!ै̹֚̽শέ͹ͼσͬ஠̀ॉੰ̳ͥȃ$
sn!.g!/0EbubGspn\2.4^
sn!.g!/0ebub\1.4^

特集１―シェルスクリプトུ໐ಿの分散処理
表１．parasort 及び 4 台分散 parasort の処理速度と、前者に対する後者の実質的な速度向上

処理行数

1億

1000 万

100 万

10 万

1万

1000

parasort（前回） !56:1/216 ຟ !!45:/169 ຟ !!!2:/29: ຟ !!!!2/155 ຟ !!!!1/445 ຟ !!!!1/428 ຟ

上記 +4台分散 !2354/556 ຟ !!213/6:9 ຟ !!!!:/641 ຟ !!!!4/647 ຟ !!!!4/443 ຟ !!!!4/3:8 ຟ

速度向上( 参考 ) 単独sort からの

速度向上

3.7 倍
13.8 倍

3.4 倍

2.0 倍

0.30 倍0.10 倍0.10 倍10.4 倍

4.6 倍

0.46 倍0.013 倍0.001 倍※ 各コマンド完了までの秒数を time コマンドで 5 回計って平均したもの。分散しない parasort 測定値は前編の表から引用。尚、行数の調整には head コマンドを使用。

ば、本当に開始したかどうかを確認せず、「これくらい待っうか。今回は 4 台の同性能なコンピューターを使って分散ておけば大丈夫だろう」と見切り発車をしてしまっている処理を行ったので、理論的には 4 倍強の処理能力となる。

のである。コンピューターの台数が多かったり、相手がイ果たしたどれだけこの数字に迫ることができるのであろう

ンターネット経由の遠いところにあるのであればちゃんとか。前回同様にベンチマークを実施した（→表１）。

確認をとるコードを付け加えておかねばならない。

前編と測定方法を揃えて比較できるようにした。すなわ

もう一つは、前にこのスクリプトを実行して途中で中断

ち、1 億行〜 1000 行までそれぞれ 5 回計測した平均をとっさせてしまった場合への備えである。この時、本社や支社た。ただし、前編では AWK と sort の 2 種目で実施したが、でポートリッスンがされたままの状態になっている可能性

誌面の都合もあって今回は sort のみとした。

があるので、それを確実に終わらせておかねばならない。

1 億行時の処理時間は、およそ 1243 秒（20 分 43 秒）となっ

これらに気をつけないとデータに欠損が起こったりスクて実質的な速度向上は 3.7 倍を達成した。前述のとおり理

リプトが沈黙したりする。実用化するなら、最低限その対論的な能力向上が 4 倍強であるから、分散化によるオーバー策を施さなければならない。

ヘッドは少なく、かなりいい結果を出したと言える＊３。こ

うしてまたシェルスクリプト部長改め本部長は、命ぜられ̷ུ̱̀໐ಿ͉Ȃ ࠫ‫̹̱੄ͬض‬ȃたミッションに対して申し分の無い結果を出したのだった。

さてこのシェルスクリプトの効果はどれほどなのであろ*3 もちろん行数が少ない場合はこの限りではない。効果が逆転する分岐点が 100
万行と 10 万行の間に存在しており、並列化時よりも大掛かりな様が伺える。

΀·ΑΠςȜθ ĢĢ ˎ˒ర͈ζΏΰੜၑͅಯ̺ͭȃ
今回の計測とは別なのだが、シェルスクリプト本部長は
その後、図２に載せたなんと 26 台コンピューター群を舞台にしたとてもエクストリームな分散処理プロジェクトを任されることになった。仕事のデキる人物には次から次へと大きな仕事が舞い降りてくるものだ。
前編・後編と二回に渡ったシェルスクリプト部長シリー

図２．26 台ものコンピューターから構成されたエクストリームなマシン
7

0GVECV ưɭမǛᏂƴੑƚǔ＊４

ズの最後に、少しだけこの話を紹介したいと思う。

分散先は 25 台ということになるので、Gigabit Ether だと
40Mbps にまで落ちてしまい、仮に 1 台あたりの性能が同໦८ੜၑ͜ͅ‫ه‬ఴ̦̜ͥ
1 台のコンピューターの論理 CPU 数の増加を期待した並

じ 7Mbps だとしたら、もう無視できない値だろう。

‫ه‬ఴ͈࣪໚͜Ȃ͉ͤ͞ͺͼΟͺ

列処理の場合だと、いくら資金があっても CPU 数を増やす
アプローチはすぐに限界に達してしまう。一方分散処理なでは、この 26 台コンピューター群ではそれをどう克ら予算に応じていくらでも台数を増やせる。まさに分散処服したのか ? 答えはネットワークの直列接続だ。しかも理だからこそなせる技だが、その分散処理にも、単純に台InﬁniBand という超高速なインターフェースを 1 台につき数を増やしていくだけではやがてぶつかる壁がある。それ2 個用いたという。具体的なアイデアは図３に示した。

は加工依頼データの搬出と回収だ。

搬出時は、受信したものを tee コマンドに掛け、自機の例えば分散させる先のコンピューターが n 台あったとしディスクに落とすと共に次のホストに再搬出する。一方回よう。そして分散元のコンピューターと分散先のｎ台のコ

収時は、受信したものを cat コマンドで受け、自機の加工

ンピューターがハブ等を介して一つの LAN に接続される形

済みデータを追加して次のホストに送る。こうすればスルーになっていたとする。この状態で分散処理させたデータをプットは落ちない。レイテンシー（遅延）は増えるもののｎ台のコンピューターに一斉に送受信する様子を想像してスループット低下に比べれば殆ど問題にならないという。

みてもらいたい。ネットワークのスループットは分散元の肝心の結果はというと、なんと 1 億行ソートをわずか 2親機の口で n 分の 1 に落ちてしまうことが容易に想像でき分で完了したというのである。コンピューターのスペックるだろう。だが、今回測定した時のように分散先の台数 nが違う（詳細は聞けなかった）ので単純に比較はできないが少なければ問題にならない。なぜかといえば、CPU で加ものの、分散処理も並列処理もなしの時には 4 時間以上か工処理する速度、つまりは加工処理のスループットがネッ

かっていたことを鑑みると驚異的な早さだ。これは確かに

トワークのスループットに比べて無視できるほど低いから

ハードウェアに資金を投入したことによる効果も大きいが、だ。実際に表１の測定結果を見てみると、分散処理化する

数々のアイデアが揃わなければ実現できなかったものだ。

前の 1 億行ソートでは 1 時間 16 分かかっている。1 億行のデータは約 4GB あるので、加工処理時のスループットは約

ハードウェアもシェルスクリプトも、アイデアによって7Mbps となる。これは Gigabit Ether の帯域を 3 台で分割活かされる。シェルスクリプト本部長はいつも周囲にそうした場合のスループットに比べて２桁も低いことがわかる。

語るのだった。

しかし分散処理に協力してくれるコンピューターが増えて加工処理のスループットを下回ってしまう。今回の場合、*4 このエピソードは独立行政法人新エネルギー・産業技術総合開発機構（NEDO）
による平成 21 年第 2 回イノベーション推進事業「研究開発型ベンチャー技術開発助成事業」の助成対象事業の、「パイプライン計算機とユニケージによる
高速情報処理技術の実用化に関する研究」の一部として実施された研究活動に基づくものである。

tee で撒いてcat で繋げて回収

ればネットワークのスループットの低下がしていき、やがc

図３．分散処理コンピューターの台数が多い場合は、直列なネットワークにする方が有利
8

USP MAGAZINE vol.2cΏͿσΑ·ςίΠఱ‫ܔ‬၌

シェルスクリプト大喜利ɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔ₻₏₷₏₻ɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔȊɐȊɔংٛȇȸ଑̩ȹ༎ਬಿȆ͙̥ͭ

ٝ
లඵ

₻₏₷₏₻

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

さて次は、３ヵ月間のご無沙汰、シェルスクリプト大喜利२Ȃġスクリプトの動作環境は Linux とします。そして、とくに（略して sh 大喜利）のコーナーでございます。楽しみにして断りがない場合は、Linux JM(iuuq;00mjovykn/tpvsdfgpshf/

くださっていた皆様、そして作品を投稿してくださっていたkq0) に記載されているコマンド及び機能のみ使用可能とし皆様、お待たせ致しました。まずはメンバーのご挨拶から。

ます。これは多くの人が楽しめるようにするためです。
（JM

私は司会を務めます吹く編集長のみかんです。誤字ではにあるという理由で、ń ΏͿσࠏ͈́ٝ൞͜ ŐŌ Ȋ）

ありませんよ。思わず吹いてしまうような作品を募集し始অȂġsh 大喜利はシェルスクリプトを披露する場ですから、

めて約半年、このコーナーも無事二回目を迎えることがでőŦųŭ ͞ œŶţźȂ őźŵũŰů ͉̈́̓ঀ̻̽͝Θιです。そもそきました。ありがとうございます。ついに二桁突入です（二も JM にも載っていません。逆にシェルスクリプトにとっ進数で）。次は三桁目指します！（目標低っ）て不可欠な awk や sed 等は OK です。JM にもありますし。

他のメンバーは「読者の皆さん」、というわけで読者参

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

加型のコーナーなのです。ではシステムを説明します。まུ๔‫ٳ‬ই

だ連載回数も少なくルールが定着していませんので、同じ内容ですが暫くは掲載し続けます。

ΏͿσΑ·ςίΠఱ‫ܔ‬၌͉͂
購読している皆さんに毎号お題を出して回答を募り、面Ƀల֚࿚ɄŴŵųŪůŨŴ ΋ζϋΡ͈փ‫̢̞̯̺̩̀ޗ༷̞ͬঀ̈́ٸ‬ȃ
前回に引き続き、マイナーなコマンドに光を当てて、使い道を考えてあげようというお題です。

白いものを紹介します。そして、良い回答には段位を授与、今回光を当てるのは strings コマンド。コンパイル済み

悪い回答では段位を強制返還させてもらいます。面白さにのバイナリファイルはあれどソースファイルは無いという応じて授与・返還される段数は様々です。そして、見事十時、そのバイナリファイルの中から元のソースファイルに段になりますと !! ຊ୳ͅ଄̩̱̦̹̞̻̲̠̻ͭͭ͟͝

あったであろう文字列を探し出す、というような使い方をΈΛΒをプレゼント！日曜夕方のアレとほとんど同じです

されがちなコマンドです。これだとソースを無くしてしまっね。ただ、扱うものがシェルスクリプトということでいく

た（or 引き継ぎが出来なかった）開発者が涙目でデバッグ

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

する時くらいしか使い道がありません。何かもっといい活

ΏͿσΑ·ςίΠఱ‫ܔ‬၌අခ͈σȜσ֚Ȃġsh 大喜利はクイズやテストではありません。つまり決用法はないものでしょうか。
といって募集しましたが、回答は辛うじてお二方だけでした。ちょっと難しかったですかね……。まずはお一人目まった答というものはありません。敢えて言うなら面白ɝ̧̯͈͂ͭٝ͠൞

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

$"!0cjo0ti
MBOH>D
OHxpse>(cvhhz(
dnet>ahsfq!.s!%OHxpse!%)fdip!#%QBUI#!}!us!;!(!(*!3?
0efw0ovmm!}!tusjoht!}!bxl!.G!(\;!^(!(0_Cjo0|qsjou!%
4~!0_]00|qsjou!%2~(!}!tpsu!}!vojra
gps!dne!jo!afdip!#%dnet#a<!ep!!fdip!#>>>!%dne!>>>#<!!tusjoht!%dne!}!hsfq!%OHxpse<!fdip
epofඵȂġ面白いスクリプトとは例えば、こんなものです。
ͼȂġ人が考えつかない意外性があるυȂġ美しい or 芸術的 or 記述がシンプル・短い or 高速ΧȂġアイデア・こだわりが光るΣȂġネタになるようなバカバカしさ、くだらなさがあるなどなど、ただし最後のは段位強制返還の恐れが…。:-)

9

添えられていた説明によると、パスが通っているディレ

最初の回答が paste コマンドを使ったシンプルな書き方、

クトリにある全てのコマンドのうち、“buggy” という記述

後の回答が paste コマンドを使わなかった場合の回答だそが埋め込まれているアヤしいコマンド、および問題箇所をうです。

列挙するとのこと。それから、単純に一つ一つ strings を実そう！私は後者のような回答がくることを予想していた

行すると遅かったので検索の早い grep で一旦舐めて、引っのですよ。ファイルディスプリタ番号は０~9 まであります

掛かったものだけ strings したという。

が、使えるのが 1 と 3 〜 9 で丁度 8 個なのです。出題者のうーん、「意外な用途」かというと、それほど意外では意図まで読まれていたとはもう御見それしまくりだ。もちないかなあ。だけど、実行結果を見ると「RS/6000 版 AIX 3.2

ろん前者の回答も素晴らしい。というわけで、えーいঅ౲

上の sh はバグってる」とか「Solaris 8 の bash 2.03 はバグっ਎ဓȊȊてる」とかいろいろタレ込みが埋め込まれてて面白い。こɝũŢŮŢůŰ ̯͈ͭٝ൞

のお題への投稿数も少なかったし、よし、੝౲਎ဓ！

$"0cjo0ti
qbtuf!.e(]c(!#%A#!}!tusjoht!.2

◇

◇

◇

もう一人の回答は？それがなんと、第二問と一緒に解いたとコメント「1 問目と 2 問目を同時に解きました」。といういうのですよ。そう来ましたか！なので、次のお題へ進みます。

ことで、これがその複数のお題を同時に解くという回答でɃలඵ࿚Ʉす。複数のお題を一遍に解くという芸当は、まるでお笑いŷŰŭįĲ ͈ ķ βȜΐͅ੄̧̹̀ ŪůŵŦųŭŢŤŦ ΋ζϋΡͬΏͿσ

マ○ガ道場の富永○朗みたいじゃないか。strings の使い方

Α·ςίΠͅ֊૒̱̩̺̯̞̀ȃ Ĺ ͈̾ΑΠςȜθͬਹૈ̳ͥ

は正直「そのまま素通ししてるだけじゃん！」と思うわけ୺ဥΨȜΐοΰࢹ̵̞ͭ͘ȃだが、それゆえにコロンブスの卵的意外性にやられたし、

interlace コマンドとは、8 つのファイルの一行ずつ順番

同時解きという技を披露されたし、もちろん paste コマンにマージして 1 つにするために作られたオリジナルコマン

ドを使ってシンプルに解いてるし、これも私の予想をいく

ド。これは難しいだろうと思い「段位はサービスしますよ」

つも裏切っていてすばらしい。অ౲਎ဓȊȊ◇とか言って投稿募集したんですが、出題者である私の予想◇◇を裏切って簡単に解く回答の投稿が続出！参りました。段

他にも、paste をコマンドを使わずに至極真っ当に解いて位サービスさせていただきます……。

くださった回答も多数寄せられましたが、paste を使うとɝŁũŪųŰŤũŢŤũŢŤũŢ ̯͈ͭٝ൞

いう解法に圧倒されてしまい、採用に至りませんでした。

qbtuf!.e!(]o(!b/uyu!c/uyu!d/uyu!e/uyu!f/uyu!g/uyu!h/uyu!i/uyu

ごめんなさい！では最後のお題。

コメント「ワンライナーで十分です」。はい、読者の皆Ƀల२࿚ɄŖŔő ࿻͈֥ٛٛͅഴ჏̳ͥ͂মྩޫͅষ͈ιȜσ̦ু൲௣

様御見それしました。そーなのですよ！ paste コマンドを૞̷̯̠̳ͦͥ́ȃ

使えばいいだけの話だったのです。うぇ〜い、みんな段位ΗͼΠσȇVTQ࿻͈̮ٛව̜̦̠̮̰̞̳ٛͤ͂͘ȃུ໲ȇ
YYYYYYYY...ո‫ئ‬Ȃমྩ਀௽̧ဥ!!!!!!!)ಕ*obnf>५നఊ჊!!!!!!!!!!!!!ɩ!̭͈5ࣜ࿒͈ਜ਼๔͉
fnbjm>yyyAvtqupnpoplbj/kq!ɩ!ॽအ͉́ྚ೰݅́Ȃ
qmbdf>൐‫ނ‬സ!!!!!!!!!!!!! ɩ!͈̓ਜ਼๔̩̥́ͥ
ipx>uxjuufs!!!!!!!!!!!!!ȁɩ!̵̥ͩͤͭ͘ȃ...

もってけー。というわけで、२౲਎ဓさせていただきます。

ɝḶ൥ྶ‫͈̯ͭܮ‬ٝ൞$"0cjo0ti
qbtuf!.e(]o(!#%A#$"0cjo0ti)
xijmf!sfbe!b!<ep
fdip!#%b#sfbe!b!='4!''!fdip!#%b#
sfbe!b!='5!''!fdip!#%b#
sfbe!b!='6!''!fdip!#%b#
sfbe!b!='7!''!fdip!#%b#
sfbe!b!='8!''!fdip!#%b#
sfbe!b!='9!''!fdip!#%b#
sfbe!b!=':!''!fdip!#%b#
epof*!=!#%2#!4=!#%3#!5=!#%4#!6=!#%5#!7=!#%6#!8=!#%7#!9=!
#%8#!:=!#%9#10

USP MAGAZINE vvol.22̭ͦͬ ůŢŮŦĭġ ŦŮŢŪŭȄ űŭŢŤŦȄ ũŰŸ ͈ਜ਼๔́ İũŰŮŦİ
ŶŴűİŮŦŮţŦųŴįŤŴŷ ͅ ńŔŗ ́೏ܱ੄ႁ̳࣐֚ͥ࿤჊
Α·ςίΠͬै̩̺̯̞̽̀ȃ Ȫ΋ȜΡ͉͓̩̈́ͥౣ̩Ȋȫ一行野郎シリーズの第二問です。レベルとしてはまだまだ簡単でしょうか。もともと半ば解決を依頼される形で問題提案されたのですが、簡単だったため一行野郎問題にしてかつ、橙色のような制約も追加してみました。これにより、
単純に行数だけを見て値を扱おうとすることができないよ
うになっています。

ΏͿσΑ·ςίΠఱ‫ܔ‬၌ɝ̯̠͂͏͙̳͞ ĩŁŴŢŵŰũŠŧŶŮŪźŢŴŶĪ ̯͈ͭٝ൞
ubjm!.o6!}tpsu!.s!})xijmf!sfbe!.s!m<ep!tfu!..!#%A#!
#%|m$+>~#<!epof<!fdip!#%3-%5-%2-%4#!??0ipnf0vtq0nfn
cfst/dtw*

り立つ企画です。お題に対する回答、お題そのものを広く募集致します。さて、次号のお題はこちらです。

ষ͈̤ٝఴksh（zsh も）版も投稿してくださいましたが、Bash 版

֚Ȃġ引数として与えられた平仮名（全角 UTF-8）が回文であの方が文字数が若干少ないこと、また JM に載っているコ

るならば戻り値（$? のこと）として 0 を、そうでなけ

マンドというこの sh 大喜利のルールにより、Bash 版を採ればそれ以外の値を返すシェルスクリプトを作ってく用しました。

ださい。尚、環境変数として LANG=ja̲JP.UTF-8 がセッ

ふむふむ、これに届いたメールの本文をパイプで流し込トされているものとし、これに対応しているコマンドをめば書き込むというわけか。そしてソートを掛けることで使って構いません。また、日本語における回文のルール

4 つの変数がどの順番で来ても正しく並ぶようにしている。

「濁音、半濁音、促音、拗音は清音と同一視」に従って

お題ではなるべく短くということなのでスペースを削って判定してください。コードが短いとか美しいとか、何か欲しかったところだが、それ以外はまさにお手本どおり、しら見応えのあるものがいいです。

੝౲਎ဓ！

ඵȂġシェル変数 $T には現在の温度（小数点第 1 位まで）が、ɝŁũŪųŰŤũŢŤũŢŤũŢ ̯͈ͭٝ൞

同じく $H には現在の湿度（整数）が入っているものとdbu!0ncpy})xijmf!sfbe!m<ep!fwbm!%m<epof<fdip!#%obn
f-%fnbjm-%qmbdf-%ipx#*??0nfncfst/dtw

します。この 2 つを元に不快指数を計算し、これはちょっと面白いです。会員データのある行は丁度というフォーマット（温度と不快指数は小数点以下四捨代入式になっているので、eval を使ってうまいこと利用し五入して表示、また行末は改行すること）で表示する一ています。こうすれば sort は要らないというわです。

行野郎スクリプトを作ってください。なるべく短い方が‫أ‬ഽ >ooɎ!৔ഽ >oo&!ະ١ঐତ >oo

実は代入式をそのまま利用するというのはちょっと期待いいです。尚、不快指数の計算式はしていたんだ。それに、ファイルパスがチルダ表記になっ

1/92U ,1/12I )1/::U .25/4*,57/4ているところを差し引いても先の回答より文字数が少なくて、より望ましい回答だということで、第二問の回答分に二段加えてࡼ౲ͬ਎ဓȊとします。
२Ȃġちょっと志向を変えて、本当の大喜利っぽいお題を出したいと思います。

そして最後にオシい！という回答を紹介。

ɝŨŰųŪįŴũ ̯͈ͭٝ൞

ȶȸ̭ͭ̈́ΏͿσΑ·ςίΠ͉΃Λ΋̞̞ȹ ֚ఘȂ ̓ͭ̈́Α·ςίΠȉȷ

fdip!ahsfq!>}us!oi!\~}tpsu}tfe!t0/+>00}us!\~]]o!oi]!
a?0ipnf0vtq0nfncfst/dtw
これは恐らくお題を読み間違えてしまったのだと思います。間違いが 2 つあり、一つはカンマ区切りにしていない

コードの見た目がカッコいいのもよし、実行結果がカッ
コいいのもよし。

ൎࣂ͈̱̥̹

こと、もう一つはファイルへの書き込みが追記ではなく新お題への回答は、お名前（ペンネーム）、回答したいお規になっていることです。ただ、始めから字数を節約する

題番号、回答スクリプト、簡単な補足の四点セットで下記ことを意識してくれていまして、巧妙なことをしていて短の宛先へ！一人何問でも何個でも回答可です。尚、次回締いのです。指摘されたその間違いを解消するためのコード

め切りは ˍˍ࠮ˎ˔඾Ȫ࠮ȫࡿஜ ı শとします。しかもそを書き足しても恐らく一番短かったと思います。

の間は何度でも回答の修正を受け付けます。

お題の要求を満たしていないので残念ながら段位進呈はなし。オシい！
◇◇◇というところで本日の大喜利はこれにてお開き！読者の皆様、投稿してくれた全ての皆様、ありがとうございました。

ൎࣂఱ༡ਬȊȊ
シェルスクリプト大喜利は皆様からの投稿あってこそ成̤ఴ̱̱̓̓͜௣̩̺̯̽̀Ȝ̞
それからお題も大募集。考えてくれた方にも段位を授与します。自分で出題して回答するもの、今のところ可！

ൎࣂ୶
どちらも投稿先は、nbhAvtqupnpoplbj/kq です。
本誌をイベントで購入された方も、ぜひご参加ください。
11ŖŏŊřİōŪůŶŹİ ΏͿσΑ·ςίΠ͈‫خ‬ෝ଻ͬޭࡠ́͘೏‫̳̱͘ݥ‬Ȋ
【入会特典】
・入会時「ちんじゅうちゃん」グッズプレゼント。
・エンジニアの好奇心を刺激する内容満載
USP 友の会
マスコットキャラクター
「USP MAGAZINE」が年４回お手元に届きます。
「ちんじゅうちゃん」
正会員の方には USP MAGAZINE 電子版もお送りします！
＜今後の特集予定＞
シェルスクリプトで Hadoop、言語対抗コマンドバトル・ロワイヤル
Android で CUI!?、運用監視もシェルで実装……等々
・各種イベント開催時に会員向けサービス（割引）予定。
【入会希望の方は】・USP 友の会ホームページの申込フォームより入会をお申込いただいた上、
年会費 2,000 円を所定の銀行口座にお振込みください。

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

ŖŔő࿻͈֥ٛٛ༡ਬಎ

USP MAGAZINE vol.2

ΏͿσ̦́̾̈́ͥܿ੅͈ႊȊ̜͈̈́ͭ́ͤ͜ΈσȜ΋ηνΣΞͻમ̱̩͉ͅͺ·ΓΑȊ
ɃͼαϋΠထ࣬Ʉ

TechLIONFor Independent Engineerུ໤͈΋ϋάνȜΗܿ੅͉͂‫̥ة‬ȉŕŦŤũōŊŐŏ ͉ȶུ໤ȷ͂΀ϋΐΣͺͬࠫ͐ΠȜ·ρͼήȃŊŕ ̞̠͂ྴ͈࣏࿤ͬ୆̧ॼͥ๩̦࠭
̭̭̜ͥͅȃ
੄‫׵‬ȇ༹ႅࢼ෗Ȃఈ
ĳıĲĲ ා ĲĲ ࠮ Ĳı ඾ఱिࣄ೧̀ͅ‫ٳ‬टࠨ೰
ĳıĲĲ ා Ĳĳ ࠮ġŷŰŭįĵŁ ൐‫ٳ̀ͅނ‬टထ೰

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

ũŵŵűĻİİŶŴűŵŰŮŰůŰŬŢŪįūű