ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

“Web2.0バブル”はもうすぐはじける?

2007-08-09 20:45:18 | Weblog

ここの記事
“Web2.0バブル”はもうすぐはじける?
http://www.itmedia.co.jp/anchordesk/articles/0708/08/news042.html

を読んだけど、
Web2.0バブル崩壊の流れは書いてあるが、
いつはじけるかは、わかんなかった・・


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

なぜモデルを先に決めるかというか、アジャイル開発での失敗の原因というか

2007-08-09 16:41:13 | 開発ネタ

 このまえの「オブジェクト指向で開発の最初から最後までの手順例」で、モデルの部分のクラスを決めて、この内容を確定させてから、フレームワークとかをきめている。この理由について。




■アジャイルなどの開発で・・

 アジャイルっぽく開発する場合、テストファーストで開発していく。

 この場合、外側の画面から決まっていく場合、まずは、内部は、固定の値を返すクラスを作って(スタブ=ダミーモジュール)、外側だけを作り、ちゃんと動くことを確認して、どんどん中を作っていく。

 この方法の場合、作りやすいところから作って言ってしまう傾向にある。




■ゾウを冷蔵庫に入れるプログラムも作成可能

 この場合、冷蔵庫への入庫画面というのをつくって、そこにゾウを入れることも可能になってくる。。。

 でも、中のほうを作っていくと・・・

 きゃー、入らない(>_<!)

 この場合、冷蔵庫の定義が間違っているか(冷凍倉庫のコトを冷蔵庫ともいう)、ゾウを焼いて、骨を漢方薬にするため、すりつぶしたものを冷蔵庫に入れなど、工程がいくつか抜けている。

 実際の開発でも、外側から作っていくと、「おい、これ無理ジャン!」っていうことが、結構あります。




■モデルの部分を固めてから、外側をつくっていく

 なので、モデルの部分を固めてから、
 いいかえると、入出力をきめて、その処理内容に矛盾のないことを固めてから、そとにデータをつけていくと。。
 で、そのとき、入出力を設定して、その処理を呼び出すドライバ部分をJUNITでつくると。。

 そうすれば、ロジック部分はかたまっているから、あとは見栄えの問題だけで、そこまでくれば、アジャイルで、どんどんせめていって、あとはモデル部分とつなげればOKであります。




■結局

 モデルの部分が矛盾なくできるかどうかが、システム開発できるかどうかの決め手であって、ここを早めに確認することが重要であります(つまり、データが初めから最後まで、きちんと流れるかどうか、意図通りに流れるかどうか)。

 そこを確認したいので、モデルから先に決めているわけです。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

VC++で、サーバーにアクセスする

2007-08-09 11:54:30 | Weblog

 ウィリアムのいたずらのホームページに、VC++で、サーバーにアクセスする
プログラムを書いてあるのだけれど、ちょっと変なところがあったので、
書き直してみました。

 WebAPIをVC++から呼び出し、利用するなんていうときに、使うようなものです。




■仕様

今CHomePageAccessというクラスがあって、その中のメソッドとして、 
HomePageReadというのがあって、そこで読み込むとする。

書式は
CString CHomePageAccess::HomePageRead(CString ReadURL)

 ReadURLには、読み込むURL("http://www.yahoo.co.jp"など)
 返り値は、URLにアクセスして渡してもらった結果。
      NULLのときは、エラー





■プログラム

 こんなかんじ。
CString CHomePageAccess::HomePageRead(CString ReadURL)
{
	CString strServer,strObject;
	CString	data	=	"";	//	読み込み内容が設定される
	INTERNET_PORT nPort ;
	DWORD dwServiceType;
	const TCHAR szHeaders[] = _T("Accept: text/*¥r¥nUser-Agent: xxxx¥r¥n");
	CInternetSession session("Session1");
	CHttpConnection *pServer = NULL;
	CHttpFile *pFile = NULL;
	DWORD dwRet;
	TCHAR szBuff[1024];	 // ここにもらうデータが一時的に保存される.

	dwServiceType = AFX_INET_SERVICE_HTTP;
	nPort = 80;
	AfxParseURL(ReadURL,dwServiceType,strServer,strObject,nPort );

	try
	{ 
		pServer = session.GetHttpConnection(strServer, nPort);
		pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, 
                             strObject,NULL,1,NULL,NULL,INTERNET_FLAG_RELOAD);

		pFile->AddRequestHeaders(szHeaders);
		pFile->SendRequest();
		pFile->QueryInfoStatusCode(dwRet); 

		if (dwRet == HTTP_STATUS_OK)
		{
			ULONGLONG nRead;
			nRead = 1;

			//	ヘッダの読み込み
			//	ヘッダを利用したい場合、strHeaderDataを使う
			//	今回は、読み捨てる
			CString strHeaderData;
			pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF,strHeaderData);

			//	内容の読み込み
			while (pFile->ReadString(szBuff, 1000) != NULL)
			{
				//いらないと思うけど、一応最後に0をいれた
				szBuff[1000]=0;	

				//1文字も読み込まなかったら、そこで終わりとする
				size_t pos = strlen(szBuff);
				if ( pos	==	0 )
				{
					break;
				}

				//	読み込んだデータをつなげていく
				data.Insert(data.GetLength(),szBuff);
			}
		}

		//	あとしまつ
		pFile->Close();
		pServer->Close();

		if (pFile != NULL)
			delete pFile; 
		if (pServer != NULL)
			delete pServer;
	}
	catch (CInternetException* e)
	{
		if (pFile != NULL)
		{
			pFile->Close();
			delete pFile; 
		}
		if (pServer != NULL)
		{
			pServer->Close();
			delete pServer;
		}
		session.Close();
		e->Delete();
		data.ReleaseBuffer();
		return NULL;
	}
	session.Close();
	return data;
}

(上記 ¥ < > は、本当は半角なので、半角にしないと、
 当然コンパイラエラーになります。)


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする