エンジニアが発信する【2007年03月】の記事です

エンジニアが作る最新ITブログ トップ>【2007年03月】

2007年03月31日

18日目

この本での18日目です。

---------------------------

3週間完全マスター ソフトウェア開発技術者 2007年版
¥2,940
Amazon.co.jp

---------------------------

さて、DBがらみは結構すぱっと行ったのですが、、、

セキュリティがらみはいまいち進みが悪いです。


そうです。

仕事が忙しいのです。(いや嘘。ちょっと忙しい程度)


セキュリティの仕組みは気になっていたので今回は特に勉強させてもらいます。

ただ。。。共通鍵と公開鍵はなぜか知ってたなぁ・・・。

どこで勉強したのかな?


き、記憶に無い。



ってことで、今回身に付けた知識


・情報セキュリティとリスクマネジメント

 「情報セキュリティとは、企業や組織の情報システムを脅かすリスクに対して、安全、安心、防衛を提供する手段」


・セキュリティポリシの策定

 ポリシ(基本方針):セキュリティに対するその組織の考え方、体制(運用方法)、罰則、用語の定義等を記します。

 ガイドライン(スタンダード:規定集):不正アクセス保護、パスワード管理、ネットワーク接続、媒体管理などに関する基準を示します。

 マニュアル(プロシージャ):社外サーバーの設定方法や、パスワードの運用方法など。


・BS7799-2

 セキュリティポリシを定める⇒情報セキュリティ管理システムの適用範囲を決める⇒リスクアセスメントを行う⇒リスクを管理する⇒実施すべき管理目的及び管理策を選択・追加する⇒適用宣言書を作る。

 BSIによって作成された情報セキュリティの管理基準


・共有かぎ暗号方式

 送信者と受信者で同じかぎを使用する。


 特徴は以下のとおり

 ・暗号化/複合化が高速。⇒DES方式が有名。RAS方式の数千分の一の時間で暗号化/複合化が行える。

 ・事前に相手にかぎを安全に配布する必要がある。

 ・通信相手の数に比例して管理するかぎの数が増える。n(n-1)/2個必要


 DES暗号方式:1977年にNBSより公布。平文を64ビットずつのブロックに分割し、転置と換字を組み合わせた処理を16回行う。64ビットの鍵を使う。(その他の鍵:IDEA[Ascom Tech-スイス-] FEAL[NTT-日本-] RC5[RSA data security-アメリカ-])


・公開かぎ暗号方式

 鍵を秘密にしないで公開する方式。


 特徴は以下のとおり

 ・暗号化/複合化に時間がかかる。

 ・不特定多数の相手との暗号通信が可能。

 ・かぎの管理が容易。


 RSA方式の鍵の長さは1024ビットが主流。鍵が長くなるのでコンピュータの性能が向上しても処理速度は余り変わらない。


 暗号通信では公開鍵が「暗号化」を行うが、電子署名では公開鍵が「複合化」を行う。


・電子署名

 送る予定のメッセージとそれを秘密鍵で暗号化したメッセージを相手に送り、受け取った相手は公開鍵で複合します。

 メッセージが同じことによって送信者を特定します。なお、この方法はメッセージの改ざんも検知できます。


・ディジタル証明書

 ある公開鍵が正当な所有者のものであることを、通信の当事者以外が証明するもの。


・PKI

 公開かぎ暗号方式の技術を応用した、セキュリティ基盤のこと。

 プロトコルの代表には:WWWのSSL、電子メールのS/MIME、VPNのIPSec


・WWWの暗号化

 SSL(Secure Socket Layer)が多く使われている。

 ディジタル証明書とセッションかぎを使った通信。


・電子メールの暗号化と認証(S/MIME)

 1.共通かぎを生成し、その鍵でメッセージを暗号化。

 2.共通鍵を公開鍵方式で暗号化し、メッセージに添付して送信する。


・IPsec

 IPパケットまるごと暗号化する。(IPアドレスが見えなくなって宛先が分からなくなるのでは???)


 IKE:暗号化に使われる公開かぎ方式暗号などで暗号化し、安全に共通かぎを相手に渡します。

 AH:IPパケットのメッセージ認証を行います。暗号化は行いません。

 ESP:IPパケットの認証と完全性に加え暗号化も行います。


切羽詰ってきたなぁ・・・。

2007年03月31日

Vectorにて - 松のページブログ - 楽天ブログ(Blog)

 ちょっと前に気がついていたのだが、A5:SQL Mk-2 を Vector にて公開したところ、コメントを付けてくれた方がいるみたいだ。

> コメントタイトル:惜しい…!
> コメント内容:ツールとして、センスの良さを感じます。
>これで各種文字コードへの対応力が高ければと、思うことしきりです。
>個人的に今後の進化に期待してます。

 なんか褒められてますね。メチャメチャうれしいです。目がハート

 だけど、各種文字コードの対応力? A5:SQL Mk-2 は内部的にはShift_JIS(MS932)で動いているのだが、データベースの文字コードから、Shift_JISへの変換は基本的にデータベース側の「OLE DBデータプロバイダ」がやってくれるはず…。

 んー、CSVのインポート/エクスポートがShift_JIS(MS932)だけだからかな?EUC-JPとかUTF-8とかに対応すべきかな?。

2007年03月30日

[C#] Visual C# 2005 Express Edition

c-visual-c-2005-express-edition

ひょんなことから(またかよ!)仕事でVC#触ることになりました。
VS2003が手元に有るんですが、無料版も有るってことで2005を。

Visual C# 2005 Express Edition 日本語版
http://www.microsoft.com/japan/msdn/vstudio/express/vcsharp/

.Net 2.0なC#プログラミング、初めてのチャレンジです。
以前は高価な開発環境だったVisual Studioですが、今は無料なんですねー。
(Express Editionですがね)

とりあえず、製作はデータ取込&印刷っていうクライアントアプリです。
てことで軽そうなADO.NET 2.0なDBが何が有るかなーとネットを探してみたら

ADO.NET 2.0 Provider for SQLite
http://sourceforge.net/projects/sqlite-dotnet2/

SQL Server 2005 Compact Edition
http://www.microsoft.com/japan/sql/editions/compact/default.mspx

とかとか。

とりあえず、SQLiteの方が馴染みが有るので、さくっとアプリを作ってみました。
色々便利になってるのねー、でもあっという間に重たいアプリになるかも、、、などと思った旧世代VBな人でした。

Technorati , , , , , ,

2007年03月30日

C言語編第三十三章 メモリの動的確保 - giru0116のブログ - 楽天ブログ(Blog)

今回はメモリの動的確保。 これも結構重要な内容です。

メモリの動的確保とは



例えば極端な話ですが学校で人数が多いクラスは60人、少ないクラスは25人だとします。
この時配列を60人分確保すると、25人のクラスの場合は35人分が無駄になります。
他にも文字列の入力を受け取る配列の大きさにも困りますね。

長い文字列を入力される事を想定して1000もの大きさを確保したとしても
10文字も入力されないなんてこともよくあるのではないかと思います。
これは相当もったいないですね…。

逆に大体10文字だからといって10文字分しか用意しないとそれ以上の入力があった時
対応できません。 これでは駄目ですね。

このような時に役立つのが「メモリの動的確保」です。

これまでのプログラムでは配列は事前に大きさを決めてソースコードを書いていました。
しかしメモリの領域を動的に確保できると上記のように
もったいないような事になること、足りなくなることもなくなります。
このメモリの動的確保を行なうのに最もよく使われていると思われるのがmalloc関数です。
数学関数を使う際にはmath.hが、文字列関数を使う際にはstring.hというヘッダファイルを
インクルードする必要がありました。
malloc関数のようなメモリを操作する関数を使うにはstdlib.hをインクルードする必要があります。
これはソースコードの上部に#includeと書くだけでいいので問題ないかと思います。

ちなみにmalloc関数のプロトタイプ宣言は void *malloc(size_t);となっています。
「size_t」というのはsizeof演算子が返す型だと定められています。まぁ負の値は返さないので
unsigned intと同じだと思えば問題ないかと思います。

「void *」は基本的に他のポインタ型へキャストをして使用します。
他のポインタ型とは違って、void型のポインタは別のポインタ型へ全く問題なくキャストが
できるというのが主な使用法です。 まぁこのvoid *についてはあまり覚えなくても問題ないです。

malloc関数とfree関数



さて、それではmalloc関数に戻ります。void *malloc(size_t); この関数は
引数に確保する領域のバイト数を指定します。 そしてその確保した領域の先頭のアドレスを
戻り値として返します。 例を示します。






ソースコード
malloc01
実行結果
malloc02


こうしてmalloc関数は使います。引数にはsizeof(int) * 5として、int型の大きさを5個確保しています。
戻り値を代入しているのはint型のポインタですね。 
(int *)として、int型のポインタへとキャストしてから代入しています。
このキャストは今のコンパイラなら必要ないのですが
古いコンパイラであった場合、キャストしないといけないということがあるので
一応(int *)をつけることにします。

また、滅多にないことなのですが、malloc関数は残りのメモリが確保しようとしている量よりも
少ない場合にはメモリが確保できず、NULLを返すことになっているので
if(p == NULL)として戻り値がNULLの場合の対策をしています。
ここでexit関数を使っています。 これを実行するとここでプログラムを終了します。
return文の場合はmain以外の関数で実行した場合、プログラムが終了することはありませんが
exit関数はmain以外の関数で実行した場合でも、プログラムを終了させます。
引数に入れる値は正直適当です。 ここでは1を指定しています。
ただ、0は正常に終了する という事を表すそうなので0以外にした方が良いようです。
(例:return 0; ← main関数の最後、0で終了している)

最後になりますが、free関数は重要です。
これを使って確保したメモリを解放しないと
無駄に使わない領域を増やす結果になってしまいます。
まぁプログラムが終了する際にはちゃんと確保した領域は解放されることが多いのですが
解放されない事も稀にあるようですし、malloc関数と対にfree関数を使うようにというのはよく言われています。
このfree関数というのはしばしば使うのを忘れてしまうのですが、絶対につけて下さい。
まぁこう書いている私自身もよく忘れてしまっているわけですがorz

まぁ色々と面倒な事を書いてきましたが、簡単にいうと
p = malloc(sizeof(int) * 5);というのは
int a[5], *p;
p = a;

としているのと同じ事です。 そして上の5というのは変数にする事もできるので






ソースコード
malloc03
実行結果
malloc04


ということができます。 これでメモリの動的確保ができるようになりました。

realloc関数



malloc関数でメモリを動的に確保して、free関数で解放する。
これだけでも十分に問題ないのですが、ついでにrealloc関数というのも説明します。
これはメモリを動的に再度確保する関数です。
この関数のプロトタイプはvoid *realloc(void *, size_t);となっています。

引数の1つ目にはmalloc(またはrealloc)で確保した領域のアドレスが代入されているポインタを指定
2つ目には確保する領域のバイト数を指定します。
そして確保した領域の先頭アドレスを戻り値として返します。

ちなみに1つ目の引数にNULLを指定した場合はmalloc関数と同じ働きをします。
2つ目の引数に0を指定した場合はfree関数と同じ働きをします。
これはrealloc関数が1つ目の引数で指定した領域の内容を別の場所にコピーした後に
free関数で解放して、2つ目の引数で指定したバイト数分だけ領域を確保し
コピーした内容を、この確保した領域にコピーし直すという
働きをしているためです。
そのため1つ目の引数がNULLだった場合はmalloc関数と同じに
2つ目の引数が0だった場合はfree関数と同じ働きをします。

またこの時、1つ目の引数に指定したアドレスと戻り値のアドレスは同じである場合が多いかと思いますが
違う事もあります。
 これによって問題が起こる事もあります。

例えば関数に引数としてmallocで確保したメモリ領域の先頭アドレスを渡したとします。
要はこういう状況です。 長くなるのでソースは画像で示せませんが…。

ソースコード

realloc01
この例ではreallocで確保しているのは10です。 この程度の領域確保の場合なら引数に指定したアドレスと
戻り値のアドレスは同じだと思います。 これは指定した領域の大きさが問題になる事が多いですので。
そこで、reallocで確保する量を100000にしてみます。 結果がこれです。

realloc02
このように関数に渡したpとアドレスが同じなのならば問題なく上の例のように関数内で
代入された値が表示されるはずなのですが、されていません。
これは確保した領域が違う場所であるために起こってしまう現象です。
確保した場所が違っても再確保する前の場所のデータは新しいアドレスの方に
コピーされるので基本的には問題ないのですが、関数に引数として渡す場合などにこの
問題が起こります。
また、realloc関数がfunc関数に渡したアドレスの領域を解放しているのでp[0]は14525ですらありません。

そしてさらにこの問題の厄介な点は100000確保したメモリはfree関数で解放されていないという点です。
main関数で解放されているのは全く違う場所が解放されている事になります。
この全く違う場所を解放するという事自体が既にかなり不味いことです。
領域を確保したわけでもない場所を解放すると何が起こるかが分からないので
コンピュータに問題が起きる事すらありえるかもしれません。

それに100000ものメモリ領域を確保したままになってしまっている可能性もありますしね…。

そういうことから私はrealloc関数で領域を別の関数内で再確保する場合には
このようにするべきなのではないかと考えます。

ソースコード

realloc03

このようにp = func(p);とすることで、realloc関数で確保された領域の先頭アドレスが
1つ目の引数のアドレスと同じでも違っていても戻り値としてその値を返しているので
main関数内で全く問題なく表示できるようにできます。
それゆえに確保した領域の先頭アドレスがpに代入されているという事になるので
free(p);は全く問題ありません。

ですので別の関数で再度メモリを確保しようという時にはその確保した領域の先頭アドレスを
戻り値として返すべきだと思います。 これなら確実な処理が実行できますからね。
しかし… この辺の内容絶対に相当難しいですね。 そのため完全に理解するのは厄介だと思います。
ここについて理解したい方はじっくりと時間をかけて理解して下さい。
細かい点についてまで理解しなくてもいいという方はp = func(p)のように
戻り値として返して受け取るということだけ覚えて下さい。

文字数の関係でここで一旦中断します。
後半はこちらです。

2007年03月30日

C言語編第三十三章 メモリの動的確保(続き) - giru0116のブログ - 楽天ブログ(Blog)

文字数の関係上前半後半と分かれてしまっています。
ちなみに前半はこちらです。

二次元配列の動的確保



ここまでで動的に事実上の配列を確保する方法を説明してきました。
しかし、これじゃ一次元配列しか作れませんね。
そこで、ここでは二次元配列の動的確保の方法を紹介します。
三次元以上の配列を動的に確保する場合も似た方法になりますが、ここでは説明しません。
どうしても知りたい方はコメント、掲示板に書き込み、メールをお願いします。
ここではとりあえず先ほどまで全ての例をint型でやってきたのであえてdouble型で説明します。

まずはプログラムの例を示します。

ソースコード

malloc05
実際には上記の例の3とか5とかは変数で行ないます。 ここでは簡単化のために定数で行ないましたが。
このように二次元配列を動的に確保する際にはポインタのポインタを使用します。
まずはp = (double **)malloc(sizeof(double *) * 3)として
double型のポインタを3個確保します。これは
double **p, *d[3];
p = d;

と同じ事です。 こうしてdouble型のポインタを3個確保したら
次にforループを使って確保した各ポインタに対してdouble型の値を確保します。
もちろん各ポインタ毎に確保する領域の大きさは変えても構いません。
そして解放する際の手順はまず各ポインタが確保した領域を解放します。
最後にポインタのポインタが指す先の領域を解放します。
この順番を間違えるとfree関数で解放する事ができなくなってしまうので気をつけましょう。

補足説明



ここまでの説明は簡単化のためにint,doubleのみで行ないましたが
もちろんchar型、構造体も動的に確保できます。
(例:

person_t *p;
p = (person_t *)malloc(sizeof(person_t) * 5);

free(p);)

また、ポインタを動的に確保したい場合はポインタのポインタに
p = (char **)malloc(sizeof(char *) * 5);
とすることによりポインタも確保できます。
これは二次元配列の動的確保の途中と全く同じです。

まとめ












実用的プログラムでは配列の領域はメモリの動的確保によって得る事が多い
メモリの動的確保はmalloc関数で行い、確保した領域はfree関数で解放する
malloc関数等を使用する際にはstdlib.hをインクルードする必要がある
malloc,realloc関数の戻り値はNULLでないかどうかを必ずチェックする
別の関数でrealloc関数を使用してメモリの再度の確保をする際には戻り地としてアドレスを返すべき
二次元配列を動的に確保する場合の解放は確保した各ポインタ→ポインタのポインタの順で行う
もちろんchar型、構造体もint,double型と同様の手順で動的に確保できる
ポインタを確保する際の手順は二次元配列を確保する際の手順の途中までと等しい


例題



二十一章解答の問1のプログラムの
中で4とされている人数をキーボードから取得した数字にして動的にメモリを確保して下さい。
(ポインタのポインタを使用してキーボードから取得した数字分ポインタを確保し
各ポインタに対して3だけ要素を確保します → tensu[i] = (int *)malloc(sizeof(int) * 3) )

実行結果

解答例

これで三十三章は終了です。
今回の内容でint,double型のポインタにメモリの動的確保という新しい使い方ができるようになりました。
これまででは関数内で変更した値をそのままにするため とかだけでしたからね。
それにしても今回の内容は重要ではありますが、かなり厄介な内容であったなぁと思います。
例題も実用的な内容を含んでいるのでかなり難解な問題ですしね…。
頑張って理解してください。

ここに書いてあることが分からない場合は掲示板に書き込み、記事にコメント、もしくはメールをお願いします。

2007年03月29日

[雑談][Mac] Start Mac体験モニター 第二段スタート

%e9%9b%91%e8%ab%87mac-start-mac%e4%bd%93%e9%a8%93%e3%83%a2%e3%83%8b%e3%82%bf%e3%83%bc-%e7%ac%ac%e4%ba%8c%e6%ae%b5%e3%82%b9%e3%82%bf%e3%83%bc%e3%83%88

Macを4ヶ月間試用できるというStart Mac体験モニターの第二段がスタートしたそうです。
ということで、熱い(?)を記載して体験モニターを募集してみました。
Macほしいー(^^)

アップル - 「Start Mac体験モニター」募集
http://www.apple.com/jp/articles/startmac_monitor_2/

Macはクリエイティブな職業の人だけが使うものと思っていませんか? Macに興味はあっても実際に触れる機会の無かった方、今こそお試しいただくチャンスです。

Mac を使えば、自分で撮った写真でグリーティングカード、フォトブック、カレンダーなどを簡単に、センスよく作ったり、ブログに公開したりするのも簡単。ミュージック、フォト、ムービー、ブログ、Podcastingなどが驚くほど手軽に楽しめる。その魅力は尽きることがありません。

最先端のIntelプロセッサを搭載しているMacは、Windows も使えるので、もう互換性を気にする必要はありません。

「Start Mac体験モニター」プログラムではアップルのMacを4ヶ月間自由にお使いいただいて、その感動をご自身のブログで発信していただける方を募集します。

モニターに選出された方は、全国のApple Storeでレッスンを受講いただけますので、Macがまったく初めてでも安心です。

Technorati , , , ,

エンジニアが作る最新ITブログ トップ>【2007年03月】

メンバー紹介

タグパネル

ランキング

エンジニアが作る最新ITブログ DODA