2008-08-29

Google ウェブマスター ツール

Google ウェブマスター ツール に登録してみた

Google ウェブマスター ツール にログオンして、不定期メモのサイトを追加
確認の方法はメタタグを選択して、表示されたメタタグをコピー

Blogger側で「レイアウト」→「HTMLの編集」で<title>〜</title>行の後にメタタグを貼り付けて「テンプレートを保存」

Google ウェブマスター ツール に戻って「確認」を行い登録は完了

手順が正しいかはわかりませんがとりあえず使えるようにはなった

Google Analytics とはまた違った情報を見る事が出来るわけですが、どうすればいいんでしょう?
情報弱者な私は活用の方法がわからない… orz

2008-08-24

ATLを使ってCOMコードコンポーネントを作る 5

ATLを使ってCOMコードコンポーネントを作る 4 の続き

続けるつもりは無かったのですが、VARIANT_BOOLの値の返し方を書いていなかったのでさらに続けます
と言っても非常に簡単な話しかしませんが…


こんなIDL定義をした場合
[id(1), helpstring("VARIANT_BOOLを返す")] HRESULT SampleMethod([out,retval] VARIANT_BOOL* result);

実装は次のように記述します。(今、私はラッパーとして作っているので、WrappedMethod() は bool を返す前提で話を進めます)
STDMETHODIMP CTest::SampleMethod([out,retval] VARIANT_BOOL* result)
{
result* = WrappedMethod() ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}

そう、当たり前と言えば当たり前ですが、boolとVARIANT_BOOLは異なるのでちゃんと変換しなきゃダメなんですね。
変換用の関数とか用意されてそうな気もしますが調べてません…

2008-08-21

引用部分にスクロールバーを表示するようにした

引用部分のはみ出した分をスクロールで表示させるためにテンプレートを少々変更しました。
blockquote {
background: #f0f0f0;
overflow: auto;
border: 1px solid #909090;
}

ついでに背景色と枠線も付けてみました

これで引用部分に>pre<を付ければ行頭のスペースはそのまま出力されるし改行も元のレイアウト通りに出力されます。

一つだけ問題があってBloggerの投稿画面って「HTMLの編集」から「作成」に切り替えると行頭のスペースが減っていくのでレイアウトがどんどん崩れていっちゃうんですけど…どうしようも無いですよね?

2008-08-20

ATLを使ってCOMコードコンポーネントを作る 4

ATLを使ってCOMコードコンポーネントを作る 3 の続き

前回、一応実装までの手順を書きましたが、今回は列挙型の定義手順を説明します。


COMとして公開する列挙型はIDLファイルに以下のような記述を追加します。
[
v1_enum,
helpstring ("ロジックオプション"),
]
typedef enum SampleEnum
{
[helpstring("値1")] ENUM_VALUE1 = 0x00000000,
[helpstring("値2")] ENUM_VALUE2 = 0x00000001,
[helpstring("値3")] ENUM_VALUE3 = 0x00000002,
[helpstring("値4")] ENUM_VALUE4 = 0x00000003,
[helpstring("値5")] ENUM_VALUE5 = 0x00000004
} SampleEnum;

記述方法はいくつかあるようですが、このような記述をするとVBから想定通りに使えました。
typedef enum の行の SampleEnum は無くてもコンパイルは通りますがVBからの参照がおかしくなります。

引数にインターフェースや列挙型を使用するには
[id(1), helpstring("引数に列挙型などを使用する場合")] HRESULT SampleMethod([in] ITest* pTest, [in] SampleEnum enumValue, [out,retval] VARIANT_BOOL* result);

のように記述します。

一応続く…

ATLを使ってCOMコードコンポーネントを作る 3

ATLを使ってCOMコードコンポーネントを作る 2 の続き

そろそろお決まりの言い訳を入れておきましょう!
これは私の作業メモですので間違った事が書かれている可能性が大いにあります。

さて、言い訳が終わったところでウィザードで追加した「ATL シンプル オブジェクト」(仮にTestという名前で追加したとします)にメソッドやプロパティを追加してみます。

まず、IDLファイルを見てみると、ウィザードにより次のような記述が追加されています。
  1. インターフェースの定義
    [
    object,
    uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
    dual,
    nonextensible,
    helpstring("ITest インターフェイス"),
    pointer_default(unique)
    ]
    interface ITest : IDispatch{
    };

    ここにある uuid にはウィザードにより適切な値が入っています。ウィザードを使用しないでインターフェースを追加する場合は Visual Studio に付属している uuidgen.exe を使います。
    helpstring で説明を付けておくとIDEで表示されるので簡単な説明を付けておくとよいでしょう。
    その他、dual、nonextensible などはウィザードで選択されたオプションに従い入っています。どんな意味があるのかはヘルプを見ましょう(^^;)

  2. クラスの定義
    library TestLib
    {
    importlib("stdole2.tlb");
    [
    uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
    helpstring("Test Class")
    ]
    coclass Test
    {
    [default] interface ITest;
    };
    };

    こちらにも uuid が登場します。やはりウィザードにより適切な値が入っています。ウィザードを使用しない場合はインターフェースとは別の uuid を発行して使います。
    helpstring はインターフェースと同様適当な説明を付けておきます。
    coclass の部分でTestクラスが実装するインターフェースが定義してあります。


プロパティやメソッドを追加するにはインターフェースの定義に追加する必要があります。
ウィザードを使ってもよいですが、こては手入力の方が速くてよいと思います。
例えばこんな感じに記述します
interface ITest : IDispatch{
[propget, id(1), helpstring("取得、設定が可能なプロパティ")] HRESULT SampleProperty1([out, retval] LONG* pVal);
[propput, id(1), helpstring("取得、設定が可能なプロパティ")] HRESULT SampleProperty1([in] LONG newVal);
[propget, id(2), helpstring("取得のみ可能なプロパティ")] HRESULT SampleProperty2([out, retval] LONG* pVal);
[id(3), helpstring("返値のないメソッド")] HRESULT SampleMethod1([in] LONG arg1);
[id(4), helpstring("返値のあるメソッド")] HRESULT SampleMethod2([in] LONG arg1, [in] DOUBLE arg2, [out,retval] VARIANT_BOOL* result);
[id(5), helpstring("引数から値を返すメソッド")] HRESULT SampleMethod3([in] LONG arg1, [out] LONG* arg2, [out,retval] VARIANT_BOOL* result);
};

プロパティの場合は propget か propput を付けます。プロパティの種類には、たしかもう1種類あったのですが今回は使いません。
id には重複しない値を設定します。id に設定する値には予約された意味のある値(確か -1 など)を付ける事もできます。意味のある id はどこかに定義があるので調べて参照してください。今回は意味のある値は設定せず、1 からの連番を付けます。
helpstring はインターフェースと同様、適当な説明を付けておくとよいでしょう。
以降、id 毎に簡単な説明を記述します。
  1. 取得、設定が可能なプロパティです。この場合は取得、設定で同じ id を付けます。返値は HRESULT とし、プロパティ名には Get や Set は付けません。
    例では引数が1つだけですが、インデックス番号などの引数を追加する事も出来ます。最後の引数は取得側には [out, retval]、設定側には[in] を付け、取得側は設定側と同じ型のポインタ型とします。

  2. 取得のみ可能なプロパティです。設定側のプロパティ定義が無いだけで取得、設定が可能なプロパティと同様に記述します。

  3. 返値のないメソッドです。返値は HRESULT とします。[out, retval] の付いた引数は宣言しません。

  4. 返値のあるメソッドです。返値は HRESULT とします。[out, retval] の付いた引数が返値の宣言です。例では真偽値を返しています。VBなどから使用するために VARIANT_BOOL* 型を使用します。

  5. 引数から値を返すメソッドです。返値は HRESULT とします。[out] の付いた引数が値を返す引数です。例ではLONG値を返しています。

引数で使用している型はCOM用に定義された型です。ULONGなど、VBから使用できない型もあるため注意が必要です。
このようにIDLファイルにインターフェースの定義が出来たらクラス定義に実装コードを追加します。まずはヘッダファイルから
// Test.h : CTest の宣言

#pragma once
#include "resource.h" // メイン シンボル

#include "SampleProject.h"

#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "DCOM の完全サポートを含んでいない Windows Mobile プラットフォームのような Windows CE プラットフォームでは、単一スレッド COM オブジェクトは正しくサポートされていません。ATL が単一スレッド COM オブジェクトの作成をサポートすること、およびその単一スレッド COM オブジェクトの実装の使用を許可することを強制するには、_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA を定義してください。ご使用の rgs ファイルのスレッド モデルは 'Free' に設定されており、DCOM Windows CE 以外のプラットフォームでサポートされる唯一のスレッド モデルと設定されていました。"
#endif



// CTest

class ATL_NO_VTABLE CTest :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDynamicControl, &CLSID_DynamicControl>,
public ISupportErrorInfo,
public IDispatchImpl<IControlLogic, &IID_IControlLogic, &LIBID_LogicWrapperLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CTest()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_DYNAMICCONTROL)


BEGIN_COM_MAP(CTest)
COM_INTERFACE_ENTRY(ITest)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);


DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}

public:

STDMETHOD(get_SampleProperty1)(LONG* pVal);
STDMETHOD(put_SampleProperty1)(LONG newVal);
STDMETHOD(get_SampleProperty2)(LONG* pVal);
STDMETHOD(SampleMethod1)(LONG arg1);
STDMETHOD(SampleMethod2)(LONG arg1, DOUBLE arg2, VARIANT_BOOL* result);
STDMETHOD(SampleMethod3)(LONG arg1, LONG* arg2, VARIANT_BOOL* result);
};

OBJECT_ENTRY_AUTO(__uuidof(Test), CTest)

最後、publicに追加されている6個の関数が追加した部分です。
関数名はIDLの定義と同じにします。プロパティの場合は先頭に get_ または put_ を付けます。
返値などは STDMETHOD マクロにより付くので?気にしなくてよいです。
引数はIDLの定義から [ ] で囲まれた部分を省いたものにします。

次に実装側、cppファイルですが説明が面倒になってきたので簡単に…

宣言の方は STDMETHOD マクロを使用しましたが実装側は何故か使わず、返値は STDMETHODIMP を使用します。
返値としては、処理が成功した場合は S_OK を返します。
失敗した場合は用意されている定義から適当に選んで返します。

IDL で [out] と定義された値には *result = true のようにして値を返します。
本などを読むと [out] と定義された値はメモリを確保して返すように書かれていますが、そのようにするVBに対してとうまく値を返せませんでした。
このあたりは型によって挙動が変わるのかもしれません。

さて、そろそろ本格的に理解できない領域に突入してきましたがもう少しだけ続きます

ATLを使ってCOMコードコンポーネントを作る 2

ATLを使ってCOMコードコンポーネントを作る 1 の続き

さて、プロジェクトが追加できたのでいよいよクラスを追加します。
最終的にはウィザードでの追加はやめる事になったのですが、一応手順だけ残しておきます。

  1. 「クラス ビュー」でプロジェクトを右クリックして「追加」→「クラス」と選択します。
    私は「クラス ビュー」から追加した場合のソースコードの配置が気に入らないため「プロジェクト エクスプローラ」から追加したいフィルタを選んで行いました。
    なので貼り付けてある画像は「プロジェクト エクスプローラ」からの物です。

  2. 「カテゴリ」の「ATL」を選択し、「テンプレート」の「ATL シンプル オブジェクト」を選択して「追加」をクリックします。

  3. 「ATL シンプル オブジェクト ウィザード」が表示されます。

  4. 「短い名前」に名前を入れると他の項目は適切な物が入ります。「次へ」をクリックします。

  5. このような画面になります。

  6. 「サポート」の「ISupportErrorInfo」にチェックを入れて「完了」をクリックします。

今回はC++で記述されたロジックをExcelで流用したいだけの物で、通信したり、共通のリソースにアクセスしたりしないので深く悩まずにすみました。
つか、そんな要件があったら私では作れませんよ(^^;)

続く…

ATLを使ってCOMコードコンポーネントを作る 1

今頃感がプンプン漂ってきますが、 Visual Studio 2005 で ATL を使用して COMコードコンポーネント を作成する事になりましたので手順メモを残します。

まず、プロジェクトを作成します。
今回は既存コードのラッパーとして作りたかったので既存ソリューションにプロジェクトを追加しました。

  1. まず、「ファイル」→「新規作成」→「プロジェクト」とメニューを選択します。

  2. このようなダイアログが表示されます。

  3. 「プロジェクトの種類」は「Visual C++」→「ATL」を選択し、「テンプレート」は「ATL プロジェクト」を選択します。
    「プロジェクト名」および「場所」は適切な物を設定します。
    「ソリューション」は「ソリューションに追加」を選択します。
    ここまで設定できたら「OK」をクリックします。

  4. 「ATL プロジェクト ウィザード」が始まります。「次へ」をクリックします。

  5. そのまま「完了」をクリックします。

ここまでの手順でプロジェクトの追加は完了です。

続く…

2008-08-12

Blogger の HTML/JavaScript ウィジェットが削除できなかった

環境は Mac OS X Leopard + Firefox 3 です。

ページ要素→編集→削除

で削除が出来ませんでした。
仕方がないので

レイアウト→HTML の編集

で直接ウィジェットを削除しました。削除したのは
<b:widget id='HTML1' locked='false' title='' type='HTML'/>
です。どれを消せばいいかはタイトルや並び順から判断します。


気になったので一応、追試してみたのですが

HTML/JavaScript はやはり削除できない。
キャンセルすると Firefox ごと閉じてしまいます。

Firefox を再起動して他のウィジェットを試してみると正常に削除できました。
再度 HTML/JavaScript を試してみると…アレ?
問題ありませんねぇ…

結局 Firefox が問題なのか Blogger 側の問題なのかわからないまま解決してしまいましたorz

2008-08-11

VMware Fusion 2 beta 2 の使用感

機能強化されたUnityについてですが、Windows2000 使うと Spaces で他の操作スペースに切り替えてもすぐに戻されてしまいます。
XPでは動作するんですが、何かをきっかけに同様の現象が出てしまいます。

XP + Full Screen でのマルチモニタ対応も問題ありません。

XP + Unity でのマルチモニタ対応もちゃんと機能していてウインドウを他のモニタに移動できます。
ただし、Spacesで他の操作スペースにウインドウを移動したら表示は出来るけど操作できない状態になってしまったり、別の操作スペースに移動したウインドウをクリックしたら元の操作スペースのウインドウにフォーカスが移ったりと怪しげな動作満載です。

Unityは遅いし不安定なのでまだまだ使わない方がいい気がします。

Unityについては元々使っていないし使わなければ何の問題もないのですが、
Ctrl + ↑↓←→ による Spaces の切り替えが出来なくなる事があります。
どうもVMwareがキー入力を捕まえて離さないようで、VMwareを終了すれば回復できます。
これは結構頻繁に起き、しかも非常に不便なのでbeta1に戻そうかと思案中です。

DirectX は改善されたっぽく、前は動かなかったゲームが動くようになってました。
…普段使わないですけどね。

2008-08-09

FOMAデータ通信を月額換算2500円程度で提供、日本通信

FOMAデータ通信を月額換算2500円程度で提供、日本通信

画期的だと一瞬思ってしまった自分が恥ずかしいです。

日本通信株式会社のニュースリリースでは
  • 今回発売する製品は、150時間まで分単位でテレホンカードのように使える
  • 想定市場価格は39,900円(税込)で、利用可能期間は480日間(約16ヶ月)
  • 週に数回程度の利用頻度であれば、月額換算で2,500円を下回ります
と説明されていて、誤解を招くような言い方ではないのですが、@ITではタイトルで
FOMAデータ通信を月額換算2500円程度で提供
と謳ってしまっているのでアレですよね^^;
有効期限は480日(約16カ月)で、月額換算だと2500円弱、1時間当たりでは266.6円となる。
と説明されていますが、有効期限いっぱいまで使用した場合の月額換算 39,900円/16ヶ月(有効期限) と1時間あたりの価格 39,900円/150時間(通信可能時間) を並べて書いてしまっているのも問題があると思います。
意図的に正しい理解を妨げようとしているとしか思えないんですが…

まあ、細かい話をすると 480日は 約15.78ヶ月 なので月額は 約2528円、2500円強です。しかも一日あたり18.75分しか使えません。謎なのは1時間あたりの単価で、普通に計算すると 266円/時 になるんですけど…

このサービスは分単位のサービスとの事なので
39,900円で9000分接続可能なサービス。ただし480日の有効期限付き
と誤解が生じないように紹介して欲しいものです。

普通1日18.75分あれば十分だと言うのなら私の文句は的外れですけど…

2008-08-06

Windows2000 で Visual SourceSafe 2005 の履歴を表示可能にする

開発環境用のOSとして Windows2000 を使用する事が多いのですが、Visual SourceSafe 2005 (以降 VSS と表記します) の履歴が表示できず、困っていました。
この現象は私の環境がおかしくなっているからだと思っていたのですが、

BUG: Windows 2000 で Visual SourceSafe 2005 を使用すると、履歴のダイアログ ボックスが Visual SourceSafe エクスプローラに表示されません。

どうやら既知の不具合だったようです。
VSSデータベースの設定をタイムゾーンを使わないようにすれば回避できるとありますが、客先のVSSデータベースなので出来ない相談です。
また、サポートの終了している Windows2000 に限定した不具合なので修正は期待できません。


しかし、この現象は TzSpecificLocalTimeToSystemTime 関数がない事に起因しているようなので、TzSpecificLocalTimeToSystemTime 関数を提供できれば正常に動作するのかもしれません。

そこで黒翼猫さんのKDWの出番です。

設定手順は以下の通り

  1. KDLLinst.exe を起動して「EZ KD レジストリ」をチェックして Windows を再起動します。

  2. 再度 KDLLinst.exe を起動して「ExInstall」に VSS のパスを設定し、「Kernel32」を選択して「簡易設定」を押します。

以上で設定は完了!履歴の表示が出来るようになりました。

・・・多分

多分というのは昼にやった手順をもう一度行いメモを取っているわけですが、今現在、VSSデータベースが無い状態で書いているので最後の検証が出来ないのです。
昼やったときは出来たので多分大丈夫なんでしょう。

それにしてもKDWってステキです!
黒翼猫さんに大感謝です!!

2008-08-06 23:58 少しだけ加筆

2008-08-01

VMware Fusion 2 beta 2 がリリースされた

VMware Fusion 2 beta 2 がリリースされました

beta 1 は多少不安定なところもあったので早速 beta 2 にアップデートしてみます
beta 1 の時と同様に製品版のシリアル番号でインストールできました

Mac と VMware上の Windows がシームレスに使えるようになり、機能面でも Pallalels に追いついた模様
これで速度が落ちたり不安定になったりしなければいいんですけど…
(私がPallalelsを使わず、VMwareを使用しているのは速度と安定性が理由なので)

スケジュールに従って自動的にスナップショットを取る機能が追加されたようだが、これを使用して速度面の問題はないんだろうか?
マルチディスプレイ対応などは Windows2000 でどのくらい恩恵に与れるのだろうか?
このあたりが興味のあるところ

ちなみに私が未だに 2000 を使い続けるのはライセンスの問題なのです。
XP にも Developer Edition があればよかったんですけどね〜

Mac OS X の IPv6 初期設定は変えた方がいいらしい

高木浩光@自宅の日記 : MacユーザはIPv6を切るかnet.inet6.ip6.use_tempaddr=1の設定を によると Mac OS X の IPv6 は匿名アドレスになっておらず 携帯の個体識別番号の問題 と同じ状態だそうです。

現在、GUIから匿名アドレスを使用する設定は出来ず、ターミナルなどから設定する必要があるそうです。
ちなみに私は IPv6 は切っているつもりでしたが、一部のネットワーク環境では自動に設定されていました。

早いもので既にスクリプトを配布されている方がいらっしゃいますので私も設定したいと思います。

waveriderの日記 : Macでipv6 temporary addressを有効にする にある手順通りに設定するだけ。
念のためダウンロードしたファイルの内容を確認しましたが、問題なさそうです(全然理解していませんが、匿名アドレスを使用する以外の事はしていない事はわかりました)
後は手順通りに実行するだけです。

さて、これで匿名アドレスを使用するように設定できたわけですが…

職場も自宅もルータのIPv6を無効にしているのであまり意味がないのでした。

外出するときは外出用にAirMacを切りにしたネットワーク環境に切り替えてるしね(^^;)