So-net無料ブログ作成
検索選択
前の30件 | -

スマートメーターと蓄電池と平準化 [技術コラム]

うちの電力計がスマートメーターに変わった。

さっそく、昨日の電力使用量のグラフを見てみた。

すると、やはり、電力の使用量が時間ごとにかなり違い、グラフが凸凹している。
これは、やはり、ローカル側に蓄電池をおき、電力の使用が多い時に(ある電力量を超えたときに)
家庭内に蓄電池が放電し、電力の使用量が少ない時に、蓄電池が充電をすると言った充放電を
繰り返すことにより、そのローカルの家庭内における電力の使用量がどの時間をいても一定と
なり、しいては、その電力管内の電力の使用量がどの時間をみても一定となるだろうと予測できる。

個々の一定を積み上げると、積み上がったものも(つまり全体の電力量も)一定となりますよね。

つまり、電力の平準化が実現できるのである。

これにより、電力会社が、電力の最大容量のために用意すべき発電設備を減らすことができるなど
電力料金を下げる施策を取りうることが可能であると推測される。

上で”ある電力量を超えたら”と書きましたが、その月の電力量の平均などで、あたりをつけておいて、
ある電力量が、その日の電力量の平均に一致するように、ある電力量を動的に動かすのが良いと思いますが、その動かすアルゴリズムは、いろいろと出てきそうですね。
大学などの研究材料としては良いかも。

ローカルに蓄電池を置くだけだと、1日あたりの電力量の平準化が可能となるが、しかし、
毎日の管内のグラフをみてみると、電力量は、ボコボコしていると推測される。
つまり、ローカルの蓄電池による平準化には、限界があるのである。
そこで、系統側にも蓄電池を設けて、平準化をすると、毎日の電力量のグラフも一定の値を
示すようになると推測される。
つまり、集中と分散のちょうど良い関係が求められるのである。

ココナラにて下記サービスを展開しております。 [技術コラム]

Webフロントエンドの開発の支援・代行をします JavaScript・jQueryでの設計が苦手な方向け!


iOS・Androidアプリの開発を支援します 1人ではスマホアプリを開発するのが難しいと感じている方向け!

乱流プラントル数と乱流シュミット数 [技術コラム]

 乱流プラントル数と乱流シュミット数は、ほぼ1と仮定されることが
多いが、流れによどみがある場所では、その仮定が成り立たなくなるだろう。

なぜならば、物質には慣性があるからである。だから乱流シュミット数は、よどみが
ある流れにおいては1と仮定できなくなる。
乱流プラントル数は、よどみがあっても1と仮定できる場合が多いが、それは、熱には
動きの慣性がないからである。しかし、物質が熱の輸送に大きく寄与している場合には、
乱流プラントル数も1と仮定するのが難しくなる。

なぜ、境界層の剥離点を、乱流プラントル数を1と仮定したときに、推定することが
難しいのかは、境界層には、よどみ点があるからである。特に、物質の輸送が熱の輸送に
大きく寄与している場合には、乱流プラントル数、乱流シュミット数で、剥離点を推定
するのは難しくなると思われる。物質の慣性のために、それぞれを1と仮定できなくなる
からである。

また、乱流ルイス数なるものがあまり言われないかというと、流れが複雑な場において、
よどみと思われる場所が多くなると、ほぼ、乱流ルイス数は意味をなさなくなる。
それも、物質の慣性のせいである。ただし、熱の輸送が、ほぼ物質によって行われて
いる場合には、乱流ルイス数を1と仮定するとよいというのは、この乱流プラントル数、
乱流シュミット数、乱流ルイス数がなぜ1と仮定されるのかをよく理解していれば
当たり前のことであることがわかる。
しかし、乱流ルイス数を1と仮定できるときは、上記の議論から、乱流プラントル数、
乱流ルイス数を1と仮定できなくなることがある。それは、よどみのある流れ場において
そういう状況が生まれる。
よどみのない流れにおいては、乱流プラントル数、乱流シュミット数、乱流ルイス数を
ほぼ1と仮定しても問題ないと思われる。


あくまで人間を中心にして仕事をする人間支援型コンピュータシステムの提案 [技術コラム]

人間支援型コンピュータシステム

と書いて、たぶん、想像するものは、皆さんとは、
違うと思います。

このシステムの設計手法が、なぜ、今まで、あまり
メジャーにならなかったか、それは、コンピュータ
ネットワークというものが、そんなに、世の中に、
浸透していなかったからだと思います。

今までのシステム設計では、たとえば、業務システムでは、
人間の行っている作業を、コンピュータのシステムに、
置き換えていくことが多いと思います。
しかし、私が、提案するシステム設計手法は、あくまで、
その仕事は、人間が、行うことが前提です。
その人間と、人間との間の仕事を支援するシステムを構築して
いくと言うのが、この設計手法のきもです。
仕事をするほうの人間が、もし、SE、プログラマーもかねて
いるのならば、その人間を含めたシステムは、自己修復可能で、
自己改善可能で、自己進化が可能で、自己メンテナンスが可能な
システムとなります。高い外注費を払ってメンテナンスして
もらう必要がなくなります。

システム設計にあたって、まず考えなければならないことは、
何人の人をやとえば、その仕事が、価値あるものになるか、
すなわち、人をやとう価値のある仕事になるかです。

そして、その人数で仕事をするためには、どこをどうコンピュータで、
支援してやれば、その仕事をこなせていけるかを考えなければ
なりません。

例として、3人で、その業務をするとしましょう。1000人から、
仕事を依頼されるとします。

すると、仕事の内容を、いちいちメールで、集めていては、大変です。
そこで、仕事を依頼するためのコンピュータシステムを構築する必要が
出てくるのです。
そして、仕事の結果を、1000人に、それぞれ提示するコンピュータシステムも
必要となってくるでしょう。

仕事の内容があるデータ処理であるのならば、データベースを、簡単に、管理したり、
データを処理したり、もしくは、シミュレーションをしたりするシステムも
必要となってくるでしょう。

こんな感じで、あくまで、人が、仕事を請け負い、人と、人のやりとりで、仕事が
進んでいくシステムのことを提案したいと思います。

話がまとまらないので、今日は、ここまでにして、少しずつ発展させていけたらと
思います。

そんなところです。


デジタルインクの可能性 [技術コラム]

今日、面白いメールが来ていた。

それは、”デジタルインク”という概念である。

デジタルインクのデジタルデータには、IDが付与されていて、
どのペンで書いたかがわかるそうである。

しかし、私は、その概念に固執するのは、もったいないと思う。
可能ならば、デジタルインクのデジタルデータには、指紋認証や、
静脈認証をするためのデータが付与されるべきであろうと考える。

すると、あるデジタルインクのペンを握った人が、書いたデジタル
の文字には、書いた人を特定するデータが付与されているので、
紙にサインを書くよりも、はっきりとした証拠のデータとなるのである。

そんなところです。


2進数とn進数に関して [C言語]

 2進数は、定義的には、
 a = a(n)*2**n + a(n-1)*2**(n-1) 
    + a(n-2)*2**(n-2) + a(n-3)*2**(n-3) + ・・・ 
    + a(1)*2**1 + a(0)*2 ** 0
 ということになる。
 10進数の定義が、
 a = a(n)*10**n + a(n-1)*10**(n-1) 
   + a(n-2)*10**(n-2) + a(n-3)*10**(n-3) + ・・・ 
   + a(1)*10**1 + a(0)*10 ** 0
    8進数の定義が、
   a = a(n)*8**n + a(n-1)*8**(n-1) + a(n-2)*8**(n-2) 
   + a(n-3)*8**(n-3) + ・・・ + a(1)*8**1 + a(0)*8 ** 0
 となり、2進数の基数が、2、8進数の基数が、8、10進数の基数が、10と
 いうことの違いがある。
    nは、任意であり、a(i) (iは、0からnの間の整数)は、0か1をとるのが、2進数、
 a(i)が、0から9までの間の数を取るのが、10進数、a(i)が、0から7までの数字を取るのが、
 8進数となる。
 なぜ、8進数で、a(i)が、0から7までの間の整数しか取れないのかは、この定義が、明快であることの
 証明でもある。
 つまり、8進数のi桁目が、a(i)*8**(i)なので、a(i)が、もし、8という値を取れば、
  8 * 8**(i) ——> 1 * 8 ** (i+1) と変化し、一桁上のi+1の桁が1つ増えることになるのである。
もし、8以上の数を取ったとしても、例えば、10とかを取ったとしても、
 10 * 8 **(i)  ———> (8 + 2) * 8 **(i) ——> 1 * 8 **(i + 1) + 2 * 8 ** i
と変化し、一桁上の値が、1増えるのである。
では、a(i)が、マイナスの値を取った場合には、どう処理するのであろうか?
たとえば、a(i)が、-11の場合である。
 -11 * 8 **(i) ——> (-8 - 3) * 8 **(i) ——>-1*8**(i + 1) -3 * 8**(i)
となり、それぞれの桁から、−1、−3だけ引かれることになる。引く数がなければ、上の桁からもってくる
のは、10進数の引き算で勉強した通りである。
しかし、このような柔軟な定義であるが、2進数、8進数、10進数、n進数の定義から、
a(i)は、0から、nの値しか取らないと定義して使う。

 2進数も、8進数も、10進数も、n進数も、表記の簡略系は、
 a(n)a(n-1)a(n-2)・・・a(1)a(0)
 となる。





配列とポインタの密接な関係 [C言語]

 配列とは、実は、連続したメモリにアクセスするための道具にもなる。
配列とは、同じ種類の型の変数(値を入れるための箱)の連続した集まりであるが、
実は、それは、決められた範囲内のメモリにアクセスするための道具になる。

int a[100];

とは、aというアドレス(ポインタ)を起点として、添字が、0〜99まで、
変化することができる連続した変数の集合であるが、これは、起点とした
アドレスから、intの大きさの99個分離れたところまで、アクセスが可能な
ことを意味する。

aがポインタであるということから、次のような記述が可能であることに
気づいた人もいるだろう。

*(a + 1);
*(a + 10);
*(a + 50);
*(a + 70);
*(a + 99);

という記述が実は、可能なのである。
だから、
for(int i = 0; i < 99; i++){
    *(a + i);
}
と言ったプログラムを組むことが可能なのである。

これは、もちろん、ポインタ変数に、aの値を入れて、
アクセスすることに類似する。

int *p = &a[0];
もしくは、
int *p = a;
とすることにより、

for(int i = 0; i < 99; i++){
    *(p + i);
}
と言ったプログラムが可能である。
もちろん、pを配列風に扱うことも可能である。

for(int i = 0; i < 99; i++){
    p[i];
}
しかし、このポインタ変数pも、a[0]~~~a[99]までの
範囲に相当する範囲を超えて、メモリにアクセスすることは、
できないことを忘れてはならない。



入れ子の構造体 [C言語]

 前の記事で、以下のような構造体にすると、1つの情報を扱って
わかりやすいことを述べた。

typedef struct{
   char name[256];
   int age;
   int EnglishScore;
   int MathScore;
   int SocialScore;
   int Length;
   int Weight;
   int Location;
} PERSONAL;

しかし、これでも、構造体の中が、のっぺりと、表現されていて、
情報の整理が実は、できていないのである。

そこで、
typedef struct SUBJECT_TAG{
   int EnglishScore;
   int MathScore;
   int SocialScore;
} SUBJECT;
と、科目のスコアーに関するもので、まず、ひとまとめする。

次に、
typedef struct BODY_TAG{
   int Length;
   int Weight;
} BODY;
と、体に関するもので、ひとまとめにする。

そして、最後に、情報を整理してまとめる。

typedef struct{
   char name[256];
   int age;
   struct SUBJECT_TAG sb;
   struct BODY_TAG bdy;
   int Location;
} PERSONAL;

と言う風にまとめると、プログラムをしているときに、今、どのような
情報を扱ってプログラムしているのかが一目飄然となる。
ここで、構造体PERSONALのなかで、structを使って、入れ子の
構造体を宣言しているが、コンパイラにもよるのかもしれないが、
このようにしないと、コンパイルエラーになってしまうのである。
実は、C言語の文法的にもこうなのかもしれない。そこは、良く調べていない。

PERSONAL psnl[50];
と宣言すれば、
psnl[4].sb.SocialScore = 50;
psnl[12].bdy.Length = 180;

などのように使えるようになる。




構造体に関して [C言語]

 構造体とは、変数をまとめて、使いやすくしたものと私は考えている。

たとえば、
 char name[50][256];
   int age[50];
   int EnglishScore[50];
   int MathScore[50];
   int SocialScore[50];
   int Length[50];
   int Weight[50];
   int Location[50];

 と言った、個人に関する情報を50人分入れておく変数(配列)が
あったとしよう。配列宣言のところでは、かろうじて、何に使うかが
わかったとしても、プログラムのなかで、ごちゃごちゃと使われると、
一つの個人の情報を扱っているということが見えてこないことが多い。

そこで、
struct PERSONAL_TAG{
   char name[256];
   int age;
   int EnglishScore;
   int MathScore;
   int SocialScore;
   int Length;
   int Weight;
   int Location;
};
struct PERSONAL_TAG PInfo[50];

としたほうが、個人の情報を扱っていることが一目瞭然となる。

使い方は、PInfo[4].age = 24;
などのように使う。
これを、typedefして、構造体に、別名を与えることもできる。

typedef struct{
   char name[256];
   int age;
   int EnglishScore;
   int MathScore;
   int SocialScore;
   int Length;
   int Weight;
   int Location;
} PERSONAL;
このようにすると、変数宣言のときに、いちいちstructとつけなくても、
PERSONAL  PInfo[50];
というふうに、宣言できる。



配列、構造体の利用方法 [C言語]


 2次元の配列は、画像のデータを表すのにも使われるが、
2次元の位置座標をいれておくのにも使われる。

double [500][500][2];

だとして、500 × 500の格子状のデータではあるが、
X座標と、Y座標をそれぞれの格子状の点に入れることにより、
なめらかな形状の物体を表現することもできる。

これに、構造体を使うことにより、

typedef struct {
    int data1;
    int data2;
    int data3;
    double X;
    double Y;
}  POLY_DATA;

POLY_DATA pd[500][500];

と、格子状の点の様々なデータを格納することが
できる構造体を定義することも可能である。




多次元配列に関して [C言語]

 多次元配列の定義は、
2次元の場合
int a[100][300];
これは、100*300のintの配列を確保したことになります。
考え方によっては、X方向に、300個、Y方向に100個の
升目上の配列(変数の集まり)を用意したと解釈できます。
しかし、ライブラリの関数に渡すときには、どっちが、Xで、
どっちが、Yかが決められている場合がありますが、個人の
プログラムだけで、配列を使うときには、自分で、どっちが
Xで、どっちがYかを決めておけば、大丈夫です。
たとえば、X方向に100、Y方向に300としても良いのです。
ただし、そのプログラムでは一貫して、その決まり事にそって
プログラムしなければなりません。
つねに、Xが100、Yが300なら、最初から、最後まで、
Xは、100、Yは、300とすべきなのです。

char a[100][300];
と定義した場合には、二次元の画像の255諧調の画像を
表すのに使われることが多いです。
しかし、赤、青、緑、明度のRGBカラーの場合には、
char a[100][300][4];
と、[4]で、RGB + Alphaを表現しなければ
なりません。しかし、このようなプログラムは、
どこに、Rをどこに、Bを、どこに、Gを、どこに、Alphaを
入れたかどうかがわからなくなり、バグを生み出すことが
多いです。しかし、ライブラリで、このような決まり事で、
引き渡さなければならないときには、仕方がありません。
画像を扱うプログラムは、速度を要求されることが多いので、
自分のプログラム側と、ライブラリ側で、データ構造が違うと、
データ構造の変換だけで、えらく時間を取られるはめになります。

しかし、自分のプログラムだけで、そのデータ構造を使うならば、

typedef struct{
    char red;
    char green;
    char blue;
    char alpa;
} IMAGE_DATA;
IMAGE_DATA iMage[100][300];
と言ったデータ構造にしたほうが、プログラムが分かりやすくなります。

三次元配列の定義は、ちなみに、
int a[100][300][500];
などとします。
これは、三次元空間の濃度分布などを格納するのに使われます。



かけ算・割り算の計算順序をかえる方法 [C言語]

 数学の式などをプログラムに展開する場合など特に、括弧で、計算の
順序を変えなければならないことが多いです。

 10*20 + 40 / 20 + 30

と言う式でも、計算順序によってまったく違う値になります。
括弧もなにも無い場合、左から、* / が最初に計算されて
いきます。

10*20 + 40 / 20 + 30
  ↓
200 + 2 + 30
  ↓
232

しかし、ここで、括弧で、計算順序を変えたとしましょう。

10*(20 + 40) / (20 + 30)

このような計算順序の変更は、良くあることです。
計算結果も違ってきます。

まずは、左から、括弧の中から、計算されて行きます。

10*(20 + 40) / (20 + 30)
  ↓
10*(60)/(50)
  ↓
600/50
  ↓
12

となり、上の括弧が無い場合の232と括弧がある場合の
12では、値が全く違ってくることがわかります。

C言語には、様々な演算子がありますが、優先度を良く
理解していないと、間違った計算をすることになります。
しかし、優先度がよくわからない場合には、括弧を明示的に
つけて、無理矢理、思い通りの計算をさせることができます。
 



文字列に関して [C言語]

 すくなくともC言語において、文字列とは、バイト列である。
バイト列とは、8ビットの値の集まりである。

 そんな馬鹿な。じゃー、日本語は、UNICODEは、2バイトじゃないか?
と言われる方がいる。

 2バイトということは、1バイトが2つあることではありませんか?
だから、UNICODEなどは、1バイト変数を2つ使って、1つの文字を表しているのに
すぎないのである。

 だから、
char s[20] = “あ”;
とした場合には、s[0]とs[1]を使って、”あ”の情報を入れているのである。

文字列を宣言するのに、ポインタを使う場合が多々あります。

char *s =“これは、ポインタと文字列の試練です”;

え?ポインタって、アドレス(ポインタ)を入れておくための箱じゃなかったの?
こんなに多くのバイト列が入ってしまうの?と疑問に思われる方もいるかと思います。
しかし、そうではありません。“これは、ポインタと文字列の試練です”は、まず、メモリに
確保されます。そして、その確保されたメモリの先頭アドレスが、sに入るのです。
これは、C言語のほとんどのコンパイラの仕様であって、お約束に近いです。
ちなみに、このsが指し示す値は、書き換え不可能です。

しかし、
char s[20] = “これは、ポインタと文字列の試練です”;
と宣言すれば、sは、書き換え可能となります。
しかし、sを書き換えるときに、直接s[1] などをいじくると、2バイトで、表現されている
日本語などは、ごちゃごちゃになるので、C言語で、用意されている文字列を扱う標準関数を
使いましょう。
ただし、その標準関数に、さきほどのポインタを渡すと、書き換えられない故のエラーが
でるので、覚えておきましょう。



ポインタに関して。 [C言語]

 ポインタとは、そのオブジェクトがおかれているメモリの先頭アドレスにすぎない。

 型には、char int short long float double などがあったが、それらの変数には、
その変数を指し示すアドレスを持っている。
 int a = 1;
 というaの値1を持ってくるときに、アドレスバスに乗るのが、そのアドレスである。
そのアドレスのことをポインタと言っているにすぎない。
アドレスバスとは、広大なメモリ空間の中で、aという変数の中身がおかれている場所を
示す住所にすぎない。

 そして、変数のポインタ(アドレス)を、抜き出す、お約束が、&マークである。
変数に、&aと言う風に、変数の前に、&をつけると、それは、その変数を指し示すポインタ(アドレス)
に変化するただのお約束である。理論もへったくれも無い。

 ポインタ変数とは、上で書かれているポインタ(アドレス)を格納しておくための
変数(箱)にすぎない。

 ポインタ変数宣言は、
int型変数のポインタを入れておく変数を宣言する場合には、
まず、int を書いて、その次に、*をつけるのがお約束である。
int *p;
とすれば、ポインタ変数宣言となる。
忘れてはならないのは、ポインタ変数とは、ポインタではないということである。
ポインタを入れておくためのただの箱である。これは、お約束であり、理論もへったくれもない。

int *p;
というポインタ変数のpの中には、まだ、NULLという値しか入っていない。
宣言したての時には、このNULLが入ることがお約束である。

そこで、
p = &a;
のように、&aというポインタをポインタ変数pに代入して初めて、ポインタ変数pに意味が
出てくる。
pの中には、ポインタ&aが入っている。つまり、変数aの住所であるアドレス(ポインタ)が
入っている。

さて、pを使って、aの中身を取り出すには、どうすれば良いのであろうか?
pは、aの住所を知っているのである。住所させ知っていれば、取り出すのが容易なことは、
明らかだろう。
またまたそのお約束が*マークである。
*マークをpの前につけると、つまり*pとすると、それは、aのエイリアスと言っても過言では
なくなる。
*p = 1652;
とすれば、aの値は、1652となるのである。同じメモリエリアをさしているのであるから、
当たり前である。これは、お約束ではなく、理論である。



配列に関して [C言語]

 配列とは、連続した変数の箱と表現されることが多い。

 確かに、
   以下のプログラムのように、

 int i = 0;
   int MyArray[20];

   for(i = 0; i < 20; i++){
           MyArray[i] = i;
   }

   のように、連続して、変数iを増加させたりすることにより、
 値を入れたり、出したりすることができる。

 ちなみに、
    MyArray
  などの配列の名前は、その配列の最初のメモリのアドレス
 もとい、ポインタである。
 たとえば、
 int *p = MyArray;

   とすれば、
 *(p + 1) と MyArray[1]
   *(p + 2) と MyArray[2]
   ///
   *(p + 19) と MyArray[19]
 は、同じメモリの中身をさしている。

 また、
   int MyArray[20];
  と宣言した場合、0〜19までの添字(上のプログラムではi)で、
 アクセスできる、19を添字が超えた場合には、たとえば、30とか、
 プログラムがエラーを起こしてしまいます。

 また、コンピューターウイルスなどは、このメモリの添字が、規定値を
 超えてしまうことを利用したものもあります。
 バッファオーバーランというものです。



変数に関して [C言語]

     数値には、型と言うものがあったことを思い出して頂きたい。

 その型の数値を格納しておく、いわば箱となるものが変数である。
 その箱は、一般的には、メモリに確保されます。
 しかし、コンパイラによっては、良くつかわれ、使い回される変数は、
 レジスタというところに確保される可能性があります。

 変数は、メモリに確保されようが、レジスタに確保されようが、その
 プログラムが終了したり、パソコンをシャットダウンしたり(プログラムが
 終了するということですが)すると、内容は、消えてしまいます。
 こういう風に、消えてしまう性質のことを揮発性と言います。

 こんな感じで、消えてしまいたく無い場合には、ハードディスクに、
 数値を保存する必要があります。
 その格納する単位が、ファイルというものです。
 この場合の性質が、不揮発性と言います。

 メモリには、アドレス(つまりメモリを指し示す住所)があります。
 その住所は、32bit CPUの場合には、32ビット4バイトとなります。
   そして、通常そのアドレスは、16進数で表します。
 16進数とは、10進数が、9の次が10であるのに対して、
 16進数は、9の次は、Aで、その次が、B、C、D、E、Fと
 値が上がって行きます。つまり一桁で、16個の場合を表すことができる、
 それを16進数と言います。
 
 さて、アドレスが、0x23945793
 の場合に、メモリは、どこを表しているでしょうか?一般的には、1バイトの
 メモリを表しています。
 char c = (char)(0x23945793);
 とキャラ型にキャストしてやると明白です。
 ここで、
    int i = (int)(0x23945793);
 とキャストしてやると、そのアドレスが示す1バイトの部分だけでなく、お隣にある
 3バイト(intが4バイトの場合)も含めて、iに代入されます。
 このとき、intの数値がどのように格納されているかどうかは、ビックエンディアン、 
 リトルエンディアンという仕組みに支配されています。

 ちょっと難しいですが、アドレスは、0x23945793のように、何でも与えて
 良いのは、char型だけで、intなどは、偶数値を与えたりしなければなりません。
 それは、CPUによります。そういうのをint境界と言う風に呼びます。
 


型に関して(double float int long short charなど) [C言語]

 今までは、float型、double型、char型、int型の即値を
説明して来たが、その即値とは、
float の場合(例)
 1.234F
(floatの場合には、double型の即値と見分けるために、末尾に、Fをつけます)

doubleの場合(例)
 4.234
(doubleの場合には、floatと違い、そのまま浮動小数点をかけば、double型になります)

以上 浮動小数点で。

char型
 1バイトの正負の値をとる整数である。
(どのコンパイラでも、このchar型は、大きさが決まっています。)

int型
 システムがもっとも扱いやすい大きさをもつ正負の値を持つ整数である。

ほかに、整数型として、long、shortなどがあり、コンパイラによっては、long long
なんていうのもあります。
これらは、コンパイラで、その大きさは、決まっておらず
short <= int <= long <= long <= long long
という大きさの不等号が決まっているだけです。

他に、整数には、正の値しか取らない
unsigned char
unsigned int
unsigned short
unsigned long
unsigned long long
などがあります。
unsignedにすると何がよいかというと、正負の値をとるintに比べて、正の値しか
とらないunsigned intは、倍の整数の範囲を取ることができるということです。
また、unsigned intなどは、メモリのビット列を表すのに最適です。
普通のintで、メモリのビット列を表すと、intの最上位ビットは、正負の符号ビット
であるため、ビット演算を行ったときに、算術演算となり、
例えば、メモリが、ハードウエアのスイッチになっている場合など、ビットの演算が
できないということがあります。



浮動小数点に関して(floatとdouble) [C言語]

浮動小数点とは、実数のを表すことができるものである。
floatとdoubleの違いは、その精度の違いである。
floatは、10の38乗ぐらいまで、表すことができるが、精度とは、
その38乗のことを言っているのではなく、何桁有効数字があるかと
いうことである。コンパイラにもよるが、floatは、6桁ぐらいの
有効数字しかない。有効数字は、左からカウントされる。
例えば、
5.0384735
ならば、整数の5から、有効数字がカウントされていく。
なので、有効数字6桁の場合には、5.038473までが、
コンピューターが保証してくれる数であって、最後の5
つまり、0.000005は、変数に代入したりするたびに、
ころころと変わってしまう数なのである。
doubleは、10の308乗くらいまでの数を表すことができるが、
有効数字は、15桁くらいである。もちろんコンパイラにもよるが。

しかし、ここで、注意しなければならないのが、実数は、数直線上の
すべての数を表すことができるのに対して、floatとか、doubleで
表される数字は、まだらにしか数を表現できないのである。
0から1 11から12の間の数をfloatとか、doubleで、表現しようと
しても、穴があいてしまうのである。すると、CADとか、CAMのプログラム
を作ろうとすると、X、Yの位置を正確に表すことが、doubleでさえ
できないのである。誤差が出てくる。数式上は、あるポリゴンに乗っていた
としても、doubleでの数字では、ポリゴンに乗っていないということが
多々ある。コンピューターで、数式の世界を表現するということは、
こういう困難があることを忘れてはならない。


足し算の優先順位(かけ算・割り算への準備) [C言語]

 足し算は、いわゆる線形なので、どこから足し合わせて行っても、
 同じ結果がでる。
 10 + 20 + 30 + 40 + 50 + 60
 などは、普通のコンパイラなら、+ は、左結合なので、左から
 計算されて行く。
 これで、整数の計算は、問題はない。
 しかし、浮動小数点の計算の場合には、計算順序が、精度に影響を
 与える場合がある。大きな浮動小数点の数字と、小さな浮動小数点の数字を
 足し合わせた場合、小さな浮動小数点が、無視されてしまい。結果として、
 実際の値とかけ離れて、精度が悪くなる場合などである。

 さて、この足し算を、強引に、計算順序をかえることができる。
 それが、括弧”(” と ”)”の役割である。
 たとえば、
 (10 + (20 + 30)) + (40 + 50)
 などとすれば、単純に、左からの足し算にはならない。
 (10 + (20 + 30)) + (40 + 50)
    ↓
 (10 + 50) + 90
    ↓
  60 + 90
    ↓
  150

  のような計算順序になる。
  整数の足し算の場合には、なにも関係がないが、かけ算、割り算が入ってくる
  計算の場合には、結果が違ってくるので、計算順序をかえるということは、
  とても重要なこととなってくる。



int 型を char 型に代入するときの注意点 [C言語]

     int と違い、char型は、システムで、大きさが決まっています。
 1バイトの大きさです。unsigned char も同じ大きさです。

 char 型で定義した変数
 char a;
 に、int 型の範囲外の大きさの数字を代入しようとするとどうなるでしょうか?
 たとえば、char 型の範囲は、-127から128なので、intに260を代入して、
   int b = 260;
   char型の一番上のビットは、符号ビットなので、260をビットに直して、
   符号ビットも含めて、8ビットだけが代入されます。
 よくよく考えると、代入された値は、計算することは、できますが、
 しかし、intのchar型を超えた値を、int型からchar 型に代入した場合には、
 意味の無い数字として、そのint型の変数の値を考えなければなりません。


 

intの符号あり・なし [C言語]

    intは、正、負、両方取ることができる。
 大きさは、システムで、効率よく動けるbit数による。

 int に、たとえば、-1435を入れたとして、これを
 int a = -1435;
   としたとしても、
   unsigned int b = (unsigned int)a;
   と、unsigned int でキャストしたとしても、bの符号は、プラスになり、値も変わる。
 しかし、bのメモリのbitの配置は、変わらないのである。



int の システム的な解釈 [C言語]

    intとは、システムで、効率よく計算が出来る型である。

 つまり、64bitのCPU上で動いているなら、intは、64bitの可能性が
 高い。
 64bit CPUの場合、レジスタと、intのメモリの間の転送が一発で済むからである。
 ただし、このとき、データバスも64本無ければ、意味が無い。



C言語における足し算 [C言語]

  足し算というと、
  12 + 31;
  は、あきらかに足し算ですね。

  この足し算、数字が書いてあり、変数が書いてある訳では無いのですが、
 12は、まず、メモリに確保されます。しかも、int型として、メモリに確保されます。
 もしも、long型として、メモリに確保してほしいなら、
 
  12L + 31L;
 と書くと、12は、long型として、メモリに確保されます。

 さて、
  12 + 31
 ですが、12は、int型として、メモリに確保され、31もint型としてメモリに確保されます。
 そして、2つの足し算の結果は、43ですが、これも、int型のメモリとして、確保されます。
 なぜ、確保というかというと、メモリに格納されているかどうかは、保証されていないからですね。
 レジスタと言うところに確保されている可能性が高いです。

 そこで、たとえば、
    int result;
 と言う変数を、定義して、
 result = 12 + 31;
 としたら、メモリに確保されている43が、resultという変数に、入ります。
 正確には、コピーされます。

 これが、C言語における足し算です。

 次回は、もっとこの足し算を掘り下げて行ければと思います。




コンパイラを通すために必要最低限必要な記述 [C言語]

コンパイラを通すためには、


#include
int main(void){
    printf("Hello,World!¥n");
    return 1;
}

解説:
 stdio.hをインクルードしていると思いますが、それは、以降に使う
 printfのために必要です。printfの引数が、char *であることを、コンパイラに
 あらかじめ知らせる記述をこの#includeが読み込むわけです。

 printfの中には、ダブルコーテーション、つまり”で囲まれたものが存在しているかと
 思います。"Hello,World!¥n"ですね。
 これは、文字列と言うもので、この関数printfを呼び出すことにより、引数である、
   Hello,Worldがコマンドラインに出力されます。¥nは、改行しましょうねというものです。
 引数、"Hello,World!¥n"は、上記で、char *と書きましたが、この文字列を書くと、
 メモリに、この文字列が確保されて、char * が、printfに引き渡されると言う訳です。

 mainで、int と書かれていますが、これは、mainの戻り値が、int型であることを示して
 います。mainは、どの関数からも呼ばれていない、このプログラムの最初の関数ですが、
 システムからみれば、システムから呼び出す関数にすぎないので、mainは、システムに、
 intを返すと言う意味です。main(void)は、main関数は、引数を持ちませんよと言う意味です。

 return 1は、実は、書かなくても、コンパイルは、通るのですが(昔のコンパイラなら)
 しかし、最近のコンパイラは、int mainと書いている以上、なにかreturnで返せよなと
 コンパイルエラーを出してしまうので、return 1;と1を返すようにしています。

 私は、プログラムを練習するにあたり、Visual Studioを購入しました。
 高いのですが、その後も、いろいろなことに使えて便利ですし、統合環境なので、
 覚えておくと、就職後も楽でした。




 

スーパーやデパートで迷わないために! [技術コラム]

こんなICタグの利用を考えてみました。
家で、献立などをたてて、その材料が
わかって、購入されたものがわかっても、
インターネットなどで配信してもらえば
楽なのですが、それは、なかなか高くつきます。

しかし、スーパーなどにいっても、どのような
材料を買えばよかったかをメモを見ながら
いちいち探すのは、いつも通っている女の
方ならまだしも不慣れな男の人にとっては、
結構きついものがあります。

そこで、ICタグを持って、スーパーに行き、
歩いていると、買うべき品物の前まで
いくと、今日は、これを買う予定ですと、
教えてくれるシステムは、どうでしょうか。
もしくは、買うべき品物の前まで、床に
埋め込まれた電光掲示板が、矢印を
示して教えてくれるとかは、どうでしょうか。
買うべきものを買わないで、店を出ようと
するとまだ、購入していないものが
ありますと教えてくれるのもよいかと
思います。

これは、衣服とかにも応用できることで、
デパートとかで、自分の買いたいもの
(インターネットとかで、見つけたとか)
のところまで、ロボットが案内してくれる
というのもいいかと思います。

案内してくれている間に、漫才のひとつでも
ロボットがやってくれると面白いと
思います。


情報検索の可能性 [技術コラム]

グーグルの未来像が書かれている本に
載っていたものを補足したのですが、
ICタグを持っていて、歩いていて、
あるレシーバーの周辺に行くと、
自分の好みの映像や、写真などが
表示され、自分の好みの音楽が
流れるというものです。

自分の好みというのは、以前
その人がインターネットから
ダウンロードした音楽や、
グーグルで検索したものです。

また、ICタグを持っていれば、
位置情報がわかるので、その人が
どこで、その情報を欲しているか
わかるので、その位置の近く
の情報を届けるというのも
よいかと思います。

しかし、これは、携帯電話の
GPSを利用したものがすでに
ありますが、あまり、普及して
いないのが現実です。

また、プライバシーの問題が
あります。


ロボットに必要となってくるもの [技術コラム]

前回、デパートなどに行くと、自分の好きな物の
所へロボットが誘導してくれると言うのを書きました。
このとき、ICタグによって、識別されるものは、
2つあると思います。

ひとつは、お客さんであり、もうひとつは、品物
です。

このとき、レシーバーが固定されてしまっていては、
品物や、お客さんが、そのレシーバーの近くにいる
ということしかわかりません。

しかし、ロボットがレシーバーならどうでしょうか?
ロボットは、動けるので、人や品物の所までピンポイント
でいける。要するに、3次元の1点を識別できるのでは
ないかと思います。しかし、ICタグひとつと、レシーバー
ひとつでは、3次元の1点を識別するのは、かなりの
技術を要すると思います。これは、No5で触れます。

さて、3次元の1点を識別できれば、ロボットが、着実に
お客さんを品物の所まで、誘導できます。
このとき、ただ単に品物のところに、お客さんを
誘導するだけでよいのでしょうか?

ロボットと人間とのインタラクションが要求されるものと
思われます。インタラクションは、会話などがありますが、
体の不自由な方などに対しては、それだけではないと
思います。

こう考えると、ロボットとICタグの組み合わせは、
お買い物だけに応用できるものではないと思います。
識別しなければならないもののすべてが対象に
なってくると思います。

たとえば、介護は、どうでしょうか?
ICタグを持った患者さん、ICタグがついた、
食事や、薬や、衣服。それを扱う、レシーバーつきの
ロボット。何かができそうだと思いませんか?


GPSの原理 [技術コラム]

前回、ロボットについている、レシーバーと
ICタグ1個で、3次元の1点を識別できるかと
いうことを述べました。

まず、難しいということを述べておきます。
ある人が、電波の出るものの距離を計ろう
として、それをニューラルネットで構築しようと
しました。入力として、電波の強度、教師信号と
して、レシーバーと発生源との距離です。

しかし、ニューラルネットは、永遠に学習
しなかったそうです。こんなこと書くと夢が
ないと思われますが、結構厳しいです。

一般に、ICタグからは、電波が出ています。
その電波をレシーバーが受信することによって、
ICタグがついたものが見つけられると
いうものですが、これは、ICタグが、
レシーバーの有効範囲にあるということが
わかるだけです。

では、レシーバーのついたロボットが品物を
手に取れるくらいの精度は、でないのでしょうか?
一般に、テレビなどの電波は、指向性のあるものを
飛ばします。これは、ほとんど、減衰がないと
聞いています。

しかし、普通に電波を発生すると直感的に、
電波は、どんどん減衰していってしまうと
思います。(間違っていますか?)
すると、発信させた電波の強度と、減衰率が
わかれば、ICタグまでの距離が測れる
のではないでしょうか?
放射能のガーガーカウンターではありませんが、
ICタグの電波の強くなるほうへ、ロボットが
近づいていけば、ICタグのついた洋服をロボットが
つかめるのではないかと思います。

3次元の1点を特定する技術として、GPS
(グローバルポジショニングシステム)が
あります。
これを行うには、レシーバーが3個必要で、
その3つの乗った平面の上側にあるか、下側に
あるかがわかるというものです。一般に、
レシーバーは、天井につけるので、レシーバーの
したにあるICタグの3次元上の1点が識別できる
というものです。

やはりこれを使うのが現実てきなのでしょうか?

皆様のご意見お待ちしております。


ロボッドの位置情報の算出システムの提案 [技術コラム]

さて、レシーバー1個と、ICタグ1個で、
3次元上の1点を識別できるという
夢の技術が開発された後の議論です。

ロボットがレシーバーの場合、ICタグの
電波には、有効範囲があるので、
ICタグの近くに行かないとICタグの
場所がわからないという問題があります。

やはり、固定型のレシーバーで、
大雑把な位置を見つけて、ロボットが
ICタグの近くに行くことによって、
3次元的な1点を見つけ出すというのが
現実的なのでしょうか?

しかし、固定型のレシーバーを多数配置するのは、
お金がかかりすぎるという場合は、ロボットを
複数巡回させてICタグのおかれている
位置のマップを協調してつくり出すと
いうことも考えられます。


空調システムの最適な設定の提案 [技術コラム]

講習会とかの部屋に入ったとき、寒いなと
思ったことがありませんか?
そんなときに、自分の適温と風が当たるのが
すきとか風が当たるのが嫌いとかを
記録したICタグを持ち歩いておいて、
ある部屋にはいるとそこの空調設備が
部屋内にいるすべての人のICタグを
読み取って、最適な空調計画を立てて、
空調するというのは、どうでしょう。

しかし、ここの用途のためにICタグを

多数もちあるくのは、大変なので、

携帯電話にICタグを組み込んで汎用

にするのがいいのかとも思います。


前の30件 | -