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
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ストリートビューのプライバシー配慮のぼかしについて
GigazineのGoogleストリートビュー、街中の銅像にプライバシー配慮のぼかしを施すで思い出したのですが、次の写真なんかすごく面白いと思うのですがどうでしょう。ローマ市内の皇帝通り沿いにあるアウグストゥスの銅像です。
参照
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?
■
あ