パンくずリスト
  • ホーム
  • コーディング
タグ:コーディング
ホームPage 1 / 11
  • 体験
ソフトウェアツールの値段

この話は、30年ほど前のことである。当時、プロッタで作図をしようと、プロッタ本体とコンピュータ本体につなぐインターフェースを作った経験があったな、などと、考えていたら、ソフトウェアの値段について想い出したことがあったので、書いてみようとおもう。

 

なぜかというと、当時、8ビットのコモドール社のPETというコンピュータが、ある測定を行うために職場に導入された。

 

もちろん、表示は白黒のディスプレイで、文字も一行40字で25行程度の表示能力しかなかった。グラフなどは、手描きか、プロッタを用意して、描かせるのが一般的だった。

プロッタでグラフを描くと、見栄えがいいので、簡単なプログラムをコーディングしては、動作確認し、使っていた。

 

コーディングは、例えば、次のような手順で行う。

 

1. OPEN 2,5 --- プロッタのインターフェースの初期化

2. PRINT#2,"I" --- プロッタ本体の初期化

3. PRINT#2,"M0,0" --- プロッタ原点の指定

4. PRINT#2,"I100,100" --- プロッタのペンを原点から相対位置座標の(100,100)に移動

5. PRINT#2,"P1" --- プロッタのペンを下ろす

6. PRINT#2,"I200,200" --- プロッタを(300,300)まで移動させる(線を引く)

7. PRINT#2,"P0" --- プロッタのペンを上げる

8. PRINT#2,"M0,0" --- プロッタのペンを原点に戻す

9. CLOSE 2 --- プロッタのインターフェースを閉じる

 

上記のように、当時、たいていのプロッタの作図ツールはこんな感じで、簡単なプログラムは、ほとんどすべて自作していた。したがって、たいして時間もかかっていない。もし、仮に作成費用を計算したところで、せいぜい1〜2万円程度だろうとおもわれた。

 

ところが、あるとき、これらのコーディングを行うのは、時間と手間がかかるので、外注に出したらどうか、という話が上司から出た。

 

さっそく、仕様をある程度、外注さんと打ち合わせた後に、見積りをいただいて驚いた。その当時のパッケージソフトと呼ばれたものは、1〜2万円、高くても数万円だった。だから、どんなに高くても十万円を超えないだろうと考えていた。

 

だが、その見積りには、なんと、百万円を超える金額が並んでいたのだ。

 

唖然とした。単純なツールなのに、なぜそんなに高いのか、わけがわからなかったのだ。しかし、とにかく、発注することとなった。

 

1か月ほど待った後に、そのツールは完成した。しかし、コンピュータへのインストールと動作確認に3日もかかり、コーディング自体が分量が多い、サイズが大きいために、当時のひ弱なコンピュータのメモリには、耐えがたいものだった。

 

結局、外注したものはあまり使われず(?)に、(少なくとも自分自身は、ほとんど使わずに、) 自作のツールを使っていたという記憶がある。

 

自分たちは、グラフ作図の意味とプロッタの動作がわかっているので、必要最小限のコーディングでソフトウェアツールを完成させた。

 

これに対して、外注さんは、ある程度、最初に仕様は決めているものの、基本に忠実に、コーディングしようとした、つまり、ある程度、自由度を持たせて、どんな変更要求にも耐えうるようにしたのだと、推察された。(そのため、コードが肥大化した。)

 

また、1か月の人件費と作業費も加算されて、莫大な金額になったのだとおもわれた。

 

ソフトの値段は、おそらくほとんど人件費なのであろう。

 

昔は、コンピュータスペシャリストという職種が、一部の企業にあったときいている。簡単な実験データや測定データを作図するのに、プロッタできちんと描画したほうが、きれいだし、見栄えも良いなど、説明資料としても、メリットはある。だが、さすがに、百万円を超えるソフトでも、自作のソフトでもたいして描画は変わらない、という状況では、困ってしまう。

 

この話は、まだ、ディスプレイのスクリーンコピーができない時代の話なので、今どきの事情はまた、異なるのかもしれない。

 

現代は、32-64ビットのコンピュータの時代であり、さすがに、自作ツールを扱う人は少ないとおもわれるが、外注化はやはり同じような構図だとおもわれる。

 

ソフトウェアの外注化がいかに高価だったかという、自分自身が経験した昔のエピソードのひとつである。

 

(2012-4-30)

 

  • 体験
C言語の習い始めと「最小自乗法」

これも、いまでは表計算ソフトのExcelやCalcなどで簡単にできるとおもうのだが、およそ25年ほど前はまだそれほど便利ではなかった。ちょっとした実験データを整理するのに使った「最小自乗法」のコードは、自分でコードを書いて使っていた。

 

その当時は、パソコンも8ビットから16ビットへの移行の時期で、プログラミング言語はもちろんBASICがメインであった。

 

当時、作成したコードの一部をご紹介しよう。

 

測定するデータとして、x と y の組を何個か(n組としよう)を準備し、いわゆる y=ax+b の係数 a と b を求めるものであり、直線への回帰の度合いを r^2 という指標で表すものである。

 

これをBASIC言語で記述すると、次のような感じになる。

 

=====(ここから)=====

1 ' file"LSQL"

10 ' least square method (linear)

20 'SCREEN 0:CLS:CLEAR:KEY OFF

30 DIM X(30),Y(30),Z(30),W(30),V(30)

40 PRINT"formula Y = A X + B":PRINT

45 PRINT

50 INPUT"quantity of set ( N ) =";N

60 PRINT:PRINT

70 FOR I=1 TO N

75 PRINT I;

80 INPUT" ( X , Y ) =";X(I),Y(I)

85 IF X(I)=-1 THEN I=I-1:GOTO 75

90 NEXT I

100 FOR I=1 TO N

110 Z(I)=X(I)*Y(I):W(I)=(X(I))^2:V(I)=(Y(I))^2

120 NEXT I

130 Z1=0:X1=0:Y1=0:W1=0:V1=0

140 FOR I=1 TO N

150 Z1=Z1+Z(I):X1=X1+X(I):Y1=Y1+Y(I):W1=W1+W(I):V1=V1+V(I)

160 NEXT I

170 A=(Z1-(X1*Y1)/N)/(W1-(X1)^2/N)

180 B=Y1/N-A*(X1/N)

190 R1=(Z1-(X1*Y1)/N)^2

200 R2=W1-(X1)^2/N

210 R3=V1-(Y1)^2/N

220 R=R1/(R2*R3)

225 PRINT:PRINT

230 PRINT" A =";A

240 PRINT

250 PRINT" B =";B

260 PRINT

270 PRINT" R^2 =";R

280 PRINT

290 END

=====(ここまで)=====

 

BASICはインタプリターとよばれるものであって、一行ずつ解釈しながら実行する。そのため、スピードは遅い。これに対して、コンパイラとよばれるものは、一度機械語に変換してから実行するので速い。

 

C言語のコンパイラが16ビットパソコンで使えるときき、なんとかしてBASICで書いたコードをCに変換できないかを考えたものであった。

 

C言語のコンパイラは、当時、LSI-C86試食版ver3.30 というものが、たしか、雑誌の付録で無償提供されていたのであった。

 

そんなとき、街中の本屋さんで偶然みつけたのが、科学技術関係のフリーソフトを納めたCD-ROMであり、その中におもしろいものがいくつかあった。

 

そのひとつが、「B to C」という変換ソフトで、BASIC言語のコードをC言語に強制的に変換するものであった。変換後の多少の手直しは必要だが、そのときは、とても便利であった。たとえば、上述の「最小自乗法」のコードは、次のようになる。

 

=====(ここから)=====

/**** Least Square Method by Osamu Furukawa ****/

#include"stdio.h"

#include"math.h"

#include"string.h"

#include"stdlib.h"

unsigned char _s0[256],_s1[256],_s2[256];

float a;

float b;

int i;

int n;

float r;

float r1;

float r2;

float r3;

float v[31];

float v1;

float w[31];

float w1;

float x[31];

float x1;

float y[31];

float y1;

float z[31];

float z1;

main()

{
extern float a;

extern float b;

extern int i;

extern int n;

extern float r;

extern float r1;

extern float r2;

extern float r3;

extern float v[31];

extern float v1;

extern float w[31];

extern float w1;

extern float x[31];

extern float x1;

extern float y[31];

extern float y1;

extern float z[31];

extern float z1;

putchar('\n');

printf("Least Square Method \n");

putchar('\n');

printf(" formula Y = A X + B\n");

putchar('\n');

printf(" quantity of set ( N ) ="" ?");

scanf(" %d",&n);

putchar('\n');

for(i=1;i<=n;i+=1){

l_75: ;

printf(" %d",i);

printf(" ( X , Y ) ="" ?");

scanf(" %f, %f",&x[i],&y[i]);

if(x[i]==-1){

i=i-1;

goto l_75;}

}

for(i=1;i<=n;i+=1){

z[i]=x[i]*y[i];

w[i]=pow((x[i]),2);

v[i]=pow((y[i]),2);

}

z1=0;

x1=0;

y1=0;

w1=0;

v1=0;

for(i=1;i<=n;i+=1){

z1=z1+z[i];

x1=x1+x[i];

y1=y1+y[i];

w1=w1+w[i];

v1=v1+v[i];

}

a=(z1-(x1*y1)/n)/(w1-pow((x1),2)/n);

b=y1/n-a*(x1/n);

r1=pow((z1-(x1*y1)/n),2);

r2=w1-pow((x1),2)/n;

r3=v1-pow((y1),2)/n;

r=r1/(r2*r3);

putchar('\n');

printf(" A = %g\n",a);

putchar('\n');

printf(" B = %g\n",b);

putchar('\n');

printf(" R^2 = %g\n",r);

putchar('\n');

}
=====(ここまで)=====

 

と、こんな感じになるのであった。もちろん、むだの部分も多いとおもうが、計算処理は速くできたのであった。

 

このようなきっかけが、私のC言語の習い始めであった。ただ、その後、表計算ソフトが発達し、DOSベースでのLotus1-2-3や、Windows3.1 ベースでExcelなどが簡単に使えるようになってからは、この「C言語」との関係はだんだん薄くなってしまった。

 

だが、これも私にとっては貴重な良い経験であった。

 

(おそらく、読者の皆さんのなかには、この記事をごらんになって、自分だったらもっとスマートにコーディングできるのにと思われる方もおられるとおもう。なにしろ、あくまでも、当時の私の経験したことなので、ご寛容を願いたい。)

 

(2010-9-12)

 

 

(追記)

 

もっとスマートにコーディングするとしたら、こんな感じになるでしょうか。

 

(2010-9-12)

 

プログラミングの楽しさと厳しさ

以前、バリスタ(電子セラミック部品のひとつで電圧非直線抵抗素子のこと)の開発に携わったことを書いた。材料開発もそうだが、サンプルの特性をきちんと正確に評価できる測定技術もまた必要になってくるのである。

 

当時、まだパソコン(PC)は8ビットであって、マイコンとも呼ばれてもいた時代のことである。バリスタの特性評価のひとつに、一定の電流を流したときの電圧降下を測定するという操作がある。この測定制御をコンピュータ(PC)を用いて行おうというものであった。

 

定電流電源をソフトウェアで操作し、電圧計で電圧を測定するのであるが、その値は数千ボルトにも達する場合がある。安全装置をつけて、しかも十分な接地を行なって、万が一にも感電事故などが起こらないようにしなくてはならない。

 

この測定制御プログラムを作成したときのことを少し書いてみようとおもう。

 

バリスタのサンプルは、例えて言えば、セラミックの円板の上下に電極を取り付けた形状であって、これらを銅板の上に整列させて並べておき、電源の接地側に接続しておく。

 

電源の高圧端子側を絶縁体でうまく絶縁して、ハンドリングできるようにし、プロッタのペンのかわりに取り付けて、ソフトウェアで、指定したX座標、Y座標の位置に動かし、サンプルの上部に取り付けた電極に接触させる。そして、定電流電源を駆動させて、一定の電流を流し、電圧計に表示された値を読み込む。そして、電流値を変えるか、X、Y座標を指定し直して再度測定するか、という操作を繰り返す、というシーケンスである。

 

このような内容のコーディングを行なったのである。

 

問題点は多くあったが、いちばんの問題は、コンピュータの誤動作であった。

 

8ビットマイコンは、一応、BASICという言語でソフトのコーディングができた。いろんな処理をサブルーチンに書き上げて、メインのプログラムから呼び出し処理をするのであるが、ときどき、誤動作でフリーズすることがあった。

 

原因は、ノイズだとおもわれた。端子が接触し数千ボルトのON/OFFをするときに、ノイズが発生するのか、それとも外来のノイズだったのか、とにかく途中で止まってしまう。

 

どこで止まるのかを観察していると、測定制御プログラムのメインルーチンからサブルーチンに制御が移り、実行処理の後、メインルーチンに戻れなくなっている。ノイズで、コンピュータのメモリのスタック領域が壊れているのだと気づいた。

 

そこで、重要な処理はすべてメインルーチンに書くようにした。簡単な計算などはサブルーチンに書いてもよいが、安全に行うべき高電圧のON/OFFやデータの読み込みなどは、メインルーチンに書くようにしたのである。

 

ようやく、誤動作せずに測定系が正常動作したときは、正直ほっとしたのであった。

 

もちろん、現代は、コンピュータも32ビットや64ビットが主であり、コーディングソフトウェアも進化しているはずなので、こんなことは滅多にないとおもわれる。

 

プログラミングは楽しい面もあるが厳しい面もある。こんな経験をさせてもらったことも、いまでは懐かしい想い出のひとつになっている。

 

(2010-1-21)

 

ホームPage 1 / 11