北のDC

!
記
訪

探

ポ
レ
会
強
勉
撃
一
張
USP友の会出Writer：濱田康貴

みなさんこんにちは。@nullpopopo でございます。USP友の会をよくご存知の方は、友の会=シェル芸というイメージが強く、友の会という名前を知らなくても「シェル芸」「危険シェル芸」というアブノーマルワードをTwitter上で見かけることが多いかと思いますが、「そろそろシェル芸以外の勉強会をやりたいよね。」という声があがり、2014年9月から「一撃シェルスクリプト勉強会」
をはじめました。
その際、さくらインターネットさんには、会場を貸していただいたり、開発環境としてさくらのクラウドを利用させていただいており、一撃スク
リプトが動くクラウドのサーバーがどのようなものかを知ることでサーバー構築の理解が深まるであろうということで、
この度、石狩データセンター（以下石狩DC）の見学をさせていただけることになりました。
また、合わせて第2回一撃サーバー構築シェルスクリプト勉強会（さっぽろ！）も札幌で開催して来ましたので、こちらの様子もレポートします。

北海道を訪れた11月初旬は紅葉が綺麗でしたが、石狩DC訪問の日は起きたらなーんかしばれるなーと思ったら朝から雪がチラついておりました。
わやですね。
地下鉄の駅からタクシーで石狩DCへ向かったのですが、ちょっと離れたところから撮影しても建物が横に広くてすべてが収まりきりません。

この日は宮下センター長と広報の室野さんにご案内いただきました。

42015 February

エントランスを入ると、このようなオシャレなゲートを通過します。サーバーやネット
ワーク機器などの搬入は別の搬入口から行うそうで、後ほど触れますが、ここにも一つ工夫があるそうです。

ここからAC6600Vに降圧され、高圧トランスでさらにAC400Vへ降圧します。ACサーバーではUPSへAC400Vで入力し、ACからDCへ変換してバッテリーへ蓄電し、さらにDCからACへ変換しAC230Vを出力します。
そこからさらにサーバー電源ユニットでは230Vを入力し、DC12Vを出力します。一方
DCサーバーではPSラックへAC400Vで入力し、ACからDCへ変換してバッ
テリーへ蓄電し、DC340Vをサーバーラック内にある集中電源ユニットへ送り出します。集中電源ユニットでは、DC340VからDC12Vへ変換し、サーバーへ送り出します。

石狩DCの電源は66000Vの特別高圧で受電しています

石狩DCでは、通常のACサーバーとDCサーバーが稼働しており、現在はACサーバーの割合が多いそうです。

( 画像提供：さくらインターネット )さて、先ほど機器搬入に一つ工夫があると書きましたが、こちらが機器の搬入口となります。

空調は常に20度に保たれており、搬入された機器はここに1日
半 程 度 寝 か せてからサ ー バ ー
ルームに搬入します。

冬場は屋外と屋内の気温差が激しく、結露を防止するのが目的だそうです。また、搬入直後の機器を段ボールから出しても素手で持てないくらい冷たいのも、ここで寝かせておく理由の1つだそうです。北海道
ならではの工夫ですね。

宮下センター長と私が立っている先にあるのがターボ冷凍機です。
通常は外気を取り込んでサーバー室を冷却するのですが、夏場の外気が高温多湿になった際にはこれを動かして冷気を取り込みます。2011年の開所時には年間100時間の稼働を想定していたのですが、2014年の夏は1500時間を超えた稼働だったそうです。

5

北のDC

記!

探訪

撃勉強会レポUSP友の会出張一監視センターにはPUE(※1)や外気温がプロットされるモニターが表示されているのですが、1号棟がフルに稼働し、2号棟にもラックが入り始めている状態でPUEが1.08～1.26でした。

石狩DCの外気冷房は壁吹き出し方式と天井吹き出し方式の2種類で、取り入れた外気をサーバールームの壁から真横に送り出すか、天井から送り出すかの違いがあります。

冷却効率はどちらもそれほど変わらないそうですが、壁吹き出し
方式は大きなファンの少数設置でよい反面、作業者が寒い、紙のマニュアルが飛ばされるといったデメリットがあるそうです。天井吹き出し方式は壁吹き出し方式のデメリットを解消できるものの、小さなファンやラック上部の排気ダクトをラック列ごとに取り付けなければならないそうです。

外気を取り込む際には、このようなフィルタを通します。海に近いので、塩害防止のために除塩フィルタをこの奥に設置しているそうですが、こちらは予想外に塩が入り込まないとのことです。

窓からの眺めは最高です。取材に訪れた日は晴れていたので、手稲山までハッキリ見えます。現在2号棟まで完成している石狩DCですが、8号棟まで建てられる分の用地を取得
済みとのこと。実に広々としています。

そして、建物周辺の私道はDCからの排熱でロードヒーティングをしています。

共連れ防止のゲートをくぐった先は、いよいよサーバー室です。
まず目に飛び込んでくるのがHVDC DC12Vシステムのサーバーラックです。
※1 PUE(Power Usage Eﬀectiveness): データセンターやサーバー室のエネルギー効率を示す指標の1つ。
データセンター全体の消費電力をサーバーなどのIT機器の消費電力で割った値で、これが1.0に近づけば近づくほどエネルギー効率がよい。通常の都市型DCではPUEが2前後。

62015 February1Uハーフサイズのサーバーが多数稼働しています。これらはさくらの専用サーバーで用いられているものだそうです。

ァする
様がハァハ
皆
な
き
好
uxやUNIX
皆さん！Lin しまいましたよ！
てけ
物を見つ
こちらはサーバー室の電源ラックなのですが、ラックの前に立つだけで分電盤などの状況をモニターで見ることができるのです。
え？それだけ？と思われるかも知れませんが、なんとこれ、GNOMEのアプリケーションなん
ですね。
（※2）

そして、
この自動扉の向こうは2014年2月より運用開始
した2号棟サーバー室です。

1号棟の扉は手動だったのですが、田中社長自らサーバーを運んでラッキングしに来たときに「扉は手動よりも自動がいいよね。」と言ったのが自動扉を採用したキッカケだそうです。
写真には写っていませんが、廊下からサーバー室は段差がなく、台車でサーバーを運んでも荷崩れする心配がありません。

宮下センター長は「1号棟では予想以上に排熱効
率や電力効率が良かったので、2号棟はもっとラッ
クをギチギチに詰めなよと田中社長からプレッシャーをかけられました。」と語っておられました。

最後に見せていただいたのは、休憩室です。テーブルエリアと畳エリアがあり、お菓子やパン、飲み物の販売もあります。
大雪で帰れなくなったときはここで夜を明かすこともあるそうで、まさに北の大自然、試される大地といったところでしょうか。

※2 GNOME: X Window上で動くデスクトップ環境。http://www.gnome.org/

7

一通り施設を見学したところで、会議室にてインタビューを行いました。

濱田：2014/11/15に石狩DC開所3周年を迎えますが、感想的に測っています。手順改善をしてくれた人を表彰するようを聞かせてください。

な制度も設けて、
自発的に改善していく仕組みを作っていますね。

宮下：(開所から3周年を迎えたのが)早いなーという印象と、大きなトラブル無くやってこれたのが良かったと思いま

濱田：それはボトムアップ的なアプローチでしょうか？

す。他のDCではやっていないであろう新しい試み、例えば外気冷房を取り入れたりですとか、そうした試みを導入し

宮下：そうですね。ボトムアップで運用改善していくよう、つつも大きなトラブルが無くて良かったです。
あとは1号棟

ここ数年取り組んでいます。今年からは私のいる運用部にが早く埋まってよかったですね(笑)。本当は3年で埋まるこ

関しては、各エリアにマネージャーを置いて、各拠点にはとを目標としていましたが、2013年に2号棟の運用を開始

リーダーを置いて、各エリアで決済が早くできるようにしますることができました。

したし、東京に複数ある各DCにリーダーを置きましたので、センターごとに素早く反応できるというような仕組みを作り

濱田：通常、DC運用は目新しいことをあまりやらず、決まっました。

たフローに忠実なイメージがありますが、新しいことをや
これだけは必要！

りつつも無事故という品質を保っているのには、
どういった

濱田：サーバー構築の自動化などの仕組みはありますか？

工夫をされているのでしょうか？
宮下：ツールの開発はだんだん出来始めていますが、正直
宮下：サーバー運用ですと、ヒヤリハットを挙げて日々改善

なところ新しいことをやりながら運用部での開発は厳しいしたりですとか、設備設計ですと、業者さんと一緒に実験しですね。ansibleなどもやりたいですし、個人的に始めている

たり導入検討したりして進めています。設備担当の者がのですが、現在BIOSやIPMIの設定は手動でやっているの

元々建設業界にいたので、そういう知識をもとに弊社が主で、今後は物理的なハードウェア設定を自動化したいとは体となって、業者さんと協力して進めていったので大きな思っています。
メーカー製のツールを中心に探しているんで事故に繋がらなかったのかなと思います。全てにおいて当

すけど、メーカーが提供しているツールでは実現できない

事者意識を持って一人称で取り組んで、全てにおいて業者

機能は、キー入力の再生ツールなどで多台展開してみたいさんに投げっぱなしにしないというやり方でやってきていなとは思っています。

ます。
濱田：最近ですとスイッチやルーターも物理的な結線の制
濱田：日々の運用オペレーションでどのように運用改善な約から開放されつつありますが、
ネットワーク設計や運用のどに取り組まれていますか？

自動化も検討されていますか？

宮下：先ほど申し上げましたヒヤリハットの他にも、いろん

宮下：レイヤ2スイッチについては、APIが搭載されているもな各種サービスを扱っていますので、サービスごとに手順のはこれにアクセスして設定することで自動化しています。

があるんですけども、手順は作りっぱなしにせず常に改善

あとはDOS攻撃の検知も自動化しています。今までは手動するようにしています。
どれだけ改善しているのかは定量

オペレーションで30分くらいかかって対応していたのが、自82015 February

開所３周年の意気込み

動化によって数分でできるようになりました。
こうしたオペレーションの自動化というのは各部署でキーワードになっ三谷：いつも仲間がRISING SUNに行くのを家からTwitterで見ているのですけど、去年までは『行ってきます』から『たていますね。

だいま』まで様子が伝わってこなかったのですが、今年は濱田：今年のRISING SUN ROCK FESTIVAL 2014 in EZO(※3)

真を載せたりするので、リアルタイムで様子がわかります(以下RISING SUN)で公衆無線LANを提供されましたが、参加のキッカケは何だったのでしょうか？
宮下：去年のさくらの夕べ＠札幌の懇親会で、そんな話がありまして・・・
三谷：そうです、
澤田(local代表理事)が直訴しにきまして(笑)
宮下：私もRISING SUNは個人的に見に行って好きでした
し、前の年に会場に行ってTwitterでつぶやくにも時間がかかるという経験をしましたので、そのアイデアをもらってすごかったですね。みんながツイートしたりFacebookに写ね。事情に詳しい人は『さくらさんのおかげだ』て言ってました(笑)。RISING SUNに行った人も行けなかった人も、リア
ルタイムで楽しむことができましたね。
宮下：今年イベンターさんとの接点もできたので、今後拡大できたらなーと思います。
濱田：2015年夏のRISING SUNに参加する予定はありますか？
宮下：桜井とは社内的な作戦どうするか、
イベンターさんにどういうアプローチをしていくかの作戦会議を先日行いま

やってみようと思ったのがキッカケですね。

した。

濱田：アンテナ以外は自前で建設されたそうですね。

室野：やらないという選択肢はまったくないですね。

宮下：アクセスポイントに関しては札幌の会社さんに協力してもらいましたが、設定やアンテナまでの配線は自分たちでできました。来年やれるとしたら、もっと自分たちでできる

宮下：こうしたイベントへの協力を、社内実地研修や新人研修の場にもできたらいいですね。4月入社の新人が構築に携わって夏8月に卒業できるみたいなのも面白いと思って率を増やしたいですね。

います。
あとは、
さくらに入社するとこういったイベントの仕濱田：会場まで結構な線路長がありますよね？

なげていきたいですね。

宮下：石狩DCから会場までは300mあります。センターと会

濱田：RISING SUNのときに一番苦労されたのはどんなこと

場間は無線ですが、センターのサーバー室から屋上のアン事にも参加できるというメリットも押し出して求人にもつでしょうか？

テナまでは90mほどLANケーブル配線をしました。今までは屋内のケーブル配線しかしないので、屋外用のLANケーブ
ルは硬くて重たいなーと思いながら配線した思い出がありますね(笑)※3
RISING SUN ROCK FESTIVAL 2014 in EZO: 毎年夏に石狩湾新港 野外特設ステージで開催されている国内最大級の野外オールナイトロック・フェスティバルイベントの1つ
http://rsr.wess.co.jp/2014/index.html

9

宮下：特に目新しいことをやったわけではないのです

濱田：オペレーターの訓練や教育は、どのようにされていが、業者さんの手配とか、どういう設計にしようかとか、ますか？

(屋外ネットワーク構築は)初めてのことだったので、手探りでした。はじめはセンターから会場まで光ケーブル

宮下：石狩DCで働くオペレータの教育に関して言えば、物を敷設しようという案が出たのですが、見積もりを取っ

理的な作業が中心ですので、ハードウェアの仕組みやRAID

たら10日間で数百万円かかると言われてしまいまして。

について、IPMIについてなど、ハードウェアに関する教育メ

なんとかならないかと思っていたところに無線にたどり

ニューを中心に行っています。あとは物理的な結線やラッつきました。屋上のアンテナマストも最初は自分たちでク内のエアフローの基礎知識、電源コンセントの種類につ建てようと思っていたのですが、高さもありますし、風がいても触れますね。特殊な形状のコンセントも扱ってます

あることも考えると、作業時の安全という観点で、最初ので。意外に思われるのですけど、在庫の処理についてはの年は自分たち素人じゃ無理だなーと。
こうした工事を教育に時間をかけています。帳簿をつけるのに在庫管理してくれる業者さんを見つけるのに苦労しましたね。中のシステムを使っているのですが、これのオペレーションのネットワークやルーターの設定はいつもの延長線上が意外と難しいので。あとはサーバー構築に関しては、自だったので問題なくできましたし、監視などもいつものようにできました。
濱田：石狩DCへの見学は今もよくDCの設計は作業員の効率や健康を考えます訪れる人はいるのでしょうか？
宮下：開所当初よりは減りましたが、他のDCよりは多いですね。
月に２～３件くらいですね。利用を検討されている方が半分、取材が半分ですね。運用中の苦労話はよく聞かれます。何人くらい働いてますかというのも聞かれますね。
これだけは必要！

室野：現地採用はありますか？という質問もよくされます。
宮下：自治体さんなどのような、データセンター誘致を検討されている方は、雇用の話は気になるみたいです

動化は進んでいるんですけど、ね。利用を検討されている方は運用に関する質問が中一部手動でファイルを設定しな心ですね。あとは周囲に何もないので、従業員のお昼ければいけない箇所があるので、ご飯はどうしてるんですかということも聞かれます(笑)。

viの使い方を教えたりですとか、UNIXの基本コマンドを教えたりは

濱田：ここらへんセイコーマートくらいしかないですよしていますね。

ね・・・やはりお弁当作って持ってくる人とかが多いので
濱田：サーバー構築でのオペレーションは、自動化が進ん

しょうか？

でいるということから、確認のコマンドを実行することが多宮下：11時くらいになると『お弁当屋さんがきました』
っいのでしょうか？

てアナウンスが流れるので買いに行く人もいますね。周囲に工場があるので、お弁当屋さんの巡回コースに宮下：確認の工程もありますし、さくらの専用サーバーは基なっているんですよ。周囲に工場もなくてうちだけだっ本セットを一旦構築するのですが、お客様からオプション

たらお弁当屋さんが来てくれるかどうか・・・(苦笑)のオーダーがあったりすると、一旦サーバーをラックから外して、例えばストレージをSSDに変更したりなどのカスタ

102015 Februaryマイズを行います。
こうした際にファイルを編集することはあります。
あとは障害対応でファイルを編集したりということもありますね。
濱田：ネットワークのオペレーションは自動化などを行っていますか？
宮下：うちのチームですが、
ネット
ワークのオペレーションは物理的な配線が中心で、基本的なconﬁg
投入までを行います。
それ以降は運用チーム(東京や大阪)に任せています。

ITを使って音楽フェスを盛り上げた。
きっかけは懇親会ても、物理的な作業がメインですが、それに伴う運用ツールの開発を自分たちでできるようにしたいです。最近のエンジニアの方って、WEBのフロントエンドですとかソフトウェア会社のインフラエンジニアでもクラウドに移行して物理サーバーを見る機会が減っていますけ
れども、幅広いレイヤーで深く対応できるエンジニアを育てていきたいですね。
三谷：空調の壁吹き出しと天井吹き出しの2種類を同時に採用した理由を教えていただけますか？
宮下：実験が契機ですね。壁吹き出しはあまり例がないのですが、導入当初は、空気の均一性が悪いのではないかということを懸念していました。一方で、天井吹き出
しは空気の流れを作るためにダクトを作らなければならないという手間と部材の費用がかかります。天井吹き出しの空調機(ファン)に関しては、遠くまで空気を運ぶので強力なファンにしなければいけないので、電気代もイニシャルコストもかかってしまいます。反面、壁吹き出しにするとダクトも不要で、ファンのモーターも小さくでき電力もかかりません。それぞれメリット・デメリットがあるので、両方導入してみようということになりました。
導入していろいろと計測してみると、空調能力は壁吹き出しのほうが均一性がなくなるという懸念はありましたが、各サーバーラックにセンサーを入れて温度を測ったら、そんなにバラついておらず、両方式でそんなに空調能力に大差はなく、差異は許容できる範囲でした。ただ、壁吹き出し方式は人に直接風が当たってしまいます
ので、長時間作業が辛いです。
ラッキング作業は1回に何十台と行いますので、短くて半日、通常1日作業になっ濱田 ：最後に、『こんなサービスを予定している』『こんなサービスをやりたい』『こんな石狩DCにしたい』
といったことはありますか？
室野：IaaSの範疇を超えるサービスにまで手を広げるという予定はなく、
あくまでインフラに関するサービスを安価に提供することを大前提にしています。
宮下：AWSさんは大小含めて200以上ものサービスがありますが、さくらはそういった追求はせず、範囲を絞って開発していこうという話は代表(田中社長)からもありまして。石狩てしまい、作業員の効率や健康を考えると天井吹き出しのほうが良いだろうという傾向です。なので、ほとんどのラックは天井吹き出しにしています。ただ、壁吹き出しを諦めるのは勿体無いねって話もありまして、風が直接人に当たらないようにフィルタをラックとラックの間に入れてみたりというような実験をしています。
コスト面でも壁吹き出しのメリットもありますので。
濱田：本日はどうもありがとうございました。

DCに関しては、自社の設備だからこそできることがいっぱいあるのですが、例えば空調ですとか、HVDCなどがありますので、こうした最新の設備を常に取り入れられるようなデータセンターにしたいです。
日々のオペレーションに関し取材協力

三谷公美 / Kumi Takahashi MITANI（一般社団法人 LOCAL）
宮下頼央（さくらインターネット）
室野奈緒美（さくらインターネット）11

＃！＄！＃！＄！＃！＄！＃！＄！＃！＄！＃＃！＄！＃！＄！＃！＄！＃！＄！＃！＄！＃
司会：『もっと吹く』編集長・みかん

五回
第十シェルスクリプト大喜利
皆さんこんにちは。三か月に一度のお楽しみ、シェ

で、Perl や Ruby、 Python などは使っちゃダメ

ルスクリプト大喜利のコーナーのお時間です。三か月です。そもそも JM にも載っていません。逆にシェに一回のはずが、出題の不手際で連載が一カ月遅く

ルスクリプトにとって不可欠な awk や sed 等はなってしまいました。ごめんなさい。

OK です。JM にもありますし。でも、よっぽど面

もたもたしてるうちに年が明けてしまいまして、今
ひつじ

年は未年なんですってねぇ。ヒツジといえば鳴き声は白ければ、Perl とかなきにしもあらず ??
五、Open usp Tukubai(http://uec.usp-lab.com/) も「メェ～」ですが、そういえばヤギも同じだったよう

使用 OK ！

な……。ってことで、Web で検索したら鳴き声を比れないと採用はキビシいですよ～。

較する動画があったんです。ヒツジは 「メー」 でヤギ

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

但し、使う意義がそれなりに感じらは 「メェェ」 と鳴いてました。いやぁ、12 年前はこん

本番開始

な簡単に疑問解決できたかな？
さてそれでは本コーナー、シェルスクリプト大喜利のルールのご説明からまいりましょう。

シェルスクリプト大喜利とはシェルスクリプト大喜利特有のルール
一、sh 大喜利はクイズやテストではありませぬ。なの＜一問目＞
1 ～ n （n は引数で指定） の自然数の中に存在する 『回文数』 を全て求めるシェルスクリプトを書いてください。

年が明けてもやっぱり一問目は整数問題です。
今回は回文数です。つまり、各桁の数字が左右対称になっている数のことです。以前、回文を判定するお題を出していただけに、ちと簡単だったかな？

で決まった答えというものはないのです。あえて◎K 師範の解答

言うなら面白いスクリプトが正解！

1 #!/bin/sh2
3 seq $1 |4 while read n; do
5echo $n | fold -w 1 > $$.1
6
tac $$.1 | diff $$.1 - > $$.2
7
if [ ! -s $$.2 ]; then8echo $n
9fi
10 done11 rm $$.?

二、面白いスクリプトとは、例えばこんなもの。
イ、 人が考えつかない意外性がある
ロ、 美しい、芸術的、記述がシンプル、高速、など
ハ、 アイデア・こだわりが光る
ニ、 ネタになるバカバカしさ、くだらなさがあるなど。でも最後のは段位強制返還の恐れありよ。:-)
三、ス ク リ プ ト 動 作 環 境 は Linux と し、 基 本 的 に

まずはヒネリがないと謙遜する K 師範の解答から。

Linux JM(http://linuxjm.sourceforge.jp/) に 記

いやいや、回文数を作るのに fold で縦並びにして載されているコマンド及び機能のみ使用可能としtac で反転するあたりはアイデアだね。しかも diff のます。これは多くの人が楽しめるようにするため出力が無し（＝等しい）なら回文数と。師範、いつもなのです。
（JM にあるので、C シェル系での解答

ありがとう！一段授与、只今四段。

も OK ！

◎そよかぜさんの解答

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

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

2015 February

1 #!/bin/shC U I 徹底仕事術！
シェルスクリプト大喜利
今のようにバラエティーに富んだスマホゲームなど

2 awk -v n=$1 'BEGIN{for(i=1;i<=n;i++){print i}}' |awk '{for(i=length($0);i>0;i--){printf("%s",substr($0,i,1))}print "",$0}' | awk '$1==$2{print $1}'
scale=0

無かった頃、あるいは Windows や Linux に GUI 環境

初投稿のそよかぜさん。こちらは実質ワンライナー

ンスイーパー（もどき）を。プレイして、爆弾に触れを入れたばかりの頃、よくやりませんでしたか、マイてゲームオーバーになると、各マスに周囲 8 方向にですな。
全部 AWK か！最初の AWK で数列作って、次ので逆並びの数を作り、最後ので回文判定をしてるわけね。
最初の AWK なんかは seq コマンドでもっと短く書け

隣接する爆弾数がパッと表示されますよね。アレがやりたいんですよ。
行を跨いだカウントをどうやるかが腕の見せ所のこるけど、それはきっと AWK だけで済ませようというのお題。さて、どんな解答が来たのでしょうか。

こだわりだろうね。ありがとう。初段授与。

◎fkd.sh さんの解答◎ふじやんさんの解答
1 #!/bin/bash
2 seq $1|
3 sed 's/.*/ &\n&/'|4 sed '/^[0-9]/s/.*/echo & | rev/e' |5 sed 's/ //g'|
6 uniq -c|
7 sed -n '/2 /{s/.* //;p}'

一 転 し て 今 度 は、sed が い っ ぱ い 並 ぶ 解 答 で す。
まぁ、2 回目の投稿ですね、ありがとうごうざいます。
添付のコメントによれば「uniq コマンド以外は全部sed で頑張りました。嘘です。頑張っただけです」とのことです。なんじゃそりゃ！
ぱっと見は uniq 以外 sed に見えるけど、いやいや
最初は sed じゃなくて seq だし、途中で echo や revが出てくるしいろいろ使ってるじゃないか。
でもアイデアはいいね。1 個目の sed で値をもう一行複製して、次の sed でその片方を rev コマンドによって反転させ、最後の uniq と sed で連続出現したもの（＝回文数になっているもの）を見つけて残しているわけだ。面白い、一段授与。只今二段。
◇◇◇

では、二問目いきましょう。
＜二問目＞
横 10 桁×縦 10 行でハイフン “-”が敷き詰められ、 そのうちのいくつかがアスタリスク “*” で書き換えられたテキストがあります。 これを入力データとし、 マインスイーパーのように、 自分のいるマスの周囲 8 マスにある “*” の数を数えて 1 個以上であれば数字に置き換えるシェルスクリ
プトを書いてください。

- - * - - - - - - - - - - - - - - - - * - - - - - - - - - - - - - - - - - - - - - - * * - - - - - - - - - - - - * - - - - - - - - - - - - * * * - - - - - - * - * - - - - - - * * * - 1 * 1 - - - - - 1 2 2 1 - - - - - 1 * 1 - - - - - - 1 1 1 - - 1 2 2 1 - - - - - 1 * * 1 - 1 1 1 - 1 2 2 1 - 1 * 1 - 1 2 3 2 1- 1 1 1 - 2 * * * 2- - - - - 3 * 8 * 3- - - - - 2 * * * 2

1 #!/usr/local/bin/bash
2 # usage: $ bash maine.bash < maine.txt
3
4 declare -A A C
56 for i in {1..10}; do
7 read A[$i:1] A[$i:2] A[$i:3] A[$i:4] A[$i:5] A[$
i:6] A[$i:7] A[$i:8] A[$i:9] A[$i:10]
8 done910 for i in {1..10}; do
11 for j in {1..10}; do
12 if [ "${A[$i:$j]}" = "*" ]; then13
C[$i:$j]="*"
14 else15
if [ "${A[$(($i-1)):$(($j-1))]}" = "*" ]; then16
let C[$i:$j]++
17fi
18
if [ "${A[$(($i-1)):$j]}"= "*" ]; then19
let C[$i:$j]++20
fi
21
if [ "${A[$(($i-1)):$(($j+1))]}" = "*" ]; then22
let C[$i:$j]++
23
fi
24
if [ "${A[$i:$(($j-1))]}"= "*" ]; then25
let C[$i:$j]++26
fi
27
if [ "${A[$i:$(($j+1))]}"= "*" ]; then28
let C[$i:$j]++29
fi
30
if [ "${A[$(($i+1)):$(($j-1))]}" = "*" ]; then31
let C[$i:$j]++32
fi
33
if [ "${A[$(($i+1)):$j]}"= "*" ]; then34
let C[$i:$j]++35
fi
36
if [ "${A[$(($i+1)):$(($j+1))]}" = "*" ]; then37
let C[$i:$j]++
38
fi
39 fi
40 done41 done42
43 for i in {1..10}; do44 for j in {1..10}; do
45 echo -n "${C[$i:$j]:=0} "46 done47 echo ""48 done

まずはお一人目、初投稿ありがとうございます。な59

るほど、配列変数に一旦全部読み込んでから、全マスについて周囲の爆弾数を数えるというわけですね。
オーソドックスに来ましたね。
お ぉ、 よ く 見 た ら こ の シ ェ ル ス ク リ プ ト は 全 てbash の内部コマンドで閉じてるぞ。つまりピュア
bash ってことか。うーん、やるね～！よし、初段授与。

◎TSB_KZK さんの解答
1 cat mine.txt |2 tr '*-' '50' |3 sed "s/./& /g" |4 awk '5
NR>1{
6
for(i=1;i<=10;i++){7if(p[i]>=5) n[i]=1;8if($i>=5) p[i]+=1;9
printf("%d ", p[i])10}11print ""
12
}
13
{
14
for(i=1;i<=10;i++){15p[i]=$i+n[i];16n[i]=0
17
}
18
}
19
END{
20
for(i=1;i<=10;i++){21
printf("%d ", p[i]);22}23
print ""
24}' |25 sed "s/ //g" |26 sed "s/^/echo /g; s/\([0-2]\)[56]/\$((\1+1))5/g" | sh |27 sed "s/^/echo /g; s/[56]\([0-3]\)/5\$((\1+1))/g" | sh |28 tr '056789' '-*****'

8
print;
9 }'10 cat mine.txt|
11 tr :- :0|
12 awk "$cnt_bottomright" |13 ./tateyoko|
14 tac|15 awk "$cnt_bottomright" |16 ./tateyoko|
17 tac|18 awk "$cnt_bottomright" |19 ./tateyoko|
20 tac|21 awk "$cnt_bottomright" |22 ./tateyoko|
23 tac|24 tr 0 -こちらも常連のクエンさん。Tukubai の tateyoko

コマンドを使ってますね。コメントによると、爆弾の真下と右下をカウントするという作業を 90 度ずつ回転させながら 4 回行って、周囲 8 マスのカウントを実現しているとのことです。
なるほど、そういう手もあるのか！しかもコレ、縦横のマスの数が 10 でなくても使えるや。すばらしい！
二段授与だ。これで七段。
◇◇◇

では最後のお題。今回はフツーなお題なんですが。
＜三問目＞
UNIX の cal コマンドは日曜始まりでしかありません。
そこで、引数で 0 （日曜） ～ 6 （土曜） の数値を与えると、その曜日始まりで今月のカレンダーを表示するシェルスクリ
プトを書いてください。

続いては、常連で本誌連載でもお世話になっている

世界は広くて多種多様！カレンダーにも金曜始ま

TSB_KZK さん。お世話になってるんですが……、いり、土曜始まりなど、日曜が始まりでない地域がたく

やぁ～これはオシい !! 不正解。

さんあります。シェルスクリプトの力で i18n
（国際化）

とりあえず添付のコメントを紹介すると「awk で縦の計算、sed で横の計算をしました」とのこと。つ

しようじゃありませんか！とうのがこのお題。
実は今回一番人気がありました。解法も様々……。

まり斜めの計算が足りないのですよ。でも、awk でやっぱりフツーのお題の方がいいのかなぁ。

縦方向、sed で横方向という分担が面白かったのと、◎さいたま帝国さんの解答

sed でシェルに食わせるコードを動的に生成している$$n=ここに曜日番号$$cal | tail -n +3 | tr -d '\010\137' | sed 's/\(..
\) /\1_/g' | sed 's/[ _]*$//' | tr ' ' '0' | tr _ \\n | awk '/00/{w++;next} /01/{for(i=0;i<(7+w-'$n')%7;i++){print "--"}}1' | awk 'NR%7{printf("%s ",$1);
next} 1' | grep ^トリッキーさが勿体無かったので掲載しましたよ。
うーん、残念！変わらず七段。

◎C6H8O7 （クエン） さんの解答
1 cnt_bottomright='
2 {
3for (i=1; i<=NF; i++) {4$i=(p[i-1]=="*")&&($i!="*")?$i+1:$i;
5$i=(p[i ]=="*")&&($i!="*")?$i+1:$i;
6}
7
for (i=1; i<=NF; i++) {p[i]=$i;}60

2015 February

最初はオーソドックスな解法の解答から。ワンライ
ナーですね。えぇとこれは cal コマンドの日付を一旦
1 つ 1 行にして、再び 7 日毎に 1 行とするもの。ただし、何日目を起点にするかは指定された曜日番号に従うというわけです。

C U I 徹底仕事術！
シェルスクリプト大喜利
まぁそつない解答だね。ただ、最後の grep が何のて必要な 7 列分を取り出せばいいというわけです。

ためにあるのかちょっと気になったけど、改行コード

いや～、これはウマい !! アタクシ今ねぇ、ねるねを入れるためなのか。なるほど。一段授与。只今五段。

るねるねの魔女みたいに脳内がテレってるよ！（←古◎321516 さんの解答いっ）

1 n=ここに曜日番号
2 mdate -d $(date '+%Y%mm')|
3 tarr|4 yobi 1|
5 self 1.7 2|
6 awk 'NR<2{for(i=0;i<($2-'$n'+7)%7;i++){print "**"}}1' |7 self 1|
8 yarr -7|
9 tr '*' ' '次も一日毎に一旦 1 行にする戦略をとってるんでただねぇー、残念なことに曜日名の行が正しく取り出せてないのだよ !!! おしい！曜日名の行の取り出し開始位置を 7 行目で指定しているようだけど、これ、
8 行目（日にちの列）と同じでよかったんじゃないか !?
さらに欲を言うと、LANG=C を設定して C ロケールにしておかないとこれまた文字数を数え間違う原因になってしまうぞ。

すけど、他者と違って cal コマンドを使ってないのがでもまぁ、お題の解釈のしようによっては曜日名の注目ポイント。Tukubai コマンドを駆使しているんで行は出さなくてもいいともとれるし、何よりアイデア

すが、mdate という日付を計算・列挙するコマンドが気に入ったから、二段授与しちゃう。これで三段だ。
◇

で今月の日にち一覧を出してます。

◇◇

なるほどね、mdate コマンドってこういう列挙すといったろころで本日の大喜利はこれにてお開き！

る用途に向いてるのか。年月によって月末の日にちは

読者の皆さん、投稿してくれた皆さん、今回もありが28 ～ 31 日と様々で、計算面倒だからねぇ。よし、ことうございました。

れも一段授与。只今五段。

ありがとうございました！

◎fkd.sh さんの解答
1 #!/usr/local/bin/bash
2
3 # usage:
4 #$ bash cal_youbi.bash 0
5 #$ bash cal_youbi.bash 0 12 20146
7 OF1=$((${1:-0}*2 + 1));
8 OF2=$((${1:-0}*3 + 1));9 paste -d " " \10 <(cal $2 $3 | awk 'NR == 2{print $0; print ""} NR != 2{print $0}') \11 <(cal $2 $3 | awk 'NR == 1{print ""}NR>1') | \12 awk -F, 'NR == 1{print $0}NR == 2{print substr($
1, '${OF1}', 13)}NR > 2{print substr($1, '${OF2}', 21)}' | \13 awk 'NF>0'

誌面が無くなってきたので最後にしますけど、これこれにておしまい！
約四年にわたって開催してまいりましたこのシェルスクリプト大喜利。思えば大喜利ネタでマウスパッドを作ったり、大喜利の出題ミスを解答でツッコまれたり、想像の上（時には斜め上）行く解答で勉強になったり、いろいろありました。
しかし突然なのですが、今回をもちまして御開きとさせていただきます。ここまでお付き合いいただいた
皆々様、大変ありがとうございました。また、投稿をお寄せくださった皆様、せっかくここまで段位を重ねてくださったのに、ごめんなさい。

は面白い解法ですよ。
「なるほど、頭いー」とアタクシ感心したので、解というのもこのところ、シェルスクリプト界隈でナ説をしちゃいます。9、10、11 行目で同じ月のカレン

ゾの秘密結社が暗躍してるって噂で……。コイツは大ダーを横に並べてるんです。ただし左側（10 行目で変だ！ってことでアタクシも黙っちゃいられなくなっ

生成している方）は日にちを 1 行下にずらしておき

ちゃいましてね。火事と喧嘩は何とやらって奴です。

ます。するとこういうテキストができます。
February 2015
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14
8 9 10 11 12 13 14 15 16 17 18 19 20 21
15 16 17 18 19 20 21 22 23 24 25 26 27 28
22 23 24 25 26 27 28

同 じ 月 を、
1 行ずらして横に並べる
金曜始まりにしたいなら金曜の列から
7 列抽出

そうしたらあとは、指定された曜日の始まりに応じでもまたやりたいねぇ
でもこの一件が落ち着いたら、また読者の皆さんを巻き込んで同じような企画をやりたいですね。
その時まで、 シェバンしのお別れ！………………
えぇ～と、はい、おあとがよろしいようで。
（寒ぅ）
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/

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

ISBN 978-4-904807-16-3
C3455 ￥500

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