スキップしてメイン コンテンツに移動

投稿

2008の投稿を表示しています

OpenGL: Visual C++ 2008 Express EditionでGLUTを使う

WindowsにVisual C++ 2008 Express Editionをダウンロード・インストールする。このバージョンではPlatform SDKは同梱されている。

GLUT for Win32からglut-3.7.6-bin.zipをダウンロードする。ファイルを展開し以下に示すフォルダにコピーする。

glut.h → C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl glut32.lib → C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib glut32.dll → C:\WINDOWS\System

これで準備完了。因みにglaux.libは存在せず、リンクする必要はなくなっている。

使用例

C++: OpenGLで正十二面体を回転させるで示したソースを dodecahedron.cpp として保存し、以下のコマンドをコマンドプロンプト上で実行する。Visual Studio 2008へのパス(C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools)は通しておくこと。

vsvars32 cl dodecahedron.cpp /O2 /FIwindows.h dodecahedron

これで回転している正十二面体が表示されるはずだ。

ActionScript 3.0のコードをコンパイルしてそのまま公開できてしまうwonderfl

ウェブ上でActionScript 3.0のコードを書いてサーバ上でコンパイルでき、しかもそれをそのままFlashとして公開できてしまうというサイト、wonderflが面白い。早速、適当な短いコードをコンパイル・公開してみた。簡単だ。

鏡文字 MirrorImagedText - wonderfl build flash online
文字を打ち込むと鏡文字になるFlash。最初にクリックしないとアクティブにならないかも。

ところでGoogle Chromeだと正常にコンパイルができなかったな。仕方がないのでFirefoxを使った。うーむ。

PS3: WipEout HDの楽しみ方

最近、WipEout HDの圧倒的なスピードと映像に酔い痴れている。画像はレースの一シーン。この映像が1080p/60fpsで目にも留まらぬ速さで動きまくる。とりあえず数日プレイしてすべてのレースキャンペーンで1位(イージーが多いけど)を取れたのでWipEoutを楽しむ方法について書いてみる。

自分はPSのワイプアウトXLからのファン(Wiperと呼ばれる)なのだけど、ワイプアウトは本当に楽しいと思う。自分の操るクラフト(自分の運転するマシンのこと。空中に浮いているのでクルマとは言わない)が最速クラスで綺麗に走れたときには脳汁が出っ放しになる。だが何故か日本ではあまり流行らない。一部の熱狂的なファンはいるのだが一般受けしないようだ。前作のWipEout Pulse(PSP)は日本語化さえされない始末。欧州ではキラーソフトの一つにも数えられているのになぁ。自分が考えるに流行らない理由はきっとワイプアウトの楽しみ方を知らない人が多いからではないだろうか。そこで自分なりのワイプアウトの楽しみ方を述べることにする。

ワイプアウトは最初から最速で走ることはできない。これはいきなり最速クラスでレースをしても速過ぎてとてもじゃないがゲームにならないからだ。遅いクラスで慣らしていって最後に最速クラスでレースを行うようになっている。ただし、Zoneモードは別だ。これはだんだんとスピードが速くなるモードで壊れるまで走ることができる。ただし、いきなりZoneをプレイしても最速になるまでに壊れてしまうだろう。

で、初めてワイプアウトをプレイすると、最初のところで挫折してしまう人が多いようなのだ。クラフトを思うように操作できない人もいれば、思ったよりも速くないし爽快感がないと感じる人もいるようだ。

操作が難しいという人は、慣れるまでしばらくプレイして欲しい。慣れてくると低速クラスなら苦もなく操れるようになると思う。ワンポイントアドバイスとしては、カーブは外側から内側に入るようにして、気持ち早めに曲がったほうがいいかもしれない。それとエアブレーキを利用すること。あとは曲がりすぎないことかな。人によっては後方視点よりコックピット視点にした方が操りやすいかもしれない。自分はコックピット視点の方が操りやすかった。

思ったよりも速くないと感じた人は、序盤はどれも遅いクラスなのでしばらく我慢…

Fortranコンパイラの速度比較

10年以上も前の話だけど、Fortran90はFORTRAN77に比べて遅くてダメダメ、GNU Fortranは遅くてダメダメって云われていた。今でもFortranを使っている身としてはちょっと気になったので簡単なベンチマークテストを実施。Xeon 3.2GHz/メモリ2GB の環境で、姫野ベンチ(サイズS)を使って測定した。因みにコンパイラのオプションはGNUコンパイラが -O3 、Intelコンパイラが -O3 -tpp7 -xW -Vaxlib とした。

以下、測定結果。

Fortran90 - ifort 9.0
MFLOPS: 1190.497 time(s): 59.9921000000000 Score based on Pentium III 600MHz : 14.37104

FORTRAN77 - ifort 9.0
MFLOPS: 1539.517 time(s): 64.18000 Score based on Pentium III 600MHz : 18.58422

Fortran90 - gfortran 4.0.2
MFLOPS: 603.2382 time(s): 60.6580000000000 Score based on Pentium III 600MHz : 7.281968

FORTRAN77 - g77 3.4.5
MFLOPS: 1426.6582 time(s): 57.7142258 Score based on Pentium III 600MHz : 17.2218533



コンパイラのバージョンがちょっと古いけど、やっぱりFortran90に比べFORTRAN77の方が速いな。GNUコンパイラについてはg77が思ったよりも悪くない。確かバージョン3で大幅に性能が改善されたんだっけな。うろ覚えだけど。

インデントの大切さ

大学の実習で学生にプログラミングを教えているのだが、C言語などでプログラムを書かせるとほとんどの人がインデント(字下げ)をでたらめに入れる。これは何故だろう。

教えている学生は2年生なのだが、1年生で既に講義で習っているはずなのに。自分ならインデントを揃えないと読みづらくてやっていられなくなるが、インデントをでたらめに書く人はそれを苦労とは思わないのだろうか。インデントの意味を教えてもキツネにつままれたような顔して、それが重要であると考えてくれないようなのだ。それならばと放っておくと括弧が足りなくてコンパイルエラー、条件文のスコープが分からなくなって四苦八苦、関数を終わらせずに次の関数を書き始める等々、奇妙奇天烈なコードを書いてくれる。で、最後には分からなくなったので教えて欲しいと言ってきて、インデントがでたらめなコードを自分が読む羽目になるのだ。

プログラムを書くなら、文法などよりもまずインデントの重要性を知る必要があると思う。…と考えるとやっぱりPythonはプログラミングを習い始めるのに良い言語のように思うなぁ。

Python: NumPyで相関係数を求める

覚書。numpy.corrcoefを使う。

from numpy import corrcoef print corrcoef([1, 2, 3, 4, 5], [1, 2, 2, 5, 5])

出力結果:

[[ 1. 0.92966968] [ 0.92966968 1. ]]

入力データのそれぞれの組み合わせに対する相関係数が行列として出力される。2データの相関係数は右上か左下の値となる。

Goolge Livelyの終焉

少し前のニュースだけどGoogleのLivelyが12月いっぱいで終了するそうだ。少しばかりオブジェクトのプログラミングでもしようかと思ったが、結局は手を付けず仕舞いだった。

まずは、3Dオブジェクトを作ろうとした場合、Mayaなどの本格的な3Dモデリングソフトが必要なことがネックとなっていた。SketchUpあたりで作れたのなら良かったのだけど。その辺のことは疎いので、それだと技術的な問題があったのかもしれないが。簡単なガジェットならばGoogleデスクトップガジェットで作成できるようだったが、これもまったく宣伝していなかったので知っていた人もほとんどいないのではないだろうか。

また、発表後にほとんどソフトウェアなどのアップデートはなかった。大体Google Chromeで使えない時点で問題外である。せめて定期的にオブジェクトを追加するなりしていればまだ良かったのだが。オブジェクトすら増えないとなれば最初に部屋を作った以降はなにもすることはなくなってしまう。

多くの人はこれを以って仮想空間はまったく流行らないと考えるかもしれない。しかし、どんなサービスにでも云える事だが、定期的に利用者の期待するサービスを提供しなければダメなのだ。逆に言えば、良いサービスを継続して出していればもう少し流行っただろうと思う。

11月を振り返って

11月はほとんどブログを更新しなかったな。11月最後のリトルビッグプラネットの記事も以前に書いていたものをアップロードしていなかっただけだし。一番の原因は風邪で体調を崩したことかなぁ。この時期はいつも体調が悪い気がする。仕事の掛け持ちやらで疲れているところに、周りに風邪引きが増えてそれを貰ってしまうという悪循環。一度体調を崩すと気力が削られて様々な「やる気」が萎えてしまうのだ。

体調が悪かったり、仕事がちょっと忙しかったのもあるけど、ブログの更新が滞った別の理由としては面白いゲームが出ていたってのもあるな。ブログ更新の優先度はそれほど高くない、というか一番低い位置にあるので他にやることができてしまうととたんに更新が滞ってしまう。プログラミング関連だと趣味や仕事とも共有できて、ブログネタにもなるんだけど、ゲームだとねぇ。まあ需要があればプレイ日記を書いてもいいのだけど。個人的には他の人のゲームプレイ日記を読むのは好きだし。

因みに11月中に、PS3ではリトルビッグプラネットとWipEout HD、PSPではパタポン2と勇者のくせになまいきだor2をプレイした。この四つのうち主にプレイしたのはリトルビッグプラネットとパタポン2で、どっちもかなり面白いよ。残りの二つも面白いのだけどプレイする時間がなかっただけ。PlayStation Homeの大規模βテストにも当選したけど時間がなくて一回起動しただけだな。

12月は時間と体調の管理に気をつけたい。

PS3: リトルビッグプラネットをパーフェクトクリア

しばらく前にリトルビッグプラネットのすべてのステージをノーミス(ライフパーフェクト)でクリアした(ゴールドトロフィー「プレイ」取得)。後半のステージが結構大変だったな。最難関といわれているスノーランドのファクトリーは確かに難しかったけど、慣れたら思ったより苦労はしなかった。それよりも何故かダンシングパレスのほうが苦労した。眠かったせいもあるかもしれないけど普段しないようなミス連発。あそこのステージは乗り物系のからくりが多くて突っ走ってクリアができない(つまり時間がかかる)のもきつかった原因。でもそのステージの内容自体は好きだけど。

ライフパーフェクトに比べて全アイテム集め(シルバートロフィー「アイテムフリーク」取得)は楽だったかな。オンラインでみんなとワイワイやっていれば集まるってのも楽だった理由。フレンドと2人でやっているときにフローズンツンドラのx4(4人プレイ専用)をやったのだけど、こちらが一人でコントローラ3個使ってクリアした。手が攣りそうだったよ…。

アイテムもすべて集めたので最近はクリエイトに手を出してみたのだが、これも楽しいな。慣れるまで大変だけど自分で仕掛けを考えて作るってのは予想以上に面白い。現在の作品が完成したら公開してみよう。なんだかステージの構想を練ったり、実際にパーツを組み立てて作成する感じが、プログラミングを彷彿とさせるな。

とにかくリトルビッグプラネットは楽しい。横スクロールのアクションゲームにリアルな物理演算と画像処理、作成ツール、オンラインプレイ等々、既存のパーツの寄せ集めでできているのだけど、プレイする感覚はこれまでにない新しいものだった。こんな素晴らしいゲームが出てくるのを見ると、まだまだテレビゲームも捨てたものじゃないなと思う。

ActionScript 3.0でハロウィン

お菓子をくれなきゃ、いたずらするぞ! Trick or Treat!

ということで、ハロウィン。ActionScript 3.0を使って10分ほどで作成。カボチャをクリックすると色が変わる。

以下に、ソースコードを示す。

Halloween.as

// Halloween.as // by nox, 2008.10.31 package { import flash.display.*; import flash.text.*; import flash.events.*; import flash.utils.Timer; public class Halloween extends Sprite { // dafont.com http://www.dafont.com/ [Embed(systemFont="Halloween Borders", fontName="HalloweenFont", mimeType="application/x-font" )] private static const HalloweenFont:Class; private var txtHalloween:TextField = new TextField(); private var HalloweenStageWidth:int, HalloweenStageHeight:int; private var timer:Timer; private function ClickHandler(event:Event):void { var format:TextFormat = txtHalloween.getTextFormat(); format.color = Math.random() * 0xFFFFFF; txtHalloween.setTextFormat(format); …

ActionScript 3.0で少し早いクリスマス気分を味わう

クリスマスあたりを目処に簡単なゲームをActionScript 3.0で作ろうかと思って、その雛型を作ってみた。雛型なんでホントに形だけだけど。それでも赤と緑の色合いとクリスマスソングで気分だけはクリスマスっぽくなるなぁ。それにしても未だにActionScript 3.0の使い方がこんなんで良いのか疑問に思う。なんだか無駄の多いコードのような気がする。

以下のFlashコンテンツをマウスクリックなどでアクティブにして適当なキーを押すと始まる。MP3だけで2.5MBあるので少し重いかも。尚、音が鳴るので注意すること。因みに飛んでいる天使をクリックすると…。


BGMにtaitai studioフリーMp3素材集からHappy Christmas Partyを利用させてもらった。また、効果音は効果音gから。フォントについてはdafont.comからクリスマス関連のフォントを使用した。

以下、ソースコード。

ActionXmas.as

// ActionXmas.as // by nox, 2008.10.29 package { import flash.display.*; import flash.text.*; import flash.events.*; import flash.media.Sound; import flash.media.SoundChannel; import flash.utils.Timer; public class ActionXmas extends Sprite { // taitai studio http://www.taitaistudio.com/ // taitai studio フリーMp3素材集 http://www.taitaistudio.com/mp3/ [Embed(source="xmas.mp3")] private static const SoundXmas:Class; // 効果音g http://sfxg.bufsiz.jp/index.html [Embed(source="slap01.mp3")]…

Processingで分子動力学計算

Processing面白いなぁ。以前はhttp://proce55ing.orgが公式サイトだったことから、Proce55ingとしても知られている。Java仕様のビジュアルデザイン用プログラミング言語なのだが、とても簡単に扱うことができる。プログラミングでアートする感じ。

そこで今回はなんちゃって分子動力学計算プログラムを作ってみた。もちろん原子をリアルタイムに計算しながら表示させている。ただし、コードを短くするために分子ではなく疑似原子単体同士の相互作用にしている。そのため計算している相互作用はvdW力とクーロン力のみだ。また特に工夫をしているわけでもなく全原子同士のすべての相互作用をそのまま計算している。分子動力学計算の詳細についてはPEACHによる生体分子の分子動力学シミュレーション(1)原理と方法あたりを参考にすると良いと思う。

実際のプログラムを以下に示す。num_atomsで原子数を指定しており、初期配置を比較的密集させてその状態で力を計算させている。また、左上にエネルギーを表示している。初期の高エネルギー状態から低エネルギー状態に安定化するのが見て取れる。その他の詳しいことは実際にソースコードを読めば分かると思う。短いしね。




以下、ソースコード。

simple_md.pde

/** * Simple molecular dynamics by nox, 2008.10.21. * * Perform molecular dynamics for pseudo-atoms without internal * interactions, such as bonds, angles, dihedrals. Only vdW and * Coulomb interactions. */ final int num_atoms = 20; Atom[] atoms = new Atom[num_atoms]; void setup() { size(360, 360, P3D); noStroke(); // initialize positions of atoms int cnt = 0; int num_side = ceil(pow(num_atoms, 1.0 / 3.0)); for (int…

2D物理演算ソフトウェアPhunを楽しむ

2D物理演算ソフトウェアのPhunは楽しい。Phunと云う名前自体が、Physics(物理)+Fun(楽しむ)の造語であり、名が体を見事に表している。

物理演算と聞くとなにやら難しそうだが、このPhunは少しも難しくない。もちろん壮大な設計図のもと、緻密で複雑な機械を作ろうとすれば大変だろうが、とりあえず四角や丸の置物、バネや水を出してみたりといったことはマウス操作でちょちょいのちょいだ。3歳の子供だってできるのだから誰にだってできるだろう。



まずはここに掲載されているPhunの動画を見て欲しい。ちょっとばかり楽しい気分になれる。因みに自分はリトルビッグプラネットのβテストが終わってしまったので、発売日までそれに代わる類似ソフトを探していたところPhunを知った。もしPhunを少しでも楽しめたのならリトルビッグプラネットに嵌ることは間違いないと思う。

ブルーレイディスクで録画データをバックアップ

自宅の居間に設置しているPCはほぼ録画専用になっていてHDD容量は500GBだ。しかし、この容量でも録画目的だと全然足りない。仕方がないので、MPEG-4に変換して保存したり、DVDにバックアップしてたりしたのだが、バックアップの手間が非常にかかるので、先日、ブルーレイディスク(BD)ドライブを購入した。

MPEG-4への変換は、Pythonスクリプトとmencoderを使って、タイトルから自動的にフォルダを割り振って変換するようにしてあるので、ある程度自動化できていたのだが、DVDへのバックアップについては、1枚4.8GBの容量では何度もドライブから出し入れしなくてはならず非常に厄介だった。BDだと一層で25GB、二層(DL)で50GBと、DVDに比べ容量が格段に大きいのでバックアップがとても楽になった。最近はBD-Rの値も下がり、一枚350円を切る値段になっていて、これなら許容できる。

と云うわけで、我が家では着々とBD化が進んでいる。そう言えば最近は市販のDVDはまったく購入しなくなってしまった。BDの画質を見た後だととてもDVDを購入する気にはなれないなぁ…。

C言語で複数のアルゴリズムを使って円周率を求める

以前、大学でプログラミング実習を教えたときの課題だった、複数のアルゴリズムで円周率を求めるプログラムが出てきたのでここに書いておく。実行時間も測定している。これはCで書いたけど、使用言語はFortranでも可だったはず。

出力結果:

Machin's formula: 3.14159265358979 Time: 0.437000s (1000000 times) Gauss-Legendre : 3.14159265358979 Time: 0.219000s (1000000 times) Count points : 3.14552000000000 Time: 0.265000s (10 times) Monte Carlo : 3.14394000000000 Time: 0.594000s (10 times) Circumference : 3.14159265358979 Time: 3.047000s (1000000 times) Integral : 3.14159265393433 Time: 0.375000s (10 times)

Machin's formula, Gauss-Legendre, Circumferenceは100万回計算、Count points, Monte Carlo, Integralは10回計算して時間を測定している。それにしても、算術幾何平均を使ったガウス-ルジャンドルのアルゴリズムは速いなぁ。

以下、ソースコード。

/*======================================================= ratio of the circumference of a circle to its diameter =======================================================*/ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> /*-----------…

PS3:「リトルビッグプラネット」信じられない面白さ

1年以上前に「LittleBigPlanet」というエントリを書いた。そしてとうとうリトルビッグプラネット日本語版が10月30日に発売する。それに先駆けて、βテスターの募集があったのだが、運よく日本地域枠の2万人に入ったようでβテストに参加することができた。因みに、米国、欧州でそれぞれ2万人の枠があり、全部で6万人のβテスターがいることになる。

早速、PSN経由で1GB弱のファイルをダウンロード、インストールし、プレイしてみたのだが、予想以上に楽しい。本当に楽しい。誰にでもすぐにできる簡単操作、自由にコーディネートできる愛くるしいリビッツ人形、世界中の人とのオンラインプレイ、想像力を刺激するステージのクリエイトなど。これほど予想を上回るできのソフトはアンチャーテッド以来かなぁ。アンチャーテッドとはジャンルがぜんぜん違うけど。

百聞は一見にしかずということで、まずはトレイラー動画を観ていただきたい。



どうですか? 面白そうですか? 実は自分はそれほど面白そうだと思わなかった。もし、この時点で凄く楽しそうと感じたなら、即、購入で間違いない。

動画ではそれほど面白そうだとは思わなかったけど、確かに実写のようなプレイ画面や驚くほどリアルな物理演算処理は凄いと思ったので、βテストに応募してプレイしてみたのだが、このとき初めて自分の考えが誤っている事に気が付いた。これはプレイしないとその凄さが分からない。百見は一プレイにしかず、である。正直、このゲームの楽しさ、面白さは文章では伝わらないと思うので、これ以上の説明はしない。しかし、週末のプレイを楽しみにしていたところ、子供たちに見つかって占領されてしまい、自分はあまりプレイできなかったことからも、その楽しさが伝わるはずだ。

やっとPS3の性能をちゃんと使った、次世代機らしい、素晴らしいゲームソフトが出てきた。老若男女を問わずに遊べるので是非多くの人にプレイして欲しい。

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

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

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

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

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

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

自分は仕事柄、論文を読むことが多く、ほとんどの場合PDFで保存されているのだが、その管理が今までは非常に大変であった。ファイル名やフォルダでの分類に気を使って管理していたのだが、これだと手間が掛かり、ファイル数が多いとあまり機能しなく…

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のほうが…

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&…

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

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

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

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

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-startIf 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-debuggerWill wait for 60 seconds for a debugger to come to attach to the process.--noerrdialogsSuppresses all error dialogs when present.--disable-breakpadDisables the crash reporting.--full-memory-crash-reportGenerates full memory crash dump.--typeThe value of this switch determines whether the process is started as a renderer or plugin…

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)よりも小さく設定されている。そのためサイトによっては固定幅フォントが他のブラウザに比べて小…

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.3…

Python: はてなブックマークのコメント一覧非表示機能について

はてなブックマークのコメント一覧を非表示にする機能が追加された。しかし、新着ブックマークからはコメントが読めてしまう。

例えば、はてなブックマークのコメント一覧非表示機能テストのページはコメントを非表示に設定しているが、その新着ブックマークのページを開くとコメントが表示されていることが分かる。さらに、下記のPythonスクリプトを

hatena_get_comments.py http://d.hatena.ne.jp/fk_2000/20080829/p1

のように実行させると、すべてのコメントとそのユーザ名を表示することができる。

これをGoogle App EngineでWebサービスとすることは簡単だろう。Webサービスの公開はモラルに欠けるようにも思うのでやめておくが、本当にコメントを読めなくするつもりなら今回の非表示機能は中途半端と云わざるを得ない。

因みに、個人的にはコメントを非表示にすることについては賛成とも反対とも考えておらず、あまり関心がない。しかし、はてなブックマークの存在意義にも関わってくるような機能についてはもう少し議論・熟考したほうが良いようにも思える。

hatena_get_comments.py

#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, os, urllib, urllib2, xmlrpclib from HTMLParser import HTMLParser class HatenaHTMLParser(HTMLParser): is_user = False is_comment = False comments = [] current_user = "" current_comment = [] def handle_starttag(self, tag, attrs): if tag == "dd" and ("class", "bookmarker") in attrs: self.is_user = True elif tag == "span&…

Python: はてなブックマークのAPIを使ってみた

最近、はてなブックマークを使い始めたこともあり、はてなブックマークのAPIについて調べてみた。ざっと確認をした後、Pythonではてなブックマーク件数取得APIはてなブックマークエントリー情報取得APIを使ってみた。

はてなブックマーク件数取得APIはブックマークされた件数とAmazonの商品がコレクションされた件数をXML-RPCで取得することができる。一方、ブックマークエントリー情報取得APIでは、はてなブックマークのエントリーの情報をJSON形式で取得することができる。サンプルコードを以下に示す。

#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib2 import xmlrpclib import simplejson url = "http://www.hatena.ne.jp/" asin = "4774124966" # はてなブックマークエントリー情報取得API. data = urllib2.urlopen("http://b.hatena.ne.jp/entry/json/%s" % url).read() info = simplejson.loads(data.strip("(").rstrip(")")) if info: title = info["title"] cnt = int(info["count"]) bookmarks = info["bookmarks"] cnt_user = len(bookmarks) cnt_comment = 0 for b in bookmarks: if b["comment"]: cnt_comment += 1 print b["comment"].strip() if cnt_comment > 0: print print u"タイトル: %s" % titl…

Google: 333333333333335-333333333333334=0?

巷ではGoogleで399999999999999-399999999999998を計算させると0を返すと話題になっているが、ちょうど333333333333335-333333333333334の計算から0を返すようだ。ちなみにこの倍となる数値で計算させると666666666666669-666666666666667=0のように差が2で0を返すようになる。たぶん近いうちに修正されるんじゃないかな。

Google App Engine: Gearsで位置情報を取得してストリートビューで表示させる

Gearsジオロケーション専用のAPI(Geolocation API)がリリースされたのでGoogle App Engineで実装してみた。まず、Geolocation APIで位置情報を取得し、Google MapsおよびGoogle Street Viewにより表示するWebアプリだ。因みに、アプリを実行させるには予めGearsをインストールしておく必要がある。

Geo View

コードは基本的にはStreet Strollを使っており、初期位置情報をGeolocation APIのgetCurrentPositionメソッドにより取得している。下記に示すコードが主な変更部分になる。

Gearsのコアであるgears_init.jsの読み込み。

<script type="text/javascript" src="http://code.google.com/apis/gears/gears_init.js"></script>

初期化関数initialize()の前にinitialize_geo()を噛ませ、変数lat, lngにそれぞれ緯度・経度が入るようにしている。

function updatePosition(position) { lat = position.latitude; lng = position.longitude; initialize(); } function initialize_geo() { if (window.google && google.gears) { var geo = google.gears.factory.create("beta.geolocation"); geo.getCurrentPosition(updatePosition, function(positionError) { alert(positionError.message); }); } else { if (confirm("位置情報を取得するためにはGearsが必要です。インストールしますか?")) { window.location = &qu…

Google App Engine: mixi OpenIDで認証する

mixiがOpenIDに対応したということで早速Google App Engineで実装してみた。以前のエントリで紹介したがGoogle App Engineのサンプル集OpenID ConsumerというWebアプリがあるので、そのソースコードを利用させてもらった。

しかし、実際に使ってみればわかるのだがこのコードにはいくつかのバグ(とGoogle App Engineの制限)があってちゃんと動かない。下記のリンク先は正常に動くように修正したものだ。

mixi OpenID テスト

以下にバグの箇所とその修正コードを示す。

consumer.py

344-345行目の以下のコードを

self.response.set_status(302) self.response.headers['Location'] = redirect_url

以下のように修正する。

self.response.out.write("<html><head><meta http-equiv=\"refresh\" content=\"0;url=%s\"></head><body></body></html>" % (redirect_url,))

これはGoogle App Engineの制限を回避するためで、一度HTMLを表示し同時にリダイレクトを行っている。

fetcher.py

以下の57行目からのコードで、青で示したコードの後ろにある赤で示したコードを青のコードの前に移動させる。

if body: method = urlfetch.POST if 'Content-Type' not in headers: headers['Content-Type'] = 'application/x-www-form-urlencoded' else: method = urlfetch.GET if not headers: headers = {}

また、外部モジュールのPython …

Googleの暗号化ツールKeyczarをPythonで使う

Keyczarから持ってきたKeyczar Python (0.5b)を適当なディレクトリに展開し、srcファイル内のkeyczarをPythonディレクトリのsite-packatesにコピーする。次に、PyCryptosimplejsonASN.1 tools for Python から必要なモジュールをダウンロードしインストールする。

KeyczarToolのPythonの実装として、keyczart.pyが提供されているのでこれを利用する。ただし、これにはバグがあり、そのままだとAddKeyを実行できない。詳細は以下に報告されている。

Issue 21: Incorrect AddKey() Call from keyczart.py main()

対処方法としては、svnで最新版を持ってくるか、以下のようにソースを修正する。

keyczart.pyの113行目の

def AddKey(loc, status, crypter=None, size=None):



def AddKey(loc, status, size=None, crypter=None):

に変更する。

実際に平文を暗号文にし、さらにそれを平文に戻してみる。その前に鍵を作る必要があるので、keyczart.pyで作成する。--locationには鍵を作成したいディレクトリを指定すること。

keyczart.py create --location=C:\users\keyczar\keyset --purpose=crypt
keyczart.py addkey --location=C:\users\keyczar\keyset --status=PRIMARY

ここで気を付けなくてはならないのは --status=PRIMARY で指定する文字を大文字にする必要があることだ。マニュアルやコマンドの使い方では小文字になっているが、小文字で指定すると鍵の情報が正しく書き込まれない。たぶんバグだろう。

で、ここまで準備ができれば後は以下のように使用できる。

#!/usr/bin/env python from keyczar import keyczar crypter = keyczar.Crypter.Read(r"C:\users\keyczar\keyset…