2008年9月24日水曜日

Evernoteを使わないと人生損する

このブログ記事をはてなブックマークに追加

Evernoteを使っていないと人生を損していると思う。もちろん独断と偏見だけど。それにしても、もっと早くからこのようなサービスがあることを知っていればなぁ、と思ってしまう。それほどまでに個人的には画期的なアプリケーションであり、サービスであったのだ。

少し前にあるウェブサイトでEvernoteのことを知り、すぐにインストールした。しかし、イマイチその便利さが分からずしばらく放置していた。まず、どのように使えばいいか分からない。画像やPDFファイルなどを貼り付けることができるノートのようなものと云うことは分かったのだが、どこが便利なのか。普通にノートを取れば済む事ではないかと思ってしまったのだ。

それで、Evernoteはしばらく使っていなかった。ところで、自分は仕事用のノートを持っており、ミーティングやセミナー、仕事の進捗、ちょっとしたメモをこれに書いていた。ある日、以前行った仕事の手順を知るためにそのノートを見返してみたのだが、すぐに該当する箇所を見つけることができなかった。この時間の浪費はひどく損だ。特に仕事関係のメモは高い頻度で見返すことが多く、仕事の効率にも響く。そこで、Evernoteを思い出した。Evernoteならタグでグループ分けもでき、ソートや検索もお手の物だ。これは使わない手はないと、ここで初めて気が付いた。

それからしばらく使ってみたのだが、これがとても良い。まず、入力したメモやデータがオンラインストレージと同期されるので、どのPCからも同じノートを読むことができる。もちろん、オンラインでデータを扱うことに対しセキュリティが気になるようならローカルデータとして扱うこともできる。この場合、入力したPCでしか閲覧できないが。

また、普段PCを使って仕事しているので、仕事の進捗など一々ノートを取り出して開いてペンで書き込むという行為はそれだけで効率が落ちるのだ。EvernoteであればPCから離れることもない。さらに、仕事のデータ、例えば数値計算のグラフなどを画像のまま貼り付けることができるのも凄く便利だ。

自分は仕事柄、論文を読むことが多く、ほとんどの場合PDFで保存されているのだが、その管理が今までは非常に大変であった。ファイル名やフォルダでの分類に気を使って管理していたのだが、これだと手間が掛かり、ファイル数が多いとあまり機能しなくなる。EvernoteだとPDFファイルをドラッグ&ドロップするだけだし、読んだ内容をちょこっとメモするだけで情報の価値も格段に上がる。検索も一発だ。今までの苦労が嘘のようである。

ノートブックは目的別に複数作成できるので、仕事用のノート、個人用備忘録のノート、それにこのブログ記事用のノートも作った。ブログで書きたいことを思いついたとき、タイトルもしくは短い要旨だけをノートに書いておく。そして、後で時間ができたときにちゃんと書き直してブログにアップするわけだ。もちろん、メモだけ取ってやっぱり書かない記事もあるが、メモをしてからしばらく時間を置くことで本当に書きたい記事かどうかを見極めることもでき一石二鳥だ。

これで自分がEvernoteを使わないと損すると思う理由を理解してもらえただろうか。とりあえず簡単な使い方を知りたいのなら、シゴトハッカーズ:Evernoteの基本的な使い方【チュートリアル編】あたりが参考になる。因みに対応機種にはWindows, Mac, iPhone, Windows Mobileがあり、ソフトウェア自体は無料だ。さらにブラウザ上からも操作することができる。ただし、使うには無料のアカウント登録をする必要がある。オンラインストレージは月に40MBまでは無料であり、有料のプレミアム会員になると月に500MBまで使える。プレミアム会員の料金は月5ドルもしくは年45ドルのどちらかを選ぶことができる。

続きを読む...

2008年9月19日金曜日

UMPC購入で最終的に選んだのはWILLCOM D4

このブログ記事をはてなブックマークに追加

しばらく前からUMPC(Ultra Moblie PC)に興味を持っていたのだが、いろいろと調べた上で最終的に購入したのはWILLCOM D4だった。今のところ、かなり満足している。

購入動機

現在、仕事では多数のUnix系マシンとWindows XPを搭載したメインノートPC、自宅では多目的用途のWindows XP搭載のメインデスクトップPC、Windows Vista搭載のTV録画用途キューブPCを使っている。メインノートPCはちょっと古いがLet's Note CF-W4を使っており、毎日、職場・自宅間を持ち歩いている。重量は約1.2kgである。

で、通勤時に1.2kgを持ち歩くのが重く感じられてきたのでサブノートが欲しくなったのだ。そこで、メインノートPCの代わりになる性能を持ち、コンパクトで軽いサブノートを物色してみた。

選定

まずここで大事なのは、重量、大きさ、性能だ。特に持ち歩きを楽にしたいので重量が最も優先される項目である。次に性能だろう。普段メインノートPCで行っていることは一通りこなしたい。大きさについては軽ければ軽いほど小さくなると思ったのでそれほど気にしなかった。もちろん、価格については安いほど良い。

そこで、最近出ているUMPCを一通り調べてみた。いわゆるネットブック(Netbook)と呼ばれる低価格なノートPCでは重さに問題がある。大体1kgほどあるのだ。現在使用しているLet's Noteが1.2kgであることを考えると、1kg前後ではあまり重量としてのメリットがない。それならば、0.9kgのLet's Note Rシリーズのほうが(価格以外は)良いだろう。今回は重量を大幅に減らして運搬を楽にすることが目的の一つとなっているので、現在の半分ほどの重さにはしたい。そこで、1.2kgの半分で600g程度を目安とした。これを踏まえてUMPCを調べてみるとWILLCOM D4とLOOX U/B50しか残っていないことが分かった。と云うわけでこの二つの中から選ぶことにした。

WILLCOM D4とLOOX U/B50ではそれほど性能に差はないようだが、若干LOOX U/B50のほうが良さそう。しかし、D4であればPHS通信が最初から使えるのでどこでも簡単にネットに繋ぐことができる。また、価格のほうでもD4のほうが安い。特にW-VALUE割引により実質価格が6万円以下になる。また、購入の指針には入れなかったが見た目は個人的にはD4のほうが良い。この点は性能には影響しないが個人的な満足感には影響する。

というわけで最終的に選んだのはWILLCOM D4だった。因みにこの時点で実際に実機には触れている。やはり実機に触れることは大事だと思う。

WILLCOM D4の評判

しかし、実際に使った人でないとスペック以外の目に見えない部分については分からない。そこでネット上でWILLCOM D4の評判を調べてみた。かなり気に入っている人もいる一方、購入して最悪だったという人もいる。まず、欠点として挙げられているのが、無線LANの感度の悪さだ。すぐ近くに無線ポートがあっても途中ぶちぶち切れるのだとか。ほかに、電池の持ちが悪い、Windows XPではなくVistaである、筐体のSHARPのロゴを押すだけでスリープが復帰してしまう、全般的に不安定、などなど。いろいろ挙がっている。

このように欠点もかなりあるようだが、結局、この軽さには何物にも代えがたく、WILLCOM D4の購入に踏み切ることにした。

WILLCOM D4を使用した感想

この小ささで普通のPCと同じことができることは驚きである。Windows Vistaが動いているので当たり前なのだが、それでも普通にメールやウェブはもちろんのこと、PythonやVisual C++までも使えるのは嬉しい。VPN ClientでIPSecを通して職場のネットワークを使えるのも便利だ。

また、懸念していた無線LANの感度の悪さはほとんど感じなかった。確かにアンテナは3-4本だったりするが、職場、自宅、実家などで試したところ一度も通信が途切れなかった。メインノートPCのLet's Noteのほうがよっぽど感度が悪い(これは多分自分がはずれを引いたからだと思うが、有線LANもあるし修理に出すほど困っているわけではないのでそのまま使っている)。

電池の持ちはそれほど長いわけではないが、Ver. Lを購入したので大容量バッテリーが付いてきたし、不自由はしてない。公称では4.5時間とあるが実質3.5時間ぐらいか。SHARPのロゴを押すことでスリープ復帰とのことだが、基本的に持ち運び時はキーロックをするので勝手に起動することはない。ただし、不安定さは若干あるかもしれない。一度、シャットダウン時にブルースクリーンになったことがある。ただ、頻繁にあるわけではないのでそれほど問題視はしていない。

上記のように、使用した感想は概ね満足できるものだった。

より使いやすく

始めからWindows Vistaに入っているアプリケーションだけでは仕事としても趣味としても使えないので、いくつかの設定とアプリケーションをインストールすることにした。

まず、ディスク容量だが、40GBのHDDを備えていて、10GBほどはリカバリ領域に使われており、残りの30GBのうち10GBはシステムで使っている。実質ユーザが使える領域は20GB弱ほどだ。そこで、外部記憶装置としてmicroSDHC 8GB(Class 6)をつけることにした。ダウンロードしたファイルや仕事用の一時ファイルはすべてここに置く。microSDはClass 4以上は対応していないとのことだったが、転送速度が上がらないだけで実際は使えるようだ。次に、ネットワークの設定だ。無線LANは最初切れているのでFn+Capsで使えるようにする。当初、これに気が付かないで少し戸惑った。あとはプリンタ設定だが、自宅のローカルプリンタ、職場のネットワークプリンタどちらも問題なしだった。

次いで、アプリケーションのインストールを行った。インストールしたソフトウェアは以下の通りだ。

Microsoft Office
Officeの付いていないVer. Lだったので。デスクトップPC用にOfficeを購入していたのでそれをインストールした。因みに一つのOfficeアプリケーションをメインのPCとサブのノートPCにインストールすることはライセンス上で認められている行為だ。

Kasparsky
これは以前購入した3ユーザライセンスのものが余っていたので。

Visual C++
やっぱりC++で遊びたい。

xyzzy
普段はWZ EDITORをEmacsキーバインドで利用しているが、Emacsならxyzzyでもいいかと思って。因みに自宅のビデオ録画用PCでも利用している。

ActivePython
Pythonは基本。最近は何をやるにしてもPythonだ。

IPython
Pythonとセットで。コマンドラインでちょっとした操作をしたいときに便利。電卓にもなるし。

FileVisor6
ファイル操作・管理ユーティリティ。ファイルエクスプローラを便利にしたもの。シェアウェアだがもうこれがないとWindowsが使えない体になってしまっている。普段はFileVisor5を利用しているが、VistaだということでFileVisor6を購入した。

Cisco VPN Client
職場のネットワークに繋げるため。因みにワンタイムパスワードを使っている。

PuTTY
ターミナル。これがないと仕事ができない。

Google Chrome
IEのモッサリ加減にはうんざりなので。Google Chromeはやはり速い。D4になかなか合うと思う。

Evernote
メモ帳兼スクラップブック。備忘録や研究ノートとして使っている。超便利。使い始めて日は浅いのだが、既にこれがないと生活できない体に…。

PowerShell
コマンドプロンプトはへこすぎるし、Windowsでいろいろやりたいなら必須かと。

Adobe Acrobat Reader
最初から入っているバージョン8をアンインストールして、バージョン9を入れた。

Adobe Flash
ウェブ使うならこれも必須。

Mozilla Thunderbird
いつもお世話になっているメールソフト。

デ辞蔵
アカデミックパックを購入したので無料で付いてきた。リーダース英和+プラスなどが入っており便利だが、起動が重いかなぁ。

OfficeとVisual C++が結構容量を食っているが、それでも残り容量は10GB以上ある。スペック的に動作はそこそこといったところだが、どこにでも持ち運べ一通りの作業ができるというのが素晴らしい。因みに、メインのノートPCは普段は職場に置いておき、必要ならリモートデスクトップを利用することにした。持ち運びの荷物が軽くなり大変満足できる結果となった。

最後に

軽いWILLCOM D4は持ち運びをメインとしたサブノートとして秀逸。外ではPHSで通信、自宅や職場では無線LAN。メインPCで行うような仕事をD4で行うことができるが、基本性能やディスプレイ表示能力、ユーザーインターフェイスからすると効率が落ちるかも。適材適所で。

続きを読む...

2008年9月16日火曜日

Googleデスクトップガジェットを5分で作る

このブログ記事をはてなブックマークに追加

Googleデスクトップガジェット(Google Desktop Gadgets)を作るのは簡単だ。ここではHello, world!と表示させ、表示された文字をクリックするとJavaScriptによりダイアログが出てくるガジェットを作成する。さらに、国際化を施して、英語環境では"Hello, world!"、日本語環境では「こんにちは、世界!」と表示させることにする。

これで、ガジェットの作成、JavaScriptの記述、国際化、それぞれの基本を押さえることができる。またこれはJavaScriptを使ったミニアプリケーションでもあり、JavaScript学習者にとっては手軽に扱えるアプリケーション作成ツールにもなるだろう。

まずは準備

当たり前のことだが、最初にGoogleデスクトップをインストールしておく。

次に、GoogleデスクトップガジェットSDKをダウンロードし、適当なディレクトリに展開する。以前は日本語版があったようだが、現在は英語版しかないようだ。しかし使い方が簡単なので、それでもまったく問題ない。

早速、ガジェットを作ってみる

展開したディレクトリの api/tools/designer_en.exe を実行し、Google Desktop Gadget Designerを起動する。メニューの File から New Gadget... を選択する。

プロジェクト名として適当な名前をつける(ここでは HelloWorld とした)。

プロジェクトを作るとテンプレートとして四角い領域が表示されるので、Gadget Designerの"Label"アイコンを選択し、その領域の中央をクリックしラベルを付ける。付けたラベルをクリックすると右上のペインにラベルのプロパティが表示されるので、プロパティ内のinnerNameの値を &HELLO_WORLD; とする。

左のビューペインでen/フォルダを開くとstrings.xmlが表示されるので、それをダブルクリックする。そうするとstrings.xmlの中身が表示されるので、<strings></strings>内の適当な場所に、

<HELLO_WORLD>Hello, world!</HELLO_WORLD>

と書き込む。

先ほど作成したラベル(&HELLO_WORLD;と表示されているはず)をダブルクリックするとmain.jsにlabel1_onClick()という関数が作成されるので、その中に

view.alert(HELLO_WORLD);

と書き込む。これによりラベルをクリックすると"Hello, world!"というダイアログが表示されるようになる。

メニューの Gadget にある Build Package でHelloWorld.ggが作成できる。これをダブルクリックすればGoogleデスクトップにガジェットが追加される。ガジェット内のHello, world!をクリックするとダイアログが出る。

日本語で表示する

今回作ったガジェットはすべて英語だった。英語圏のユーザはこれでいいが、日本だったら日本語で表示させたい。Googleデスクトップガジェットでは国際化するのは簡単だ。

まず、api/tools/NewProject/jaフォルダを、先ほど作成したガジェットのフォルダにコピーする。そうしたら en/strings.xml を編集したのと同じように ja/strings.xml を開いて、

<HELLO_WORLD>こんにちは、世界!</HELLO_WORLD>

と書き込む。

あとは、Build Packageでggファイルを再作成するだけである。日本語環境であれば、"Hello, world!"の代わりに「こんにちは、世界!」と表示される。更に詳細を知りたかったり、ガジェットを作りこみたい場合は、 Googleデスクトップ サイドバーガジェット入門を参照のこと。また、api/samples/gadgets以下のサンプルプログラムもガジェットを作成する上で非常に役に立つだろう。

今回のチュートリアルは、LivelyのオブジェクトがGoogleデスクトップガジェットSDKで作られているとのことで、使い方をざっと調べたついでに作ってみた。因みにLivelyでガジェットを作成するための許可をもらうにはLively gadget developer requestで登録すればいいらしい。

続きを読む...

2008年9月14日日曜日

PS3:「アンチャーテッド エル・ドラドの秘宝」でプラチナトロフィー

このブログ記事をはてなブックマークに追加

PS3のアンチャーテッド エル・ドラドの秘宝がトロフィーに対応したとのことで、早速やり直してみた。自分の場合、一度クリアしたゲームはほとんどの場合、二度目のプレイはしない。そして、最初からやり直しとなるとげんなりしてしまう。しかし、このアンチャーテッドは違った。再度のプレイだというのにまったくダレもせずに、面白くてのめりこんでしまう。まるで映画の中を駆け回っている気分にさせる。プレイすればするほど上手に立ち回れるようになるのが実感できる。また、キャラクターの日本語吹き替えが特に秀逸でこれを聞くだけでもプレイする価値はある。

と云うわけで、少しも飽きず、退屈もせずにプラチナトロフィーまで取ってしまった。トロフィーを知らない人のために補足しておくが、トロフィーはゲームのやり込みに対する勲章のようなもので、達成項目の難易度に従って、ブロンズ、シルバー、ゴールド、そしてプラチナが与えられる。アンチャーテッドの場合、36個のブロンズ、8個のシルバー、3個のゴールド、そしてそれらすべてのトロフィーを集めて初めて1個のプラチナがもらえるのである。言うなればプラチナトロフィーとはアンチャーテッドを骨までしゃぶりつくしたという証拠でもある。

アンチャーテッドはアクションアドベンチャーなので自分のように暇があまり取れない人にも向いている。今回のプラチナトロフィーもちまちまとプレイしながら約2週間で取得できた。大作RPGとかだとこうは行かないだろう。アンチャーテッドは続編がリリースされることも決まっており、今から本当に楽しみだ。

続きを読む...

2008年9月6日土曜日

Google Chromeの起動オプション一覧

このブログ記事をはてなブックマークに追加

Google Chromeの起動オプション(コマンドラインオプション)の一覧。ソースコードのbase/base_switches.cc, chrome/common/chrome_switches.ccから。すべてを確認したわけではないので使用は自己責任で。

例えば、ユーザデータファイルを保存するディレクトリを"C:\users\chrome"にしてJavaScriptをオフにする場合は、Google Chromeのショートカットのリンク先を以下のようにして起動する。

"C:\Documents and Settings\ユーザ名\Local Settings\Application Data\Google\Chrome\Application\chrome.exe" --user-data-dir=C:\users\chrome --disable-javascript

--debug-on-start If the program includes chrome/common/debug_on_start.h, the process will start the JIT system-registered debugger on itself and will wait for 60 seconds for the debugger to attach to itself. Then a break point will be hit.
--wait-for-debugger Will wait for 60 seconds for a debugger to come to attach to the process.
--noerrdialogs Suppresses all error dialogs when present.
--disable-breakpad Disables the crash reporting.
--full-memory-crash-report Generates full memory crash dump.
--type The value of this switch determines whether the process is started as a renderer or plugin host. If it's empty, it's the browser.
--enable-dcheck Enable DCHECKs in release mode.
--disable-hang-monitor Suppresses hang monitor dialogs in renderer processes.
--disable-metrics Completely disables UMA metrics system.
--disable-metrics-reporting Disables only the sending of metrics reports. In contrast to kDisableMetrics, this executes all the code that a normal client would use for reporting, except the report is dropped rather than sent to the server.
This is useful for finding issues in the metrics code during UI and performance tests.
--assert-test Causes the browser process to throw an assertion on startup.
--renderer-assert-test Causes the renderer process to throw an assertion on launch.
--crash-test Causes the browser process to crash on startup.
--renderer-crash-test Causes the renderer process to crash on launch.
--renderer-startup-dialog Causes the renderer process to display a dialog on launch.
--plugin-startup-dialog Causes the plugin process to display a dialog on launch.
--testshell-startup-dialog Causes the test shell process to display a dialog on launch.
--plugin-launcher Specifies a command that should be used to launch the plugin process. Useful for running the plugin process through purify or quantify.
Ex: --plugin-launcher="path\to\purify /Run=yes"
--channel The value of this switch tells the child process which IPC channel the browser expects to use to communicate with it.
--testing-channel The value of this switch tells the app to listen for and broadcast testing-related messages on IPC channel with the given ID.
--homepage The value of this switch specifies which page will be displayed in newly-opened tabs. We need this for testing purposes so that the UI tests don't depend on what comes up for http://google.com.
--start-renderers-manually When this switch is present, the browser will throw up a dialog box asking the user to start a renderer process independently rather than launching the renderer itself. (This is useful for debugging.)
--renderer Causes the process to run as renderer instead of as browser.
--renderer-path Path to the exe to run for the renderer subprocess
--plugin Causes the process to run as plugin host
--single-process Runs the renderer and plugins in the same process as the browser
--process-per-tab Runs each set of script-connected tabs (i.e., a BrowsingInstance) in its own renderer process. We default to using a renderer process for each site instance (i.e., group of pages from the same registered domain with script connections to each other).
--process-per-site Runs a single process for each site (i.e., group of pages from the same registered domain) the user visits. We default to using a renderer process for each site instance (i.e., group of pages from the same registered domain with script connections to each other).
--in-process-plugins Runs plugins inside the renderer process
--no-sandbox Runs the renderer outside the sandbox.
--safe-plugins Runs the plugin processes inside the sandbox.
--trusted-plugins Excludes these plugins from the plugin sandbox.
This is a comma separated list of plugin dlls name and activex clsid.
--test-sandbox Runs the security test for the sandbox.
--user-data-dir Specifies the user data directory, which is where the browser will look for all of its state.
--app Specifies that the associated value should be launched in "application" mode.
--upload-file Specifies the file that should be uploaded to the provided application. This switch is expected to be used with --app option.
--dom-automation Specifies if the dom_automation_controller_ needs to be bound in the renderer. This binding happens on per-frame basis and hence can potentially be a performance bottleneck. One should only enable it when automating dom based tests.
--plugin-path Tells the plugin process the path of the plugin to load
--js-flags Specifies the flags passed to JS engine
--geoid The GeoID we should use. This is normally obtained from the operating system during first run and cached in the preferences afterwards. This is a numeric value; see http://msdn.microsoft.com/en-us/library/ms776390.aspx .
--lang The language file that we want to try to open. Of the form language[-country] where language is the 2 letter code from ISO-639.
--debug-children Will add kDebugOnStart to every child processes. If a value is passed, it will be used as a filter to determine if the child process should have the kDebugOnStart flag passed on or not.
--wait-for-debugger-children Will add kWaitForDebugger to every child processes. If a value is passed, it will be used as a filter to determine if the child process should have the kWaitForDebugger flag passed on or not.
--log-filter-prefix Will filter log messages to show only the messages that are prefixed with the specified value
--enable-logging Force logging to be enabled. Logging is disabled by default in release builds.
--disable-logging Force logging to be disabled. Logging is enabled by default in debug builds.
--log-level Sets the minimum log level. Valid values are from 0 to 3: INFO = 0, WARNING = 1, LOG_ERROR = 2, LOG_FATAL = 3.
--dump-histograms-on-exit Dump any accumualted histograms to the log when browser terminates (requires logging to be enabled to really do anything). Used by developers and test scripts.
--remote-shell-port enable remote debug / automation shell on the specified port
--uninstall Runs un-installation steps that were done by chrome first-run.
--omnibox-popup-count Number of entries to show in the omnibox popup.
--automation-channel The value of this switch tells the app to listen for and broadcast automation-related messages on IPC channel with the given ID.
--restore-last-session Indicates the last session should be restored on startup. This overrides the preferences value and is primarily intended for testing.
--record-mode
--playback-mode
Chrome supports a playback and record mode. Record mode saves *everything* to the cache. Playback mode reads data exclusively from the cache. This allows us to record a session into the cache and then replay it at will.
--no-events Don't record/playback events when using record & playback.
--hide-icons
--show-icons
Make Windows happy by allowing it to show "Enable access to this program" checkbox in Add/Remove Programs->Set Program Access and Defaults. This only shows an error box because the only way to hide Chrome is by uninstalling it.
--make-default-browser Make Chrome default browser
--proxy-server Use a specified proxy server, overrides system settings. This switch only affects HTTP and HTTPS requests.
--dns-log-details
--dns-prefetch-disable
Chrome will support prefetching of DNS information. Until this becomes the default, we'll provide a command line switch.
--debug-print Enables support to debug printing subsystem.
--allow-all-activex Allow initialization of all activex controls. This is only to help website developers test their controls to see if they are compatible in Chrome.
Note there's a duplicate value in activex_shared.cc (to avoid dependency on chrome module). Please change both locations at the same time.
--disable-dev-tools Browser flag to disable the web inspector for all renderers. const wchar_t kAlwaysEnableDevTools[]
--always-enable-dev-tools Enable web inspector for all windows, even if they're part of the browser. Allows us to use our dev tools to debug browser windows itself.
--tab-count-to-load-on-session-restore Used to set the value of SessionRestore::num_tabs_to_load_. See session_restore.h for details.
--memory-profile Enable dynamic loading of the Memory Profiler DLL, which will trace all memory allocations during the run.
--memory-model Configure Chrome's memory model.
Does chrome really need multiple memory models? No. But we get a lot of concerns from individuals about how the changes work on *their* system, and we need to be able to experiment with a few choices.
--enable-file-cookies By default, cookies are not allowed on file://. They are needed in for testing, for example page cycler and layout tests. See bug 1157243.
--start-maximized Start the browser maximized, regardless of any previous settings.
TODO(pjohnson): Remove this once bug 1137420 is fixed. We are using this as a workaround for not being able to use moveTo and resizeTo on a top-level window.
--enable-watchdog Spawn threads to watch for excessive delays in specified message loops. User should set breakpoints on Alarm() to examine problematic thread.
Usage: -enable-watchdog=[ui][io]
Order of the listed sub-arguments does not matter.
--first-run Display the First Run experience when the browser is started, regardless of whether or not it's actually the first run.
--message-loop-histogrammer Enable histograming of tasks served by MessageLoop. See about:histograms/Loop for results, which show frequency of messages on each thread, including APC count, object signalling count, etc.
--import Perform importing from another browser. The value associated with this setting encodes the target browser and what items to import.
--silent-dump-on-dcheck Change the DCHECKS to dump memory and continue instead of crashing. This is valid only in Release mode when --enable-dcheck is specified.
--disable-prompt-on-repost Normally when the user attempts to navigate to a page that was the result of a post we prompt to make sure they want to. This switch may be used to disable that check. This switch is used during automated testing.
--disable-popup-blocking Disable pop-up blocking.
--disable-javascript Don't execute JavaScript (browser JS like the new tab page still runs).
--disable-java Prevent Java from running.
--disable-plugins Prevent plugins from running.
--disable-images Prevent images from loading.
--use-lf-heap Use the low fragmentation heap for the CRT.
--gears-in-renderer Switch to load Gears in the renderer process.
--new-http Enable new HTTP stack.
--javascript-debugger-path
--enable-p13n
Allow loading of the javascript debugger UI from the filesystem.
--gears-plugin-path Debug only switch to specify which gears plugin dll to load.

続きを読む...

2008年9月4日木曜日

JavaScriptとウェブブラウザ、そしてGoogle Chrome

このブログ記事をはてなブックマークに追加

Googleからウェブブラウザ「Google Chrome」がリリースされた。まだベータ版だが、高速な起動は特筆に値する。作業効率を著しく下げる起動の遅いPC、OS、アプリケーションには個人的に我慢がならないので、それだけでGoogle Chromeを採用する価値がある。しかしながら、このブラウザの本質は独自開発の高速なJavaScriptエンジン"V8"にある。

しばらく前からIE7の動作の遅さや不安定さが目立つようになってきており、そろそろ他のもっと軽快なブラウザに乗り換えようかと考えていた。動作の遅さの原因ははっきりしている。JavaScriptを多用しているページをタブで複数開いているからである。一昔前、GoogleによりAjaxが世間に知られるようになる以前のこと、JavaScriptはオフにしておくべき項目のトップであった。しかし、Ajaxに代表されるJavaScriptを使ったページの便利さが知られることで、JavaScriptの使用は必須になってしまった。今更、GoogleリーダーやGoogleマップを使うなといわれても困るのだ。

しかし、JavaScriptの有用性が知られれば知られるほど、JavaScriptを多用したページは増え、よりリッチになって行き、ついにはウェブブラウザの許容範囲を超えてしまう。ここ最近では、明らかにJavaScriptの要求に付いていってないのが分かるようになっていた。

このまま行けば、ブラウザ環境はいずれ破綻する、しないとしてもユーザビリティの著しく劣った環境になると思っていた。必要とされているのは、JavaScriptが軽快に動作するシンプルで高速なウェブブラウザなのだ。

そんな中、タイミングよくGoogle Chromeが出てきた。個人的にはあまりGoogleばかりに依存したくはないのだが、自分の琴線に触れるようなサービスが出てくるので仕方がない。まだリリースされたばかりのベータ版で機能不足や不安定さが残っているが、素質は十分だ。

Google Chromeを使うにあたってのメモ:

Google Chromeの固定幅フォントのサイズ(13pt)が何故かプロポーショナルフォントのサイズ(16pt)よりも小さく設定されている。そのためサイトによっては固定幅フォントが他のブラウザに比べて小さくなり見にくくなることがある(ここのブログのソースコードのように)。これについてはすべて同じサイズに変更した。また、ダウンロード先のフォルダを変更し、パスワードは保存しないようにした。

続きを読む...

2008年9月1日月曜日

Python: RPyで階層的クラスタリング

このブログ記事をはてなブックマークに追加

Python+RPy+SciPyで階層的クラスタリングを行う。下記のtest.dat(30個の5次元データ)に対して閾値0.5として計算する。

clustering.py test.dat 0.5

標準出力:

Data file: test.dat Element file: element.out Output file: data.out Cluster file: cluster.out EPS file: cluster.eps Threshold: 0.500000 (distance) 30 x 30 = 900 Cluster 1 : 5 Cluster 2 : 8 Cluster 3 : 1 Cluster 4 : 1 Cluster 5 : 12 Cluster 6 : 2 Cluster 7 : 1 Total : 30 Number of clusters: 7

test.dat: 30個の5次元データ。

-2.39257 0.39147 0.21229 -0.84501 -0.02255 -2.13082 0.44121 0.12561 -0.91345 -0.12832 -2.23498 0.26590 -0.35356 -0.03484 -0.17437 -2.27747 0.29900 -0.05188 -0.63788 -0.13000 -2.11555 0.39492 0.11465 -0.86242 -0.34207 -2.31947 0.26036 0.47846 -0.71782 0.07270 -2.32941 0.38637 0.44304 -0.75346 -0.04302 -2.30690 0.59296 0.22947 -0.82801 -0.09882 -2.29088 0.53157 0.03204 -0.75087 -0.05802 -2.36682 0.34835 0.23964 -0.72942 -0.09720 -2.11368 0.52013 0.27528 -0.81122 -0.20050 -2.27156 0.21167 0.57165 -0.66193 -0.03302 -2.15076 0.42352 0.39504 -0.76157 -0.12652 -2.21785 0.36763 0.32698 -0.77082 -0.14381 -2.27547 0.37300 0.27672 -0.84605 -0.11913 -2.21365 0.37827 0.12720 -0.72738 -0.16452 -2.22145 0.53808 0.36045 -0.75871 -0.13850 -2.12462 0.43006 0.16845 -0.87023 -0.09789 -2.20644 0.53991 0.19739 -0.82177 -0.29343 -2.10046 0.77307 0.21435 -0.86245 -0.15118 -2.37488 0.50979 0.17556 -0.78224 -0.14136 -2.31240 0.48578 0.20484 -0.85149 -0.12238 -2.19001 0.33037 0.09407 -0.91014 -0.09473 -2.31135 0.29111 0.38171 -0.73491 -0.03447 -2.23133 0.35395 0.29436 -0.48961 -0.06276 -2.19413 0.36376 0.21777 -0.18686 -0.20020 -2.06165 0.38107 0.43080 -0.76940 -0.38291 -2.34113 0.44097 0.42368 -0.73850 0.02570 -2.41489 0.40263 0.32783 -0.80521 0.03404 -2.34918 0.48361 0.16130 -0.87229 -0.09810

cluster.eps: image file



element.out: height and merge data

0.0653862929061 [-22 -30] 0.0692241388534 [ -2 -18] 0.0918671214309 [ -7 -28] 0.107376254824 [-21 1] 0.110198113414 [-14 -15] 0.136962358698 [ -1 -29] 0.139532210618 [-13 -17] 0.142665365804 [-8 4] 0.146113402192 [-23 2] 0.148827203159 [ -6 -24] 0.154304262741 [-11 -19] 0.184603648393 [-10 5] 0.196790849635 [ 3 10] 0.205812622791 [-16 12] 0.224987104075 [-9 8] 0.253271677848 [-5 11] 0.285769571333 [ 7 14] 0.297698839601 [-12 13] 0.319598069143 [ 9 16] 0.34335611295 [-25 -26] 0.356127683001 [ 6 17] 0.386487913265 [15 19] 0.466665096402 [-4 22] 0.500220834332 [18 21] 0.514176928693 [-20 -27] 0.614681702347 [23 25] 0.710561224034 [20 24] 0.796960005207 [26 27] 1.13283489335 [-3 28]

data.out: averages and member of groups

-2.314584 0.318096 0.459708 -0.721324 -0.002422 12 7 28 6 24 -2.281683 0.402869 0.283269 -0.780521 -0.097274 1 29 13 17 16 10 14 15 -2.100460 0.773070 0.214350 -0.862450 -0.151180 20 -2.061650 0.381070 0.430800 -0.769400 -0.382910 27 -2.232736 0.463276 0.143898 -0.826001 -0.150468 4 9 8 21 22 30 23 2 18 5 11 19 -2.212730 0.358855 0.256065 -0.338235 -0.131480 25 26 -2.234980 0.265900 -0.353560 -0.034840 -0.174370 3

cluster.out: order and member of groups

001: 12 7 28 6 24 002: 1 29 13 17 16 10 14 15 003: 20 004: 27 005: 4 9 8 21 22 30 23 2 18 5 11 19 006: 25 26 007: 3

clustering.py

#!/usr/bin/env python import sys, os from rpy import * from scipy import * def create_data(data, is_square_root=False): """Create distance data. Arguments: data: position data is_square_root: whether to apply square root or not Return values: in_data: distance data ndim: number of dimensions """ in_data = [] num = len(data) ndim = len(data[0]) for i in range(num): for j in range(num): if i < j: dist = 0.0 for k in range(ndim): dist += (data[i][k] - data[j][k])**2 if is_square_root: dist = sqrt(dist) in_data.append(dist) elif i > j: in_data.append(in_data[j*num+i]) elif i == j: in_data.append(0.0) return in_data, ndim def clustering(in_data, data, ele_file, cluster_method="complete", eps_file=None): """Clustering. Arguments: in_data: distance data data: position data ele_file: element filename (height/merge data) cluster_method: clustering method [complete] eps_file: EPS filename [None] """ efile = file(ele_file, "w") if len(in_data) == 2: efile.write("%5.3f [-1 -2]\n" % in_data[1]) efile.close() return mat = in_data[:] print "%d x %d = %d" % (len(data), len(data), len(mat)) mat = with_mode(NO_CONVERSION, r.matrix)(mat, nrow=len(data)) d = with_mode(NO_CONVERSION, r.as_dist)(mat) hc = r.hclust(d, method=cluster_method) for h, m in zip(r["$"](hc, "height"), r["$"](hc, "merge")): efile.write("%s %s\n" % (h, m)) efile.close() if eps_file: r.postscript(eps_file, title=eps_file) r.plclust(hc, hang=-0.1, ann=r.FALSE) r.dev_off() def expand_group(m, n): """Expand group list.""" group = [] for x in m[n-1]: if x < 0: group.append(-x) else: group.extend(expand_group(m, x)) return group def arrange_cluster(ele_file, data, ndim, threshold, out_file): """Arrange clustering data. Arguments: ele_file: element filename (height/merge data) data: position data ndim: number of dimensions threshold: threshold of clustering out_file: output data filename Return value: groups: pair list of hierarchical clustering """ if len(data) == 2: print "Cluster 1 : 1" print "Total : 1" return [] elif len(data) < 2: print "No cluster" print "Total : 0" return [] efile = file(ele_file) ofile = file(out_file, "w") h = [] m = [] for l in efile: e = l.replace("[", "").replace("]", "").replace(",", " ").strip().rstrip("\n").split() h.append(float(e[0])) m.append([int(e[1]), int(e[2])]) tt = [[i, x] for i, (x, d) in enumerate(zip(m, h)) if d > threshold] t = [] for d in tt: for x in d[1]: if x < tt[0][0]+1: t.append(x) groups = [] all = [] for x in t: g = [] if x < 0: g = [-x] else: g = expand_group(m, x) groups.append(g) if not groups: groups = [range(1, len(h) + 2)] for i, g in enumerate(groups): print "Cluster %-3d: %d" % (i+1, len(g)) g_data = [data[j-1] for j in g] for d in range(ndim): ofile.write("%f " % average(mat(g_data).T[d])) for j in g: ofile.write("%d " % j) ofile.write("\n") efile.close() ofile.close() s = 0 for x in groups: s += len(x) print "Total : %d" % s return groups def write_cluster(groups, cluster_out): """Write clustering result.""" clust_file = file(cluster_out, "w") print "Number of clusters: %d" % len(groups) count = 1 for c in groups: clust_file.write("%03d:" % count) for d in c: clust_file.write(" %d" % d) clust_file.write("\n") count += 1 clust_file.close() def main(args): if len(args) < 2: print >>sys.stderr, "Usage: %s data_file [threshold=5.0]>" % os.path.basename(args[0]) sys.exit(1) elif len(args) == 2: th = 5.0 elif len(args) > 2: th = float(args[2]) DATA_FILE = args[1] ELEMENT_FILE = "element.out" OUT_FILE = "data.out" CLUSTER_FILE = "cluster.out" EPS_FILE = "cluster.eps" IS_SQUARE_ROOT = True print "Data file: %s" % DATA_FILE print "Element file: %s" % ELEMENT_FILE print "Output file: %s" % OUT_FILE print "Cluster file: %s" % CLUSTER_FILE print "EPS file: %s" % EPS_FILE if IS_SQUARE_ROOT: print "Threshold: %f (distance)" % th else: th = th**2 print "Threshold: %f (distance**2)" % th # position data data = [[float(d) for d in l.split()] for l in file(DATA_FILE)] if len(data) > 1: # distance data in_data, ndim = create_data(data, is_square_root=IS_SQUARE_ROOT) # clustering by position and distance data and output element file clustering(in_data, data, ELEMENT_FILE, eps_file=EPS_FILE) else: print >>sys.stderr, "Error: no data." sys.exit(1) # arrange clustering data by element file and threshold, and output group data groups = arrange_cluster(ELEMENT_FILE, data, ndim, th, OUT_FILE) # output ordered clustering data by using group data write_cluster(groups, CLUSTER_FILE) if __name__ == "__main__": main(sys.argv)

仕事で使おうと思って一応書いたけど、コード量が多くてなんだかスッキリしないなぁ。Linuxでは問題なかったけど、WindowsではEPSファイルでエラーが出るし。使用環境、RとRPyの相性の問題もあるようだ。Rは2.1.1、RPyは0.4.3でちょっと古いかもしれない。最近はrpy2が出ているようだけどどうなんだろう? 使ってみるかな。

続きを読む...