04

特集 中小企業手作りIT化奮戦記
Ｃ言語のススメ

第17回

菅雄一

八八12
14縁の木、育てよう 第9回

白羽玲子

Haskell版Open usp Tukubai 完成させるぞ企画

Haskellでやってはいかんのか？ 第14回
上田隆一

18

中小企業診断士が解説する、超実践的な会話術!

円滑コミュニケーションが世界を救う!
濱口誠一

第4回

20

ユニケージ開発手法 コードレビュー 第15回

26

法林浩之のFIGHTING TALKS

28

IPv6新時代を体感しよう！ 第8回

32

TechLION再録

38

ユニケージエンジニアの作法

42

ITエンジニアのためのマーケティング入門

44漢のUNIX

50

人間とコンピュータの可能性

52

スズラボ通信

56

大内智明
法林浩之

第13回

波田野裕一

インターネット、Javaなど20年のITの歴史を振り返る

松浦智之

第14回

水間丈博
後藤大地

第3回

第22回

大岩元

すずきひろのぶ

第26回

第18回

未来に活きる！現場で使える！

データモデリング 第16回熊野憲辰

60

めざせシェル女子！ 第3貝～貝殻高校、パソコン部の日常～
ちょまど64姐のBENTO

65

初期設定67

ハングリーのすすめ

桑原滝弥

シェル魔人／編集後記

ちんじゅうちゃん
本誌名称についてvol.21より「USPMAGAZINE」
から「シェルスクリプトマガジン」に、変更となりました。
バックナンバーは「USP MAGAZINE」
としてお求めいただけます。

本誌正式名称は「シェルスクリプトマガジンvol.26」となります。

今月の特集は好評連載中の「中小企業手作り 化奮戦記」！

風待月
触った経 験 が 無い人へ
「C 言 語のススメ」

IT

八

八

writer 菅 雄一

42015 June

八八5

■プログラミング言語とは■C言語のプログラム
C言語の入門書に出てくる簡単なプログラムの１つに、プログラミング言語は、平たくというとコンピューターに命令して処理を行うための言語だ。

「Hello World」
を表示させるものがある。

「1+1を計算しなさい」
や「Helloを表示せよ」
といった命令だ。
コンピューターは「0」か「1」の二進数の並びの命令を理解す#include <stdio.h>

る。
コンピューターが理解できる言語を機械語という。
機械語
で16進数表現されているものは、「0」「1」の並びだと見えにく

int main(void)いため、16進数に置き換えているのだ。

{
printf("Hello World");

だが、機械語だと人間が扱うには困難だ。
そこで、人間が読return(0);み書きしやすい形式の命令文になったのがC言語だ。他にもBASIC、FORTRAN、Java、PHPなどがある。
人間がわかりやすい}

言語を「高水準言語」
または「高級言語」という。
諸説あるようだが「0」「1」の機械語は原始的なので「低水準言語」と呼び、色々#include <stdio.h>は、stdio.hというファイルを取り込む命令な命令表現があるC言語やJavaなどの事を高水準言語と呼んだ。
includeは「取り込む」
なので、そのまんまだ。
拡張子「h」のでいるようだ。

ファイルはヘッダーファイルと呼ばれ、関数の型式が記述され高水準言語だと人間は理解できても、コンピューターにはている。
プログラム中で使う関数を宣言する際、該当する関数の理解できないため、コンピューターにわかる機械語に翻訳す宣言が記述されているヘッダーファイルを取り込む必要があるる。
翻訳作業の事をコンパイルと呼び、コンパイルをするソフのだ。
(他にも変数の定義、構造体の定義もある)トのことをコンパイラーという。
コンピューターと対話するため

stdio.hのファイル名は「standard input output」の略で、「標の言語であるプログラミング言語は、毎年のように生まれてい準入出力」に関する関数群の型式が記述されている。
(C言語の入門書のサンプルプログラムに載っているヘッダーファイルは、る。

おまじないだと思っても良いかもしれない)■C言語は英語
C言語を勉強しはじめた頃は、闇雲にC言語の命令を覚えていった。
しかし、丸暗記だったため、すぐに忘れてしまう。
世界のプログラマがこの無味乾燥な命令を覚えられるのが不思議で仕方なかった。
だが、だいぶ後になって、英語の略語であることに気づいた。
例えば、strcpy()命令は「string copy」の略で「文字列の複製」という意味でそのまんまだ。
ファイルを開くfopen()命令は、「ﬁleopen」の略だ。
C言語はアメリカで開発された言語のため、英語を使うアメリカ人がわかりやすい仕様になるのは当然だ。
中学・高校で英語を学んでいる我々にとっても比較的、英語は馴染みやすい。
もし、ドイツやフランスで開発され、命令文がドイツ語やフランス語の略語なら、命令文は無味乾燥で丸暗記になり、非常にとっつきにくくなっていただろう。

■C言語は関数の集合体
C言語の命令は関数形式が多い。
数学の関数と全く同じものだ。
関数とは入力値を変換する装置だ。
入力値 (x) の値が決まると、出力値 (y) の値が決まる。
そのため数学では、x の値を関数 f に代入して y の値が出てくる式を y=f(x) と表現している。
数学が苦手な人には難しく思えるが、身近な所に関数はある。
具体例は自動販売機だ。
アイスコーヒーのボタンを押すと、アイスコーヒーが出てくる。
ホットコーヒーは出てこない。
押す
ボタン
（入力値）
によって、出てくる飲み物（出力値）が決まっている。
飲み物=自販機（ボタン）という関数なのだ。
C言語も同様で、printf(“Hello World”);「Hello World」
が、関数 printf() によって、出力値として、画面に「Hello World」と表示される。
C言語の場合、入力値とは言わず、引数という。
この場合、引数は文字列「Hello World」になるのだ。

62015 Juneの命令は、入力値

ところで、プログラムの本体になる main() も関数だ。
関数の宣言と、関数の中身を記述している。
そしてmain関数の宣言の引数部分にある「void」
は「空」とか「空虚」という意味で、引数がない事を意味する。
C言語の関数で引数がない場合にvoid が使われる。
main() は関数なので出力値がある。
宣言部分にint があるが、int は integer の略で「整数」の意味だ。int main() は、main()関数の返り値は整数という意味だ。
return()命令を使って出力値「0」を出している。
「0」は正常終了を意味している。

■ライブラリ依存性の問題■ライブラリ
C言語には多くの関数が用意されている。
それらはライブラリ複数のプログラムが、共有部品として共有ライブラリを使っと呼ばれるファイルに格納されている。
libraryなので、まさに「プていると、ファイルを軽くしたり、プログラム実行時にメモリの節ログラムの部品（関数）の図書館」という感じだ。
先ほど触れた約といった利点がある。
だが問題点もある。

ヘッダーファイルは、関数の宣言(関数名と引数の数)の記述であって、関数の中身は記述されていないのだ。
ところでライブラ

複数のプログラムがライブラリを共有している実行ファイル Ａリには2種類ある。
静的ライブラリと共有ライブラリだ。
静的ライ
ブラリはコンパイルの際、プログラムの内部に埋め込まれる。
共有ライブラリはコンパイルの際、プログラム内部に埋め込まれることはなく、必要なときに、外部にある共有ライブラリを活用しているのだ。

静的ライブラリと共有ライブラリ
実行ファイル Ｂ

実行ファイル

実行ファイル

静的ライブラリ

実行ファイル Ｃ

共有ライブラリ

共有ライブラリ

共有ライブラリを使う利点は、プログラムファイルを小さくできることにある。
そしてプログラムを動かす際、プログラムファイルをメモリ上に読み込むのだが、プログラムファイルが小さいとメモリの使用量が少なくなるため、メモリの節約になる。
そのた
めコンパイルで静的ライブラリを指定しない限り、共有ライブラ
リが選択されるのだ。

例えば、共有ライブラリが、何らかの障害で消えて無くなったら、それを使っているプログラムが動かなくなる。
共有ライブラリのバージョンが上がり関数の仕様が変わった場合でも、様々なソフトが動かなくなるなどの影響が出る。
LinuxでもWindowsでも起こる問題だ。
システムにセキュリティーの不具合が発見された際、下手に更新するとライブラリの中身も書き換わり、様々なソフトに影響を及ぼす可能性がある。
Linuxだと暗号化で重要なOpenSSLライブラリが下手に更新できないし、Windowsの場合、出たばかりのHotﬁxを使うと、不具合が出やすいという話もある。
このことは悩ましい問題なのだ。

7

■メモリ領域の確保■メモリ違反パソコンを触っていたりサーバー管理をしている際、沢山のパソコンを動かしている際、ソフトが落ちたり、OSが固ソフトが稼動しているとメモリ不足になり、動きが重たくなる事まったりする事がある。

がある。
プログラムはメモリを使用している。
プログラム本体をその原因はメモリ違反だが、簡単なプログラムで再現するメモリ領域に読み込むだけでなく、変数などを記憶させるため、事ができる。

メモリ領域を確保しているからだ。
わかりやすい例だと、LinuxやemacsやWindowsのメモ帳と#include <stdio.h>

いった、文章を書き込むソフトで、人間が入力した内容は一旦、メモリに保管される。
入力や書き換えの度に、ファイルに書き出int main(void)

したり、変更すると、処理が遅くなるため、ファイルに保存させる{前に、メモリ領域を確保して、メモリ上にデータを置いているの

int i ;だ。
ファイルに書き出すよりも、高速に処理できるからだ。

int a[4] ;C言語のプログラムで簡単なメモリ領域の確保を見てみる。

for ( i = 0 ; i < 100 ; i++){#include <stdio.h>a[i] = i ;#include <stdlib.h>}return(0);int main(void)}{
int *a ;a[] という配列に対して、確保した領域をはみ出す量のデー

a = malloc(10);

タを書き込むプログラムだ。
このプログラムを走らせると「セreturn(0);グメンテーション違反です」というエラーが出る。

}

確保したメモリ領域に対して、それを超える量のデータの書き込みがあると、エラーが出る仕組みなのだ。上のプログラムは、10バイトの領域を確保するプログラムだ。

普通のプログラムなら、メモリ違反をすると、プログラムmallocはメモリ領域を確保する命令だ。
ちなみにmallocはの処理が強制終了する。
OSに備えられているメモリ保護機「Memory Allocation」の略で、「メモリの割り当て」という意味な能が働くからだ。
だが、OS内部のプログラムやハードウェアので、そのまんまだ。

を制御するドライバが、プログラムの不具合でメモリ違反し世に出ているプログラムは、処理速度を速くするため、処理た場合、メモリ保護機能が働かないためOSの管理で使って中のデータをメモリ上に置いている。
そのため多くのデータをいるメモリ領域を破壊したりする。
このため、正常なデータ使って作業している場合、メモリも多くの領域が必要になり、メを失ったOSは、正常に作動できず、OSが固まったりするのモリ不足に陥ってしまう問題がある。

だ。

色々なソフトを同時に動かしているとパソコンやサーバーが重たくなるのは、メモリ領域の確保のしすぎてメモリ不足に陥っているのが問題なのだ。

82015 June

■バッファオーバーフロー攻撃
ウイルスを忍ばせたり管理者権限を奪って、システムを乗っ取る手口のひとつだが、C言語のメモリ違反を応用した手口なのだ。
C言語のちょっとしたメモリ違反の場合、メモリ保護機能が働かないため、エラーが出ないままプログラムが動き続ける。
そのため以下のプログラムが動いてしまう。
(※)あくまでも私が使っているLinuxでの動作結果で、環境によっては結果が異なることもある
実行結果は以下のようになる#include <stdio.h>#include <string.h>[suga@linux]$ sample

int main(void)

I have a girl friend.

{

I have a boy friend.

char s2[12],s1[1] ;[suga@linux]$

strcpy(s1,"I have a girl friend.");fprintf(stdout,"%s\n",s1);
strcpy(s2,"boy friend.");fprintf(stdout,"%s\n",s1);
return(0);}girlがboyに書き換わる仕組み

S1に割り当てられた領域

I

S2に割り当てられた領域

S1の領域に無理やり 「I have a girl friend.」を入れる

h a v eag i r l

S1に割り当てられた領域

I

S2に割り当てられた領域

S2の領域に 「boy friend.」を入れる

h a v ef r i e n d . ヌル

aS1に割り当てられた領域

b o yf r i e n d . ヌル
S2に割り当てられた領域

s1配列は1文字分のメモリ領域しか確保していない。
だが、ちょっとしたメモリ違反だとメモリ保護機能が働かないため、21文字分の文字列を書き込んでもエラーが出ない上、s2配列の領域にまで書き込んでしまっている。
その後、s2配列に「boyfriend.」の文字を代入すると、s1配列からはみ出した文字列を上書きする形になるため、s1配列に格納されている文字列が「I have a boy friend.」に書き換わるのだ。

9この程度なら笑い話になるが、ちょっとしたメモリ違反は、深刻な問題も引き起こす。
それがバッファオーバーフロー攻撃なメモリ違反による関数の呼び出しのだ。
まずは説明の前段階として、呼び出す予定のない関数を動かすプログラムを見てみる。

メモリ領域#include <stdio.h>

上書きをしてint over(void){
printf("Over Flow!!\n");exit(0);} /* 呼び出す予定がない関数 */void func(void)

関数over()のアドレス

配列a［０］

関数over()のアドレス
関数over()のアドレス

上書き

関数over()のアドレス{

関数over()のアドレス

int a[1];main()への戻り先のアドレス

int i ;for ( i = 0 ; i < 5 ; i++ ){a[i] = (int)over ;/* 配列aに関数over()のアドレスを代入 */メモリ領域}}
int main(void)

関数over()のアドレス{func();

関数over()のアドレスreturn(0);}関数over()が実行される
関数over()関数over()のアドレス

sub()関数は、どこからも呼び出されていないのだが、プログラムを実行すると、over関数が呼び出される。
以下の仕掛けをしているからだ。

関数over()のアドレス
関数over()のアドレスメモリ違反しながら関数over()の開始先を書き込むことで、main()関数への戻り先のアドレスを上書きしてしまう。
そのため関数終了時に、main()関数に戻らず、over関数が呼び出されてしまうのだ。
これを悪用したのがバッファオーバーフロー攻撃で、ウイルスを忍ばせたり、管理者権限を奪うのだ。

10

2015 June

ウイルスをしのばせる手口のイメージ

ウイルスを忍ばせる手口も、管理者権限を奪う手口
も、本来なら呼び出し元の関数に戻る場所のアドレスを、変数Aのメモリ上のアドレスに書き換えている。
関数

メモリ領域終了時の戻り先アドレスが、変数Aのアドレスに書き換わっているため、変数Aのアドレスに飛ぶと、そこに格納されてしまったウイルスプログラムやシェル起動プログラムが呼び出されたりするのだ。

ウイルス
プログラム

管理者パスワードを強固にしたら大丈夫と思っている
変数 A

人もいるだろう。
以前の私もそうだった。
だが、管理者のパスワードを盗まなくても、パスワード破りを行わなくても、管理者権限で動くプログラムの欠陥を利用して、バッファオーバーフロー攻撃を行えば、管理者権限が奪えるのだ。
バッファオー バ ーフロー 対 策として、L i n u xで は変数Aのアドレス

戻り先のアドレス

Exec-Shield、Windows7ではデータ実行防止(DEP)の設定で、特定のメモリ上に送り込まれたプログラムを作動させない設定が行える。
だがこれによって、動かなくなるソフトもあるようなので、悩ましい問題だ。

管理者権限を奪う手口のイメージ

C言語を知る事で、システムが抱える問題点が理解しやすい話をした。
それ以外にもC言語を学ぶ利点はある。
例として、
ソ

メモリ領域bashが起動してroot権限でやりたい放題
シェル起動のプログラム

ケットを使った簡単な通信プログラムを書いてみると、クライアント・サーバーの概念が具体的に見えてくる。
ファイルロックのプログラムを書いてみると、同時書き込み防止の仕組みが見えてくる。
初歩的なC言語のプログラムしか書くことができない
私でも、概略を知ることでシステムの勉強になり、この体

変数 A

験から、
「C言語でのプログラミングは必要ないから要らない」とは言わず、是非、C言語を触ってみることをお勧めする！

変数Aの
アドレス

戻り先のアドレス11

第4回

伝えるためのシンプルすぎる技術「PREP法」

今回は、「PREP」法という伝えるための技術を紹介します。

PREP とは、自分の考えを相手にわかりやすく伝えるための技術です。

では、PREP とはどのような内容でしょうか？ PREP とは、Point → Reason → Example → Point それぞれの頭文字をとったものです。

なぜ、ディズニーランドに行くべきでないのか？という理由が明確に伝わりますね！（ただし、これを話した後、命の保障は一切できません…）

では、PREP 法だとなぜ伝わりやすいのでしょうか？

１）結論が最初に来る人は知らないものには不安を持ちやすいもの。逆に知ってP ＝要点、結論（Point）
R ＝理由、背景、根拠、効果（Reason）
E ＝具体的な事例、データ（Example）いるものであれば安心して話を聞くことができます。最初に Pで結論を出すと、聞き手は「何の話をするのか？何を言いたいのか？要求は何か？」がわかるので、安心してその後の話を聞P ＝結論の再確認（Point）くことができます。

例えばゴールデンウイークや夏休みなどの大型連休に家族

２）理由や思考プロセスがわかるや恋人から「ディズニーランドにでも行こうよ♪」と誘われたときのことを考えてみましょう。本音では「混むから家にいたいよな…」と考えている場合、どう言えば伝わるでしょうか？

R で根拠を示すので、なぜその結論が正しいと言えるのか？

を理屈のレベルで納得できます。また、話し手がその結論に至った思考プロセスも見えてくるので、話の不透明さがなくなります。

P：どこにも行かず家でのんびりすべきだ
R：連休時は人が集中するため、ディズニーランドは異常に込んでおり、逆に疲れるだけ
E：去年行った時にも無茶苦茶込んでいて、結局、１つしかアトラクションを楽しめてない
P：よって、連休中はどこにも行かず家でのんびりしよう

182015 June

３）具体例によりリアリティを持つことができる

E で実際の事例を出すので、説明内容を頭でイメージしやすくなり、リアリティ（現実感）が醸成されます。

実例で考えてみましょう

よく言われることPREPの観点による改善策

営業管理のパッケージシステムを導入する場合を考えてみイイタイコトがよくわからないな。何が言いたいの？
どうしてほしいの？

Pointがないので、結論を最初に言うようにする

P：A 社の営業管理システムを導入すべきである

何でその結論になるの？
論理が飛んでない？根拠は何？

Reasonがないので、根拠や自分が結論にいたった思考プロセスを説明する

理屈はわかるけど何かイメージがわかないな／机上の空論にしか聞こえない

Exampleがないので、具体的な事例やデータを説明するましょう。

R：導入コストが安く、当社の営業スタイルにマッチするので、スムーズに導入できる
E：実 際に当社と同規模の B 社、C 社も A 社の営業管理システムを導入している
P：A 社の営業管理システムを導入すべきである
仮に P、R、E がないとどのような状態になるでしょうか？

このように、相手のコメントから「自分の伝えるクセ」を知ることができます。自分のコミュニケーションのクセには、なかなか気づきづらいもの。また、コミュニケーションに足らな“Pがない”“Rがない”“Eがない”

い要素を的確に指摘してくれる人も少ないものです。

A 社のパッケージが素晴らしいのはわかったけど、で、どうしてほしいの？

そこで、自分の足らない要素を埋めるためにも、よく言われることを PREP の観点で改善されてはいかがでしょうか？

他社ができてるかもしれないがウチではできるのか？

PREP の注意点
ただし、PREP を使う際に1つだけ注意点があります。そ理屈はわかるけど、本当にうまくいくのか？
A 社にだまされてない？

A君

れは、「結論から先に言うことで相手が怒ってしまい、その後に聞く耳を持たない状態にならないかどうか？」です。
上司

今回の最初のディズニーランドの例では…。まあ、言うまでもないですよね（笑）。

私自身は、例えば役員相手に話すときには基本的にはPREP で話をします（彼らは結論から先に知りたがる生き物なまとめると、ので）。ただし、役員の意向に沿わない話をする場合には、「ごPoint がない   → イイタイコトが伝わらない
Reason がない  → 理由・根拠が伝わらない
Example がない → 信憑性にかける相談があるのですが、まず状況から説明させてください」といって、あえて E から話すことで、余計な怒りを買わないように気をつけています。

PREP は有効なツールですが、ツールの効果は相手や状況という評価をされます。逆に言えば、PREP を意識すると、上に書いたような事態を避けることができます。ちなみに気づかれた方もいらっしゃるかもしれませんが、ここまでの内容は、によって変わるもの。
「結論を先に言うことで地雷を踏まないか？」というスクリーニングを行ったうえで、ビジネスに是非活用してください。

PREP の形式でご説明しています。結論→理由→具体例、という順番ですね。

自分のクセに気づく
また、PREP を応用して自分のコミュニケーションのクセに気づくこともできます。ここで、ご自身の普段の仕事を振り返ってみてください。上司や顧客からどのようなコメントをされることが多いですか？

19

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

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

ISBN 978-4-904807-20-0
C3455 ￥500

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