2008年8月17日
#
INI 編集ツール IniModifier を作成してみる (3)
過去の記事へのリンク:
INI 編集ツール IniModifier を作成してみる (1)
INI 編集ツール IniModifier を作成してみる (2)
まずは、WTL::CRichEditCtrl のヘッダを見てみることにする。
WTL は SDK のラッパであり、MFC とほぼ同機能のメソッドを持っているので迷ったら、MSDN で MFC と SDK のヘルプを見るのが常套手段。
WTL::CRichEditCtrl
// WTL::CRichEditCtrl (CRichEditCtrlT<ATL::CWindow>) の宣言
// Constructors
CRichEditCtrl( HWND hWnd = NULL );
CRichEditCtrl& operator =( HWND hWnd );
HWND Create( HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0,
ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL );
// Attributes
static LPCTSTR GetWndClassName();
static LPCTSTR GetLibraryName();
int GetLineCount() const;
BOOL GetModify() const;
void SetModify( BOOL bModified = TRUE );
void GetRect( LPRECT lpRect ) const;
DWORD GetOptions() const;
DWORD SetOptions( WORD wOperation, DWORD dwOptions );
// NOTE: first word in lpszBuffer must contain the size of the buffer!
int GetLine( int nIndex, LPTSTR lpszBuffer ) const;
int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;
BOOL CanUndo() const;
BOOL CanPaste( UINT nFormat = 0 ) const;
void GetSel( LONG& nStartChar, LONG& nEndChar ) const;
void GetSel( CHARRANGE &cr ) const;
int SetSel( LONG nStartChar, LONG nEndChar );
int SetSel( CHARRANGE &cr );
int SetSelAll();
int SetSelNone();
DWORD GetDefaultCharFormat( CHARFORMAT& cf ) const;
DWORD GetSelectionCharFormat( CHARFORMAT& cf ) const;
DWORD GetEventMask() const;
LONG GetLimitText() const;
DWORD GetParaFormat( PARAFORMAT& pf ) const;
#if ( _RICHEDIT_VER >= 0x0200 )
LONG GetSelText( LPTSTR lpstrBuff ) const;
#else
// RichEdit 1.0 EM_GETSELTEXT is ANSI only
LONG GetSelText( LPSTR lpstrBuff ) const;
#endif
#ifndef _ATL_NO_COM
BOOL GetSelTextBSTR( BSTR& bstrText ) const;
#endif
#if defined( _WTL_USE_CSTRING ) || defined( __ATLSTR_H__ )
LONG GetSelText( _CSTRING_NS::CString& strText ) const;
#endif
WORD GetSelectionType() const;
COLORREF SetBackgroundColor( COLORREF cr );
COLORREF SetBackgroundColor(); // sets to system background
BOOL SetCharFormat( CHARFORMAT& cf, WORD wFlags );
BOOL SetDefaultCharFormat( CHARFORMAT& cf );
BOOL SetSelectionCharFormat( CHARFORMAT& cf );
BOOL SetWordCharFormat( CHARFORMAT& cf );
DWORD SetEventMask( DWORD dwEventMask );
BOOL SetParaFormat( PARAFORMAT& pf );
BOOL SetTargetDevice( HDC hDC, int cxLineWidth );
int GetTextLength() const;
BOOL SetReadOnly( BOOL bReadOnly = TRUE );
int GetFirstVisibleLine() const;
EDITWORDBREAKPROCEX GetWordBreakProcEx() const;
EDITWORDBREAKPROCEX SetWordBreakProcEx( EDITWORDBREAKPROCEX pfnEditWordBreakProcEx );
int GetTextRange( TEXTRANGE* pTextRange ) const;
#if ( _RICHEDIT_VER >= 0x0200 )
int GetTextRange( LONG nStartChar, LONG nEndChar, LPTSTR lpstrText ) const;
#else
int GetTextRange( LONG nStartChar, LONG nEndChar, LPSTR lpstrText ) const;
#endif
#if ( _RICHEDIT_VER >= 0x0200 )
DWORD GetDefaultCharFormat( CHARFORMAT2& cf ) const;
BOOL SetCharFormat( CHARFORMAT2& cf, WORD wFlags );
BOOL SetDefaultCharFormat( CHARFORMAT2& cf );
DWORD GetSelectionCharFormat( CHARFORMAT2& cf ) const;
BOOL SetSelectionCharFormat( CHARFORMAT2& cf );
BOOL SetWordCharFormat( CHARFORMAT2& cf );
DWORD GetParaFormat( PARAFORMAT2& pf ) const;
BOOL SetParaFormat( PARAFORMAT2& pf );
TEXTMODE GetTextMode() const;
BOOL SetTextMode( TEXTMODE enumTextMode );
UNDONAMEID GetUndoName() const;
UNDONAMEID GetRedoName() const;
BOOL CanRedo() const;
BOOL GetAutoURLDetect() const;
BOOL SetAutoURLDetect( BOOL bAutoDetect = TRUE );
// this method is deprecated, please use SetAutoURLDetect
BOOL EnableAutoURLDetect( BOOL bEnable = TRUE );
UINT SetUndoLimit( UINT uUndoLimit );
void SetPalette( HPALETTE hPalette );
int GetTextEx( GETTEXTEX* pGetTextEx, LPTSTR lpstrText ) const;
int GetTextEx( LPTSTR lpstrText, int nTextLen, DWORD dwFlags = GT_DEFAULT, UINT uCodePage = CP_ACP, LPCSTR lpDefaultChar = NULL, LPBOOL lpUsedDefChar = NULL ) const;
int GetTextLengthEx( GETTEXTLENGTHEX* pGetTextLengthEx ) const;
int GetTextLengthEx( DWORD dwFlags = GTL_DEFAULT, UINT uCodePage = CP_ACP ) const;
#endif
#if ( _RICHEDIT_VER >= 0x0300 )
int SetTextEx( SETTEXTEX* pSetTextEx, LPCTSTR lpstrText );
int SetTextEx( LPCTSTR lpstrText, DWORD dwFlags = ST_DEFAULT, UINT uCodePage = CP_ACP );
int GetEditStyle() const;
int SetEditStyle( int nStyle, int nMask = -1 );
BOOL SetFontSize( int nFontSizeDelta );
void GetScrollPos( LPPOINT lpPoint ) const;
void SetScrollPos( LPPOINT lpPoint );
BOOL GetZoom( int& nNum, int& nDen ) const;
BOOL SetZoom( int nNum, int nDen );
BOOL SetZoomOff();
#endif
// Operations
void LimitText( LONG nChars = 0 );
int LineFromChar( LONG nIndex ) const;
POINT PosFromChar( LONG nChar ) const;
int CharFromPos( POINT pt ) const;
void EmptyUndoBuffer();
int LineIndex( int nLine = -1 ) const;
int LineLength( int nLine = -1 ) const;
BOOL LineScroll( int nLines, int nChars = 0 );
void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE );
void SetRect( LPCRECT lpRect );
BOOL DisplayBand( LPRECT pDisplayRect );
LONG FindText( DWORD dwFlags, FINDTEXT& ft ) const;
LONG FindText( DWORD dwFlags, FINDTEXTEX& ft ) const;
LONG FormatRange( FORMATRANGE& fr, BOOL bDisplay = TRUE );
LONG FormatRange( FORMATRANGE* pFormatRange, BOOL bDisplay = TRUE );
void HideSelection( BOOL bHide = TRUE, BOOL bChangeStyle = FALSE );
void PasteSpecial( UINT uClipFormat, DWORD dwAspect = 0, HMETAFILE hMF = 0 );
void RequestResize();
LONG StreamIn( UINT uFormat, EDITSTREAM& es );
LONG StreamOut( UINT uFormat, EDITSTREAM& es );
DWORD FindWordBreak( int nCode, LONG nStartChar );
// Additional operations
void ScrollCaret();
int InsertText( long nInsertAfterChar, LPCTSTR lpstrText, BOOL bCanUndo = FALSE );
int AppendText( LPCTSTR lpstrText, BOOL bCanUndo = FALSE );
// Clipboard operations
BOOL Undo();
void Clear();
void Copy();
void Cut();
void Paste();
// OLE support
IRichEditOle* GetOleInterface() const;
BOOL SetOleCallback( IRichEditOleCallback* pCallback );
#if ( _RICHEDIT_VER >= 0x0200 )
BOOL Redo();
void StopGroupTyping();
void ShowScrollBar( int nBarType, BOOL bVisible = TRUE );
#endif
#if ( _RICHEDIT_VER >= 0x0300 )
BOOL SetTabStops( int nTabStops, LPINT rgTabStops );
BOOL SetTabStops();
BOOL SetTabStops( const int& cxEachStop ); // takes an 'int'
#endif
これで大体何ができるか分かった。
あとは、実際に使用しそうで使ったことがないメソッドについて詳しくみていくことにする。
GetLibraryName
リッチエディットコントロールを使用するには、最初にリッチエディットコントロールの DLL をロードしておかなければいけないらしい。
リッチエディットコントロールの DLL 名はバージョンによって異なるので(Ver1.0 は RICHED32.DLL で、Ver2.0 以降は RICHED20.DLL)、このメソッドを使うことでその違いを CRichEditCtrl がプリプロセス時点で解決してくれる。
// IniModifier.cpp
int WINAPI _tWinMain( HINSTANCE, HINSTANCE, LPTSTR, int )
{
HMODULE hRich = ::LoadLibrary( CRichEditCtrl::GetLibraryName() );
// snip
::FreeLibrary( hRich );
return nRet;
}
SetSelectionCharFormat
現在の選択のテキストの文字書式属性を設定する。
なお、選択範囲がない場合は、以降の入力についての設定となる。
// CRichEditCtrl m_rich;
// テキストを青色太字にして保護にする
CHARFORMAT cf;
cf.dwMask = CFM_PROTECTED | CFM_COLOR | CFM_BOLD;
cf.dwEffects = CFE_PROTECTED | CFE_BOLD;
cf.crTextColor = RGB( 0, 0, 255 );
m_rich.SetSelectionCharFormat( cf );
SetEventMask
親ウィンドウに送る通知メッセージを指定する。
- ENM_PROTECTED
- 保護領域を編集しようとした時に WM_NOTIFY メッセージで EN_PROTECTED が通知されるようにする。
0 を返すと変更許可、非0 を返すと変更禁止とする。
ENPROTECTED* pProtected = reinterpret_cast< ENPROTECTED* >( reinterpret_cast< LPNMHDR >( lParam ) ); としたとき、
pProtected->msg に、この通知発生原因のメッセージ ID が入っている。
pProtected->chrg.cpMin と pProtected->chrg.cpMax に、この通知発生元のインデックス(リッチエディットコントロール先頭位置からのオフセット)が入っている。
- ENM_KEYEVENTS
- キーボードイベントが発生した時に WM_NOTIFY メッセージで EN_MSGFILTER が通知されるようにする。
0 を返すと通常のイベントを処理する。非0 を返すと以降のイベント処理を無視する。
MSGFILTER* pFilter = reinterpret_cast< MSGFILTER* >( reinterpret_cast< LPNMHDR >( lParam ) ); としたとき、
pFilter->msg に、この通知発生原因のメッセージ ID が入っている。
- ENM_MOUSEEVENTS
- マウスイベントが発生した時に WM_NOTIFY メッセージで EN_MSGFILTER が通知されるようにする。
EN_MSGFILTER の動作については、ENM_KEYEVENTS と同じ。
m_rich.SetEventMask( ENM_PROTECTED | ENM_KEYEVENTS | ENM_MOUSEEVENTS );
2008年8月16日
#
INI 編集ツール IniModifier を作成してみる (2)
過去の記事へのリンク:
INI 編集ツール IniModifier を作成してみる (1)
リソース配置が楽なのでダイアログベースで作ることにする。
とりあえずリソースエディタで適当にコントロールを配置して、UI を決める。
ダイアログの自動リサイズを実装するため、CDialogResize も継承しておく。
class CMainDlg
: public CDialogImpl< CMainDlg >
, public CDialogResize< CMainDlg >
{
テキストを編集したり色をつけたりしたいので、リッチエディットコントロールを使ってみようと思う。リッチエディットコントロールを使うのはこれが初めてだが、WTL のヘッダを見ていると結構いろいろできそうなので、せっかくなので調べながら作っていくことにする。
リソースエディタのイメージはこんな感じ↓
リッチエディットコントロールは 2.0 を使うこととする。
CDialogResize は atlframe.h
CRichEditCtrl は atlctrls.h
にそれぞれ定義されているので、stdafx.h は下記のようになった。
// stdafx.h
// Change these values to use different versions
#define WINVER 0x0500
#define _WIN32_WINNT 0x0501
#define _WIN32_IE 0x0501
#define _RICHEDIT_VER 0x0200
// WTL よりも ATL を優先する場合は、atlapp.h より前に include すること
#include <atlstr.h>
#include <atltypes.h>
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlcrack.h>
#include <atlframe.h> // CDialogResize
#include <atlctrls.h> // CRichEditCtrl
#include <atldlgs.h> // CFileDialog
処理の関係上、文字セットは UNICODE ではなく、マルチバイト文字セット(MBCS) でビルドすることにする。
// stdafx.cpp
#if defined( _UNICODE ) || defined( UNICODE )
#error This program doesn't assume unicode build.
#endif
# ところで、なぜ #error ディレクティブではマルチバイト文字が使えないんだろ。
# ダブルクォーテーションで括ってやってもだめ。L"" としてもだめ。何かうまくいくようにしてくれるといいんだけど。
IniModifier
Inno Setup のフロントエンドである ISTool の日本語言語ファイル作成をしたりしているが、INI 形式のファイルをアップデートが非常にめんどくさすぎるので何かツールを作成しようと思う。
開発環境は以下の通り。
- Windows XP sp2
- Visual C++ .NET 2003 sp1
- WTL 8.0
要件仕様は下記の通りとする。
- ファイルのエンコーディングは SJIS/UTF-8 に対応。(できれば EUC も対応。)
- セクション名・キー名で差分チェックを行う。
- Visual SourceSafe の比較画面のように見比べつつ編集もできるようにする。
- セクション:[太字表示]
- コメント:緑色表示
- 追加されたセクション・キー:青色表示
- 削除されたセクション・キー:赤色表示
- 削除されたキー:キーの先頭に
";<DEL>:" を追加。
IniModifier の完成イメージはこんな感じ↓
2008年3月21日
#
とっても今更感がありますが・・・(^^;
2008年02月度PageView
| 日付 | PV |
| 合計 | 12,270 |
| 平均 | 423 |
| 前月比 | +0.3% |
| 2008/02/01 | 386 |
| 2008/02/02 | 257 |
| 2008/02/03 | *448 |
| 2008/02/04 | 513 |
| 2008/02/05 | 433 |
| 2008/02/06 | 435 |
| 2008/02/07 | 437 |
| 2008/02/08 | 474 |
| 2008/02/09 | 267 |
| 2008/02/10 | 374 |
| 2008/02/11 | 791 |
| 2008/02/12 | 529 |
| 2008/02/13 | 571 |
| 2008/02/14 | 388 |
| 2008/02/15 | 370 |
| 2008/02/16 | 312 |
| 2008/02/17 | 291 |
| 2008/02/18 | *707 |
| 2008/02/19 | *790 |
| 2008/02/20 | 554 |
| 2008/02/21 | 379 |
| 2008/02/22 | 416 |
| 2008/02/23 | 228 |
| 2008/02/24 | 270 |
| 2008/02/25 | 372 |
| 2008/02/26 | 305 |
| 2008/02/27 | 374 |
| 2008/02/28 | 302 |
| 2008/02/29 | 297 |
記事を投稿した日に * 印をつけてみました。
IME 関係の記事はまま好評だったようで何より。
2008年3月4日
#
自宅では、メーラーは秀丸メールを使用しているのだけど、大量にくる迷惑メールはウイルスバスター 2007 の迷惑/詐欺メールの判定機能([MEIWAKU] や [Phishing] と件名に表示)を併用してうまくフィルタリングさせていた。
ところが 3/1 に自宅のウイルスバスターを 2008 にアップデートしたところ、深刻な問題が発生。迷惑メール対策機能を設定しているにも関わらず、上記の [MEIWAKU] といった文字が追加されなくなり、メールのフィルタリングが動作しなくなってしまった。
何度か設定を見直したが、設定ミスというのは考えられず、むしろ機能削除された感がある。そこで、サポートにメール問い合わせをしてみた。
以下、回答。
----------
迷惑/詐欺メールの判定につきまして、[MEIWAKU]や[Phishing]と件名に表示という機能は
大変申し訳ございませんがご要望されている機能は
現時点では、ウイルスバスター2008 にはにはございません。
ご希望に添うことができず、誠に申し訳ございませんが製品仕様につき
なにとぞご理解、ご了承のほどよろしくお願いいたします。
なお、「秀丸メール」は動作要件外となっております。
大変申し訳ございませんが、何卒ご了承いただきますようお願いいたします。
----------
とのことorz
いやな予感、大的中。速攻で 2007 に戻しました。
この迷惑メール判定機能が便利でアッサリ 3 年契約したのに・・・
とりあえず再登載の要望は出しておくか。
年内は 2007 が使えるからいいとして、来年からどうしようかな。
こうなってはウイルスバスター 2008 は もはや使う意味ないし、何かいいフィルタリングソフトを探さないといけないかな。。
2008年2月19日
#
キーボードの A を押すと半角カナの「チ」となってしまうときの直しかた でいただいたコメントより。
[Alt+Shift] で [EN] - [JP] 間の切り替えができました。
これで、万一言語が切り替わってしまっても、いちいちキーボードから手を離さずにそのまま入力を続けることができます。
2リットルさん、情報ありがとうございました。
2008年2月18日
#
防備録として。
・IME が OFF のとき、キーボードの A を押すと、「A」ではなく半角カナの「チ」となってしまう。
・IME が ON のとき、キーボードの A を押すと、ひらがなの「あ」ではなく「ち」となってしまう。
これらは、何かの勢いでキー操作をした時に起こる問題で、以前は、その度に泣く泣く Windows を再起動していた。
これは、[Ctrl+Shift+ひらがな] とすることで、ローマ字入力・かな入力切り替えをすることができる。
これは IME が ON/OFF の状態に関わらず有効だ。
ちなみに、σ(^^) は Microsoft Office IME 2007 を使っているが、ひょんな拍子で、タスクバーの IME が [JP] から [EN] に変わってしまうことがある。
これがなんのタイミングで切り替わるのかわからなくて、今のところはマウスで [EN] をクリックして [JP] に戻して使っているが、これがいちいちめんどくさい。
IME の設定で [EN] を削除すればいいだけなんだろうけど、削除せずに切り替える(または勝手に切り替わらないようにする)方法はないものか。
2008年2月3日
#
2008年01月度PageView
2008年01月度PageView
| 日付 | PV |
| 合計 | 13,076 |
| 平均 | 422 |
| 前月比 | -19.0% |
| 2008/01/01 | *514 |
| 2008/01/02 | 324 |
| 2008/01/03 | 337 |
| 2008/01/04 | 366 |
| 2008/01/05 | 316 |
| 2008/01/06 | 279 |
| 2008/01/07 | 518 |
| 2008/01/08 | 414 |
| 2008/01/09 | 652 |
| 2008/01/10 | 594 |
| 2008/01/11 | 468 |
| 2008/01/12 | 318 |
| 2008/01/13 | 251 |
| 2008/01/14 | 285 |
| 2008/01/15 | 424 |
| 2008/01/16 | 331 |
| 2008/01/17 | 346 |
| 2008/01/18 | 544 |
| 2008/01/19 | 327 |
| 2008/01/20 | 283 |
| 2008/01/21 | 425 |
| 2008/01/22 | 405 |
| 2008/01/23 | *326 |
| 2008/01/24 | 843 |
| 2008/01/25 | 459 |
| 2008/01/26 | 371 |
| 2008/01/27 | 438 |
| 2008/01/28 | 461 |
| 2008/01/29 | 469 |
| 2008/01/30 | 489 |
| 2008/01/31 | 499 |
記事を投稿した日に * 印をつけてみました。
先月のMS月例パッチで IE6 がクラッシュする事件があってから、PV 増加中です。
といっても 1 月は大した記事を書いていないことを考えると、あれに関する記事も未だに需要があるってことなのかな。
2008年1月23日
#
来月の Windows Update 月例パッチで遂に IE7 が優先度の高い更新プログラムとして配布されますね。
ref. Internet Explorer 7 の自動更新による配布
で、企業などでのシステム要件だとかテスト環境だとかで IE6 環境を保持したい場合には、これを事前にブロックする設定が必要だと Microsoft は述べています。
この情報は大分前から発信されていますが、いよいよ残り 3 週間となったので、メモしておきたいと思います。
ブロックする方法として、Microsoft は 4 つの方法を提示しています。
下記のうちの 1 つまたは複数の対応が必要ですが、一番上の方法がベストかと。
- 自動配布の無効化ツールキット(Blocker Toolkit) をダウンロードして展開。
- 更新プログラム管理ソリューションを展開。(社内 LAN などで管理している管理者向け)
- ユーザーが各自のコンピュータでローカル管理者として実行しないようにする。
- 更新プログラムをインストールできることが自動更新から通知されたときに、Internet Explorer 7 のインストールを拒否する。
今回はテスト環境を残したいという理由なので、自動配布の無効化ツールキット(Blocker Toolkit) を使うのがもっとも適切ですね。
実際にダウンロードして使ってみました。自己解凍型の ZIP 書庫になっていて、実行すると下記のファイルが展開されます。
- IE70Blocker.adm
- グループポリシーで設定を行う場合に使うテンプレート。
- IE70Blocker.cmd
- コマンドラインから設定を行うためのバッチファイル。
- IE70BlockerHelp.htm
- このツールキットの使い方(英語)。
- IE70BlockerHelp-GPFilteringDialog.jpg
- IE70BlockerHelp.htm 内で使用されている画像ファイル。
ここでは、コマンドラインから設定します。なお、IE70Blocker.cmd ファイルをダブルクリックしても何もおこりません。(一瞬コマンドプロンプトが表示され、使い方が表示されますがすぐに消えます。)
使い方は簡単。コマンドプロンプトを開き、IE70Blocker.cmd のあるフォルダで下記のコマンドを入力し、Enter キーを押下するだけ。すぐに成否が画面に表示されます。
IE70Blocker.cmd /B
これを元に戻す(自動更新で IE7 のインストールを許可する)には、下記のコマンドを入力します。
IE70Blocker.cmd /U
ちなみに実行される内容はそれぞれ下記のとおりです。
ブロック設定時
REG ADD "HKLM\SOFTWARE\Microsoft\Internet Explorer\Setup\7.0" /v DoNotAllowIE70 /t REG_DWORD /d 1 /f
ブロック解除時
REG DELETE "HKLM\SOFTWARE\Microsoft\Internet Explorer\Setup\7.0" /v DoNotAllowIE70 /f
なお、.reg ファイルでやりたい方は下記をコピペして使っても構いません。σ(^^)のところで上記を実際に実行した結果からレジストリキーをエクスポートしたものです(Windows XP sp2)。
この DWORD 値を 0 にするか、このエントリがないときは自動更新で IE7 がインストールされます。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Setup\7.0]
"DoNotAllowIE70"=dword:00000001
※上記内容については、Microsoft の情報をまとめたものであり、万が一、この文書が原因で何らかの不利益が発生したとしても、当方は一切の責任をとれませんので予めご了承ください。
2008年1月1日
#
新年あけましておめでとうございます。
今年もよろしくお願いいたします。m(__)m
2007年12月度PageView
| 日付 |
PV |
| 合計
| 16,135 |
| 平均
| 520 |
| 前月比
| +131.3% |
| 2007/12/01 |
139 |
| 2007/12/02 |
182 |
| 2007/12/03 |
182 |
| 2007/12/04 |
232 |
| 2007/12/05 |
186 |
| 2007/12/06 |
331 |
| 2007/12/07 |
168 |
| 2007/12/08 |
175 |
| 2007/12/09 |
175 |
| 2007/12/10 |
296 |
| 2007/12/11 |
219 |
| 2007/12/12 |
228 |
| 2007/12/13 |
274 |
| 2007/12/14 |
**1,005 |
| 2007/12/15 |
400 |
| 2007/12/16 |
332 |
| 2007/12/17 |
*1,117 |
| 2007/12/18 |
854 |
| 2007/12/19 |
730 |
| 2007/12/20 |
*1,290 |
| 2007/12/21 |
*1,855 |
| 2007/12/22 |
949 |
| 2007/12/23 |
502 |
| 2007/12/24 |
567 |
| 2007/12/25 |
792 |
| 2007/12/26 |
518 |
| 2007/12/27 |
*803 |
| 2007/12/28 |
484 |
| 2007/12/29 |
376 |
| 2007/12/30 |
312 |
| 2007/12/31 |
462 |
記事を投稿した日に * 印をつけてみました。
2007年12月の Microsoft セキュリティアップデートでの問題についてタイムリーだったのが PV を格段に増やしたようです。素直に喜べないのが残念ですが。汗