シェルスクリプトマガジン

test

シェルスクリプトマガジンvol.49 Web掲載記事まとめ

投稿日:2017.07.25 | カテゴリー: 記事

シェルスクリプトマガジンvol.49のWeb掲載部分まとめです。

現在、コード掲載記事のコード部分をshell-mag.comに掲載しています。

4 機械学習のココロ/石井一夫
8 縁の木、育てよう/白羽玲子 ゲスト:門脇明日香
12 Doorkeeper Paul McMahonに訊く、技術者哲学/シェルスクリプトマガジン編集部
18 中小企業手作りIT化奮戦記/菅雄一
24 人間とコンピュータの可能性/大岩元
26 香川大学SLPからお届け!/清水赳(香川大学SLP) コード掲載
30 ユニケージ開発手法コードレビュー/大内智明 コード掲載
40 アジャイル開発 Let’s Practice!/熊野憲辰
44 漢のUNIX/後藤大地 コード掲載
52 もしインターネットの1秒が1年だったら/hakatashi・Mine02C4
60 バーティカルバーの極意/飯尾淳 コード掲載
68 スズラボ通信/すずきひろのぶ コード掲載
72 法林浩之のFIGHTING TALKS/法林浩之
74 ITエンジニアのためのマーケティング入門/水間丈博 本文掲載
78 妹のBENTO
80 それプロのエバンジェリストから愛をこめて/山本美穂
84 中小企業診断士が解説する、超実践的な会話術!円滑コミュニケーションが世界を救う!/濱口誠一
86 40歳から始める、オレとRubyプログラミング/しょっさん コード掲載
94 回帰テスト~regression testing~/桑原滝弥・イケヤシロウ
96 Tech数独/gori.sh
98 ユニケージの目指すところ/シェル魔人

 

シェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

スズラボ通信 34 (本誌vol.49掲載)

投稿日:2017.07.25 | カテゴリー: コード

著者:すずきひろのぶ

最近、設定ファイルの名前にファイル拡張子yml がついていることが多いことに気がつきます。これはYAML というフォーマットです。プログラムの設定ファイルのフォーマットとしては簡単に使えるますが、自分のプログラムで使おうとすると意外と参考になる情報は少ないことに気がつきます。
今回はこの話題を取り上げます。

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

 

バーティカルバーの極意 第三回 (vol.49掲載)

投稿日:2017.07.25 | カテゴリー: コード

著者:中央大学 教授 飯尾淳

今回は、いかにもデータ分析といった例題に取り組みます。題材は、簡単な自然言語処理。数十篇のコラム記事を対象として、記事の自動分類に挑戦します。対象とする記事群を、クラスタリングという処理で分類します。クラスタリングとは、特定の多次元空間にマップされたデータ群を、様々な方法でいくつかのまとまりに整理する方法です。
それぞれのデータは、「距離の近さに応じて」まとめられます。ここで計算される距離を、数学では絶対値の記号を用いて|x| と表します。ほら、バーティカルバーが出てきましたね。
また、近いデータを集めて樹形図としてまとめていく方法もよく用いられます。このようにして描く樹形図のことを、デンドログラムといいます。今回、描いてみようとするデンドログラムは図 1 のようなものです。ここにも多数の棒が描かれています。
今回のバーティカルバー劇場、役者は「距離」と「デンドログラム」の二人です。

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

漢のUNIX テストフレームワームKyua その1(vol.49掲載)

投稿日:2017.07.25 | カテゴリー: コード

著者:後藤大地

 コマンドをたくさん作っていくと、いくつかのことに気がつくとおもう。
 たとえば作っていくうちにいろいろと思うところがでて、その都度プログラムの書き換えを実施していくと、コマンドの最初のころの動作と最近の動作が異なってしまうことがあるはずだ。こんな感じで互換性が損なわれることにはなにかと問題がある。少なくとも、業務で使おうとした場合には致命的な問題を引き起こしかねない。
 もうひとつは終端処理の確認というか、ちゃんとさまざまなケースで動作するのかの確認だ。自分で作るときは自分に都合のよいところしか動作チェックをしないものだ。想定していなかった処理をするとコアダンプが発生してコマンドが異常終了するとかはよくある話だ。こうした問題が発生しないように、ちゃんとテストを行うコードを書いて開発に組み込むというのは大切なことである。
 開発の最初の段階からテストフレームワークを入れておくというのはよいアイディアだ。こういうのは最初から導入して、テスト→実装→テスト→実装… といった流れでの開発を常におこなうようにしておきたい。今回はこうしたテストを実施するためのフレームワークとして「Kyua」を紹介しようと思う。

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

ユニケージ開発手法 コードレビュー vol.38(本誌vol.49掲載)

投稿日:2017.07.25 | カテゴリー: コード

著者:大内智明

今回は、取得した固定長ファイルを元に、ユニケージ内で使用するフィールド形式ファイルに変換する方法について説明します。

記事本文掲載のシェルスクリプトマガジンvol.49以下リンク先でご購入できます。

香川大学SLPからお届け!(vol.49掲載)

投稿日:2017.07.25 | カテゴリー: コード

著者:清水赳(香川大学SLP)

Elixir製のWebアプリケーションフレームワーク Phoenixを触ってみる 前編

こんにちは。香川大学工学部 学部3 年の清水です、はじめまして。

私は普段、Ruby やRailsで開発を行うことが多いのですが、サークルで「Erlang VM の上で動くRubyっぽい感じの言語があるらしいよ」と聞いて、Elixirと、Rails によく似たWebフレームワーク Phoenix を触ってみることにしました。
Elixir は、Ruby を使っている人にとって、とても馴染みやすい文法を持っています。更に特徴として、Erlangの強みである並列処理と耐障害性の機能をそのまま受け継いでいます。最近話題のチャットツールDiscordも、Elixir を採用しているそうです。
そこで、今回から次回にかけては、Elixir 製Web フレームワークであるPhoenix を紹介します。前半は,Phoenix に慣れるために簡単な掲示板アプリケーションを作ってみます。そして後半となる次回は、自宅の蔵書を管理できるようなアプリケーションを作っていきましょう。

 

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

 

40歳から始める、オレとRubyプログラミング(vol.49掲載)

投稿日:2017.07.25 | カテゴリー: コード

著者:しょっさん

梅雨の季節に入ってまいりました。この号が発売される頃には、梅雨もそろそろ明け、夏間近といったところでしょうか。

子供の頃は夏は朝から晩まで真っ黒になって遊び回ったものですが、大人になったら汗をかくだけで、色々やる気が削がれてしまいますね。とても不思議な気持ちではありますが、猛暑は家で落ち着いてプログラミング!

さぁ、今号もしまってまいりましょう!

記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。

 

もしインターネットの1秒が1年だったら 第2回(vol.48掲載)

投稿日:2017.07.18 | カテゴリー: 記事

written by hakatashi・Mine02C4

編注:本記事は「SunPro 2016 技術書典」で発表された記事に説明・イラストを追加し、シェルマガvol.48に掲載したものです。
以下リンク先で、オリジナル版の全文が公開されています。
https://sunpro.io/techbookfest/

インターネットが日本中のあらゆる人間に行き渡るようになってから、すでに10年単位の時間が経過しています。今日においてインターネットを支えるネットワーク技術が重要であることは言うまでもありませんが、実際にネットワークでどのタイミングで何が起こり、どれくらいの時間が費やされるのかということを身を持って体感している人は、たとえネットワークに精通している人でも少ないのではないでしょうか? この記事では、1 秒というわずかな時間を1年にまで拡大し、ネットワーク上で何が起こっているかを人間スケールでざっくりと解説していきます。

はじめに

こんにちは。博多市(@hakatashi) です。前回に引き続き、2016年の技術書典にSunProとして発表した「インターネットの1秒がもし1年だったら」という記事を、シェルスクリプトマガジン向けに再構成してお届けします。この記事は、インターネット通信においてクライアントがサーバーとコミュニケーションする様子を、1秒を1年にというスケールに引き伸ばし、クライアントとサーバーをそれぞれ「クライアントちゃん」と「サーバーちゃん」として、人間スケールに置き換えて順に見ていこうという企画です。
前回の記事では、クライアントがサーバーと通信するための前段階として、サーバーの住所を調べる、つまりIPアドレスを問い合わせる名前解決までの処理を解説しました。3回のDNSリクエストの末にサーバーちゃんの住所をゲットしたクライアントちゃんは、いよいよサーバーちゃんとの直接の通信を行っていきます。果たしてサーバーちゃんとクライアントちゃんの文通の行方はどうなるのでしょうか。引き続きお楽しみください。

サーバーちゃん   クライアントちゃん

 

TCP接続ハンドシェイク

2月19日 午後3時27分 TCPハンドシェイク+SYNパケット送信

各地のネームサーバーの協力を得て、無事サーバーちゃんの住所を入手したクライアントちゃんですが、お淑やかなクライアントちゃんはいきなり本題の手紙を送りつけるような真似はしません。まずはサーバーちゃんにご挨拶をします。
 TCP上の通信では、データ伝送を行う前にコネクションの確立という処理を行う必要があります。これは、相手のサーバーが通信可能な状態であることを保証したり、以降のデータが正しい順序で到着することを保証するためのシーケンス番号を互いに交換したりするためです。
 シーケンス番号とは、現在のパケットが送信しているデータが、全体のデータのうちのどの部分に該当するのかを示す値であり、ハンドシェイクで最初にランダムな値にセットされ、以降データを送信するごとに増加していく値です。TCPは双方向通信なので、このシーケンス番号はサーバーとクライアントで別々の値を保持しています。
 クライアントちゃんはランダムに生成したシーケンス番号を端に添えて、サーバーちゃんに文通してよいかを問う内容の手紙を作りました。色よい返事が返ってくることを期待して、再びポストに投函しました。手紙はいよいよ石狩に向かいます。
 ところで、サーバーちゃんの住所が判明してから最初にサーバーちゃんにコンタクトをとるまで9日もかかっています。
きっとバのつくイベントで忙しかったのでしょう。妬ましい。

*1 実際の理由はおそらくローカルホストのDNSサーバーからアプリケーション(curl)にDNS情報を受け渡す際にオーバーヘッドが発生するためです。

2月27日  午後6時30分 TCPハンドシェイク+SYNパケット受信

北海道――新千歳空港から車で50分の石狩の大地に、目的のデータセンターは存在します。冬の北海道の空気は冷たく厳しく、この時期の気温は昼間でも0度を上回ることはありません。この冷涼な外気がサーバールームから効率的に排熱するのです。
すぐ脇を通る道は国道337号線です。地元ではかつて天売島に住んでいた鳥の名前からとって「オロロンライン」と呼ばれるこの道は、眼前に手稲山を望むゆったりとした広い道路です。小樽からこの道を進んで左手側、空港のターミナルを髣髴とさせる白い横長な建物が石狩データセンターです。
この場所でサーバーちゃんは他のサーバーと肩を並べて*2、静かに443番ポートを開けて待ち続けています。  今回キャプチャしたパケットの中で最も数が多かったのはARPのパケットでした。512台*3近い数のサーバーがARPで常に囁きあい、互いの居場所を確認しあっている状態といえるかもしれません。
そんな退屈な生活の中で、サーバーちゃんはクライアントちゃんからの手紙を受け取りました。
クライアントちゃんが手紙を投函してから8日目のことです。伝送には22ミリ秒かかりました。
冒頭では東京と石狩の物理的な片道時間は5.9ミリ秒と述べましたが、当然これは理想的な通信のことであり、実際には無線通信やルーティングなどにおけるオーバーヘッドによってそれ以上の時間がかかります。
受け取った手紙は一般的なTCPハンドシェイクでした。手紙にはシーケンス番号が添えられています。クライアントちゃんからの久しぶりの手紙に喜んだサーバーちゃんは、喜んで通信を受け入れました。

*2 もちろんVPSなので物理的なサーバーマシンとして存在しているわけではありませんが。
*3 今回使用したサーバーはサブネットマスク23ビットという中途半端な値のネットワークに繋がっていました。今回も、クライアントちゃんとサーバーちゃんの通信の始まりです。

 

2月27日  午後8時11分 TCPハンドシェイクSYN+ACKパケット送信

サーバーはTCPによる通信を受け入れた証として、クライアントからのSYNパケットに対する応答を返します。サーバーはクライアントから受け取ったシーケンス番号を認識し、これに1を加えた値を返答パケットに記して送ります。シーケンス番号は送信するデータの先頭バイトを表すので、本来はデータを送信しない段階では加算しないのですが、ハンドシェイクにおいてはパケットを正しく受け取った印として特別に1を加算します。

同時に、サーバー側でもシーケンス番号を生成して返信用のパケットに記します。これでサーバーとクライアントの間で一対のランダムなシーケンス番号が初期化されます。

サーバーちゃんはクライアントちゃんに向けて通信可能な旨を記した手紙を書きました。クライアントちゃんからの手紙と同じく、隅っこにシーケンス番号を記しておきます。このパケットはSYNとACKのフラグが立てられているため、SYN+ACKパケットなどと呼ばれます。

3月9日  午前3時43分 TCPハンドシェイクSYN+ACKパケット受信

今度は石狩から東京へと手紙が運ばれます。配達にはふたたび10日近い時間を要しました。
クライアントちゃんにとってはサーバーちゃんからの初めての手紙です。だいぶ非常識な時間に配達された手紙ですが、クライアントちゃんは飛び起きて、サーバーちゃんからの手紙をじっくり読み、さっそく返事に取りかかりました。
クライアントは、サーバーからのハンドシェイクを受け取ると、先ほど説明したシーケンス番号の他に、Window Size  ValueやMaximum Segment SizeなどのTCP通信に必要な値を確認し、記録しておきます。

3月 9日 午前4時5分 TCPハンドシェイクSYN+ACKパケット送信

サーバーちゃんからの手紙で、サーバーちゃんが手紙を出せる状態であることを確認したクライアントちゃんは、その手紙に問題がないことを伝えるため、ハンドシェイクを完了させる手紙を送ります。
クライアントもサーバーと同じく、シーケンス番号を認識した証として、サーバーから送られたシーケンス番号に1を加えて返答します。このパケットにより両者の間でそれぞれのシーケンス番号が共有され、お互いにデータを送り合う事ができるようになります。

3月16日  午後3時21分 TCPハンドシェイクSYN+ACKパケット受信

ふたたび手紙は東京から石狩へ。サーバーちゃんはクライアントちゃんからちゃんと返事が届いたことにほっと安心しました。これで、いつでも通信を受け入れることができます。
このように、TCPのハンドシェイクでは通信路を3 回通る必要があるため、3ウェイ・ハンドシェイクとも呼ばれます。

TSLハンドシェイク

 

TLSハンドシェイクが終わって、クライアントちゃんとサーバーちゃんは無事通信が開始できるようになりました。クライアントちゃんはさっそく本題の質問を投げかけようと思ったのですが、ここでふと思ったことがあります。
クライアントちゃんとサーバーちゃんは、ハガキを使って互いにやり取りをしています。ハガキには特に何も細工をしていないので、書いている内容は周りの人には丸見えです。クライアントちゃんがポストに投函しに行くまではいいとしても、そこから先、ルーターから先のことに関しては何も保証できません。実はポストの中に盗撮カメラが仕掛けてあるかもしれませんし、郵便局員がハガキの内容をチラ見するかもしれませんし、サーバーちゃんの上司に内容を検閲されているかもしれません。
これは困ります。花も恥じらう乙女であるところのクライアントちゃんは、サーバーちゃん以外の誰にも手紙の内容を知られたくありません。クライアントちゃんはサーバーちゃんとのやり取りを暗号化するため、TLS(Transport Layer Security)を使用することにしました。
TLSは、TCPのようなコネクションの上で暗号技術を使って通信の機密性や完全性を確保するための仕組みです。公開鍵暗号を用いて安全に交換した鍵を使って共通鍵暗号を行い、暗号化されたコネクションをアプリケーションに提供します。
この記事は暗号理論の説明はいたしません。ちょこちょこ出てくる用語の説明はほとんどしていません。なので、やり取りする情報のさらなる意味を知りたい方は、ぜひ他の専門書を参照してください。

 

ぼくらがシェルで生きる理由 (Web版独自記事)

投稿日:2017.07.11 | カテゴリー: 記事

written by 松浦智之(シェルスクリプトマガジン編集部)

シェルスクリプトは何に使う言語なのか?残念ながら、作業の自動化やサーバー管理に使うものだと捉えている方が多い。私が、「いや、システム開発のためにこそ使うものだ」といっても、冗談あるいは曲芸の類にしか見てもらえないことが多い現状は、シェルスクリプトマガジン編集者としては悔しいものだ。
大手雑誌でシェルスクリプトが特集されることはあっても、データ管理術を手解きする特集で使われている道具はMySQL……。そこでもやはりシェルスクリプトが利用されるまでに、世の中のイメージを変えたい、というのが私の夢である。

そこで今回の記事では、私が実装したシェルスクリプト製「郵便番号から住所を補完するボタン」を紹介する。これを通じて、シェルスクリプトの実力、そして我々シェルプログラマーの愉しみを見てもらいたい。
なお、実際にシェルスクリプトによる業務システム開発を行っているUSP研究所では有償コマンド(usp Tukubai)を用いていて、「それがあるから実用的なものが作れるんでしょ?」と思うかもしれないが、そんなことはない。誰でも入手できるごくありふれたUNIXコマンドだけでここまでできる!ということが、今回の記事を通じてわかってもらえればと思う。

実は「速い!」「色々できる!」シェルスクリプト

世間では未だに「シェルスクリプトなんて遅くて使えない」という偏見が根強い。いやいや「ちょっと待ったー!」と言いたい。

シェルスクリプトはグルー言語。シェルスクリプト自身でこなそうとせずに、コマンドを呼んでそれらに任せればいいのだ。コマンドを呼べば、シェルスクリプトはそのコマンドの終了を待つだけになる。UNIX標準コマンドたちはC言語で書かれているため、この仕組みを理解した上で組まれたシェルスクリプトなら、殆どCプログラムの速さで動くことになる。

また、データが100万行、1000万行におよんでも、データの持たせ方の工夫次第で処理速度は改善できる。例えば後述の郵便番号の例なら、前3桁ごとにファイル分割して持てばいいのだ。頭の3桁の検索は、OSがファイルシステムのハッシュテーブルを使って高速に行ってくれるので、わざわざ自力で高速検索アルゴリズムを組む必要は無い。

シェルスクリプトには他の言語みたいに豊富なライブラリーもないからたいしたことができない、という意見も根強いが、これも工夫次第で想像以上にいろんなことができる。

例えば今回紹介するデモでは、CSVやJSON、XMLテキストの解析をさせている。たしかにそんなことをしてくれるコマンドは無かったが、シェルスクリプトとsedやAWKやgrep、trなど、どれも見慣れた構文やコマンドでできている。 難しいことも、簡単なことの組み合わせで実現できるのがシェルスクリプトの強み であり(マイクガンカーズのUNIX哲学定理6,7あたり) 、シェルプログラミングの愉しみはこのような「工夫」にこそあるはずだ。

「じゃあ、Webアクセスは?」

……それもデモで示すとおり、curlやwgetコマンドを使えばOK。

「メールは?」

……それは/usr/sbin/sendmailを使えば大丈夫、受信ならfetchmailコマンドとか。

「でも、本格的なRDB操作はさすがに無理でしょ」

……いやいや、 POSIX標準コマンドでjoinってのがあって これやsort、AWKなど使えば、テキストファイルでも相当本格的な操作が可能。

このようにUNIX標準コマンドには、様々な用途に利用できる必要十分なコマンドがそろっている。あとは我々シェルプログラマーがこれらをどう使うか、だ。

ネット通販によくあるアレくらい、/bin/shでだって作れるもん!

というわけで、シェルスクリプトの実力を示すべく、ネット通販の注文画面なんかでよく見かける 「郵便番号から住所を補完するボタン」 をシェルスクリプトで実装してみた。

  • shell-mag ブログの 2017年7月 のアーカイブを表示しています。

  • -->