2008-01-28

WebKitのPortingについて考えてみる

WebKitのソースをちょっと見てたので。Windows版のSafariだとCoreGraphicsとかなどのプロプライエタリなコードをリンクしているので、WebKitをx64版でビルドするとかCE版でビルドするということはできない。オープンソースなCoreGraphicsを作ればいいんだけど、そのコストってって感じ。なので、別の方法ってのを。

Qtを使う

Swiftというブラウザがやっていること。ある意味一番楽なんだけど、OS Nativeかどうかという点において、非常に微妙

Cairoを利用

Firefoxでも使っているクロスプラットフォームグラフィックライブラリCairoを使う手。AdobeのWebKit実装だと、Cairoを使っているので、それを持ってきてってのが手っ取り早いのだが、Adobe自体の実装ってどうなったんだっけ?

GDI+を利用

Windows的にいえば一番パフォーマンスが出そうなんだけど (DirectXのラッパーだし)、実装が面倒そう。そもそもGDI+のDeveloperの奴らイケてないし。

暇な間になんか考えてみよう。

QtでおなじみのTrolltechをNokiaが買収

Nokiaのプレスリリースが出ている。

Nokia to acquire Trolltech to accelerate software strategy
http://www.nokia.com/A4136001?newsid=1185531

KDEとかで使われているQtを開発している会社、TrolltechをNokiaが公開買い付けで買収するみたい。Qtというか、Embeded Qtがあるので、どこかの組み込み系の会社に買収されるだろうと思っていたけど、Nokiaってのがびっくり。今度はS60にQtを乗せてくるってこと?。この買収はおそらくS60 4th Editionくらいで成果がでてくるでしょう。2年から3年後くらい後になると思うけど。

2008-01-23

コンパクトなキーボード選び

自宅では初代Microsoft Natural Keyboard (英語配列) を使っていて、ストックとして、Microsoft Natural Keyboard Elite (英語配列のOEM版でかつUSB接続のみというレア仕様)と、IBM Space Saver Keyboard II (英語配列のPS/2版)を持っているのだけど、別のコンパクトキーボードを買ってみようとして、興味を引かれたものは2つ。

まずは、マウスではお世話になっているLogitechのdiNovo Edge。初代diNovoは微妙だったけど、無駄なテンキーがないとか、もうデザインイケすぎ。ただ値段が高すぎるのが難点。軽く調べていたところ、レビュー記事を発見。まぁまぁイケてそう。

薄さ11ミリ、頑丈で打ちやすい「diNovo Edge」
http://journal.mycom.co.jp/articles/2007/01/22/edge/

ガシガシ打つ時代は過ぎ去ったか──「diNovo Edge」に見る当世キーボード事情
http://plusd.itmedia.co.jp/pcuser/articles/0708/24/news033.html

“世界最先端を行くキーボード”ことdiNovo edgeを使ってみた
http://k-tai.impress.co.jp/cda/article/stapa/36013.html

次は、Apple Wireless Keyboard。Macの配列ということが欠点だけど、それよりもMacBook系そのままのキータッチというところがミソ。そこが微妙なポイントなんだけど、安ければMac買っちゃいそうだしなぁ。ちなみにレビュー記事はこちら。

軽・薄・短の無線キーボードに陶酔する――「Apple Wireless Keyboard」
http://plusd.itmedia.co.jp/pcuser/articles/0710/23/news009.html

さぁ、どうしようか。そういや、全部Bluetoothだね。

2008-01-22

Proxy Server for S60

作ろうと思っていたものが、ひとつリリースされた。ようはS60用のProxy Server。

YaPN - Yet another Proxy for Nokia

海外に行くときは、Nokia N80を使っているのだけど、これで日本でもNokiaを使う機会が増えるかも

2008-01-21

XPCOM

XPCOMを使って、外部アプリケーションからFirefox / Thunderbirdと連携するアプリを書こうと思ったんだけど、アドオンとして動かさないと制約ありすぎ、というか面倒すぎ。これはちょっと後でまとめて、どこかにポストしておこう。英語と日本語で。

Internet ExplorerにおけるMETAエレメント

非常にスペックだけを書いたコンテンツを発見したので呆れた。呆れてても意味ないので、ちょっと覚えている範囲で書いてみる。

HTML - meta タグの仕様詳細まとめ
http://www.drk7.jp/MT/archives/001311.html

まずInternet Explorerだと、こんな動作ははっきり言ってしない。それを理解するためにはInternet Explorerの動作原理をまず知る必要がある(TechEdかなんかでたぶんマーケの人が説明してたけど)。

METAエレメントというのは、W3Cのスペック上は、HTTPヘッダの代わりになるようなことは書いてあるが、Internet Explorerの場合はそんなことはない。というのも、HTTPヘッダのハンドリングというのはWININET.DLLと呼ばれるモジュールがすべてハンドルする。しかもこのモジュールは、HTMLを解析することはしない。そのため、METAで何を書こうがWININET.DLLが知る由もないわけだ。

ただ、といってもヒストリカルなこともあるので、METAエレメントを利用しても全く無意味 ということではない。というのも、Trident(MSHTML.DLL)がHTMLを解析する際に、よく使われるようなもの、たとえば、Pragma: no-cacheのようなよく使われる一部のものだけは、Tridentで上書きするので、機能するようになっている。もちろん、Visual Styleを無効にするとかは、Tridentの機能でやってるわけだけど。

サーバーサイドの人たちは、スペック至上主義的な考えでプログラミングをするみたいだけど、実際のクライアントの実装がどうなっているのかにも興味を持ってほしいと思うね

参考

How to prevent caching in Internet Explorer
http://support.microsoft.com/?id=234067

2008-01-14

WebKitをWindowsから使う

I posted English content in http://wontfix-en.blogspot.com/2008/01/since-i-research-webkit-i-try-writing.html.

ちょっと、WebKitについて調べてみたので、ついでにWebKitの使い方を調べてみた。

WebKitはCOMのインターフェイスを持っているので、COM経由でロードして使う。ここらはInternet Explorerとかと一緒。

初期化

IWebViewをCoCreateInstance()で取得後、親のウィンドウハンドルを登録して、initWithFrame()を呼べば、WebKitのウィンドウが作成される。

IWebView *pWebView;
HRESULT hr;

hr = ::CoCreateInstance(CLSID_WebView,
                        0,
                        CLSCTX_ALL,
                        IID_IWebView,
                        (void**)&pWebView);
if(hr != S_OK)
    goto error;

hr = pWebView->setHostWindow((OLE_HANDLE) hWnd);
if(hr != S_OK)
    goto error;

::GetClientRect(hWnd,&clientRect);
hr = pWebView->initWithFrame(clientRect, NULL, NULL);
if(hr != S_OK)
    goto error;

URLのロード

Mac OS Xでの使い方のいろんなWebページを見たところ、takeStringURLFromを使えばいいという記述がほとんど。なのでそのまま使ってみたところ、E_NOTIMPLを返すようになっているようだ。

Windows上のWebKitの場合でURLを開く場合は、IWebURLRequestを持ってきて、IWebFrame::loadRequest()経由で開く。すでにHTMLを持っている場合は、そのまま渡すことも可能。

HRESULT hr;
BSTR str;
IWebFrame* pWebFrame;
IWebURLRequest * pWebURLRequest;
IWebView* pWebView;

hr = ::CoCreateInstance(CLSID_WebURLRequest,
                        0,
                        CLSCTX_ALL,
                        IID_IWebURLRequest,
                        (void**)&pWebURLRequest);
if(hr != S_OK)
    goto error;

str = ::SysAllocString(L"http://www.apple.com/");
hr = pWebURLRequest->initWithURL(str,
                                 WebURLRequestUseProtocolCachePolicy,
                                 60);
if(hr != S_OK)
    goto error;

hr = pWebView->mainFrame(&pWebFrame);
if(hr != S_OK)
    goto error;

hr = pWebFrame->loadRequest(pWebURLRequest);
if(hr != S_OK)
    goto error;

pWebURLRequest->Release();
pWebFrame->Release();

WebKit for Windows Mobile

WebKitのWindows Mobile版があるのかどうかを探してみたところ、Wake3という会社がすでにポートしているみたいだ。ただ、コードを公開していないようで、このWebKitのポートとかで食ってこうって考えているような会社?なのかな?

WebKit自体は詳しくないけど、たぶん、CoreFusion.DLLとかもポートしないといけないかもしれないから、それだったら妥当かな。ただ、S60の実装もあるし、別の誰かが作って公開しそうな気がしないでもない

2008-01-12

X02HT用の2ちゃんねるブラウザ

MobaMona-0.1.CABをおいておいた。CABファイルをスマートフォンにコピーして、エクスプローラで実行すればインストールできる。

要望等があれば makoto.2000 at gmail.com へよろしく

Microsoft製作のジョークビデオ

エンガジェットから。

http://japanese.engadget.com/2008/01/10/gates-last-days-video/

Microsoftって会社はくだらないビデオ作るのが好きだよね。個人的には、スティーブ・バルマーのWindows 1.0のCMをぱくった、ブライアン・バレンタイン(元MicrosoftのWindows部門のVice President、今はAmazon)のWindows XPのビデオが好きだな。

ちなみにWindows 1.0のCMってのはこれなんだけどね。

2chブラウザ MobaMona (仮)

大体できてきた。.NET Compact Framework自体はじめて使うのだけど、結構制約(ほしい機能がすくなくて)が多くて萎えまくり。WndProcはoverrideメソッドで必要だと思う、正直。

Windows Mobile StandardのUI Designに反するかもしれないけど、Rich Edit系のコントロールがないと、普通の開発者は困ると思う。デコレーション付きの編集用コントロール書くの面倒だし。あと、ConnectionMgr用のクラスとかも普通必要だと思う。

あと、びっくりしたのはドロップダウン形式のリストボックスって、Windows Mobile Standardにないの?。板のスレッド一覧を作る際に、使おうと思ったら、なくてショックだった。これは必要でしょ?

複数のフォームを使っているとZオーダーがぐちゃぐちゃになったり、IMEを使っているときもなぜかZオーダーが狂って、今表示していたフォームじゃない、別のフォームが表示されたりと、変な動作もあるけど、一通り、読み込み、書き込み、基本的なブックマーク機能の実装を完了した。ZオーダーがおかしくなるというIssue自体はWindows 2000とかXPでもたびたびあるIssueだったのだけど、Windows CEでも同じようなパターンなのね。

なお、スクリーンショット自体は、KTCaptを使って撮ったのだけど、SDカードに最初インストールしたところ、オプションを選択できなくて(スタートメニュー内のショートカットが壊れてて)、ちょっと時間がかかった。とりあえず、本体メモリにインストールすることにしたけど。

2008-01-10

Backキーのハンドルの仕方

Windows Mobile 6 Standardでアプリケーション開発をやり始めたんだけど、Backキーのハンドルがどうしてもできない。

しょうがないので、GoogleとかLive Searchで検索してみたところ、以下のドキュメントを発見

How to: Override the Smartphone Back Key

ふむふむ、Keys.EscapeとかKeys.Backをハンドルすればいいのか、、、と試しにやってみるが、上手くいかない。これって.NET Compact Framework 3.5じゃないと動かないの?ということで、いろいろ調べると、以下のところに落ち着いた

Capture Back Key - MSDN Forum

Mauricio,

This is a bug in CF. Setting the form's KeyPreview property to true should allow you to handle the Back key in the form's KeyPress event handler. However, I've discovered that the KeyPress event is only fired if the focused control is a container control (form, tab page, panel, etc.).

I'm investigating a couple of possible workarounds. I'll let you know if I find one.

Dan

ようはC#だとやり方がないということ。じゃ、ウィンドウプロシージャをのっとればいいじゃんと思ったが、.NET Compact Frameworkだと、ウィンドウプロシージャはFormクラスのメンバになってないそうだ。

やりたくはなかったが、サブクラス化して、ウィンドウメッセージを監視するしかないので、試してみたところ、以下のような感じでやれば、Backキーを監視、無効にすることは可能みたい。ホントはSHCMBM_OVERRIDEKEYを使うのがいい方法かと思うけど。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowProc
{
    public partial class Form1 : Form
    {
        #region P/Invoke
        public const int GWL_WNDPROC = -4;
        public const uint WM_HOTKEY = 0x0312;

        [DllImport("coredll.dll")]
        public extern static IntPtr SetWindowLong(IntPtr hwnd,
                                                  int nIndex,
                                                  IntPtr dwNewLong);

        [DllImport("coredll.dll")]
        public extern static int CallWindowProc(IntPtr lpPrevWndFunc,
                                                IntPtr hwnd,
                                                uint msg,
                                                uint wParam,
                                                int lParam);

        [DllImport("coredll.dll")]
        public extern static int PostMessage(IntPtr hwnd,
                                             uint msg,
                                             uint wParam,
                                             uint lParam);
        #endregion

        public delegate int WndProcDelegate(IntPtr hwnd, uint msg, uint wParam, int lParam);

        IntPtr mOldWndProc;
        WndProcDelegate mProc;

        public Form1()
        {
            InitializeComponent();

            mProc = new WndProcDelegate(WndProc);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetHook();
        }

        private void SetHook()
        {
            IntPtr hwnd = this.Handle;
            if (hwnd == IntPtr.Zero)
            {
                throw new InvalidOperationException("hWnd is null");
            }

            mOldWndProc = SetWindowLong(hwnd,
                                        GWL_WNDPROC,
                                        Marshal.GetFunctionPointerForDelegate(mProc));
        }

        // Restores the original window procedure for the control.
        private void Unhook()
        {
            IntPtr hwnd = this.Handle;
            if (hwnd == IntPtr.Zero)
            {
                throw new InvalidOperationException("hWnd is null");
            }

            SetWindowLong(hwnd, GWL_WNDPROC, mOldWndProc);
        }

        protected virtual int WndProc(IntPtr hwnd, uint msg, uint wParam, int lParam)
        {
            if (msg == WM_HOTKEY && (lParam & 0xffff0000) == 0x1b0000)
            {
                if ((lParam & 0x1000) == 0)
                {
                    //
                    // This is key down message of [Back] key
                    //
                }
                return 1;
            }

            return CallWindowProc(mOldWndProc, hwnd, msg, wParam, lParam);
        }
    }
}

2008-01-09

Mcirosoft Virtual PC 2007日本語版

ちょっと試してみようと思って (Windows MobileのEmulatorでも使うドライバもアップデートされるだろうし) 入れていたんだけど、ノートPC上で使うこともないのでアンインストールすることにした。VMWareのライセンスも持っているし。

で、使っているのがWindows Vista x64なので、当然x64版の日本語版をインストールしていたのだけど、面白いことを発見。

 C:\Windows\System32\ドライバ のディレクトリ

2008/01/04  21:11    <DIR>          .
2008/01/04  21:11    <DIR>          ..
2007/02/18  00:22           296,816 VMM.sys
               1 個のファイル             296,816 バイト
               2 個のディレクトリ  26,437,722,112 バイトの空き領域

VMM.SYSというのは、カーネルモードで動くVirtual PCの仮想部分のエンジンなんだけど、インストール先がOver Localizationですか。さすがインド人仕事

2008-01-07

2chのサーバーって

Content-Encoding: gzipじゃないときは、Content-Lengthが返ってくるんだけど、gzipなときは、Content-Lengthは返ってこないんだ。初めて知った。

今作ろうと思っているもののTODOリスト

今無職クンなので、久しぶりにコードを書き始めている。とりあえず、今作ろうと思っているもの

2chブラウザ for X02HT

たぶん一週間くらいでかけると思う。面倒なので.NET Compact Framework 2.0で書く予定。証明書どうしよう。買うと$350くらいだったはずだし、Symbian Signedとかみたく商用じゃなければ格安に証明書発行させてもらえないかな、Microsoftさん。

Proxy Server for X02HT

ZeroProxyでも改造して作る。SN番号送信できるProxyサーバーがあれば便利かと思ってるので。

NSIS (Nullsoft Scriptable Install System) for Win64

簡単にポートはできないんだよね、これ。というのも、スクリプトの機能で直接Win32 APIを呼ぶことができるんだけど、その部分全部アセンブラ。x64のアセンブラ書くのは、NSS (Network Security Services)の以来かな?。NSSのx64コードはSunの人に渡しちゃったし。あと、ビルドシステムも直さないといけない。

Thunderbird IFilter

Google Summer Codeに選ばれていたけど、どうなったんだろ。ところで、Google Summer Codeで選ばれたもので、最後までちゃんとやってたのって、どのくらいの比率なんでしょう。

Xvid for Win64

アセンブラ依存の部分をx64で動くコードにする

今のところはそんな感じかな

いまさらながら GZipStream を実装してみる

Windows Mobile用の.NET Compact Framework 2.0だと、GZipStreamがないので、gzipなデータを展開するのが面倒。zlibce.dllを使うとかいろいろあるのだけど、Windows Mobile 6.0 Standard (X02HT)だと標準でzlib.dllを持っているので、それを直接dllimportすることにした。ただ単に、Content-Encoding: gzipをハンドルしたいだけなんで。

実装する前に、誰かが実装しているかどうかを調べてみたところ、Google Data APIs.NET libraryにあるのを発見。そのまま、持ってきてテストしてみたところ、二つの問題が。。。

  • finallyで常にクラッシュする。GCHandle使っているからだろ。
  • ヘッダをスキップしていないので、GZPI Streamの解析で常にStreamErrorになる

ということで、そこらを直してみたところ、上手く動いた。

ま、.NET Compact Framework 3.5だと、GZipStreamは実装されているので、こんな苦労はいらないけど。