42014 October

表1 設計工程の一覧

機能として実装するべき項目や性要件定義をもとに機器構成や機能

能、セキュリティなどの要件を明確

概要をまとめる。画面や帳票などの

➡

にする。

操作やデータの入出力、生成されるデータの概要やネットワーク機器の➡

構成図などの仕様をまとめる。

基本設計で定義された仕様をプロ運用業務として行うべき項目を定

グラム単位に分割したり、サーバー義する。監視設計や拡張設計も運やネットワーク機器のパラメーターを決定する。

➡

用設計に含む。運用業務とは何か？
については本文にて記載する。運用
設計書をもとに運用手順書などのドキュメントが作成される。

表1 設計工程の一覧に記されている順に設計書がで護されていること」「カード情報を扱うため、PCIDSS

きあがり、
詳細設計と運用設計の間に実際の構築作業

Ver3.0に準拠すること」などセキュリティに関する要が行われる(または、構築作業と運用設計が同時進行

件は、非機能要件として定義されます。

する)ようなスケジュールが一般的ではないでしょう

サーバー・ネットワークエンジニアは主に非機能要件か。
これが新規サービスではなく既存システムの更新

かつネットワーク機器やOS、
ミドルウェアにて実装されである場合には、
データ移行に関する設計も行うことる内容を担当することになるでしょう。

になります。
基本設計や詳細設計ですが、おおよその内容としては、
要件定義においては、
大きく「機能要件」「非機能要件」構築を行うのに必要な要素が漏れ無く記載されているの2つを定義します。機能要件の一例は「一般ユーことが最低条件です。
要件定義書から設計への落とし

ザーはショッピングサイトに表示されている商品をク込みに過不足がないか、項目ごとに矛盾がないかなどリックして買い物を行うことができる」「会員ユーザー

抑えるべきポイントはありますが、誌面に限りがあるたは買い物をするとポイントが貯まる」
など、
サービス内

め、
ここでは省略します。

容に直結する機能を指します。
一方で「サーバー1台に障害がおこってもサービスに影響が出ないこと」「同時

運用設計は、
サービス開始後に行うすべての作業につ接続数1000でもシステムがダウンしないこと」などのいて記載されることになります。
具体的には、
表2に示

性能要件的なものや、「ショッピングサイトはSSLで保す項目がその一例となるでしょう。

5

表2 運用設計書に記載する項目（例）
運用スケジュール(24時間365日運用か、あるいは平日の日中帯の運用か、
メンテナンス時間帯)、運用体制、責任分界点、通常作業内容(cronなどのジョブとして自動化するものも手動オ
ペレーションするものも、一旦すべてリストアップする)について定義する
ジョブ管理内容一覧
個人情報などの保護対象となるデータや保全対象となるデータを定義したり、OSやソフト
ウェアの更新、ファイアウォールやアンチウィルスソフトの運用などについて定義する
ログファイル一覧、ログ保存期間(ローテーション頻度、世代数)、ログ監査に関する内容について定義する
バックアップ取得対象、頻度、バックアップ取得方法、保存先、バックアップ保存期間、リスト
ア方法について定義する
監視や稼働統計の項目、閾値、閾値超えまたは復旧時のアクション、SLA(サービスレベル方針)について定義する
障害時の運用パターン(片系運用や縮退運転など)、影響範囲、対処方法について定義する
リソース逼迫時のスケールアップ、
スケールアウト基準および方針について定義する
作業用アカウント一覧、パスワードに関するルール、名前解決や時刻同期について etc...

目次だけでこれだけのボリュームなので、1つ1つ解説するとが理想ではないでしょうか。

となるとそれこそ本1冊書けるくらいの内容になってしまい

そしてもう1点、エクセル方眼紙のように、罫線や方眼紙のマ

ますが、運用設計で決めるべき項目を思いつく限り挙げてスなどの「本来のアウトプットの品質として評価されるべきみただけでもこんなにあるということは、
これらが曖昧なまではない」箇所で多大な工数を割くことは、あまり良いイ

ま運用がスタートすると、トラブル時だけでなく通常運用作

メージを持たれないことが多いですが、何かしら理由があっ

業において
「迷い」
が生じ、
不本意なインシデントがおきててドキュメンテーションツールが選定されていることも理解しまうことにもなりかねません。

しましょう。
それよりも大事なのは、冒頭にも記した通り、
どれ

それでは、
運用ドキュメント(運用設計書、運用手順書)の量だけ正しい設計ができているかこそが評価の主軸であるべが多ければそれで良いかといえば、答えはNoです。
必要なきです。
理不尽や無理解を憎んでツールを憎まず、弘法筆をことがどこに書いてあるのか探しにくいと、見落としや誤解

選ばずです。

が生じてしまいます。
運用ドキュメントに限らず、プロジェク

現場視点からの運用方法論については、少し古い資料では

トで作成したドキュメントは、
どこに何が書いてあるのかをありますが、
運用設計ラボ合同会社の波田野裕一氏(USP

明確にし、内容についてもドキュメント間で矛盾や齟齬がMagazineにも連載がありますね！)がthinkitに寄稿している

生じていないか、
読み手の読解力に過度に依存する内容

記事( http://thinkit.co.jp/book/2010/12/02/1902 )が参考

でないか、
暗黙知をなるべく形式知にできているかを確認になります。
今回の特集では運用ドキュメントの目線でどうするようにします。
「運用でカバー」のカバレッジが上がれ改善していけばよいかを書いてみましたが、運用業務そのば上がるほど、運用チームは疲弊していくということになるものをどう見なおしていけばよいかのヒントになるでしょう。

ので、運用設計においていかに曖昧さを排除するか、
ひい

1つのサービスやプロジェクトに長く携わっていると、技術的ては要件定義においてどれだけサービスを理解するかになスキルアップは(Webなどの情報によって)行うことができかかっていると言えましょう。

ても、
設計スキルに関しては、
本当にこれでよいのか？というとかくドキュメント系の作業は「エンジニア」に好まれない比較がなかなかできないのも事実です。
しかし、
案外周囲を

作業になりがちですが、プロジェクトメンバー間やステーク

見渡してみると同じような悩みを持つエンジニアは少なくホルダーとの意思疎通を円滑にするには欠かせません。
まないはずなので、可能な限り勉強会やカンファレンスに顔た、
設計根拠は決して事実のみが基になるのではなく、良くを出して仲間を募り、業務情報などの漏洩には気をつけつも悪くも人に依存することが往々にしてありがちです。
それ

つも設計スキルについてケーススタディを持ち寄って勉強自体は決して褒められたものではありませんが、せめて暗会を開いてみるのもよいかも知れません。

黙知のまま運用でカバーするのではなく、途中からプロジェクトにアサインされたメンバーでも短期間で既存メンバーにキャッチアップできるような粒度で書かれているこ62014 October<広告>

K-UNYO

ユニケージの教育講座では運用のコースも用意しています。

「なあ@nullpopopoよ、WEBサーバの障害対応って実は簡単なホスティング業者によっては、ファイアウォールの運用を代行して検討してみるとよいでしょう。
んだぜ？原因は❶ハードが壊れるか❷大量のアタックが来るか、 くれるところもありますので、❸デプロイされたプログラムがおかしいかの3つしかないんだ。
」と、
ある日@orz001氏(某大手ホスティングサービスでサーバ運

最後のプログラムがおかしいパターンですが、
サーバーエンジニ

用していた方)が語ってくれました。
ハードは予備機と交換すれアは最低限、
アクセスログやエラーログから原因を特定しなければよいですし、大量のアタックはファイアウォールの機能でブばなりません。
また、
自らアクセスしてみて「どのプログラム(実行ロックすればよく、
プログラムがおかしければ一旦公開を止めてファイルやスクリプト)に何がおこっているか？」を検証することも直せばよいので簡単ですね！というわけで、今月の連載はおしまあるかと思います。
サーバー上で公開しているプログラムがすべ

い・・・というのは冗談です。
おっしゃる通り設定不備や操作ミスなて自分たちの内製であれば、誰がどう対応すればよいかのフロー

どの人為的な障害は別として、外からの障害はだいたいこれら3も自ずと決まってくるでしょうし、解決までの時間も短いでしょう。

つの原因に大別されます。
CMSソフトやそのプラグインなどは管理画面から簡単にアップ
少し補足すると、
ハード障害はどんなサーバーでも避けがたい

デートできますが、自分たちで開発したものでない場合は、バグ

ものなので、
ダウンタイムがどれだけ許容できるかなどの要件やを踏んでしまったら障害期間が長期化する可能性もあるでしょう。

予算に従い、
あらかじめ冗長化を行ったり、予備部品を確保してなので、予めコンテンツとDBのバックアップをとっておき、万が一おいたりします。
物理サーバーの運用が嫌だ！という動機でVPS

表示がおかしくなった場合にはすぐロールバックできるようにしやクラウドに移行するという考えもアリでしょう。

ておくことをおすすめします。
また、
こうした運用手順においていかにダウンタイムを短くするかを考えることは、サービスやシステ

大量のアタックも、サーバーがインターネットに繋がっている以ムを理解することに繋がりますし、
単に手順をなぞるよりも大きく

上これも避けがたく、あなたが管理しているサイトが誰から恨みスキルアップできるチャンスだったりします。究極には、既成のを買ったりしているわけでもないとしても、中小サイトであってもCMSに不満を抱いて、自らCMSを開発するという選択肢もありま

そのリスクはつきまといます。
有効な対策としてはファイアウォー

すので、ご興味を持たれた方は是非「フルスクラッチから1日でル(パケットフィルタリング)やWAF(Web Application Firewall)のCMSを作る シェルスクリプト高速開発手法入門(USP研究所監修

導入になりますが、常に最新の脆弱性情報を入手するなど、
ある

上田隆一、
後藤大地 著 発行:株式会社KADOKAWA)」を一読して程度の人的リソースも必要です。

みてください(※1)。

7顧客や上司からは、一刻も早い障害復旧を求められることもあるでしょう。
しかし、安易に「デーモンやOSを再起動すれば直る
から」
といって、
再起動に逃げるのはいけません。
障害発生時の状況を破壊してしまうと、後から原因を追求することが非常に困難となってしまいます。
これはすなわち、
原因もわからずいつ再発するかわからないという危険性を内包するに等しいのです。
いた
ずらに時間をかければよいというわけではありませんが、障害原因の特定と根本的な解決策の実施を再優先にしましょう。
もし原因不明な状態が長時間続くようであれば、早いうちに複数のエンジニアで対応にあたることをおすすめします。
また、
その際に最
低1人は、
5w1hを簡潔に時系列で記録する役割であると、なお良しです。
また、
ApacheやNginxなどのhttpサーバーが出力するアクセスログには、ステータスコードが記録されることがほとんどです(※2)。
また、
エラーログは、プログラムが出力するより詳細なメッセージが記録されることもあるので、「ログは口ほどに物を言う」の精神で、真っ先にどちらも確認しておく癖をつけておきましょう。

さて、あなたがたった今サーバー管理者になって、前任者からState列が「ESTAB(ESTABLISHの意)」となっているので、SSHログイン情報とrootのパスワードを受け取ったばかりなの

httpポートはListenしているようです。
私を含めおっさん世に、顧客から「http://nullpopopo.blogcube.info/ が見えないぞ代のために少し補足しますと、
ssコマンドはnetstatの代替」とクレーム電話が入って対応しなければならないとしましょう。

となります(net-toolsパッケージがメンテナンスされなくな

そんな無茶苦茶なと思われるかも知れませんが、案外サー

り、
今後はiprouteパッケージで提供されるコマンド群を使

バー管理者にとってはこの手の話は1度や2度じゃないものでう必要があります）。
次にファイアウォール(iptables)も穴がす。
顧客は怒りのあまり、すぐに電話を切ってしまいました(※3)。

開いていることを確認しましょう(リスト2)。

なお、
本ロールプレイではCentOS 6.5(x86_64)を想定しています。

ここまでの切り分けで、このサーバーは外部からhttpで接続できることがわかりました。
さて、一体どのアプリケーショ

たまたまかかってきた電話が非通知だったので、折り返し電話ンがhttpポートを待ち受けているのでしょう。
ある通信ポー

をかけて詳細をヒアリングすることもできず、前任者がちゃらん

トをどのアプリケーションが待ち受けているかは、
lsofコマぽらんなため、
ログイン情報以外のドキュメントもありません。

ンドで確認します(リスト3)。

泣きたい気持ちをグッと堪え、サーバーにログインします。
しかし、
WEBサーバーがApacheなのかNginxなのかもわかりません。
ひとまず80番ポート(httpで用いるTCPポート)がListenしているかを確認します(リスト1)。

リスト1 80番ポートをListenしているかの確認 (接続元IPアドレスは例示のため「あり得ない」数字に置換加工しています)[hamada@www2201gi ~]$ ss -n | egrep '(^State|:80)'
State

Recv-Q

Send-Q

Local Address:Port

Peer Address:Port

ESTAB

0

0

133.242.174.215:80

123.45.678.9:43868

ESTAB

0

0

133.242.174.215:80

123.45.678.9:43869

ESTAB

0

0

133.242.174.215:80

123.45.678.9:43861

ESTAB

0

0

133.242.174.215:80

123.45.678.9:43870

ESTAB

0

0

133.242.174.215:80

123.45.678.9:43866

ESTAB

0

0

133.242.174.215:80

123.45.678.9:43867

82014 Octoberリスト2 ファイアウォールの確認

リスト3 通信ポートとプロセスの確認[hamada@www2201gi ~]$ su -[root@www2201gi ~]# lsof -i:80

パスワード:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

[root@www2201gi ~]# iptables -L -n | grep 80
ACCEPTtcp -- 0.0.0.0/0

0.0.0.0/0

nginx 1329 root 18u IPv4 10053
tcp dpt:80

0t0 TCP *:http (LISTEN)

nginx 1330 nginx 18u IPv4 10053

0t0 TCP *:http (LISTEN)

nginx 1331 nginx 18u IPv4 10053

0t0 TCP *:http (LISTEN)

上記のように、
lsofコマンドに引数「-i:<ポート番号>」をつけることで、
rootユーザがPID1329番で待ち受けているかがわかりました。
先頭のCOMMAND列に「nginx」とあるので、
NginxがWEBサーバのようですね。
顧客からの接続状況(またはエラーの有無)をログで確認したいのですが、
そもそもこのサーバーにインストールされているNginxがrpmパッケージからインストールされたものなのか、
ソースコードからコンパイルしてインストールしたものなのかわかりません。
ここでもlsofが大活躍です(リスト4)。

リスト4 Nginx実行ファイルがどうやってインストールされたかを確認する[root@www2201gi ~]# which nginx/usr/sbin/nginx[root@www2201gi ~]# lsof -p 1329 | egrep '(^COMMAND|nginx$)'
COMMAND PID USER FD TYPE
nginx 1329 root txt

REG

DEVICE SIZE/OFF

NODE NAME

252,3 1303512 1049447 /usr/sbin/nginx[root@www2201gi ~]# rpm -qf /usr/sbin/nginx
nginx-1.7.0-1.el6.x86_64[root@www2201gi ~]# yum list nginx | grep ^nginx
nginx.x86_64

1.7.0-1.el6@CentALT[root@www2201gi ~]# rpm -ql nginx | grep conf
/etc/nginx/conf.d/etc/nginx/conf.d/geo.data/etc/nginx/conf.d/ssl.conf/etc/nginx/conf.d/upstream-fair.conf/etc/nginx/conf.d/virtual.conf/etc/nginx/fastcgi.conf/etc/nginx/fastcgi.conf.default/etc/nginx/nginx.conf/etc/nginx/nginx.conf.default/etc/sysconfig/nginx/usr/share/doc/nginx-1.7.0/nginx.conf.mod_zip

9リスト3を少し補足すると、
ここで実行したlsofコマンドで、
Nginx

ストールされたものかどうかを確認しています。
whichコマンドがhttp接続を待ち受けていることを確認しましたが、USER列でnginxコマンドがどこにあるかを確認し、次にlsofコマンドのがrootになっている1329番プロセスが親プロセスであること「-p」
オプションで、PID1329番のNAME列と一致することを確認も暗に示しています。
これはTCPやUDPの0～1023番ポートまします。
そしてこれがrpmファイルからインストールされたもの

でを「特権ポート」といい、UNIX系OSではrootしかバインドできかどうかをrpmコマンドの引数
「-qf」
で確認し、
yumコマンドでない(http接続は80番でrootユーザが待ち受けるけど、リクエ

どのリポジトリからインストールしたかを表示します。
最後に、

ストはnginxユーザで実行する子プロセスにforkして、
子プロセ

rpmコマンドに引数「-ql nginx」
を与え、
grepで
「conf」
文字列をスからクライアントに返答させる)ので、必然的にこれが親プロ含むものを絞り込みます。
そうすると、/etc/nginx/conf.d ディレ

セスだとなるわけです。

クトリの配下に設定ファイルがあり、そこにログに関する記述がリスト4では、
Nginxの実行ファイルがrpmパッケージからインあるという当たりをつけることができます(リスト5)。

リスト5 設定ファイルの当たりをつける[root@www2201gi ~]# ls -l /etc/nginx/conf.d
total 2584
-rw-r--r-- 1 root root

1467 Apr 25 08:33 001_LB_WEB_NULLPOPOPO.conf-rw-r--r-- 1 root root

1707 Apr 25 08:31 101_WWW_WEB_NULLPOPOPO.conf(略)-rw-r--r-- 1 root root

2582496 Apr 26 01:13 geo.data-rw-r--r-- 1 root root

466 May 13 2008 ssl.conf-rw-r--r-- 1 root root

370 May 13 2008 upstream-fair.conf-rw-r--r-- 1 root root

283 May 13 2008 virtual.conf[root@www2201gi ~]# egrep '(access_log|error_log)' /etc/nginx/conf.d/*NULLPOPOPO*/etc/nginx/conf.d/101_WWW_WEB_NULLPOPOPO.conf:

access_log /home/logs/nullpopopo.blogcube.info/access_log main;/etc/nginx/conf.d/101_WWW_WEB_NULLPOPOPO.conf:

error_log /home/logs/nullpopopo.blogcube.info/error_log;

しかし、ここまで手間をかけずとも、
最初のlsofコマンド(リスト4にて実行)で以下のようにgrepしてあげれば、実は当たりがつくのですが、たまたまログファイル名に「log」がついているから気づけるだけのことでもあります(リスト6)。

リスト6 実はこれでも当たりをつけられちゃう[root@www2201gi ~]# lsof -p 1329 | egrep '(^COMMAND|log)'
COMMAND

PID

USER

FD

TYPE

DEVICE SIZE/OFF

NODE NAME

nginx

1329

root

2w

REG

252,3

19842 1704992 /var/log/nginx/error.log

nginx

1329

root

4w

REG

252,3

19842 1704992 /var/log/nginx/error.log

nginx

1329

root

5w

REG

252,3

25968363 1704987 /var/log/nginx/access.log

nginx

1329

root

6w

REG

252,3

289656 2497917 /home/logs/nullpopopo.blogcube.info/access_log

nginx

1329

root

7w

REG

252,3

9582 2497952 /home/logs/nullpopopo.blogcube.info/error_log

(略)

10

2014 Octoberさて、
そんなことをしているうちに、先ほどの顧客より催促の電話がかかってきました。

顧客 「ところで http://nullpopopo.blogcube.info/ は繋がるようになったのかね？」
ぼく 「恐らく大丈夫だと思いますので http://nullpopopo.blogcube.info/detarame.html を表示してもらえますか？」

顧客 「『見つかりません ごめんなさい。
リクエストされた投稿が見つかりませんでした。
検索すれば見つ
かるかもしれません。
』と表示されたぞ！」

ぼく 「(少なくともWordPressがエラーを返してあげたな、よしよし)すみません、最初に障害に気づかれたのはいつ頃でしょうか？」・・・(略)電話がかかって来た時、実は顧客にカマをかけていました。
そこそこアクセスのあるサイトの場合、普通にトップページへアクセスしてもらっても、顧客の接続環境がわからないと他のログに埋もれてしまいます。
そこで、わざとデタラメな(404エラーになるような)URLを顧客に表示させて、ログに顧客のIPアドレスを目立つように残します(リスト7)。

リスト7 デタラメなURLの表示をお願いした結果 (接続元IPアドレスは例示のため「あり得ない」数字に置換加工しています)[root@www2201gi ~]# tail -f /home/logs/nullpopopo.blogcube.info/access_log | grep detarame
123.45.678.9 - - [23/Jul/2014:01:17:25 +0900] "GET /detarame.html HTTP/1.0" 404 4449 "-" "Mozilla/5.0 (X11; Linux x86_64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"

少なくとも、
今電話でやり取りした時点で顧客からWEBサーバ

いかがでしたでしょうか。
障害対応は、
MSP事業者でない限へ接続できたことが、
WordPressが生成した404エラー画面(画り、それ自体がお金を生み出す業務ではありませんので、な面に表示された文言で判断)が表示されていることで確認でき

かなか会社から評価されにくいかも知れません。
また、
顧客

ました。
アクセスログでも、ステータスコードは404を示していまや上司からの「詰め」に心が荒むこともあるでしょう。
しかし、

す。
その後、
ログの精査を行い、顧客が繋がらないと申告してきこうした場数を乗り越えたぶんだけ、
必ずタフになれます。
そた時間帯は、
他の回線から繋がっていることが判明したこと、
そして、
インフラエンジニアとしてスキルアップする最大のチャの他エラーログに深刻なエラーがなかったこと、
前後の時間帯ンスでもありますので、是非積極的にトライしてみましょう。

で同じ接続元IPアドレスから接続ができていることを説明し、
穏便にお引き取りいただくことができました。
今回のような障害発生時において、詳細をヒアリングしたいこちらの気持ちはお構いなしに、顧客は大抵お怒りモードです。
少な
くとも「答えが欲しい」と思っている顧客に対して「当時の状況は？
今は？」とこちらからあれこれ質問をするのは、得策ではありません。
このように、
障害対応は時としてこのような胆力を求められることもありますが、これは「会話の主導権をこちらが握る」
ことが目的だったりしますので、案外バカにできないスキルだということも頭の隅に置いておくとよいでしょう。

※1： 実はこの本のプロローグに私が登場しています。
※2： httpのステータスコードは「 Hypertext Transfer Protocol (HTTP) Status Code Registry 」
http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml でIANAが一覧を公開しています。
※3： ただし、振りかかる無茶振りをすべて真正面から受け止めていては身体と心がいくら頑丈でももちません。
1人で悩まず、上司や仲間に相談しましょう。

11

bywritten人
鍋島理
クラウドの普及とともに、ITの技術トレンドはすさまじい速度で移り変わり、技術習得と情報交換、人脈構築の必要性が高まっています。
これらのニーズに答えながら、ITに携わるエンジニアの知的興味を満足させるためのエンジニアのお祭りです。
ITインフラ関連エンジニアと、
ソフトウェア開発エンジニアの両方を対象にしています。

基調講演はServerspecの開発者で、
元paperboy&co.
（現

その後Serverspecはrubygems.orgで30万ダウンロードを記

GMOペパボ）の宮下剛輔氏によるセッション「Serverspecに見録し、各種賞・メディアで紹介されるなど大きな成功を収め、る技術トレンドを生み出すヒント」
です。
Serverspecとは、
サー

さらに発展しつつあります。
なぜServerspecは成功し、トレン

バーの状態をテストするフレームワークで、
文字通りRubyによドを生み出すことができたのでしょうか。
宮下氏によれば、
ソるテストフレームワークRSpecをベースにしています。
最近のト

フトウェア開発で成功したプラクティスをインフラの世界にレンドでもあるテスト駆動インフラ／インフラCIは、宮下氏自持ち込んだこと、最初から普及を意識した活動（ネーミング、身も2007年頃から同様の構想を持っていたそうです。
Puppetキーワードを意識、
英語でドキュメントを書くことなど）、
シンによる構築自動化の後、構築後のチェックを自動化する目的

プルかつ拡張可能であること、いろいろな人を巻き込むこと、で、当 初 は A s s u r e rというツー ルを自作しました 。
しかし

既存のトレンドや影響力のある人にうまく乗っかることなど

Serverspecと違って、振る舞いテストのツールであったことや、が理由です。

様々な機能を盛り込み過ぎ、
複雑なツールになってしまいまし最後に宮下氏は、
日本人にはOSS開発者が少ない現状に触た。
Serverspecほどコンセプトが明確でなかったことや、
宮下

れながら、
技術的トレンドを生み出す近道はないこと、
ただ自氏が現場から離れPuppetにも触らなくなってしまったため、次分がほしい物、面白いと思うものを作り公開し続けることの第に宮下氏自身も使わないツールになってしまいました。
その積み重ねが、
素晴らしいものを生み出すことに繋がると力説

後、再びPuppetを使い始めた宮下氏が、既存のテストツール

し、
以下の言葉で講演を締めくくりました。

で良い物がないか探し始めたところ、
Chefは充実しているのにPuppetにはRSpec-puppetぐらいしかなく、
しかもモジュール

Shut the fuck up and write some codeのテストにしか使えないという現状にぶつかりました。
それな

Openness is our driver for excellenceら自作してしまうか!ということで、同僚がLXCのコンテナをテス

知之者不如好之者好之者不如樂之者トするためにRSpecで書いていたコードを参考に、一日で作り上げたものがServerspecだそうです。

122014 October

とにかくコードを書こうってことですね:D

基調講演後は、各トラックに別れ、セッションやハンズオンが行われました。
話題のDockerの解説・事例や、まだまだ情報の少ないSwiftの解説も行われるなど、インフラにとどまらずITエンジニア全般にとって有意義なコンテンツでした。
ざっとテーマを書き出してみると、
クラウド、
ストレージ、
ネットワーク、
インフラ、
Immutable

Infrastructure、
オートメーション、
CI/CD、
サーバーテスト、
DevOps、
WebAPI/OpenAPI、
オペレーション、
プログラミング、
機械学習、
ビッグデータ、
オープン
データ、
SDN/SDS/SDI、
Security、
CTFと様々なエンジニアのニーズに応えようとしていることが分かりますね。

各社のスカウティングセッションを聞きながらのラ

今や英語で技術情報を参照するのは当たり前の時代、そしンチタイム。
ヘルシーなお弁当で話題の「渋弁」をはてこれからのエンジニアは、
英語で海外に向けて発信したり、人

じめ、数種類のお弁当か脈を築いていくスキルも必要です。
先ほどの基調講演でも、宮ら自由に選べ、飲み物ま

下氏は英語の大事さに触れていました。
いつまでも苦手意識

で着いているという素晴を持っているわけには行きません。
そこで、JTFの目玉企画の一らしいおもてなしでした。

つである英会話カフェに参加することにしました。
最初はマグノランチタイム以外でも、
常リア・コンサルティングの渡部泰子氏による、英語の勉強法に時おやつが用意されておついてのセッション。
日本語と英語を交えながら、「声に出す」
こり、
セッションに集中して疲れた脳の栄養補給とを主体とした効率的な勉強法を学びます。
恐れず、
声に出し

もバッチリです。
スカウティングセッションでは、
ニフてみることが大事との教えを頂きました。
そして休憩を挟んで、

ティやDMM.comラボなどがショートセッションを持

あくしゅのBruce McIntosh氏による実践編。
英語による人脈作

ち、会場に集ったエンジニ

りのポイントを、英語で学びます。
ここから先は原則日本語なし

アに向けてアピール合戦

なので、冷や汗が走りまを展開していました。
年収す。
とにかく声に出してみのホンネ話や、事業にまつることが大事と自分に言わるちょっとエッチな話題

い聞かせ、
身振り手振りをが出るなど、際どいトーク

交えて必死で拙い英語をが繰り広げられ、会場を湧

しゃべりました。

かせていました。

美味しいビールと食べ物に舌鼓を打ちながら、
来場者・スタッフの垣根なく親睦を深めます。
豪華賞品を賭けて「ITウルトラクイズ」が行われるなど、
楽しい時間でした。
本レポートではあまりご紹介できませんでしたが、インフラ色の強いイベントにも関わらず、
コードについてのセッションが多かったことが印象的でした。
インフラエンジニアもコードを書かねばならず、
アプリ開発者もインフラのことを知らねばな
らないのが、
クラウド・自動化時代のトレンドなのかもしれません。
両者の領域が接近しつつある現状を感じることが出来ました。
そしてガイダンスやスタッフの親切さなど、イベントのおもてなし力の高さも印象的でした。
July Tech Festaの名の通り、来年もまた初夏の季節に開催されるはずです。
くつろいだ雰囲気の中で、知識と刺激と仲間を得ることができるイベントです。
まだ行ったことのない方は、是非参加してみてください。

13

四回
第十

皆さんこんにちは。三か月に一度のお楽しみ、シェ
ルスクリプト大喜利のコーナーのお時間です。
もうすぐ 10 月ですね（この記事を作っているのは
8 月なんですけどね）。いやぁ～すっかり涼しくなり載されているコマンド及び機能のみ使用可能とします。これは多くの人が楽しめるようにするためなのです。（JM にあるので、C シェル系での解答
も OK ！

あと ksh、 zsh も OK にしました）

ましたねぇ（ホントか !?）。9 月 9 日のスーパームー

四、sh 大喜利はシェルスクリプトを披露する場なの

ンはホントに大きかったですねー（天気が悪いと見えで、Perl や Ruby、 Python などは使っちゃダメ

ないけどホントに見えたのか !?）。次のスーパームーです。そもそも JM にも載っていません。逆にシェンは……、え、9 月 28 日なんですか、もうすぐじゃ

ルスクリプトにとって不可欠な awk や sed 等はないですか（いやそれは 2015 年だ！）。

OK です。JM にもありますし。でも、よっぽど面というわけで、とにかくもうすぐ 10 月です。『10』といったらテンパズルですよ。ほら、あの電車の切符

白ければ、Perl とかなきにしもあらず ??
五、Open usp Tukubai(http://uec.usp-lab.com/) もの 4 桁の数字を使って 10 を作る遊び。昔よくやりま

使用 OK ！

せんでしたか ? 今日はそれをシェルスクリプトにやられないと採用はキビシいですよ～。

せようというお題に挑んでもらいます。他にもお題はルールもおさらいしたところで、さあ始めましょう !

但し、使う意義がそれなりに感じらありますが、これが一番燃えましたな。結果は読み進

本番開始

めてのお楽しみ。
ではまず本コーナー、シェルスクリプト大喜利のルールのご説明からまいりましょう。

シェルスクリプト大喜利とはシェルスクリプト大喜利特有のルール＜一問目＞
1 ～ n （n は引数で指定） の自然数の中に存在する 『半素数』 を全て求めるシェルスクリプトを書いてください。

一問目の整数問題。sh 大喜利向けのお題を選ぶのが苦しくなってきた感じがするんですが、いくとこまでいきますよー。

一、sh 大喜利はクイズやテストではありませぬ。なの

さて今日求めてもらうのは半素数。これは因数分で決まった答えというものはないのです。あえて解すると 2 つの素数になる、という数です。つまり、言うなら面白いスクリプトが正解！

それ自身が素数というわけではないんですが、でも二、面白いスクリプトとは、例えばこんなもの。

そうですね。さて、投稿された解答は？

ロ、 美しい、芸術的、記述がシンプル、高速、など◎TSB_KZK さんの解答

ハ、 アイデア・こだわりが光る

1 echo "2   scale=03   n=$1
4   for(x=2;x<=n/2;x+=1)5     for(i=2;i<=n/x;i+=1){6       if(sqrt(x) >= i) if(x%i==0)break7       if(x <= i){ニ、 ネタになるバカバカしさ、くだらなさがあるなど。でも最後のは段位強制返還の恐れありよ。:-)
三、ス ク リ プ ト 動 作 環 境 は Linux と し、 基 本 的 にLinux JM(http://linuxjm.sourceforge.jp/) に 記
58

factor とか primes といったコマンドの使い道はあり

イ、 人が考えつかない意外性がある2014 October

C U I 徹底仕事術！
シェルスクリプト大喜利
8         jupper=sqrt(i)9         for(j=2;j<=jupper;j+=1) if(i%j==0)break10         if(jupper < j)11           print x, \" & \", i, \"\n\"12       }13     } " | bc

◎ふじやんさんの解答
1 #!/bin/sh
2 seq 1 $1 | xargs -n 1 factor | awk 'NF==3{print$1}' | tr -d :初参加者ですね。ありがとうごうざいます。おぉ、
これは短いですね！

いやぁ、これはオシいんですよ。半素数を求めてもなるほど、素因数分解するコマンド factor で出てらいたかったんだけど、このコードだと答えとなる半きた素因数の数が 2 つだったものだけ表示するとい素数を構成する素因数が表示されてしまいます。

うわけか、シンプルだね。シンプルなおかげか、そこ

うーん、これは本来なら残念ながら没にしてしまう

そこ速いし。よし、初段授与。これからもよろしくね！
◇

とこなんだけど、今回の投稿で（積を求めるように改造してみても）最速だったんだよね。上手い具合に試行する組み合わせを削減していて…。掲載のみで段位◇◇

さて、それじゃお待ちかね。今回最も熱くなったこのお題行ってみましょう。

授与はナシ。次のお題で健闘してるし勘弁してね。

＜二問目＞◎K 師範の解答

0~9 のいずれかの数字の引数が 4 つ与えられている。 これ

1 #!/bin/sh2
3 primes 1 $(($1/2+1)) |4 while read p; do
5   primes 1 $(($p+1)) | xargs -I@ echo $p @6 done |7 while read a b; do
8   echo $(($a*$b))
9 done |10 while read s; do
11   [ $s -le $1 ] && echo $s
12 done |13 sort -n

こちらは一転してオーソドックスな解答。素数の列
挙は 2 か所の primes コマンドに任せ、得られた素数

らの数字に何らかの四則演算を施して 10 にできる場合のみ戻り値 0 を返すシェルスクリプトを作成してください。

はいっ、というわけで 10 月号に相応しくテンパズ
ルです。1 桁の数字 4 つを四則演算して、10 にするというアレです。10000 通りのうちの 8147 通りが 10にできるので成功率は高いのですが、中には難問だったり、どう頑張っても 10 にできないものがあったりして悔しい思いをすることも。なので、実際のところ
その 4 つの数字は 10 にできるのかどうかを、シェル
スクリプトで判定しようというわけです。
ちょっと難しいお題だったかと思いきや、皆さん頑ペアの積が指定範囲内かどうかチェックしています。

張って解いてくれましたよ。

流れは大体解説した通りですな、師範、いつもあり◎東京 awker さんの解答がとう！一段授与、只今三段。

◎gori.sh 師範の解答
1 #!/bin/bash
2 loopx <(seq $1) <(seq $1)|awk '$1%$2==0'|yarr num=1|awk '(NF==4&&$3^2==$1)||(NF==5&&$3^2!=$4)'|self 1

こ ち ら は も う 一 人 の 師 範、gori.sh さ ん の 解 答。
Tukubai コマンドを駆使して短くしていますね。
これは、primes や factor コマンド、それに平方根等の高度な関数を使わずに素数を出しているんだけどコメントによれば「割り切れる数値が、自分自身の平方根のみか、自分以外で２つだけある場合」とのこと。
なるほど！ 1 つ目の AWK と yarr コマンドで 1 つの数
値の因数を一行に列挙にしてるのか！そして列挙された因数の数を数えて判定するというわけか。うーん、
ナイスアイデア ! これは二段授与だ。現在三段。

1 #!/bin/sh
2 echo $1 $2 $3 $4 |3 awk '{
4   split("1234 1243 1324 1342 1432 1423 \5          2134 2143 2314 2341 2431 2413 \
6          3214 3241 3124 3142 3412 3421 \7          4231 4213 4321 4312 4132 4123",o1);
8   for (i=1;i<=24;i++) {9     split(o1[i],o2,"");
10     print $o2[1],$o2[2],$o2[3],$o2[4];11   }
12 }' |
13 awk '{14   op[1]="+";op[2]="-";op[3]="*";op[4]="/";
15   for (i=1;i<=4;i++) {16     for (j=1;j<=4;j++) {17       for (k=1;k<=4;k++) {18         print $0, op[i], op[j], op[k];19       }20     }21   }
22 }' |
23 awk '{59

1   print $1,$2,$5,$3,$6,$4,$7,"p";2   print $1,$2,$5,$3,$4,$6,$7,"p";3   print $1,$2,$3,$5,$6,$4,$7,"p";4   print $1,$2,$3,$4,$5,$6,$7,"p";5 }' |
6 awk '{
7   cmd = "echo \"" $0 "\"|dc 2>/dev/null";
8   cmd | getline ans;
9   close(cmd);
10   if (ans==10) { ret=1;exit; }11 }12 END {exit 1-ret;}'いこと活用したり、交換法則の成り立たない減算と除算で dc のスタック順序を入れ替えるなどの工夫が随所に見られて、確かにこれは熱いコードですな。
いやぁ、抜かりない配慮と工夫で速さと正確さを両立したね。またまた素晴らしい、二段授与して五段だ。

◎TSB_KZK さんの解答の難問の一つに “1199” というのがあって、(1+1/9)*9

1 #!/bin/sh
2 nums=`echo $1 $2 $3 $4 | xargs -n 1 | sort | tr
-d ' \n'`34 res=`curl -s "http://ja.wikipedia.org/wiki/テン
パズル" |
5 tr -d "\n"                                     |6 sed "s/<table/\n<table/g"                      |7 grep "\"make10\""                              |8 grep -o "<td>[0-9]*</td>"                      |9 grep -c "$nums"`
10
11 if [ $res -eq 0 ] ; then exit 1; fi
12 echo "make 10!"という有理数計算をしないと解けないものがあるんではい、一問目に続き投稿ありがとうございます。しおっとこれは久しぶりの東京 awker さん。しかし結論から言いますと、残念！これ不正解なんですよ。
10000 通り試してみたところ、“0269” などの 10 にできない数の一部もできると判定されてしまいました。
原因は dc コマンドの計算精度の考慮しなかったことですね。計算精度を考慮しないと解けないテンパズル

すけど、これは意外にも 10 にできると判定。どーやっ

かし、こ、これは……。

てるんだろうと思ったら、1+1/9+9 の 1/9 を 0 に四君、そういうことするかね。Wikipedia の答えを使捨五入して、それが結果的に合っていたみたいです。

うのはチートなのでボツね。……なーんてこと言わな

うーん、dc に着目したのはよかったんだけど。おい言わない。面白ければ何でもアリよ、大喜利は！

しいねぇ。残念ながら段位授与ならずだ。現在六段。

インターネットを引けば答えがすぐ見つかるという◎gori.sh 師範の解答のも、いい時代になったもんだよ。確かこういうのを

1 #!/bin/bash
2 [ -z $4 ] && exit 0
3 tmp=tmp
4
5 echo a$1 b$2 c$3 d$4 | tarr > $tmp-a
6 echo '+ - * / r- r/' | tarr > $tmp-b
7 echo p > $tmp-p
89 loopx $tmp-a $tmp-a $tmp-a $tmp-a    |10 sed '/\([a-d]\).*\1/d'               |11 tr -d abcd                           |12 loopx - $tmp-b $tmp-b $tmp-b $tmp-p  |
13 tee $tmp-d                           |14 dc -e 10k -f - 2> /dev/null          |15 grep -q '\(^9\.9*$\)\|\(^10$\)\|\(^10\.0*$\)' ||16 cat $tmp-d                           |17 self 1 2 5 3 4 6 7 8                 |18 dc -e 10k -f - 2> /dev/null          |19 grep -q '\(^9\.9*$\)\|\(^10$\)\|\(^10\.0*$\)'Web スクレイピングって言うんだよね。三度目の正直

こちらは gori.sh 師範の解答。10000 通り試したとたんですが……。うーん、やっぱり難しいみたいですで段位授与だ。二段授与して、七段。
◇◇◇

さて、最後はいつものヘンなお題。
＜三問目＞
名前付きパイプを作るコマンド mkfifo がありますね。 でもアタクシ、 なかなかうまい使い道を思いつきません。
そこで、 あなたの知ってる mkfifo （名前付きパイプ） のウマい使い方を披露してください。

皆さん使ったことありますか ? このコマンド。というか、名前付きパイプって知ってます ? まぁ、名前付
きパイプの存在は知っていたとしても、なかなか使い
道無いですよね。そこであえてお題として募集してみころ……、はい正解！！さすが師範です。dc コマンドね。投稿作品をいくつか紹介しましょう。

を使うアプローチは東京 awker さんと同じですが、◎イタローさんの解答

こちらは dc に -e 10k オプションを付け、grep で端数判定をしてちゃーんと見てますね。しかも速い！

$ mkfifo detonator$ (cat detonator >/dev/null; echo 'Bomb!') &総 当 た り で 組 み 合 わ せ を 生 成 す る loopx コ マ ン ド

投 稿 コ メ ン ト に は「echo 'Bomb!' の 部 分 が rm -rf(Tukubai) を使っているものの、一時ファイルをうま~/* とかだったらきっとイヤでしょ ? つっかえている60

2014 October

C U I 徹底仕事術！
シェルスクリプト大喜利
cat コマンドを kill すると即座に Bomb! するというブー
ビートラップがありますからね」と書いてありました。
うーん…mkfifo の応用例では、こんな感じの「つっ

投稿大募集
次回のお題

かえ棒を外すと事を起こす系」の投稿がいくつかあっ

一、1 ～ n（n は引数で指定）の自然数の中に存在する

たけど一番陰湿な君のを採用したよ。確かにこれを安「回文数」を列挙するシェルスクリプトを書いてく全に解除するのは一手間だ。cat の親プロセス ID をださい。単純なお題ですから、ひとヒネり利かせ

探して kill してから、cat のプロセスを kill せんといてくださいよー。
（変わった解き方や、特定のコマ

かんよね、こういう具合に。あぁ、何て厄介な。
$ ps -o args,ppid,pid | grep "^cat detonator" | tr-d a-z | xargs -n 1 kill

mkfifo の役立つ例じゃなくてむしろ余計な例だけンド使わない縛り、珍しいコマンド使うなどなど）
二、横10 桁×縦 10 行でハイフン “-” が敷き詰められ、そのうちのいくつかがアスタリスク “*” で書き換えられたテキストがあります。これを入力データ

ど、まぁいいか。一段授与。これで四段だよ。

とし、マインスイーパーのように、自分のいるマ◎たまさんの解答

スの周囲 8 マスにある “*” の数を数えて 1 個以上$ mkfifo p1 p2$ cat p1 | md5sum &$ cat p2 | wc -c &$ cat $file | gzip | tee p1 | tee p2 > $file.gz &であれば数字に置き換えるシェルスクリプトを書
いてください。
三、カレンダには日曜始まりのものもあれば月曜始ま

投稿コメントによれば、こちらはダウンロードファりのものもあり、世界を見渡せば土曜始まりなん

イル作成時に必要とされがちなファイルサイズとてものもあります。しかし、UNIX の cal コマンド

MD5 値を、名前付きパイプでいっぺんに求められまは日曜始まりでしかありません。

すよ、という投稿です。

そこで、引数で 0（日曜）～ 6（土曜）の数値を与え

うーん、アイデアはいいと思うんだけど、gzip してできたファイルに後から md5sum と wc をすればいいんじゃないかなぁ。いまいち実用的じゃないよねぇ。というわけで残念ながら段位授与無しかな。

ると、その曜日始まりで今月のカレンダーを表示
するシェルスクリプトを書いてください、

投稿のしかたお題への解答は、お名前（ペンネーム）、解答した◎shu-1 さんの解答$ mkfifo foo$ ls -F foo$ rm foo

いお題番号、解答スクリプト、簡単な補足の四点セッ
トで下記の宛先へ。一人何問でも何個でも解答可！

最初これの何がいいのかさっぱりわからなかったん

尚、次回締め切りは 11 月 10 日 （月） 午前 0 時ですが、コメントによればスマートフォンからターミとします。雑誌は月刊化しましたけど、本コーナーは

ナルにログインしている時、パイプ記号 “|” を入れる

今までのペースでゆる～く続けていきます。約二か月のが意外と面倒で、こうやって “|” を表示させてコピ後の締め切りまでじっくり考えてください。それまでペするのだそうです。

何度でも解答の投稿と修正を受け付けます。

なるほど ! ls -F って確かにファイル名の後ろに “*”、“/”、“@”、“|” といった記号類を表示するねぇ。中でも“|” はパイプに多用するから、知ってると便利なのか。
mkfifo の意外な実用性を知ったよ。よし初段授与 !
◇◇◇いやぁ、今回は極めて面白い投稿があった一方で段位授与せずに終わった投稿も多かったねぇ。
といったろころで本日の大喜利はこれにてお開き！
読者の皆さん、投稿してくれた皆さん、今回もありがお題もどしどし送ってくださーい
お 題 の 投 稿 も 大 募 集。 こ っ ち は 締 め 切 り な し でずーっと募集中。そして、考えてくれた方にも段位を授与します。自分で出題して解答するのも、OK ！

投稿先
どちらも投稿先は、です。面

白ければ何でもあり ! じゃんじゃん投稿待ってます !

とうございました。
61

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

ユニケージ開発手法教育講座「ユニケージ開発手法教育講座」は、ユニケージ開発手法におけるデータ管理の方法や、オリジナルコマンドの使用方法などをハンズオン形式で具体的に学べる講座です。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 年 9 月現在のものです。最新の情報は弊社ホームページにてご確認ください。

ISBN 978-4-9048-0712-5
C3455 ￥500

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