はみ出しRAPTの戯言

- a day after yesterday -

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

コミュニティ リンク

2008年8月17日 #

INI 編集ツール IniModifier を作成してみる (3)

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.cpMinpProtected->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 );

posted @ 16:20 | Feedback (0)

2008年8月16日 #

INI 編集ツール IniModifier を作成してみる (2)

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"" としてもだめ。何かうまくいくようにしてくれるといいんだけど。

posted @ 1:23 | Feedback (1)

INI 編集ツール IniModifier を作成してみる (1)

IniModifier

Inno Setup のフロントエンドである ISTool の日本語言語ファイル作成をしたりしているが、INI 形式のファイルをアップデートが非常にめんどくさすぎるので何かツールを作成しようと思う。

開発環境は以下の通り。

  • Windows XP sp2
  • Visual C++ .NET 2003 sp1
  • WTL 8.0

要件仕様は下記の通りとする。

  • ファイルのエンコーディングは SJIS/UTF-8 に対応。(できれば EUC も対応。)
  • セクション名・キー名で差分チェックを行う。
  • Visual SourceSafe の比較画面のように見比べつつ編集もできるようにする。
  • セクション:[太字表示]
  • コメント:緑色表示
  • 追加されたセクション・キー:青色表示
  • 削除されたセクション・キー:赤色表示
  • 削除されたキー:キーの先頭に ";<DEL>:" を追加。

IniModifier の完成イメージはこんな感じ↓

IniModifier の完成イメージ

posted @ 0:18 | Feedback (6)

2008年3月21日 #

2008年02月度PageView

とっても今更感がありますが・・・(^^;

2008年02月度PageView
日付PV
合計12,270
平均423
前月比+0.3%
2008/02/01386
2008/02/02257
2008/02/03*448
2008/02/04513
2008/02/05433
2008/02/06435
2008/02/07437
2008/02/08474
2008/02/09267
2008/02/10374
2008/02/11791
2008/02/12529
2008/02/13571
2008/02/14388
2008/02/15370
2008/02/16312
2008/02/17291
2008/02/18*707
2008/02/19*790
2008/02/20554
2008/02/21379
2008/02/22416
2008/02/23228
2008/02/24270
2008/02/25372
2008/02/26305
2008/02/27374
2008/02/28302
2008/02/29297

記事を投稿した日に * 印をつけてみました。

IME 関係の記事はまま好評だったようで何より。

posted @ 23:42 | Feedback (0)

2008年3月4日 #

ウイルスバスター 2008 の落とし穴

自宅では、メーラーは秀丸メールを使用しているのだけど、大量にくる迷惑メールはウイルスバスター 2007 の迷惑/詐欺メールの判定機能([MEIWAKU] や [Phishing] と件名に表示)を併用してうまくフィルタリングさせていた。

ところが 3/1 に自宅のウイルスバスターを 2008 にアップデートしたところ、深刻な問題が発生。迷惑メール対策機能を設定しているにも関わらず、上記の [MEIWAKU] といった文字が追加されなくなり、メールのフィルタリングが動作しなくなってしまった

何度か設定を見直したが、設定ミスというのは考えられず、むしろ機能削除された感がある。そこで、サポートにメール問い合わせをしてみた。

以下、回答。
----------
迷惑/詐欺メールの判定につきまして、[MEIWAKU]や[Phishing]と件名に表示という機能は
大変申し訳ございませんがご要望されている機能は
現時点では、ウイルスバスター2008 にはにはございません。

ご希望に添うことができず、誠に申し訳ございませんが製品仕様につき
なにとぞご理解、ご了承のほどよろしくお願いいたします。

なお、「秀丸メール」は動作要件外となっております。
大変申し訳ございませんが、何卒ご了承いただきますようお願いいたします。
----------

とのことorz

いやな予感、大的中。速攻で 2007 に戻しました。
この迷惑メール判定機能が便利でアッサリ 3 年契約したのに・・・
とりあえず再登載の要望は出しておくか。

年内は 2007 が使えるからいいとして、来年からどうしようかな。
こうなってはウイルスバスター 2008 は もはや使う意味ないし、何かいいフィルタリングソフトを探さないといけないかな。。

posted @ 23:48 | Feedback (5)

2008年2月19日 #

Microsoft Office IME 2007 で [JP] から [EN] に変わっってしまったときの直しかた

キーボードの A を押すと半角カナの「チ」となってしまうときの直しかた でいただいたコメントより。

[Alt+Shift] で [EN] - [JP] 間の切り替えができました。
これで、万一言語が切り替わってしまっても、いちいちキーボードから手を離さずにそのまま入力を続けることができます。

2リットルさん、情報ありがとうございました。

posted @ 10:10 | Feedback (2)

2008年2月18日 #

キーボードの A を押すと半角カナの「チ」となってしまうときの直しかた

防備録として。
・IME が OFF のとき、キーボードの A を押すと、「A」ではなく半角カナの「チ」となってしまう。
・IME が ON のとき、キーボードの A を押すと、ひらがなの「あ」ではなく「ち」となってしまう。
これらは、何かの勢いでキー操作をした時に起こる問題で、以前は、その度に泣く泣く Windows を再起動していた。

これは、[Ctrl+Shift+ひらがな] とすることで、ローマ字入力・かな入力切り替えをすることができる。
これは IME が ON/OFF の状態に関わらず有効だ。

ちなみに、σ(^^) は Microsoft Office IME 2007 を使っているが、ひょんな拍子で、タスクバーの IME が [JP] から [EN] に変わってしまうことがある。
これがなんのタイミングで切り替わるのかわからなくて、今のところはマウスで [EN] をクリックして [JP] に戻して使っているが、これがいちいちめんどくさい。
IME の設定で [EN] を削除すればいいだけなんだろうけど、削除せずに切り替える(または勝手に切り替わらないようにする)方法はないものか。

posted @ 12:51 | Feedback (6)

2008年2月3日 #

2008年01月度PageView

2008年01月度PageView

2008年01月度PageView
日付PV
合計13,076
平均422
前月比-19.0%
2008/01/01*514
2008/01/02324
2008/01/03337
2008/01/04366
2008/01/05316
2008/01/06279
2008/01/07518
2008/01/08414
2008/01/09652
2008/01/10594
2008/01/11468
2008/01/12318
2008/01/13251
2008/01/14285
2008/01/15424
2008/01/16331
2008/01/17346
2008/01/18544
2008/01/19327
2008/01/20283
2008/01/21425
2008/01/22405
2008/01/23*326
2008/01/24843
2008/01/25459
2008/01/26371
2008/01/27438
2008/01/28461
2008/01/29469
2008/01/30489
2008/01/31499

記事を投稿した日に * 印をつけてみました。

先月のMS月例パッチで IE6 がクラッシュする事件があってから、PV 増加中です。
といっても 1 月は大した記事を書いていないことを考えると、あれに関する記事も未だに需要があるってことなのかな。

posted @ 3:27 | Feedback (0)

2008年1月23日 #

(2/13) 自動更新による Internet Explorer 7 の配布開始

来月の Windows Update 月例パッチで遂に IE7 が優先度の高い更新プログラムとして配布されますね。
ref. Internet Explorer 7 の自動更新による配布

で、企業などでのシステム要件だとかテスト環境だとかで IE6 環境を保持したい場合には、これを事前にブロックする設定が必要だと Microsoft は述べています。
この情報は大分前から発信されていますが、いよいよ残り 3 週間となったので、メモしておきたいと思います。

ブロックする方法として、Microsoft は 4 つの方法を提示しています。
下記のうちの 1 つまたは複数の対応が必要ですが、一番上の方法がベストかと。

  1. 自動配布の無効化ツールキット(Blocker Toolkit) をダウンロードして展開。
  2. 更新プログラム管理ソリューションを展開。(社内 LAN などで管理している管理者向け)
  3. ユーザーが各自のコンピュータでローカル管理者として実行しないようにする。
  4. 更新プログラムをインストールできることが自動更新から通知されたときに、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 の情報をまとめたものであり、万が一、この文書が原因で何らかの不利益が発生したとしても、当方は一切の責任をとれませんので予めご了承ください。

posted @ 23:59 | Feedback (0)

2008年1月1日 #

2008年です。&2007年12月度PageView

新年あけましておめでとうございます。
今年もよろしくお願いいたします。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 を格段に増やしたようです。素直に喜べないのが残念ですが。汗

posted @ 3:21 | Feedback (3)