グーグル日本語入力

5月 27
2010/05/27 02:56 Posted by sawaki Filed in Mac と iPhone

ことえりは日本語入力時に、半角スペース打てないし(半角にする設定が見つからないです、あと、SHIFT+SPACEでなら打てますよ?)Returnキー1回で確定しないしで、ATOKにしようかとも思ったのですが、昔使って自分にあわなかったので(主にキーバインドが。変更すればいい?嫌です。めんどくさいです)、試しにグーグル日本語入力をインストールしたのですが、まるでWindowsIME使ってるみたいで、超最高でした。
というお話。

しかしながら、これは Mac のことえりが使いにくいからのお話で、Windows でグーグル日本語入力を使うか?と言われたら、使わないと思います。

Comments Off

Mac OS X 10.6 snow leopard に VPN を設定する2

5月 1
2010/05/01 10:37 Posted by sawaki Filed in Mac と iPhone

思い描いていたものと違いすぎるので、OpenVPN は忘れることにしました。

ほかに簡単なソリューションはないものかと、いろいろ検討した結果でてきたのが、

iVPN

これ、最初は Mac 用のVPNクライアントかと思っていたのですが、VPNデーモン(pppd)の GUI ラッパーでした。
2,000円ほどで設定が楽になるならと思い購入。
設定方法は http://ricecaker.com/mac/29/ が参考になりました。

補足すると、iVPN の決済時に自分の名前が漢字だと、Your iVPN License の Name 欄が化ける。
「メールをエディタで開き、化けた文字列をコピーして」 iVPN のライセンス設定の Name 欄に設定するか、
ここ の適当な翻訳ですが・・・

I can’t register iVPN
iVPN の登録ができない

If you are having trouble registering iVPN, please try to use the online tool to fix your license.
もしあなたが iVPN の登録でトラブったら、オンラインツールを使って、あなたのライセンスを修正してみてください。

You must have a MacServe account for this to be available to you.
それ(オンラインツール)を利用するには、MacServe アカウントを持ってる(ないなら取得する)必要があります。

There are some cases in which invalid serials are being generated. Also, if PayPal’s record of your name includes a middle name or any non-standard characters (e.g. Japanese characters or accents), your serial may be invalid.
無効なシリアルが生成されることのあるケースは、PayPal のあなたの名前にミドルネームが含まれるか、ノンスタンダードな文字列(日本語とかー)です。あなたの Serial は無効かもしれません。

If this is affecting you, the online tool should fix this for you.
もしそれが原因なら、オンラインツールで修正できるはずです。

If you still have problems after using this tool, please contact me and I will issue you with a new serial.
もし、それでもなお問題が改善しないなら、新しいシリアルを発行するので、我々に連絡してください。

つまり、MacServe の会員サイト内で提供されていると思われるオンラインツールとやらを使ってみてください。
(私はコピペで登録できたので、上記オンラインツールは試していません)

一度設定して起動すると、iVPN アプリを終了しても、デーモンは動作し続けるので、VPN接続できますし、
起動させたまま終了させれば?再起動後に、自動でデーモンが起動します。
iVPN の画面を開く必要はありません。

windows のほうも、ネットワークと共有センター でVPN設定できて、大変満足でした。

でも、やっぱ snow leopard server 買っとけば、こんな苦労しなくてすんだです。

Comments Off

Mac OS X 10.6 snow leopard に VPN を設定する

5月 1
2010/05/01 10:04 Posted by sawaki Filed in Mac と iPhone

先日 iPhone アプリ開発用に Mac を買ったのですが、
今までやろうと思ってやっていなかった、VPN + VNC で windows 7 から Mac OS X を操作するというリモート開発環境を作ることにしました。

まず、もやっと考えたのは、
・windows 側は、ネットワークと共有センターで VPN を設定する
・Mac OS X 側は、起動時に何らかの VPN デーモンを立ち上げる
そんな感じの方法です。

windows 側はやり方が、なんとなく想像できたので、問題はまったく知らない Mac 側のデーモンです。
で、いろいろ調査したのですが、やっぱ snow leopard server 買っとけばよかった!
server 版だと、デフォルトで VPN が設定できるようになっているのですね。

しかたがないので、OpenVPN あたりを入れればよいのかなと思い、

OpenVPN on Mac OS X Leopard

のあたりを読みつつ、snow じゃないけど大体おなじだろ、と思いつつ設定してみたのですが、
デーモンが立ち上げられるようになり、さあ Windows 側だー!
とクライアントの接続設定する段階になって、クライアント証明書を設定するところが見当たらないということになりました。

(゚д゚)ェー

そこで、
Windows用の OpenVPN クライアントを入れまして、
ルータモードで接続できました!

と満足しかけたのですが。

当初思い描いていた方法と違いすぎです。本当にありがとうございました。

Comments Off

複数ディスプレイのアダプタ情報取得クラス

1月 22
2010/01/22 13:39 Posted by sawaki Filed in win32cpp

複数ディスプレイのアダプタ情報を取得する、1つのプランとして、次のようなクラスを作ってみた。
MONITORINFOEX をつかったのは、EnumDisplayDevices() の情報がほしくて、DeviceName で GetMonitorInfo() との対応を得られるため。
DAI_DISPLAY_DEVICE 構造体は、DISPLAY_DEVICE 構造体とほぼ変わらないので、DISPLAY_DEVICE 構造体を継承して rcMonitor 追加でもよかったのですが、あとで便利なので、あえて作りました。
ディスプレイ番号順にソートしたければ DeviceName でリストをソートすればいいと思います。
プライマリアダプタを確認したければ StateFlags が役に立つでしょう。

display_adapter_info.h
#ifndef DISPLAY_ADAPTER_INFO_H_
#define DISPLAY_ADAPTER_INFO_H_

#include <windows.h>
#include <TCHAR.h>
#include <string>
#include <list>

typedef struct stDAI_DISPLAY_DEVICE {
    std::basic_string<TCHAR>    DeviceName;
    std::basic_string<TCHAR>    DeviceString;
    DWORD                       StateFlags;
    std::basic_string<TCHAR>    DeviceID;
    std::basic_string<TCHAR>    DeviceKey;
    RECT                        rcMonitor;
}DAI_DISPLAY_DEVICE, *LPDAI_DISPLAY_DEVICE;

class display_adapter_info
{
protected:
    std::list<DAI_DISPLAY_DEVICE> dai_dd_;

protected:
    static BOOL CALLBACK MonitorEnumProc(
         HMONITOR   hMonitor
        ,HDC        hdcMonitor
        ,LPRECT     lprcMonitor
        ,LPARAM     dwData
    );

public:
    display_adapter_info();
    ~display_adapter_info();

public:
    int     initAdapterInfo();
    UINT    GetAdapterCount();
    int     GetAdapterInfo(UINT no, DAI_DISPLAY_DEVICE& dai_dd);
   
};

#endif /* DISPLAY_ADAPTER_INFO_H_ */

display_adapter_info.cpp
#include "display_adapter_info.h"
#include <iterator>

display_adapter_info::display_adapter_info()
{
    initAdapterInfo();
}

display_adapter_info::~display_adapter_info()
{
}

int display_adapter_info::initAdapterInfo()
{
    dai_dd_.clear();
    EnumDisplayMonitors(NULL, NULL, &MonitorEnumProc, (LPARAM)this);
    return 0;
}

BOOL display_adapter_info::MonitorEnumProc(
     HMONITOR   hMonitor
    ,HDC        hdcMonitor
    ,LPRECT     lprcMonitor
    ,LPARAM     dwData
)
{
    display_adapter_info* lpDAI = (display_adapter_info*)dwData;

    MONITORINFOEX mi;
    ZeroMemory(&mi, sizeof(MONITORINFOEX));
    mi.cbSize = sizeof(MONITORINFOEX);

    if(hMonitor){
        GetMonitorInfo(hMonitor, &mi);

        DAI_DISPLAY_DEVICE  tmp_dai_dd;
        DISPLAY_DEVICE      dd;
        ZeroMemory(&dd, sizeof(dd));
        dd.cb = sizeof(dd);
        for(int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); i++){
            if(!lstrcmp(mi.szDevice, dd.DeviceName)){
                tmp_dai_dd.DeviceName   = dd.DeviceName;
                tmp_dai_dd.DeviceString = dd.DeviceString;
                tmp_dai_dd.StateFlags   = dd.StateFlags;
                tmp_dai_dd.DeviceID     = dd.DeviceID;
                tmp_dai_dd.DeviceKey    = dd.DeviceKey;
                MoveMemory(&tmp_dai_dd.rcMonitor, lprcMonitor, sizeof(RECT));

                lpDAI->dai_dd_.push_back(tmp_dai_dd);

                break;
            }
        }
    } else {
        return FALSE;
    }

    return TRUE;
}

UINT display_adapter_info::GetAdapterCount()
{
    return (UINT)dai_dd_.size();
}

int display_adapter_info::GetAdapterInfo(UINT no, DAI_DISPLAY_DEVICE& dai_dd)
{
    std::list<DAI_DISPLAY_DEVICE>::iterator it;

    UINT i = 0;
    for(it = dai_dd_.begin(); it != dai_dd_.end(); it++){
        if (no == i) {
            dai_dd = *it;
            break;
        }
        i++;
    }
    return 0;
}

Comments Off

浜松ITカンファレンス2010 申込み受付開始

1月 22
2010/01/22 03:10 Posted by sawaki Filed in press

私もスタッフとして参加しています 「浜松IT技術者交流会主催 浜松ITカンファレンス2010」 がいよいよ来月(2/20)に迫ってきました。講師はなんと、プログラミング言語 Ruby 創始者 まつもとゆきひろ氏をはじめとした、豪華講師陣ということで、すいません、最初聞いたときは豪華すぎて耳を疑いました。

いよいよ申込みの受付開始で、受講できるのが先着 200 名ですので、ご興味のある浜松の技術者の皆様、お早めにお申込みくださいませ。
また、終わった後に、カンファレンスに参加された方限定で懇親会も予定されているようですので、
よろしかったらそちらもぜひご参加ください。

カンファレンスの詳細・お申し込みはこちら
http://hamamatsu-it.com/conference2010

主催:浜松IT技術者交流会
http://hamamatsu-it.com/

Comments Off

メッシュデータ D3DXFRAME 構造

1月 20
2010/01/20 12:28 Posted by sawaki Filed in DirectX

D3DXFRAME は複数の構造体で入れ子になっており把握しずらかったので、展開図というかツリーにしてみた。
D3DXFRAME
  ├LPSTR                 Name;
  ├D3DXMATRIX            TransformationMatrix;
  ├LPD3DXMESHCONTAINER   pMeshContainer;
  │  ├LPSTR                   Name;
  │  ├D3DXMESHDATA            MeshData;
  │  │  ├D3DXMESHDATATYPE          Type;
  │  │  └union {
  │  │      LPD3DXMESH              pMesh;                → ID3DXMesh
  │  │      LPD3DXPMESH             pPMesh;               → ID3DXPMesh
  │  │      LPD3DXPATCHMESH         pPatchMesh;           → ID3DXPatchMesh
  │  │    };
  │  ├LPD3DXMATERIAL          pMaterials;
  │  │  ├D3DMATERIAL9              MatD3D;
  │  │  │  ├D3DCOLORVALUE               Diffuse;        → float r; float g; float b; float a;
  │  │  │  ├D3DCOLORVALUE               Ambient;        → float r; float g; float b; float a;
  │  │  │  ├D3DCOLORVALUE               Specular;       → float r; float g; float b; float a;
  │  │  │  ├D3DCOLORVALUE               Emissive;       → float r; float g; float b; float a;
  │  │  │  └float                       Power;
  │  │  └LPSTR                     pTextureFilename;
  │  │
  │  ├LPD3DXEFFECTINSTANCE    pEffects;
  │  │  ├LPSTR                     pEffectFilename;
  │  │  ├DWORD                     NumDefaults;
  │  │  └LPD3DXEFFECTDEFAULT       pDefaults;
  │  │      ├LPSTR                       pParamName;
  │  │      ├D3DXEFFECTDEFAULTTYPE       Type;           → enum DWORD
  │  │      ├DWORD                       NumBytes;
  │  │      └LPVOID                      pValue;
  │  │
  │  ├DWORD                   NumMaterials;
  │  ├DWORD*                  pAdjacency;
  │  ├LPD3DXSKININFO          pSkinInfo;                  → ID3DXSkinInfo
  │  └D3DXMESHCONTAINER*      pNextMeshContainer;
  ├D3DXFRAME*            pFrameSibling;
  └D3DXFRAME*            pFrameFirstChild;

Comments Off

VMR9 カスタムアロケータプレゼンタについて

1月 20
2010/01/20 10:20 Posted by sawaki Filed in DirectX

SDKサンプルは WindowsSDK に入っている VMR9Allocator。

ウィンドウモード と ウィンドウレスモード では、デフォルトアロケータプレゼンタが使われるため、レンダーレスモード以外ではカスタムアロケータプレゼンタを使うことはできない。 VMR9 で IVMRSurfaceAllocatorNotify9 を QueryInterface しても失敗する。

http://msdn.microsoft.com/ja-jp/library/cc371529.aspx

はたぶんそういうことを言っている。

レンダリングレスモードでは、VMR9 はミキサー コンポーネントを自動的にロードしない。が、SetNumberOfStreams() を使うことでミキサーをロードすることができる。最初に 1 つの Pin は割り当てられているが、SetNumberOfStreams(1) の場合、Pin を増やさずに、強制的にミキサーをロードする。

SDKサンプルのカスタムアロケータプレゼンタが InitializeDevice で Direct3DDevice を作成しない理由は、レンダリングレス&ミキサーモードの場合、Pin を接続する前に IVMRSurfaceAllocatorNotify9::SetD3DDevice でデバイスとモニタが割り当てられていなければならないためだと考えられる。

カスタムアロケータプレゼンタの InitializeDevice は VMR9 の Pin を接続した際に呼ばれるが、Pin のメディアタイプは IVMRSurfaceAllocatorNotify9::SetD3DDevice されない限り設定されないようなので、レンダリングレス&ミキサーモード で Pin を接続できるようにするために、必然的に AdviseNotify あたりで SetD3DDevice するということなんだろうか。

VMR9 のオブジェクトを Release() すると、カスタム アロケータプレゼンタ オブジェクトの参照カウントも解放するので、カスタムアロケータプレゼンタを自前で解放してはいけない。

カスタムアロケータプレゼンタの AdviseNotify は、MSDN によれば
http://msdn.microsoft.com/ja-jp/library/cc369893.aspx

・・・アプリケーションがこのインターフェイスを使うことはない。

http://msdn.microsoft.com/ja-jp/library/cc369892.aspx

AdviseNotify メソッドは、VMR から呼び出され、・・・

とか書いてあって、いかにも自分で呼んだらいけない風なのに、SDKサンプルは自分で呼んでるのがなぜなのか。。

Comments Off