スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
年が暮れるようだ
「ハッカーと画家」を読んで越そうじゃないか。

感動しすぎて泣いてしまいそうだぜ。

http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
http://www.shiro.dreamhost.com/scheme/trans/hp-j.html
http://www.shiro.dreamhost.com/scheme/trans/taste-j.html

まあ 年越しそばぐらいは 食べようかな
スポンサーサイト
気になる用語

  • たらいまわし関数

  • スタックトレース

  • AWK(プログラミング言語)

  • シンボリックデバッガ


   気になる 詳しく知りたい。
Railsをインストールしてみた
コマンドプロンプトで

irb -r rubygems -r active_support

と、したく 上記のように打ってみるも active_supportが
見つからないようだ 困った・・・

Ruby/Ruby on Rails/インストール for windows

を参照させていただいて、

http://rubyforge.org/frs/?group_id=167&release_id=6672

から とりあえず 一番上の ruby185-21.exe でインストールしてみた。 うむ、 動いたもようである。

Pathも通してくれてるし こりゃ便利。

そもそも コンピュータは人間にできないことや
めんどくさいことを 自動化するために あると思うので
インストーラ万歳である。

手動でインストールした場合、知識が増えるのならよいのだが、
それに費やした時間分の価値がないと意味がない。

やっぱりインストールで時間を費やすのは 無駄なことと思えて仕方がない。 もっと創作的なことに使わねば。
12月って31日まであるのか
卒研しないといけないので
1月5日までには
http://bingobingobingo.blog49.fc2.com/blog-entry-255.html 
であげた書籍を読了したい。

で、卒研終わったら プログラミング禁止令を発動させないといけないんだろうなぁ・・・

にしてもPerlの習得には時間がかかるぞ・・・

でもって 正月ぐらい なにか遊んだり 別のことしたりしてもいいんじゃないの?? という思考がいったりきたり。 でも、読みたいし・・

そういえば 大学入ってから 俺って 大掃除なんて したっけ・・・
たぶんしてないな・・・ 汚くなったら片す。 つまり 毎日が勉強しかしてないという日常だ。
Template Methodを学ぶと!!
参考資料:
「Java言語で学ぶ デザインパターン入門」


なるほど、Template Methodパターンを学ぶと

インターフェース と 抽象クラス の違いが明白にわかる!!

インターフェースは 全部、抽象メソッドじゃないと駄目だけど、

抽象クラスは 実装も可能だから、Template Methodパターンみたいに 抽象メソッドと実装済みのメッソドを両方持ちたいときは 抽象クラスしか使えないというわけか!!
英語 えいご エイゴ~~~ English 英語ーーー
読めまくる文章と まったく歯が立たない文章があるのは どういうことか?

歯が立たなかった系
Learning Perl
http://fleur.hio.jp/perldoc/mix/pod/perlboot.html

いったい どこでどういった生活すれば そんな言い回しに出会うのだろうか?? まったく歯がたたん。
技術書は読みやすいというが いや、TOEICの勉強を積んだ以上 ビジネスレターの方が読みやすい。 (まあIRCで経験が積めると言う説あり)

歯が立った系
Teach Yourself C
http://www.perl.com/pub/a/1999/09/refererents.html
まあ、すでに 書いてあることに対しての知識があったから読めたというのもあるが・・・


で、計算機プログラムの構造と解釈の原著がWebにあるんだねぇ・・・

http://mitpress.mit.edu/sicp/

さあ 読めるのか!?


最近、数学でよく使われる 「高々」という言葉を理解した
http://ja.wikipedia.org/wiki/%E9%AB%98%E3%80%85_(%E6%95%B0%E5%AD%A6)

日本語でもこういうことがあるしねぇ・・・
てか、国語と 使い方が違うのは 使うときにはっきり言って欲しい・・・
これぐらいは 共通認識なのだろうか 私が悪いというのか!?


まあ、というより 文の切れ目や 繋がり方の感覚がないから 読めてない気がする・・・ 一番痛いのが that とか it が指しているのがなんなのか 掴めてないときだ・・・
行バッファリングを体験してみよう
C言語で 行バッファリングを体験してみようかと思う.
(環境は Fedora5で試しました)


#include <stdio.h>
int main(void)
{
printf("aaaaa");
printf("bbbbb");
write(1,"ccccc",5);
return 0;
}

これを 実行すると

cccccaaaaabbbbb

と,なる

最期に書いた ccccc が 最初に表示されていることに注意!!

これは,行バッファリングというものが関係している.

printf は 出力すべき内容を いきなり画面に表示せずに 一次的に保存しているのである. しかし,write は 保存しない, よって ccccc が先に出力されたというわけである.

で,気になるのがprintfが出力するタイミングは いつなのか ということなんですが, これは 改行文字(つまり\n)を認識した ときのようです.
あと,この改行文字の認識以外では,プロセスの終了のタイミングでも出力するようです.

ですから 次のコードを実行すると

#include <stdio.h>
int main(void)
{
printf("aaaaa");
printf("bb\nbbb");
write(1,"ccccc",5);
return 0;
}

aaaaabb
cccccbbb

となりました.


しかし,上記のコードを ターミナルで

# ./hoge > foo.txt
# gedit foo.txt

と,出力先を テキストファイルに変え
それを gedit で見てみると

cccccaaaaabb
bbb

と やっぱり ccccc が先に表示された..........


なぜだ..........
コンパイルの仕方の流派
うわ。くだらないことで悩んでたなぁ。 早い話はmanを見ろということか。 man 読むのはそれなりの実力がいると思うが・・・・

GCC でのコンパイルに与える オプション -o に関して書きます・・・

我が大学のC言語の演習でのコンパイルの仕方は こんな感じ

gcc -o hoge.exe hoge.c

Linux環境で .exe を付けたがる民族たちです。

一般的には .exe を付けないらしい。。 しかし、私の周りの
多くの人が .exeを付ける以上 そんなことは知る由もない(なかった)

いやいや ここで 書きたいのは .exe のことじゃなくて・・・

よく Makefileの書き方を調べていると

gcc hoge.o foo.o bar.o -o hogera

という 形になっている

我が大学の形式に直すと

gcc -o hogera.exe hoge.o foo.o bar.o

となる。 見た感じまったく 違ってるように感じるのは僕だけだろうか・・・


Manpage of GCC を引用させていただきます

-o file
出力先を file に指定します。このオプションは GCC が実行可能ファイル、オブジェクトファイル、アセンブラファイル、プリプロセス済み C コードなどの、いかなる種類の出力を行なう場合にも適用可能です。
出力ファイルは 1 つしか指定できないため、 `-o' を複数の入力ファイルをコンパイルする際に使用することは、実行ファイルを出力する時以外は無意味です。

`-o'オプションを指定しなかった場合のデフォルトは、実行ファイルを作る場合は `a.out' という名前であり、`source.suffix' の形式のファイル名を持ったソースファイルのオブジェクトファイルは `source.o' であり、アセンブラのファイルは `source.s' です。プリプロセス済みの C 言語は、全て標準出力に送られます。



出力ファイルは 1 つしか指定できないため、 `-o' を複数の入力ファイルをコンパイルする際に使用することは、実行ファイルを出力する時以外は無意味です。

と書いてますね 簡単に言うと -o で指定できるのは1つだけだということ

つまり

gcc -o hogera.exe hoge.o foo.o bar.o

だと -o の後ろに いっぱいファイルがあるけど
-o で指定できるのは 一つだけだから 始めの hogera.exe
が出力ファイル になるという寸法だったのか。

gcc hoge.o foo.o bar.o -o hogera

だと たしかに -o の後ろに 一つしか きてない。



なるほどねぇ。 てか こういうところが 気になる。
「コーディング規約」と「計算量」が気になった
「コーディング規約」と「計算量」が気になった。

ちにみに この2つに 直接の関係性はない。

だが、 気になった。 てか 前から気になってた。


良かったページを私的ブックマ:
http://horb.aist.go.jp/hirano-j/readings/becoming_good_programmer.html

http://home.a03.itscom.net/tsuzu/programing/tips26.htm
http://itpro.nikkeibp.co.jp/article/lecture/20061127/254837/

そうか log ってこうやって使うのか! やっと二分探索の計算量の算出の仕方がわかった。 説明されると 当たり前だ!!

他にも 書きたいことがあるのだけど 心に余裕がないので この辺で。
Perlでオブジェクト指向
さて、

「Effective Perl」 と 「続・初めてのPerl」 と

「Effective C++」 と 「Java言語で学ぶデザインパターン入門」 と

「Ruby on Rails 入門」 を 読んでいます。

やはり 本は同時に何冊も読まないと気がすみません。



ということで Perlでのオブジェクト指向が見えてきました・・・

というか Perlのオブジェクト指向 かなり特殊ですな むしろ特異!? 既存のPerlの範疇でオブジェクト指向を実現しようとしてるらしく、 色んな考えを一つにしているみたいです。

そこで deq君のブログの この発言が助けになります。

ちょっと 端折って引用

プログラミング言語におけるオブジェクト指向というのは,「変数と関数のスコープ/名前空間の局所化(いわゆるプロパティとメソッドのこと)」だとか,「アクセス制御(いわゆるカプセル化のこと)」だとか,「差分プログラミング(いわゆるサブクラスのこと)」だとか,「オブジェクトの最適化と型チェックを行う型システム(いわゆるクラスのこと)」だとか,そういったことが「抱き合わせ商法」的にセット売りされてるので分かりづらいんですが。(これらの考え方は本来独立したプログラミングテクニックなので,初学者には別々に教えた方がいいと思いませんか?みんなごっちゃにしすぎですよ。)




むむむ。 まだ、Perlでクラス作ったことないので ちょっと駄目だし入りまくるかもしれませんが、、、 Perlでクラス作ろうと思ったら名前空間の概念を持たないとまず無理 だということを認識した。


package による 名前空間は、理解したけど Perlでクラスを作れるようになるには もうちょっと越えなければならない山があるようだ。



追記:
Perlでオブジェクト指向がちょっとだけ書けるようになったビンゴ中西についての記事はこちら
http://bingobingobingo.blog49.fc2.com/blog-entry-407.html
使えるのか使えないのか微妙なEmacsコマンド
EmacsにはCモードと呼ばれるモードがある
*.c *.h など という名前のファイルを編集しているときがCモードである.
これは M-x c-mode [リターン] としてもCモードになる.

Cモードで C-c C-a
{ } など を入力すると 改行してくれる.

if(a==0){
hoge;
}

のスタイルでコーディングする人に便利. なお 同じコマンド(C-c C-a)
で元にもどる. やっぱり改行嫌だ となったら 戻そう



M-!
エコー領域に「Shell command: 」と表示され,そこにシェルコマンドを打てる gcc などを使うと便利か!? ただし Tab補完がきかなくなるのでちょっと不便....



参考資料:
便利なツールEmacsらくらく入門
http://itpro.nikkeibp.co.jp/article/COLUMN/20060317/232781/
帰りに・・・
帰りに、居酒屋の前で 

「じゃあ俺 明日のプリズム 唄うよ」

って言ってるお兄さんがいた 

平野綾ファンだ!


どう見ても、男だけで飲んでたもよう・・・



やっぱり 卒論は 

「エンジニアと声優文化について」

にすべきだと思う。 いや、しなければいけない!!
ライブラリの作り方 Linux編
Linuxでのライブラリの作り方とそのライブラリを使ってGCCでコンパイルする方法の覚書です。

題材は
猫でもわかる 第54章 ライブラリを作ろう
を使わせていただきました。

元にさせていただいたのはVC++でのライブラリの作り方ですが、
ここではLinuxでの作り方 および 使い方です。

以下、覚書ですので、さーっと ターミナルから打ったコマンドと
emacsで書いたコードを載せます。 長くて「とてもできそうにねー」
となりますが、10分ほど説明してもらえればわかります。。。
一応 最後に 説明を付けておきます。 ちなみに、分割コンパイルができる人は 誰でもライブラリを作れると思います。

読み方:
b-nakanisi@citrine% は コマンドプロンプトです

b-nakanisiが僕のユーザー名、
citrineは研究室で与えられているコンピュータの名前です。

なお ~(チルダ)で表される 僕のホームディレクトリは
/home/ruby/b-nakanisi です。

(ちなみに、先生がコンピュータ名に宝石の名前をつけるという手法をとっています)
10代の男女比較
まず、女子
http://www.itmedia.co.jp/news/articles/0612/18/news012.html

ついで男子
http://www.itmedia.co.jp/news/articles/0612/22/news030.html

女子はコミュニティーサイト
男子はハードウェアのページが 人気らしい。

ハードウェアなんざあ 金持ちの趣味だな。
ということで 俺は女子だ!! とか思ったらたぶん
写真とか載けって楽しむんだろうなぁ とか考え出したら
俺 デジカメなんて所有したことないよ!!!

超ハードと無縁の男・・・ 高いんだよ・・・
dog year
卒研が限界・・・・

で、何故かF研に行くとdog yearの話に・・・

いや~ 世の中すごい奴が 多すぎる・・・

それもそのはず すごい奴らは1年で7年分成長するんだね・・・






俺だって 精一杯やっとるわけなんだが・・・

まあ 正確なdog yearの意味はこちら
http://dictionary.goo.ne.jp/search/%A4%C8331302710100000000/jn/5/topic/
Rubyをどうしても勉強したい
いかん。どうしてもRubyを勉強したい。
抑えられないこの思い。

とりあえずJavaのデザインパターンの学習で
オブジェクト指向欲を緩和・・・

だが、抑えれそうにない・・・
MySQL についての覚書
色々なページを参考にさせてもらって
MySQL Windows編 Perl の覚書です。

コマンドプロンプトで
PPM> install DBI
PPM> install DBD-MySQL


MySQL Command Line Clientで
mysql> show databases;
mysql> create database test_db;
mysql> connect test_db

mysql> create table mytable(
-> name char(20),
-> comment char(255));

mysql> insert mytable
-> value('ビンゴ中西','なんかないかなぁ');

mysql> select * from mytable;


 データベースというと1つな気がしてたけど、複数のデータベースが作れて、それに connect して そこでテーブルを作成する形になるんだね。
(まあ、よく考えるとそりゃそうか・・・)


よって、

create database して、
connect して、
create table して、

テーブル できてたら後は
insert 頑張ろうって感じかな・・・
MFC 円を描く 驚いた!!
MFCで円の描き方について。

さて、四角形の書き方は

CRectが四角形の情報を持てるので

CRect masu;
//四角形の情報登録後
pDC->Rectangle(&masu);


といった形で四角形を描きましたが、、、
なんと円は Rectangel を Ellipse に書き換えるだけ!!!
えーー CRect って四角形用のクラスじゃないの!!??
となるが、その四角形に納まるように円を書いてねという意味でしょうね。ということで、この関数で楕円も書けることに納得。

よって 円を書くには、

CRect masu;
//四角形の情報登録後
pDC->Ellipse(&masu);


となる。これで 先の15マスパズルを書き換えると
図のようになった。
ellipse.jpg

MFC キー入力処理
キーボードの押されたキーで処理を分けたいときについて。

キーが押されたとき メッセージが発行されるので そのメッセージハンドラで処理する。よって使うのは「Class Wizard」

手順:
「表示」→「Class Wizard」→「WM_KEYDOWN」→、「関数の追加」→「コード編集」

これで、


void CKEY_TRAININGView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: この位置にメッセージ ハンドラ用の
//コードを追加するかまたはデフォルトの処理を呼び出してください
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}



ができあがるので ここに キー入力に対する処理を書いてやる。

Aが押された Bが押された といったことは nCharに保存されているのでswitch文で各々に対する処理をわけてやれねばならない。
たぶん このOnKeyDown( )でやりたい全ての処理を書かず、別の関数を呼び出して処理を任せる形になると思う。

次に、例を示す


void CKEY_TRAININGView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: この位置にメッセージ ハンドラ用の
//コードを追加するかまたはデフォルトの処理を呼び出してください
CDC* pDC = GetDC();

switch(nChar) {
case VK_LEFT:
pDC->TextOut(5,5,"左が押されました");
break;
case VK_RIGHT:
pDC->TextOut(5,5,"右が押されました");
break;
case VK_UP:
pDC->TextOut(5,5,"上が押されました");
break;
case VK_DOWN:
pDC->TextOut(5,5,"下が押されました");
break;
case 'A':
pDC->TextOut(5,5,"Aが押されました");
default:
break;
}

CView::OnKeyDown(nChar, nRepCnt, nFlags);
}


アルファベットや←キーごとに 別々のメッセージが発行されるのではなく、このように全て同じメッセージが発行されるので、switch文で処理を分けるのがポイントのようである。

参考資料:
http://homepage3.nifty.com/mitui707/VisualC/VCfunctionkey.html/
裏画面 ~メモリデバイスコンテキスト~
うーむ MFCで画像を動かしたい! なんとしても動かさないといけない!

4時間粘りました・・・・

http://www.geocities.jp/chiakifujimon/makesoft2/proc3.html
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/dc.html

色々探しにいって以上の2つがよいと思える。しかし、どうも腑に落ちないところもあったので 折衷案を考えました。

いきなりコードを示します


CDC* pDC = GetDC();
CDC memDC; //メモリDCを作成

CRect cClient;

memDC.CreateCompatibleDC(pDC);
GetClientRect(&cClient);//クライアント領域(窓の大きさを取ってくる)


//メモリDCの実体となるビットマップを作成
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pDC,
cClient.Width(),cClient.Height());

//メモリDCにビットマップを選択
CBitmap *pOldBmp=memDC.SelectObject(&memBmp);

//メモリDC(即ちビットマップ)に描画
memDC.FillSolidRect(0,0,cClient.Width(),
cClient.Height(),RGB(255,255,255));

//↓ここの間に描画処理を書く

//!!!メモリデバイスコンテキストに書き込むのが重要!!!
//つまり、memDC.Rectangle(); みたいに書く!!!!

//↑ここの間に描画処理を書く



//メモリDCの画像(即ちビットマップの内容)を実際の画面に転送
pDC->BitBlt(0,0,
cClient.Width(),cClient.Height(),&memDC,0,0,SRCCOPY);

//メモリDCのビットマップを戻す
memDC.SelectObject(pOldBmp);

//ビットマップを削除
memBmp.DeleteObject();

//メモリDCを削除
memDC.DeleteDC();

ReleaseDC( pDC );



直に画面(ウィンドウ)に書き込むのではなく 「裏画面」というところに書き込まないと、物体を動かした際、チラついてしまいます。これを回避するため頑張りました。
「裏画面」で検索するより「メモリデバイスコンテキスト」で検索した方が明らかに資料が多かったです。始からわかっていれば・・・

まあ それは置いておいて、少しだけ上のコードの説明を、

要は CDC *pDC で pDC->hoge( ) みたく描画していましたが、
前処理でメモリデバイスコンテキストを作って、そっちのメンバー関数で描画処理すると仮想的な画面(つまりメモリ)に書き込まれる。ということです。 ここでは、あくまで雛形を置くため、何故、直接画面に書き込みに行ってはいけないのかなどの説明は、はしょります すみません。

では、
//↓ここの間に描画処理を書く

//!!!メモリデバイスコンテキストに書き込むのが重要!!!
//つまり、memDC.Rectangle(); みたいに書く!!!!

//↑ここの間に描画処理を書く


の間に描画処理を書いたものをサンプルとして以下に載せます。これはSetTimer(1,10,NULL)により発行されたメッセージを受け取るメッセージハンドラとなっています。 では、長くなりますが、、、
Ruby勉強会@関西-13に行ってきました
Ruby勉強会@関西-13に行ってきました。

おもしろいねRubyも:-)

京都駅についたらK.I.君とたまたま遭遇。

バスに揺られて会場へ向かう。

少し遅れた・・・・


受付で 「ビンゴ中西です」

というと 何故かウケるw

はじめてウケたなww


Ruby初心者向けレッスンが非常によかった

_ および小文字から始まるのは ローカル変数

$ではじまるのは グローバル変数

@@ではじまるのは クラス変数(情報共有用)

@ではじまるのは インスタンス変数



最後の2つ(つまり@で始まる)のは、クラスの宣言や、クラスの実装でお目見えするが、他ではでてこないと思われる。
このあたりは同じことをC++では とくに変数名の先頭がどうだ とか意識しないで書くけど、Rubyは意識的に明示するようだ。

簡単に説明すると
@@で始まるのは 「鯛焼きを30枚以上作りたくないときに使う」
@は まあ普通にクラスの中で使いたい変数用といったところかな。。。


鯛焼きのを例にするの流行ってるのかなぁ。。。
まあ、オーソドックスなのかも。。。


scim-rubyというソフトを紹介する講演も面白かった。
たぶん、プレゼン資料が公開されると思いますので、
公開されれば リンクを貼りたいと思います。
~追記 こちらのようですね プレゼン資料


で、皆で練習問題を解こう!となったんですが、、、
手が動かん、、、 2ヶ月(?)ほど前に 6時間くらい勉強したのだが、、、 当時は クラスをそれほど理解してなかったし、今みたいに自分でクラス宣言して実装なんてこともできてなかったのでRubyを理解してなかったと言っていいのかもしれない。。。

Rubyというと改行で1行と見なすのでセミコロンが要らない とか
if then else end という形であるとか(今日も練習問題でendを忘れ はまる) Perlと変数につく記号の意味が違う。とかで うーん と悩んでたんですが、 最近F研のpascal氏に話を聞いて気が変わってきてました。
pascal氏は横にダーっと何度もセミコロンで分けて書いていく書き方が嫌いらしく、さらに彼の好きなpascal(ややこしいが、、、 pascal好きなんで あだ名がpascalです)では、if then else end と非常に似た形らしく なるほど そういった思想のプログラミング言語も結構あるのかなんて気づきだし、でもって 今日、変数の頭につく記号の意味が氷解したので、これで混乱せずに書けそうだ。 面白くなってきた:-)

なにか作ってみないとなぁ。。。
とりあえず15パズル完成
ご存知ですか?15パズル。
たぶん みたことあると思います。

本来は(というか現代では) ばらばらになった 写真なんかを元にもどすやつですが、
画像は次のステップということで 今回は数字を1~15まで完成図のように並べなおしてもらう というものです(ルール的にまったく差異はありません)

完成図
15puzzle.jpg



ちゃんと 元の形に戻るように作ってある(はず)ので、
頑張ってもとに戻してみてください。

じゃあ EXEファイル貼っときますね:-)
15パズル ~その1~

15パズル ~その2~

~その1~ が難しかったら ~その2~ を選んでください。


なお、今回のプログラムで使ったランダムの使い方を少しだけ
前回の記事に載せました。
C言語の乱数について
http://www9.plala.or.jp/sgwr-t/lib/srand.html
を参考に乱数について書かせてもらいます。


C言語で乱数を使いたいとき

時間を種にして、乱数を発生させるという処理が必要です。

時間の確保なんですが、

time(NULL)

で、できます。

そして 乱数の発生には srand( )という関数を使います。

よって 合わせて、

srand((unsigned) time(NULL));

という方法で、乱数を発生させます。

この2つの関数を呼び出すために、以下のように
2つのヘッダーをインクルードしなければなりません

#include <stdlib.h>
#include <time.h>


で、この乱数の取得方法なんですがちょっとだけコツがいります。

引用です
-------------------------
【使用例2】


#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
int i,j;

/* 乱数系列の変更 */
srand((unsigned) time(NULL));

/* 1~100の擬似乱数を10個ずつ10行発生 */
for (i=1; i<=10; i++) {
for (j=0; j<10; j++) {
printf("%3d ",rand()%100+1);
}
printf("\n");
}
return 0;
}


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


のように、プログラムの一番初めにsrand( )してやらなければなりません。

え!では どうやって複数の乱数を獲得するの??

と、なるのですが 
まあ、上記のソースに答えが載ってるんですが、

rand( )関数 を使います。

先ほどの2つに加えて必要なヘッダーファイルはないので
インクルードの心配は要りません。

srand( )をfor文の中に入れると はまります(泣)
初めて乱数を発生させたとき 何時間も悩みました・・・

上記の参考とさせていただいているサイトに詳しい説明がありますので詳しいことは そちらを参照していただきたいのですが、

ちょっと rand( )関数で なんで毎回違った数値を獲得できるか という僕なりの考えを書かせてもらうと、、、

srand((unsigned) time(NULL));

で、

(1,3,6,19,39,2,1,5,7)

みたいに 適当な乱数のリストが作られて
rand( )はそれを 呼ばれるたびに頭からとる関数と考えると 毎回違った数字を取ってくる理由がわかります。(もしかしたら間違ってるかもしれませんが・・・)

また、
rand( )の最大の返却値は 通常、
short int で表現できる最大値32767のようです。

参考資料:
http://www.st.rim.or.jp/~phinloda/cqa/cqa5.html
http://www005.upp.so-net.ne.jp/h-masuda/grwin/rand01.html

で、何故か32767だと、signed int型 なので 
rand( )の返却値の最小値は -32768 ではないのか? 
と思いきや!

最小値は 0 だったりする!!

ということで、C言語での乱数発生は なかなか手強い。。。。。
プログラマのためのブログ
はてな は、やっぱりプログラマ思考だなぁ

http://d.hatena.ne.jp/naoya/20061215/1166160780
http://d.hatena.ne.jp/hatenadiary/20061215/1166155734

すごい、プログラムのソースをブログに貼り付けたとき、
タグを指定してやれば、色つきで整形してくれる!!

ブログって簡単に移動できると うれしいんだけどねぇ。。。。

データベースの内容を こう簡単にインポートできんものか??
マウスクリックで描画処理
さて、マウスで左クリックされたら 描画処理をしたい!

http://www.geocities.co.jp/SiliconValley-Bay/4543/Osero/Osero/Osero-7.html

こちらの書式をそのまま適用させてもらうと、


CDC* pDC = GetDC(); //画面を再描画
NakanishiDraw( pDC );
ReleaseDC( pDC );



というのを マウスの左クリックがされたとき、
つまり、WM_LBUTTONDOUNメッセージを受け取ったとき処理するメッセージハンドラ(メンバー関数)に書けばよいことになる。

「表示」→「Class Wizard」で、

オブジェクトIDは「CDfdsfadfaView」(変な名前でごめんなさい 要はViewクラス)のままで、メッセージからWM_LBUTTONDOUNを選んで、「関数の追加」→「コード編集」で、
OnLButtonDownメンバー関数ができあがるので、


void CDfdsfadfaView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するか
//またはデフォルトの処理を呼び出してください
CDC* pDC = GetDC(); //画面を再描画
NakanishiDraw( pDC );
ReleaseDC( pDC );

CView::OnLButtonDown(nFlags, point);
}


としてやった。

なお、マウスのクリックでちゃんと処理されてるか確認したいため、
NakanishiDrawメンバー関数(自作したのね)に

static int mouse = 0;

と、1行宣言を足し。これを
四角形に描画される数字に変わるように書き換えてやる。
要は k の代わりに mouse にする。

全体ソースは以下

void CDfdsfadfaView::NakanishiDraw(CDC *pDC)
{
int tate=50,yoko=50;
int y=5,x=5;
int i,j;
int k=0;
static mouse=0;

CString str;
CRect masu;
CBrush *oldBrush, masuBrush;
COLORREF masuColor[4];

masu.left = x;
masu.top = y;
masu.right = x+yoko;
masu.bottom = y+tate;
pDC->Rectangle(&masu);
// 赤、緑、青、黄色を設定
masuColor[0] = RGB(255, 0, 0);
masuColor[1] = RGB(0, 255, 0);
masuColor[2] = RGB(0, 0, 255);
masuColor[3] = RGB(255, 255, 0);

//描画処理
for(i=0; i<4; i++){
for (j = 0; j < 4; j++)
{
masuBrush.CreateSolidBrush(masuColor[j]);
oldBrush = pDC->SelectObject(&masuBrush);
// 四角形を描画する。
pDC->Rectangle(&masu);
mouse++;
str.Format("%d",mouse);
pDC->DrawText(str, -1, &masu,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);

// もとのブラシに戻す。
pDC->SelectObject(oldBrush);
masuBrush.DeleteObject();
masu.left += yoko;
masu.right += yoko;
}
//次の行へ座標更新
masu.left = x;
masu.top += tate;
masu.right = x + yoko;
masu.bottom += tate;
}
}


なお、ウィンドウを小さくするなどの処理も、
OnDraw関数が呼ばれているらしく、
そのたびに mouse++ されてるので 窓を小さくしたりすると
数字が増えまくるが、今回 僕がやりたいことには支障がないので
これでいく。

sikaku_mfc4.jpg



なお、支障があるなら、
NakanishiDrawメンバー関数の引数を

NakanishiDraw(CDC *pDC, int i)

などとして、引数として、

OnLButtonDownの方に

static int mouse = 0;
mouse++;

などして

void CDfdsfadfaView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するか
//またはデフォルトの処理を呼び出してください
    static int mouse=0;
    mouse++;
CDC* pDC = GetDC(); //画面を再描画
NakanishiDraw( pDC , mouse);
ReleaseDC( pDC );

CView::OnLButtonDown(nFlags, point);
}


と してやればいいのではなかろうか?
あくまで試してないのでなんとも言えませんが。。。
再描画への定石(?)
さて、お次は クリックされたら 画像(さきまでの四角形の色とか)が更新されて 再描画といった感じにしたいのだが。

http://www.geocities.co.jp/SiliconValley-Bay/4543/Osero/Osero/Osero-7.html
http://www.geocities.co.jp/SiliconValley-Bay/4543/Osero/InterFace/InterFace-4.html



Kirikaさんのコメント、

GetDC()とかでデバイスコンテキストさえ捕まえれば、ダイアログでもCViewでもなんでも描画できますよ。

この知識を使わしてもらうと、結果はこうだ!!!(一般的なのか~?)


void CDfdsfadfaView::OnDraw(CDC* pDC)
{
CDfdsfadfaDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
NakanishiDraw(pDC);
}



今までの描画処理をやっていたところを

void NakanishiDraw(CDC* pDC){ } という自作メンバー関数に任せることにした。

ということでCDfdsfadfaViewクラスに 右クリックで

void NakanishiDraw(CDC* pDC)

メンバー関数追加!!

実行できたぜーーー


void CDfdsfadfaView::NakanishiDraw(CDC *pDC)
{
int tate=50,yoko=50;
int y=5,x=5;
int i,j;
int k=0;

CString str;
CRect masu;
CBrush *oldBrush, masuBrush;
COLORREF masuColor[4];

masu.left = x;
masu.top = y;
masu.right = x+yoko;
masu.bottom = y+tate;
pDC->Rectangle(&masu);
// 赤、緑、青、黄色を設定
masuColor[0] = RGB(255, 0, 0);
masuColor[1] = RGB(0, 255, 0);
masuColor[2] = RGB(0, 0, 255);
masuColor[3] = RGB(255, 255, 0);

//描画処理
for(i=0; i<4; i++){
for (j = 0; j < 4; j++)
{
masuBrush.CreateSolidBrush(masuColor[j]);
oldBrush = pDC->SelectObject(&masuBrush);
// 四角形を描画する。
pDC->Rectangle(&masu);
k++;
str.Format("%d",k);
pDC->DrawText(str, -1, &masu,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);

// もとのブラシに戻す。
pDC->SelectObject(oldBrush);
masuBrush.DeleteObject();
masu.left += yoko;
masu.right += yoko;
}
//次の行へ座標更新
masu.left = x;
masu.top += tate;
masu.right = x + yoko;
masu.bottom += tate;
}
}


sikaku_mfc3.jpg


ちなみに 数字は
DrawText(str, -1, &masu, NULL)
のところを
DrawText(str, -1, &masu, DT_SINGLELINE | DT_CENTER | DT_VCENTER)
にしたら、中央によった。

フォントの設定は
CFontクラスが管理しているようだが、
今回 真ん中によったのでそれでよし パスすると思われる。
さあ、どんどん作業を進めよう
MFCの覚書です。前回の記事へのちょっとした改良。

一つずつの四角形に数字を描画したい。

●CStringクラスが文字列関係のクラスなので
 このオブジェクトを描画する形となる

●CStringクラスのFormatメンバー関数で数字を文字列に変換できる

●CDCクラスのDrawTextメンバー関数で任意の四角形に描画する

よって今回の着目点は、

k++;
str.Format("%d",k);
pDC->DrawText(str, -1, &masu, NULL);

です。

pDCは OnDraw(CDC* pDC){ } で引数としてもらってますね:-)


void CDfdsfadfaView::OnDraw(CDC* pDC)
{
CDfdsfadfaDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int tate=50,yoko=50;
int y=5,x=5;
int i,j;
int k=0;

CString str;
CRect masu;
CBrush *oldBrush, masuBrush;
COLORREF masuColor[4];

masu.left = x;
masu.top = y;
masu.right = x+yoko;
masu.bottom = y+tate;
pDC->Rectangle(&masu);
// 赤、緑、青、黄色を設定
masuColor[0] = RGB(255, 0, 0);
masuColor[1] = RGB(0, 255, 0);
masuColor[2] = RGB(0, 0, 255);
masuColor[3] = RGB(255, 255, 0);

//描画処理
for(i=0; i<4; i++){
for (j = 0; j < 4; j++)
{
masuBrush.CreateSolidBrush(masuColor[j]);
oldBrush = pDC->SelectObject(&masuBrush);
// 四角形を描画する。
pDC->Rectangle(&masu);
k++;
str.Format("%d",k);
pDC->DrawText(str, -1, &masu, NULL);

// もとのブラシに戻す。
pDC->SelectObject(oldBrush);
masuBrush.DeleteObject();
masu.left += yoko;
masu.right += yoko;
}
//次の行へ座標更新
masu.left = x;
masu.top += tate;
masu.right = x + yoko;
masu.bottom += tate;
}
}


sikaku_mfc2.jpg


数字(描画してる文字)の大きさはフォント設定とかできるメソッドを先に読み出せばなんとかなりそうだ。。。。

DrawText(str, -1, &masu, NULL) のNULLを、うまく設定してやると、重ねあわせとかが たぶん、、、できると思う。。。

参考資料:
http://msdn2.microsoft.com/ja-jp/library/a6x7y2a4(VS.80).aspx
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200103/01030016.txt
やっぱり 今回はいけるかもしれん
MFC の覚書です。

今回は 四角形を描画したいときについて。

●四角形の情報はCRectクラスが知っている のでこれに座標を教えてやる。

●四角形の描画はCDCクラスのRectangleメンバー関数が行う
 これに先ほどのCRectオブジェクトへのポインタを引数に与える。

以下に、例を示す。
CRectクラスのメンバー変数は
(left, top)で、左上の座標
(right, bottom) で右下の座標 になっていることに注意!!



void CDfdsfadfaView::OnDraw(CDC* pDC)
{
CDfdsfadfaDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int tate=50,yoko=50;
int y=5,x=5;
int i,j;

CRect masu;
CBrush *oldBrush, masuBrush;
COLORREF masuColor[4];

masu.left = x;
masu.top = y;
masu.right = x+yoko;
masu.bottom = y+tate;
pDC->Rectangle(&masu);
// 赤、緑、青、黄色を設定
masuColor[0] = RGB(255, 0, 0);
masuColor[1] = RGB(0, 255, 0);
masuColor[2] = RGB(0, 0, 255);
masuColor[3] = RGB(255, 255, 0);

//描画処理
for(i=0; i<4; i++){
for (j = 0; j < 4; j++)
{
masuBrush.CreateSolidBrush(masuColor[j]);
oldBrush = pDC->SelectObject(&masuBrush);
// 四角形を描画する。
pDC->Rectangle(&masu);
// もとのブラシに戻す。
pDC->SelectObject(oldBrush);
masuBrush.DeleteObject();
masu.left += yoko;
masu.right += yoko;
}
//次の行へ座標更新
masu.left = x;
masu.top += tate;
masu.right = x + yoko;
masu.bottom += tate;
}
}

sikaku_mfc.jpg



参考資料:
http://mail2.nara-edu.ac.jp/~asait/visual_cpp/dialog2/class/class.htm
Visual C++〈3〉はじめてのMFCプログラミング
ライフゲーム ~どうしても作らねばならない気がして~
どうしても作らないといけない気がして、
思いとどまれず 作りました
ライフゲーム!

http://www.ee.fukui-nct.ac.jp/~yoneda/text/Experiments/1PS/lifegame.html

を参考にさせていただきました。

以下 EXEファイルを貼つけておきます。
1つ目は たぶんWindowsでしか動かないと思います。
(DOS窓、最大化してもらえるとうれしいです)

2つ目は へたすると他の環境でも動くかもです。

ライフゲームその1

ライフゲームその2


いや~ これが一世を風靡してたんだねぇ~

てか、このプログラム愛着わく~~~
わかる、これは 流行るわ!


追記:
ソース追記しておきます。
あと、Sleep( )使ってるので
Windowsじゃないと動かないみたいです。。。
その1のソース

その2のメインのソース

その2のヘッダー

さらに追記:
なにやら芸術的な動きを見せた(周期運動)
1.jpg


2.jpg


3.jpg


やっぱり 愛着わく~~
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

11 | 2006/12 | 01
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

ブロとも申請フォーム

この人とブロともになる

| ホーム | 次のページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。