月別アーカイブ: 2012年7月

C言語の歴史とネーミング

C言語は1972年にKernighan氏とRitchie氏によって開発された言語です。FORTRAN、COBOLなどが高級言語と呼ばれているのに対して、Cは低級言語と呼ばれました。これは安ものという意味でなく、アセンブリ言語に近い表現も可能なことから呼ばれたに過ぎません。Cの主たる機能はBCPLの仕様に構造化仕様を加えて開発され、そのBCPLはBから影響を受けました。このことからC言語と名付けられました。

Cの仕様にオブジェクト志向プログラミング仕様を加えたものがC++です。C#はCとC++をベースに拡張したJava風な言語です。

Cの++演算子は1増加する演算子ですので、オブジェクト志向仕様を1つ加えたという意味を++に込められているようです。

言語のネーミングとしてBの次はC、Cに1つの機能を加えたからC++、Cの次はDだけどそれほどの機能アップではないので半音上げてC#ということになります。その意味ではDb(ディーフラット)でもよかったのではないではと思われますが、Cの勢力が強くDbよりC#を採用したのではと推測されます。

C言語周辺のつながりはB→BPCL→C→C++→C#ということになります。C言語の本格的な解説書は共立出版社から出たS.W.カーニハン、D.M.リッチー著「プログラミング言語C」石田晴久訳だったような気がします。

この解説書を本棚に飾ることがファッションと考えた若者もいたかに記憶しています。これがC言語歴史の小考です。

ソート処理の続き

ソート処理では安定性があった方が望ましいです。ソートにおける安定性は前回、説明していますが政局の安定というような意味合いではなく、ソートキーの値が同じになったときの並びに関することです。

ひとつの例としてある組織の会員を年齢の若い順に整理する場合を考えます。会員は年度ごとに退会、新規会員を反映させて整理する場合、同一年齢のときは従来会員の後に、新規会員の順番を割り振った方が自然です。

安定性が保証されないクイックソートでもコードを追加したりデータに元の順番を追加すれば安定性が保たれます。安定性のないアルゴリズムにおいて安定性を保証するには、第1ソートキーの値が両者で等しいときに第2のソートキーを元の順番にしてソーティングするコードを追加します。

C言語では変数のビット長は32ビットで、倍長変数は64ビットです。第1ソートキーと第2ソートキーを合成して倍長変数にすれば、コードを追加することなく一般アルゴリズムで安定性のあるクイックソートにすることができます。以下に具体例を示します。構造体の定義と最後のサンプルデータに注目ください。

改良されたソートキー

// 構造体の定義
struct member{
    char *address;     // 住所
    char *name;        // 氏名
    union utag{
        ULONG seq[2];  // 元の順番
        ULONGLONG age; // 年齢
    }key;
};

// 2012-07-29,改良版

// name:sort function
// method:quick sort
//
// 配列要素i番目とj番目の値を入れ替える
void swapX(struct member data[], int i, int j){ // 両者の値を交換する
struct member t = data[i]; // ワークエリアに退避
data[i] = data[j]; // 上書きする
data[j] = t; // 退避したものを設定
}

void QuickSortX(struct member data[], int l, int r){// このソート法では同じ値の順序は不定になる
// 探索配列要素 左端の配列要素 右端の配列要素
// ピボットとはクイックソートにおいて、ソートする際の基準とするデータのこと
ULONGLONG mid;// 中間値
int i, j;

if(l==r) return;
i = l;
j = r;
mid = data[(l+r)/2].key.age; // ピボットの決定
for(;;){
while(data[i].key.age < mid) i++;// 左からピボット以上を探索
while(mid < data[j].key.age) j--;// 右からピボット以下を探索
if(i >= j) break; // 探索地点がぶつかったら終了
swapX(data, i, j); // お互い発見した値をいれかえる
i++;
j--;
}

if ( l < i-1 ) QuickSortX(data, l, i-1);// 再帰呼び出しで左半分ソート
if ( j+1 < r ) QuickSortX(data, j+1, r);// 再帰呼び出しで右半分ソート
}

struct member data2011[]={//Sort-key 元の順 年齢
"山川市瑞穂町3-4-5", "佐藤一郎", 0, 32,
"山郷市水森町1-2-3", "斉藤花子", 1, 25,
"内海市戸板街9-8-7", "高橋次郎", 2, 47,
"外海市黒川町6-5-4", "鈴木三郎", 3, 19,
"河山市瑞穂町3-4-5", "後藤四郎", 4, 54,
"水郷市水森町1-2-3", "渡辺桃子", 5, 61,
"外海市黒川町3-703", "東山一郎", 2012072401,25,
"外海市黒川町3-704", "東山次郎", 2012072402,70,
"外海市黒川町3-705", "東山三郎", 2012072403,47,
"外海市黒川町3-706", "東山四郎", 2012072404,32,
"外海市黒川町3-707", "東山五郎", 2012072405,47,
"外海市黒川町3-708", "東山六郎", 2012072406,52,
"外海市黒川町3-718", "西山七郎", 2012072407,32
};

名刺の作り方

名刺を手作りするには、A・one、ラベル屋さんなどの名刺作成ツールを購入することが手っ取り早いです。名刺のデザインは自由自在に設定できるが、ブランク名刺をプリンタにセットすることが難しいからです。

いまはプリンタの性能が向上したので自前で印刷する楽しみが増えました。今回、ELECOM社の「なっとく.名刺」を使って名刺を作成しました。ミシン目入りA4サイズ1枚から両面印刷可能な10枚の名刺を作ることができます。

廉価版だからなのかはっきりしませんが背景設定、イラストの取り込みが可能だが文字のサイズや色の設定が一律に限られていて少し残念な気がしました。

名刺作成アプリは無料ダウンロードだから、あからさまな苦情・要望が出せないのが歯がゆいところです。 字体、サイズ、色などを個別に設定するには、WORDを使って微調整を繰り返しながら複数枚対応をサポートすれば可能と思われます。

デジカメ用写真の印刷グッズは文房具店、100円均一ショップでも売っているのに、名刺作成用用紙はパソコンショップにしか置いてなく、名刺はビジネスでしか使われないので流通量が少ないようです。3店目でやっと購入できました。 高級和紙に印刷した毛筆の名刺をいただいたことがありますが、多くの人に出会い、高印象を与えたい方は目を引くデザインの名刺を作成してみてはいかがでしょう。

ソート処理

ソートとは多くのデータをある規則にしたがって並び替えることです。コンピュータ処理では基本中の基本処理です。多数の手法が確立され、

①マージソート、②クイックソート、③シェルソート、④ヒープソート、⑤バブルソート、⑥選択ソート

などが有名です。規則では小さい順に並べることが多いようです。データは複数項目から成っていることが一般的で、たとえば住所、氏名、年齢のように3つのアイテムによって構成され、年齢順に並べるとき年齢項目をソートキーと言います。

年齢が同じになることはよくあることでこの場合、元の順序を保証するか順序不定の2ケースに分かれます。ソートでは元の順序を保証することを安定性があると言います。

安定性を保つことがソート手法ですぐれているとは一概に決めつけられませんが、順序が保障される方が良い場合が多いようです。基本アルゴリズムで保証されなくても処理を追加すれば改善することが可能です。 安定性は保証されませんが処理時間で最高位に立つと言われるクイックソートのCサンプルコードを紹介します。

<<< クイックソート関数 >>>

//
// name:sort function
// method:quick sort
//
// 配列要素i番目とj番目の値を入れ替える
void swap(int *i, int *j){ // 両者の値を交換する
int t = *i; // ワークエリアに退避
*i = *j; // 上書きする
*j = t; // 退避したものを設定
}

// 2012-07-29,改良版
void QuickSort(int data[], int l, int r){// このソート法では同じ値の順序は不定になる
// 探索配列要素 左端の配列要素 右端の配列要素
// ピボットとはクイックソートにおいて、ソートする際の基準とするデータのこと
int mid; // 中間値
int i, j;

if(l==r) return;
i = l;
j = r;
mid = data[(l+r)/2]; // ピボットの決定
for(;;){
while( data[i] < mid ) i++; // 左からピボット以上を探索
while( mid < data[j] ) j--; // 右からピボット以下を探索
if( i >= j ) break; // 探索地点がぶつかったら終了
swap(&data[i], &data[j]);// お互い発見した値をいれかえる
i++;
j--;
}

if ( l < i-1 ) QuickSort(data, l, i-1); // 再帰呼び出しで左半分ソート
if ( j+1 < r ) QuickSort(data, j+1, r); // 再帰呼び出しで右半分ソート
}

コンピュータの処理時間

コンピュータの処理時間は年々向上し、2足歩行ロボットなどは処理時間の高速化がその実現に貢献していると言えます。

一世を風靡したBASICインタープリタはパソコンを身近な存在にしましたが処理時間に物足りなさがありました。

複雑な計算を含む場合、1分を超すこともあり、あらかじめ計算してディスクにその結果を記憶しておき、求められたときディスクを検索して計算結果を引き出すシステム設計をしたことがありました。

たいへんなのは仕様変更やバグが発見されたときには、ディスクへの記憶のため、再び数時間を必要としたことでした。数年も経つとハードウェアとソフトウェアの進歩で高速処理が可能となり、求められたときに即、計算し結果を通知するように改められたことはいうまでもありません。

似たようなケースとして、かつて工学書の末尾に対数表や三角関数表が付録として添付されていましたが、今では電卓やパソコンにて容易に関数値を求められるようになったので、付録の作り方が大きく変化しました。科学の進歩が経済活動に変動を与える一例です。

動画のすすめ

ケイタイ、スマートフォン、デジタルカメラの普及で簡単に動画を撮影できるようになりました。動画は静止画像にくらべてインパクトがあります。NHKテレビあさ7時だいに「世界が注目!ネット動画」を月ー金に流しています。世界の秀逸な動画に触れることができます。取扱い説明書を文書化するよりも音声と画像により早く安くわかりやすく準備することができ、これからは動画をお奨めいたします。そして動画を自ら運営するよりも動画サイトへ投稿して利用することが効果的です。 無料の動画サイトはたくさんあり、①Youtube,②Googleビデオ、③ニコニコ動画、④FC2動画などが有名です。いまや多くの企業や団体でYoutubeを公式チャンネルとして、プロモートや日常活動に使おうとする動きが活発化しています。 Youtube公式チャンネル【小学館集英社プロダクション】SHOPRO  http://www.youtube.com/user/SHOPRO 【NHKオンライン】NHKonline         http://www.youtube.com/user/NHKonline Youtubeについて話を進めれば最初、無料のアカウントを取得する必要がありますが、「ファイルサイズ2GBまで、かつ再生時間が15分以内」で誰でもが投稿することができます。Gメールにおける送信ファイルサイズの制限が25MBであり高密度化した写真を、メールと同時に送信しにくい現状を考えると、動画サイトへの投稿を済ませ、URLアドレスをメールで知らせることが現実的であることが理解できることでしょう。動画が静止画像よりも訴え力がある他に大容量の添付ファイルを個々に送信することは時代にそぐわなくなっているのです。 動画をそのまま投稿すると時間の経過とともに、情報の有用性が薄らぎ管理が難しくなるほか、動画受信者に対し不親切です。そこで音声や動画に同期したキャプション(字幕)、見出し、タイトル、説明文などを加えます。また最後には製作者名、連絡先などを明記します。これら一連の作業をサポートする動画編集フリーソフトが数種存在し、①AviUtl、②Avidemux、③Windows ムービーメーカー、④Windows Liveムービーメーカーなどがあります。これらのツールは動画、静止画像、音声ファイルを扱うのでファイル拡張子についての理解を深めておくと取組みやすいでしょう。 近い時期にWindows ムービーメーカーの使い方について公開する予定です。

C言語でプログラミングを楽しむ

C言語でプログラミングを楽しむ館として「C言語の庵(Cげんごのいおり)」を開設しました。目指すはLinuxシステムですがまずは机の引き出しを豊かにする準備から始めます。

一流役者になるには芸の引き出しに財産をどれほど持っているかにかかっているとも言われます。また電気屋さんに電化製品の修理をお願いすると、車の中に半田ごてや測定器のほか、ネジ、抵抗、コンデンサーなどさまざまな小道具がつまっています。

大きな組織で大きなシステムを構築する場合は、各専門家による連合体を形成し分担しますが、LINUXのようなシステムを小グループで開発するには自らが何でも深く咀嚼して理解することが必要になります。そのための知識や道具を採集するたまり場が「C言語の庵」です。

かつてBASICやCの言語処理システムを製作した経験を基盤にして具体的に進められるよう努力してみます。よって、あみだくじと日付から曜日を求めるは「ものづくり筆耕ブログ」から「C言語の庵」に引っ越します。

ものおきの改修

見るに絶えないくらいボロボロだった物置を改修しました。プロにお願いするとそれなりに立派になるが、相当の予算を見込まないといけないので自前で進めることにしました。

素人でできる範囲は小さく、改修は囲っている板材を補強し見栄えを良くするに留め、材料を調達する前に物置の大きさを計って必要とする機材を計算しました。

紙のダンボールのプラスチック版でプラスチックダンボールというハサミやナイフで切り取ることができる補強板15枚、大工技術のないものにはうってつけの材料を購入しました。

その他はねじれのある釘、アクセント用の横板を購入して総計1万円弱で済ませました。畳1枚のサイズをもつプラダンボールは乗用車では運べず、ホームセンターの軽トラックを借りました。

プラダンボールは1枚600円弱で様々な色があり、透明、黄、赤、青はやめ白にしたところ思いの外、見栄えが向上しました。ホームセンターで4~5年は持つでしょうとアドバイスももらって二人で一日がかりでしたが満足しています。

改修前の写真2枚、改修後2枚を以下に示します。他者の個人情報は塗りつぶしてあります。

 

将棋にまつわる雑感

将棋は相手の王将を詰めるゲームですが、将棋のコマには王将と玉将(ぎょくしょう)が1個づつ用意されているものが多いです。機能面での差はなく、実力下位者は上位者に王将を譲り本人は玉将を取ることになります。

これはルールというよりも礼儀ということでしょう。紛らわしさを解消するため新聞将棋では2枚とも玉将を使い王将はありません。坂田三吉を主人公とした北条秀司原作の戯曲は「王将」ですがこれらの題名に異議を唱える無粋ものは皆無のようです。

語り尽くされたかも知れませんが、チェスでは相手から奪ったコマは使えないのに、将棋では自分のコマ(家来)として使うことができます。奪った駒の再利用においてチェスは異民族間の戦争、将棋は同族間の争いを模した格闘ゲームが影響していると言われています。

異民族間では言葉もかなり異なるのに対して、同族間では言葉が通じやすく恭順の意思を確認し味方にするという文化がゲーム形成の基礎になったと考えられます。

これに関し2大勢力(藩)が対立したとき、最大権力者たる藩主が切腹し城を明け渡せば争いを収束し、大勢の家来が救われるということが我が国ではわりと頻繁に起きていましたがヨーロッパでは聞いたことがありません。知らないだけかも知れません。雑感です。