httpリクエストヘッダの正規表現処理

今まで正規表現処理を行う場合はCAtlRegExpとCAtlREMatchContextを使っていたがVS2008SP1環境では使えなくなっているっぽい。あまりboostを使いたくないけど他に簡単に実現できる方法がないのでしぶしぶBoostを使用して見たのが下記サンプル。httpリクエストヘッダからデータをパースしている

BOOL bExistMethod = FALSE;
BOOL bExistHostField = FALSE;
BOOL bExistUserAgent = FALSE;

CStringA strMethod = "";
CStringA strURI = "";
CStringA strAddress= "";
CStringA strPort= "";
CStringA strUserAgent = "";

for (int i = 0; i < fileSize; ++i) {
	if (pBuf[i] == '\r') {
		bCR = TRUE;
		continue;
	}
	if (pBuf[i] == '\n' && bCR == TRUE) {

		if (bExistMethod == FALSE) {
#ifdef _DEBUG
			CStringA strLine((char *)(pBuf + lineStartPos), i - lineStartPos + 1);
			OutputDebugStringA(strLine);
#endif
			std::tr1::regex expression("^([A-Z]{3,4}) +(/.*) +HTTP/[0-9]+.[0-9]+");
			//std::tr1::regex expression("^GET +(/.*) +HTTP/[0-9]+.[0-9]+");
			std::string tag((char *)pBuf + lineStartPos, i - lineStartPos + 1);	// 行の先頭のポインタ、行の長さ指定
			std::tr1::smatch match;

			if (std::tr1::regex_search(tag, match, expression)) {
				strMethod = match.str(1).c_str();
				strURI = match.str(2).c_str();
				bExistMethod = TRUE;
			}
		}

		if (bExistHostField == FALSE) {
#ifdef _DEBUG
			CStringA strLine((char *)(pBuf + lineStartPos), i - lineStartPos + 1);
			OutputDebugStringA(strLine);
#endif

			std::tr1::regex expression("^Host *: +([A-Za-z0-9.]+)( +: +([0-9]{1,5}))?");
			std::string tag((char *)pBuf + lineStartPos, i - lineStartPos + 1);
			std::tr1::smatch match;

			if (std::tr1::regex_search(tag, match, expression)) {
				strAddress = match.str(1).c_str();
				strPort = match.str(3).c_str();
				bExistHostField = TRUE;
			}
		}

		if (bExistUserAgent == FALSE) {
#ifdef _DEBUG
			CStringA strLine((char *)(pBuf + lineStartPos), i - lineStartPos + 1);
			OutputDebugStringA(strLine);
#endif

			std::tr1::regex expression("^User-Agent *: +(.+)");
			std::string tag((char *)pBuf + lineStartPos, i - lineStartPos + 1);
			std::tr1::smatch match;

			if (std::tr1::regex_search(tag, match, expression)) {
				strUserAgent= match.str(1).c_str();
				bExistUserAgent = TRUE;
			}
		}

		lineStartPos = i + 1;	// 行の先頭を次に進める
	}

	bCR = FALSE;	// 初期化
}

因みにpBufには下記のデータが格納されている

GET / HTTP/1.1
Host: www.google.co.jp
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive	


参照
http://codezine.jp/article/detail/1967

Gateway製ノートPC(Model No: MA7, Model: MT6836j)のキーボード交換記録

キーボードの一部のキーが駄目になったのでメーカーに交換費用を聞いてみると約3万と言う答えが返ってきた。幾らなんでもこの値段は無いなと思い自分で交換してみた。少しでも多くの人がこのような無駄な出費をしなくて済むようキーボード交換の記録を下記のページに記す。なお、この型番で無くてもメーカーは製造コストを下げるために似たようなつくりにしていると思うので参考にはなると思う。
http://tyuintail.vs.land.to/keybord.htm


参考URL
http://jp.gateway.com/support/faq/faqview.html?faq=10#A09
http://junknote.jpn.ph/contents/mx6917_02.html

Ribbonインタフェースを使った開発についての覚書

必要な環境

  • VisualStudio2008ServicePack1

サンプル


RibbonインタフェースはSDIもしくはMDIでしか利用できない。ここで記述する内容はSDIを想定している。SDIで手っ取り早く開発したいのならビューの基本クラスをリソースエディタでボタンやエディットボックスなどを配置できる、CFormViewにする。

リボンコントロールをEnable/Disableにするにはどうすればよいのか。ビューもしくはメインフレームで下記のようにイベントハンドラを用意しCCmdUIを通じてEnable()を呼び出せばよい。メインメニューでメイン項目をEnable/Disableするのと全く同じやり方

//メッセージマップにイベントハンドラを設定
ON_UPDATE_COMMAND_UI(ID_VIEW_TRUMBNAILS, OnUpdateViewThumb) 

// イベントハンドラ
void OnUpdateViewThumb(CCmdUI* pCmdUI)
{
	pCmdUI->Enable(FALSE);
}

リボンコンボボックスでとある項目が選択されたことをしるにはどうすればよいのか。ビューもしくはメインフレームで下記のようにイベントハンドラを用意する。CComboBoxのようにSEL_CHANGEメッセージを受け取れれば良いのだが、そんなものはないので変更されたかどうかは自分で記述しなければならない

//メッセージマップにイベントハンドラを設定
ON_COMMAND(ID_FONT_FONTSIZE, OnFontsize)

void OnFontsize()
{
	int curSel = m_pRibbonComboBox->GetCurSel();
	if (curSel != CB_ERR && curSel != m_curSel) {
		// 項目が選択された場合の処理を記述
	}
}

ビューにおいてリボンコントロールへのポインタが欲しくなる時がある。その場合はメインフレームでリボンコントロールを作成した時のポインタを覚えておいてViewでそのポインタを利用すれば良い

// ビューでのコード
CMFCRibbonEdit* pEditIndentLeft = new CMFCRibbonEdit(ID_PAGELAYOUT_INDENT_LEFT, 72, _T("Left:\nil"), 13);
pEditIndentLeft->EnableSpinButtons(0, 1000);
pEditIndentLeft->SetEditText(_T("0"));
pPanelParagraph->Add(pEditIndentLeft);
m_pEditIndentLeft = pEditIndentLeft;  // 覚えておく

// メインフレームでのコード
m_pEditIndentLeft = (CMainFrame*)AfxGetMainFrame()->m_pEditIndentLeft 

後で知ったのだが下記のようにしても取得できる

CMFCRibbonBar* pRibbon = ((CMainFrame*) GetTopLevelFrame())->GetRibbonBar();
ASSERT_VALID(pRibbon);

CMFCRibbonEdit* pEdit = DYNAMIC_DOWNCAST(CMFCRibbonEdit, pRibbon->FindByID(ID_PAGELAYOUT_INDENT_LEFT));

わからないことはとりあえずサンプルのC++\MFC\Visual C++ 2008 Feature Pack\MSOffice2007Demoを見れば良い

Googleストリートビューのプライバシー配慮のぼかしについて

twhs2009-05-20


GigazineGoogleストリートビュー、街中の銅像にプライバシー配慮のぼかしを施すで思い出したのですが、次の写真なんかすごく面白いと思うのですがどうでしょう。ローマ市内の皇帝通り沿いにあるアウグストゥス銅像です。


参照
http://gigazine.net/index.php?/news/comments/20090520_googlesv_privacy/

スーザン・ボイル(Susan Boyle)

動画を見てとても感動したのでメモ
スーザン・ボイル氏が歌いだすと審査員のシニカルな笑いが消え目を丸くしているのが印象的
また、スーザン・ボイル氏の状況と歌の内容がすごくマッチしているので泣けてくる


youtube
http://www.youtube.com/watch?v=9lp0IWv8QZY&feature=related


youtube(日本語訳あり)
http://www.youtube.com/watch?v=vMVHlPeqTEg


マイコミジャーナル
http://journal.mycom.co.jp/news/2009/04/17/044/


Wikipedia
http://en.wikipedia.org/wiki/Susan_Boyle


ファンサイト
http://www.susan-boyle.com/

TechDays 2009 ビデオ公開

マ社が折角TechDays 2009のビデオを公開しているので何個か見ました。


VS2010
・Dynamic Lookup・・・実行時に型を特定するみたいですが何でこれが必要なのか私にはいまいちよくわかりません。
・オプション引数、名前つき引数・・・C++のデフォルト引数みたいなものでしょうか。C#を初めて触ったときにデフォルト引数が無くていらいらしたのでこれは歓迎です。


F#
・F#は少し勉強していたのでなんとか理解できました。最後の方が急ぎ足になっているのが残念です。以下の式はどこかで使えるかもしれない・・・。

let (^-^) a b = a + b  // (^-^) に足し算する関数をバインド
(^-^) 1 2  // 3
1 ^-^ 2 // 3


参照
http://www.microsoft.com/japan/powerpro/techdays/searchresult.aspx?