SimpleBoxes

コードを記述する時のインデント

私が個人的にスクリプトなど (Perl、JavaScript、HTML、CSS、C、C++、などなど) のコードを記述する際には、インデントとしてタブを利用します。

[画像]タブ幅には通常 2 を指定しています。

タブによるインデントは「百害あって一利なし」とおっしゃる人も見かけたことがありますし、Perl でスクリプトを組む人なら一度は目にしておいて損はない良書「Perl ベストプラクティス」でも、スペースによるインデントが推奨されています。

Perl ベストプラクティスでは、インデントにスペースを利用する理由として、

どのような表示環境でもインデントの一貫性を保つための、確実で、繰り返し可能で、移植が可能な方法

と挙げられています。

一方、タブによるインデントの最大のメリットは「ユーザーがインデント幅を調整できる」という点につきます。

実際、Perl ベストプラクティスではインデントの幅については「4 で妥協する」とあって、あくまでも妥協案でしかありません。

私は現在インデントの幅を 2 に指定していますが、将来それを 3 や 4 に変えるかもしれません。そうした場合にスペースによるインデントでは、幅の調整が面倒です。

ただし、闇雲に字下げ部分にタブを利用することはありません。インデントの一貫性を保つことが難しくなるからです。

例えば、以下のようなコードがあったとします。

	my $isLongName = ($lengthOfChar > 100)
	               ? 'yes'
	               : undef;

先頭の行のインデント数は 1 です。つまり、タブインデント幅を 8 にしている場合は、8 つ分のスペースが字下げされます。

二行目、三行目はいわゆる桁合わせです。コードを見やすさを保持するために、「?」「:」の位置を先頭行の「=」部分に合わせるようにしています。

上記の例では、私が普段記述するルールに則って記述しています。そのため、どのようなインデント幅でも、きちんと揃って見えるはずです。

言うまでもありませんが、等幅フォントを利用している場合です。

字下げにタブを闇雲に利用すると、例えば、以下のようになります。

	my $isLongName = ($lengthOfChar > 100)
				   ? 'yes'
				   : undef;

のようになります。これはタブ幅が 4 の時にのみ揃って見えるコードです。

この手のコードでは、特定のタブ幅であればきれいに表示されますが、タブ幅が変わると悲惨なぐらいガタガタになってしまう場合もあります。

そこで私はインデントに対して、以下のようにルールを決めています。

  • インデントにはタブを利用する
  • タブはインデントにのみ利用し、桁揃えの用途には、必ずスペースを利用する

このルールに従うと、どのような表示環境でもインデントの一貫性を保たれ、インデント幅はユーザーの好きな幅に指定できます。

ただし、このルールに従うと、上述の例のように、行の先頭にタブとスペースが混在する場合があります。

そのため、エディタによってインデントのタブと桁揃えのスペースの区別がつかない場合がある、という欠点があります。

ですから、私は入力されたタブコードを特殊な表示で明示してくれるエディタを利用しています。

スポンサーリンク

Safari で使える便利なプラグイン

最近 Safari をデフォルトブラウザとして利用するようにしています。

Safari で足りないと感じていた機能として

  • 終了時に開いていたタブを起動時の際に開く
  • キーワードを使ったショートカット
  • タブバーのダブルクリックで新規タブを追加する

が挙げられるのですが、SafariStand を始めとするプラグインで補えることが分かりました。

SIMBL のインストール

Safari (というか、Cocoa アプリケーション) の機能を拡張する手段としては、Input Manager という仕組みを利用するのが一般的です。

SIMBL も Input Manager のひとつなのですが、SIMBL 用プラグインを使って機能拡張できるのが特徴です。

SafariStand は SIMBL なしでも動作させることが出来ますが、SIMBL を利用する方が推奨されています

という訳で、まずは SIMBL をインストールします。

解凍したアーカイブの中にある「SIMBL.pkg」を開いてインストールします。

[画像] SIMBL パッケージインストーラを起動します。

SafariStand のインストール

SafariStand は Mac OS X 10.5 Leopard 用の SafariStand 3.0Lxxx と Mac OS X 10.4 Tiger 用の SafariStand 3.0Txxx があります。必要な方をダウンロードします。

毎日考ブログでも絶賛されている SafariStand には、色んな機能がありますが、個人的に便利だと感じているのは、以下の機能です。

ちなみに SafariStand は 2008.02 現在公開されている最新 WebKit を使ったバージョンでも動作します。

「リンクタグをコピー」はリンクを <a href="アドレス">文字列</a> という形でコピーしてくれる機能です。ページ上にあるリンクにあわせてコンテキストメニューを開くと利用できます。

[画像]「リンクタグをコピー」がコンテクストメニューで利用できるように。

Firefox だと MakeLink というアドオンで同じようなことが出来ます (MakeLink はさらに多機能です)。

タブの復元機能は SafariStand Setting の「General」に設定があります。「Restore Method at Launch」というやつです。

[画像]「Restore Method at Launch」は SafariStand Setting の General にあります。

「Automatically Reopen Last Session (Safari)」というタイプに設定しておくと、Firefox と同じような動作になります。

ただし、Firefox の復元とは若干動作が異なります。あくまでも終了時のアドレスにアクセスするというだけで、Firefox のようにセッションそのものを復元してくれる訳ではありません。また、異常終了した時に復元してくれるかどうかは分かりません。

Twicetab のインストール

Twicetab も SIMBL プラグインです。

追加する機能はとってもシンプルで、タブバーのダブルクリックで新規タブを追加できるようになります。

タブバーの空きスペースをダブルクリックすることでタブを追加するという動作は多くのタブアプリケーションで共通の動作になっていて、何気に利用しています。

私のよく利用するアプリケーションでは、FirefoxPath Finder秀丸などで、その操作が利用できます。おそらく Opera でも利用できるでしょう。

Twicetab はインストーラでインストールします。SIMBL がインストールされていなければ、SIMBL もインストールしてくれます。

インストールすると「Twicetab 環境設定」というメニューがアプリケーションメニューに追加されます。

[画像]「Twicetab 環境設定」メニューが追加されます。

GreaseKit のインストール

最後に GreaseKit もインストールしてみました。

GreaseKit は Firefox のアドオン Greasemonkey の Safari 対応版です。ユーザースタイルと同じように「ユーザースクリプト」を追加できるようになるというもので、機能拡張するための機能拡張と言っていいでしょう。

Greasemonkey / GreaseKit で利用できる代表的なユーザースクリプトのひとつに AutoPagerize があります。

Google の検索結果表示などのページでは、ページあたりに決まった件数の検索結果が表示され、他の検索結果を表示するためには、通常別のページに移動する必要があります。AutoPagerize を利用すると、ページ遷移を自動化してくれるようになります。

このスクリプトが便利だというのは、何となく聞いていて、友人からもオススメされました。「Safari でも AutoPagerize」を見て導入してみることに。

折角なので「WordPress サイトの AutoPagerize 対応」を参考にして、当ページも AutoPagerize に対応してみました。

Serene Bach もしくは sb での対応については、もしかしら後日触れるかもしれません。

スポンサーリンク

Firefox・Opera・Safari で「キーワード」を利用する

私が普段利用している Firefox では、ツールバーには、以下のものが登録されています。

[画像]Firefox のツールバー

  • 戻る
  • 進む
  • リロード
  • 停止
  • タブ追加
  • アドレスバー

Opera、Safari では、リロードボタンと停止ボタンがひとつにまとまっているので、代わりに「ホーム」ボタンを追加しています。

アドレスバーの表示領域をできるだけ大きく取っておきたいので、私にとって検索バーは非常に邪魔です。ですので、検索バーが取り除ける場合は取り除いてしまいます。

アドレスバーへフォーカスを移すキーボードショートカットは「command + L」あるいは「control + L」がほぼ標準になっています。一方、検索バーにフォーカスを移動するキーボードショートカットは標準的なものはないようです。それもアドレスバーしか利用しないひとつの理由です。

検索バーを利用しない代わりに、アドレスバーから利用できる「キーワード」機能を利用します。

「キーワード」機能は Firefox、Opera、Safari (Mac OS X 版) で利用可能です。他にも利用できるブラウザはあると思いますが、未確認です。

キーワードの使い方は非常に簡単。アドレスバーで URL を入力する代わりに「キーワード」+「スペース」+「検索したい文字列」を入力します。

例えば、キーワード「g」を Google での検索として登録しておいて、「ブログ」を検索する場合、

g ブログ

のようにアドレスバーに入力します。

Firefox の場合

Firefox でキーワードを登録するには、コンテキストメニュー (右クリックメニュー) を利用します。

登録したい検索フォームに対して、コンテキストメニューを開いて、「この検索にキーワードを設定…」を選びます。

[画像]Firefox コンテキストメニュー。「この検索にキーワードを設定…」より登録ダイアログが開きます。

[画像]Firefox キーワード登録。キーワードを設定します。

登録した検索サイトはブックマークとして保存されます。

Opera の場合

Opera も Firefox と同等の操作で登録が可能です。

登録したい検索フォームに対して、コンテキストメニューを開いて、「検索を作成…」を選びます。

[画像]Opera コンテキストメニュー。「検索を作成…」より登録ダイアログが開きます。

[画像]Opera キーワード登録。キーを設定します。

登録した検索サイトは Opera の環境設定→ネットサーチで確認できます。

Safari の場合

Safari では標準の機能としてサポートされていません。SafariStand を利用します。

SafariStand の「Quick Search」が該当する機能です。

[画像]Safari Stand の Qiuck Search 設定画面。Stand メニューの SfariStand Setting ... より開きます。

URL を設定する必要がありますが、Firefox などで設定していれば、移植は比較的簡単です。

例えば、Firefox で Google での検索が以下のように登録されているとします。

Firefox で登録されている内容はブックマークで確認できます。また、Opera も同様の書式です。

http://www.google.com/search?q=%s&hl=ja&lr=

このうち、「%s」を「@key」に変更すれば、SafariStand の形式になります。

http://www.google.com/search?q=@key&hl=ja&lr=

[おまけ] 登録しているキーワード

  • [gi] Google Image
    http://www.google.com/images?q=%s&hl=ja
  • [w] Wikipedia - 日本語
    http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Search?search=%s
  • [we] Wikipedia - English
    http://en.wikipedia.org/wiki/Special:Search?search=%s
  • [yt] You Tube
    http://www.youtube.com/results?search_query=%s
  • [cp] CPAN
    http://search.cpan.org/search?query=%s&mode=all

Google も頻繁に利用しますが、大体デフォルトとして登録されていることが多いです。

スポンサーリンク

PHP で少しはまったところをメモしておく試み (2008.02.15)

エラーを無視する

関数の前に「@」をつけます。

$fh = @fopen('dummy.txt','r');
@include('mylibs.php');

この時につける接頭子「@」は、エラー演算子という呼ぶようです。

エラー処理を行う

エラー処理を行う関数として、set_error_handler が用意されています。

set_error_handler が呼び出された後、エラーが発生した場合、set_error_handler で登録した関数でエラー処理が行われます。

perl では、エラー処理を行うため eval ブロックを利用すると、該当ブロック内のエラーを捕捉できます。ブロック外のエラーは捕捉されません。

一方、set_error_handler が一度呼び出されると restore_error_handler を使ってエラー処理を解除するまで、エラーを捕捉し続けます。

<?php
  { // here is eval block
    set_error_handler('myErrorHandler');
    // :
    restore_error_handler();
  } // end of eval block
  function myErrorHandler()
  {
    // do something ...
  }
?>

エラー処理にオブジェクトのメソッドを指定する

set_error_handler で文字列を使うと、該当する名前を持つ関数をグローバルに呼び出します。

エラー処理として、インスタンス $this のメソッドを呼び出したい場合は array を使って関数を引き渡す必要があります。

<?php
  class Hoge
  {
    function Hoge()
    {
      set_error_handler(array($this,'handle_error'));
      // :
      restore_error_handler();
    }
    function handle_error
    {
      // do something ...
    }
  }
?>

クラスメソッド

インスタンスを生成せずに、クラスに定義されたメソッドを呼び出すには、「::」を使います。

クラス名::メソッド名」のように呼び出します。これは perl と一緒。

<?php
  class SomeClass
  {
    function classMethod()
    {
      // do somethimng ...
    }
  }
  
  SomeClass::classMethod();
?>

継承

extends でベースクラスを指定します。

ベースクラスのメソッドを呼び出す時は、予約されている parent というクラス名を使います。

<?php
  class SomeClass extends BaseClass
  {
    function SomeClass()
    {
      parent::__construct();
    }
  }
?>

コンストラクタ

クラス名と同じ名前の関数を定義すると、コンストラクタになります。C++ っぽい流儀です。

php5 では、__construct という関数がコンストラクタとして利用できます。__construct を定義しておけば、自動的に呼ばれるようです。

php4 / php5 共用で利用する場合、以下のようなコードがサンプルとして挙げられています。

<?php
  class SomeClass
  {
    function SomeClass()
    {
      $this->__construct()
    }
    function __construct()
    {
      // do initialization
    }
  }
?>

配列を返す関数

splitexplode など配列を返す関数がいくつかあります。

perl の場合、配列を返す関数に対して、

my $var = ( some_func() )[0];

のようにブラケットで囲むことで、返り値の配列を無名配列として扱い、添字を使って配列の一部の要素だけを抜き出すことが出来ます。

PHP の場合、無名配列という概念がないようなので、上記の場合、

$var = array_shift( some_func() );

のように記述する必要があります。

先頭の要素だけ利用する場合ならば、array_shift でいけますが、途中の要素を抜き出したい場合は、一時変数を使う必要がありそうです。

スポンサーリンク

Firefox 3 Beta 3 を使ってみました

alpha*box さんでも触れられていますがFirefox 3 Beta 3 がリリースされました。

Windows 版では Firefox 2.* と見た目の変化はそれほどないのですが、Mac OS X 版では見た目から大きく変更されています。

ウィンドウが iTunes のようなソリッドっぽい感じになり、ツールバーのアイコンも Windows 版のそれとは大きく異なり、タブバーも Safari っぽい感じになりました。

[画像]Firefox 2 と Firefox 3 を並べてみました。Firefox 3 はツールバーも Firefox 2 とは別物です。

ボタンやプルダウンセレクタなどのフォーム周りのパーツがアクアちっくになって、より Mac アプリっぽくなりました。

私はここら辺は凄く気にする方で、デフォルトの Firefox 2 は使う気にならないほどだったのですが、Firefox 3 Beta 3 のアピアランスであれば、気になりません。

今回リリースされた Firefox 3 Beta 3 はまだβ版です。まだ動作が不安定だったり、不具合があったりします。

私が見つけた不具合のひとつは「ブックマークの移動ができない」ことです。他にもまだあるでしょう。

アドオンも Firefox 3 に対応していないものが 2008.02.14 現在多くあります。ですので、しばらくの間は Firefox 2 と併用して利用したいところです。

Firefox では、複数のプロファイルを作成して、異なる環境・設定を併用することが出来ます。

プロファイルについては、Firefox まとめサイト詳しく解説されていて、Windows 版でのプロファイルマネージャの起動方法なども記載されています。

Mac OS X 版の Firefox でプロファイルマネージャを起動させるには、ターミナル上で

$ /Applications/Firefox.app/Contents/MacOS/firefox -ProfileManager

のように入力します。ここで /Applications/ は「アプリケーション」ディレクトリのパスです。Firefox をインストールした場所によって変わります。

[画像]Firefox プロファイルマネージャ。起動時にも同様のウィンドウが開くようになります。

プロファイルマネージャの「Don't ask at startup」のチェックを外しておくと、起動の度に利用するプロファイルを選択できるようになります。

折角なので、昨日作成したベンチマークを利用して Firefox 3 のベンチマークを取ってみました。Firefox lzyc build で配布されている最適化ビルドバージョンでもベンチマークを取っています。

動作環境は MacBook (Core Duo 2GHz) / 2GB メモリ / Mac OS X 10.4.11 になります。数値が小さいほど速いということを示します。最も成績の良かった数値は強調しています。表の単位は ms になります。

項目 Firefox 2.0.0.11 Firefox 3 Beta 3 Firefox 3b3 lzyc WebKit r30153
文字列追加 1.2472076 0.89252282 0.81859592 0.34970654
文字列の配列連結 50.095953 39.597911 41.997994 1.0796934
配列連結 1.6072076 1.4984672 1.3685412 0.24070654
DOM エレメント生成 38.395953 13.597911 12.797994 2.9696934
テキストノード生成 19.095953 12.297911 15.297994 2.2196934
シリアルサーチ 1.0072076 0.52752282 0.48459592 0.56070654
正規表現 9.6872076 6.4684672 4.9985412 1.5896934
innerHTML 165.983407 116.992349 110.992522 28.799562
innerText 24.495953 8.4784672 10.497994 189.998248
スタイルの読み込み 27.195953 15.897911 15.597994 3.7096934
スタイルの変更 18.795953 12.197911 11.997994 2.7796934
子ノード追加 86.395953 74.597911 69.597994 15.399562
オブジェクト作成 3.6772076 1.5184672 1.5785412 0.30170654

WebKit r30153 には及びませんが、Firefox 2 と比べると、結構速くなっていることが分かります。実際、全体的にきびきび動くような印象もあります。

なお、Firefox 3 についてはアドオンが全くない状態でテストしていますので、純粋に同等な環境での比較になっていないことに注意してください。

ざっくり使ってみた感想ですが、最初の感触はなかなかいい感じです。体感速度がはっきりと違うので、快適度が増します。

Mac OS X に準拠したアピアランスの対応もいい感じです。フォーム周りのアクアっぽいパーツの表示も自然で無理がありません。

ブックマークには「スマートブックマーク」という機能が追加されています。「履歴」もスマートブックマークの一つとして、統合されているような扱いになっています。

システム的には Safari のブックマークに近づいているという印象です。

スマートブックマークにはデフォルトで「最近ブックマークしたページ」「よく開いているページ」「最近のタグ」が登録されています。今のところユーザ独自のスマートブックマークは作成できないようです。

[画像]ブックマーク管理画面。新しいブックマーク管理画面。

ブックマークには「タグ」付けができるようですが、使い勝手などはまだ分かりません。とりあえず、従来のブックマークには一切タグが付いてない状態なので、古いブックマークにタグ付けするのはちょっとしんどい感じがします。

これまでの関連記事

スポンサーリンク

WebKit 最新版 (r30153) を使ってみました

最新版の WebKit はかなり速くなっているという話を聞いたので、どんなものか試してみました。

Mac OS X 10.4.11 でインストールされる Safari 3.0.4 と見た目は全くといいほど変わりません。

常用している Firefox 2.* と比べて、Safari 3.0.4 でも十分に速く感じるので、最新版 WebKit の速さを実感として感じるかどうかは微妙です。確かに速くなっているような気がする……という感じ。

そこで amachang さんが公開されている JavaScript ベンチマークツールを使ってベンチマークを取ってみました。→使用したベンチマークサンプル

動作環境は MacBook (Core Duo 2GHz) / 2GB メモリ / Mac OS X 10.4.11 になります。Mac の中では速くはありません。

数値が小さいほど速いということを示します。最も成績の良かった数値は強調しています。表の単位は ms になります。

項目 Safari 3.0.4 Firefox 2.0.0.11 Opera 9.25 iCab 3.0.3 WebKit r30153
文字列追加 0.69411336 1.2472076 0.7785864 45.57326 0.34970654
文字列の配列連結 1.9590626 50.095953 148.992992 143.9495 1.0796934
配列連結 0.56211336 1.6072076 1.408536 114.9495 0.24070654
DOM エレメント生成 5.8490626 38.395953 36.598032 293.9495 2.9696934
テキストノード生成 4.2190626 19.095953 36.298032 119.9495 2.2196934
シリアルサーチ 1.3090626 1.0072076 2.988536 19.77326 0.56070654
正規表現 7.2090626 9.6872076 10.298032 58.57326 1.5896934
innerHTML 229.993479 165.983407 108.198032 213.9495 28.799562
innerText 180.993479 24.495953 77.098032 107.9495 189.998248
スタイルの読み込み 5.1790626 27.195953 35.498032 26.77326 3.7096934
スタイルの変更 3.6990626 18.795953 33.898032 32.27326 2.7796934
子ノード追加 18.198555 86.395953 91.898032 1646.9495 15.399562
オブジェクト作成 0.58111336 3.6772076 1.718536 11.47326 0.30170654

という訳で私の環境では、WebKit r30153 が断トツに速いという結果になりました。

innerHTML の処理のように 8 倍程度速くなっている処理もあります。その他の処理も 2〜3 倍程度速くなっているという印象でしょうか。結構凄いかも。

なお、Firefox は Firefox lzyc build で配布されている最適化ビルドバージョンを利用しています。

ちなみに WebKit の最新ビルドバージョンは Windows 版もあります。WebKit 公式サイトで配布されている WebKit は、別途 Apple から配布されている Safari 3.0.4 for Windows が必要になりますので、ご注意ください。

これまでの関連記事

おまけ (Windows 編)

会社の Windows マシンでもやってみました。

動作環境は Intel Core 2 Duo 2.66GHz / 8GB メモリ / Windows XP Professional x64 になります。

項目 Internet Explorer 7 Firefox 2.0.0.12 Opera 9.25 WebKit r30153
文字列追加 3.9076358 1.248253 0.28055982 0.217804
文字列の配列連結 17.196905 21.897137 32.799344 0.718804
配列連結 0.57570888 1.098253 0.42155982 0.140804
DOM エレメント生成 7.9676358 15.697137 6.7195402 1.559795
テキストノード生成 18.696905 12.497137 6.7195402 1.099795
シリアルサーチ 1.7076358 0.6543646 1.0895402 0.311804
正規表現 6.5576358 13.997137 4.9995402 0.983804
innerHTML 171.989597 124.985977 40.599344 18.799705
innerText 67.196905 7.028253 28.199344 96.899705
スタイルの読み込み 13.996905 15.597137 5.6195402 2.179795
スタイルの変更 21.896905 10.468253 5.3095402 1.719795
子ノード追加 68.796905 59.397137 15.599344 8.749795
オブジェクト作成 1.7176358 3.748253 0.62455982 0.187804

スポンサーリンク

Re: Macの中にWindowsがある不思議

私が Mac OS を使う大きな理由のひとつに「Mac OS 上で Windows を動かすのは比較的容易である」というのがあります。

[画像]Mac OS X 上で色んな OS に触れてみます

Mac OS 上で Windows を動かすツールは Classic な MacOS の頃から存在しています。

VirtualPC はそれを実現するエミュレータと呼ばれるソフトの一つです。

VirtualPC の Mac 版は PowerPC 専用で、MacBook などの Intel Mac 上では動作しません。その代わりに Parallels DesktopVMware Fusion といったソフトウェアがあります。

Parallels Desktop や VMware Fusion は、VirtualPC と比べると驚くほど高速に動作するのが特徴です。

ちなみに VirtualPC は Classic MacOS 上で動かすとわりかし快適に動作します。また、インストールする OS は Windows 98 SE もしくは Windows 2000 がオススメです。私は PowerBook G4 (初代) で VirtualPC を動かす時には MacOS 9 に切り替えて利用していました。

毎日考ブログMac の中に Windows がある不思議、アンド愚痴コメントで触れられていましたが、エミュレータ以外にもリモートデスクトップという選択肢もありますね。

私は Microsoft が提供する Remote Desktop Connection Client for Mac は使ったことがありませんが、同様の目的で VNC を利用しています。

ちなみに Mac OS X でも同様の仕組み、Apple Remote Desktop があります。

自宅では、私が使う MacBook と嫁さんが利用する ThinkPad 以外に、もう一つ PC を動かしていて、ローカルなファイルサーバとして使っています。

このファイルサーバは古いラップトップ PC で、Windows 98 がインストールされています。Windows 98 なので、前述の Remote Desktop Connection は利用できません(詳細には確認していませんが)。

そこで Windows 98 に VNC サーバをインストールして、Mac OS X から Chicken of the VNC という VNC クライアントを使って Windows 98 を遠隔操作しています。

なお、Mac OS X 側を遠隔操作したい場合、VNC サーバをインストールする必要はありません。「システム環境設定」→「共有」の「Apple Remote Desktop」という項目を有効にすればいいだけです。Apple Remote Desktop は VNC 互換のため、任意の VNC クライアントソフトでアクセスできます。

記事の最初に掲載している画像は、MacBook にて……

  • Parallels Desktop で Windows XP (コヒーレントモード) を動作させて、
  • Parallels Desktop で Ubuntu を動作させて、
  • VNC で Windows 98 を遠隔操作して

みた様子をキャプチャーしたものです。

VNC での動作速度は CPU のパワーよりもむしろ回線速度に大きく依存します。うちの環境では WiFi 802.11b での接続となるため、VNC での遠隔操作は結構もたつく印象があります。Parallels Desktop で動作する Windows XP より体感的にかなり反応が鈍く感じます。

スポンサーリンク

Fastladder on Mac OS X 10.4 Tiger

オンライン RSS リーダー、Fastladder がオープンソースとなって公開されました(オープンソース版 Fastladder 公式サイト・日本語ページ)。

[画像]Fastladder オープンソース版

Google Code でも公開されているので、最新版を追っかけたい人は fastladder - Google Code からチェックアウトできます。

実際に livedoor で動作している Fastladder とは若干異なるようですが、基本的な仕組みやユーザーインタフェースはそのままの形になっているようです。

公開された Fastladder は Mac OS X 上でも動作します。推奨動作環境は

Ruby 1.8.6とRubyGemsが必要です(Mac OS X 10.5以上推奨)

Fastladder Open Source / Free Download

となっていますが、Mac OS X 10.4 Tiger でも動作させることができました。

livedoor Reader 開発日誌 : オープンソース版のRSSリーダーを公開 にて、Windows 版のインストール方法については解説されています。

Ruby のバージョンが 1.8.6 となっているので、Mac OS X 10.4 Tiger 上で動作させる場合は、まず ruby をアップデートする必要があります。

Ruby と RubyGems のインストール

Mac OS X 10.4 Tiger にデフォルトでインストールされている ruby のバージョンは 1.8.2 です。

Ruby 公式サイトのダウンロードページから最新安定版のソースをダウンロードします。

2008.02.09 現在、ruby 1.8.6 - p111 が最新版です。

ダウンロードしたアーカイブのあるディレクトリにターミナル上で移動します。あとは

$ tar zxf ruby-1.8.6-p111.tar.gz
$ cd ruby-1.8.6-p111
$ ./configure
$ make
$ sudo make install

のようにコマンドを入力すればインストールが終了します。念のため、

$ ruby --version

とコマンドを入力して、インストールされた ruby のバージョンを確認します。

ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin8.11.1]

続いて、Ruby のライブラリ管理ツールである RubyGems をインストールします。

Ruby on Rails を始めとした必要なライブラリ群をインストールするのに必要です。

RubyGems 公式サイトの「downloads」より最新版をダウンロードします。

2008.02.09 現在、rubygems 1.0.1 が最新版です。

ruby をインストールした時と同様にターミナル上で、以下のようなコマンドを入力します。

$ tar zxf rubygems-1.0.1.tgz
$ cd rubygems-1.0.1
$ sudo ruby setup.rb

これで Fastladder をインストールする準備が整いました。

Fastladder のインストール

Fastladder Open Source / Free Download より最新版をダウンロードします。

2008.02.09 現在、fastladder 0.0.2 が最新版です。

基本的なインストール方法はダウンロードしたアーカイブの中の「INSTALL.txt」というファイルに記述してあるので、その通りに作業すればいいだけです。

必要なライブラリを以下のようにしてインストールします。

$ sudo gem install rails --version 2.0.2 -y
$ sudo gem install rfeedfinder
$ sudo gem install feed-normalizer
$ sudo gem install opml
$ sudo gem install mongrel
$ sudo gem install sqlite3-ruby

その後、アーカイブを解凍して、データベースをセットアップします。

$ tar xvzf fastladder-0.0.1-macosx.tar.gz
$ cd fastladder
$ RAILS_ENV=production rake db:migrate

これでインストール作業は終わりです。

Fastladder を起動する

Fastladder はサーバサイドアプリケーションです。ですので、基本的にはウェブサーバが動いていないと動きません。

Ruby on Rails はテスト用にウェブサーバを立ち上げることができます。INSTALL.txt には Ruby on Rails のウェブサーバ機能を利用する方法が記述されています。

$ script/server -d -e production
$ RAILS_ENV=production script/crawler > /dev/null &

2 行目のコマンドは Fastladder のクローラーを起動するコマンドです。これがバックグラウンドで動いて、フィードを取得するようです。

ちなみに起動した Fastladder を止めるには、プロセスを kill する必要があります。アップデートの際などにはプロセスを止めておかないと必要なライブラリの上書きなどができません。

$ ps x | grep ruby

上記のコマンドを入力すると、起動中の ruby で動作しているプロセスが分かります。

18626  ??  S      0:03.23 /usr/local/bin/ruby /usr/local/bin/mongrel_rails start -p 3000 -a 0.0.0.0 -e production -P /U
18627  p2  S      0:02.46 ruby script/crawler
18636  p2  R+     0:00.00 grep ruby

例えば、このように表示されます。この場合、最初の 2 行が Fastladder のプロセスです。

各行の先頭の数字がプロセス ID になるので、この場合、

$ kill 18626
$ kill 18627

とすれば、Fastladder のプロセスを止めることができます。

動いている Fastladder には、ブラウザで「http://localhost:3000/」にアクセスします。

スポンサーリンク

localizer.js - JavaScript で多言語対応を考える

JavaScript で多言語に対応する手法について少し考えてみます。

できるだけ簡素なインタフェースで、また直感的に扱えるようにした方がいいでしょう。

例えば、

document.write(_('Hello world!'));

のように特殊な関数 _ に文字列を渡して、対応する言語で表示するようなインタフェースにします。

関数名 _ は、標準的な多言語対応ライブラリ gettext に準じました。

var __Localizer = function()
{
  this.strings = {};
  this.getLocalizedString = function(str)
  {
    if (__Localizer.strings[str] && __Localizer.strings[str] != '')
      return __Localizer.strings[str];
    return str;
  };
  return this;
}
__Localizer = new __Localizer();
_ = __Localizer.getLocalizedString;

ここでは __Localizer というグローバルオブジェクトを定義しています。

言語データを定義するには、以下のような __Localizer.strings を定義するスクリプトを読み込みます。

__Localizer.strings = {
  'Hello world!' : 'こんにちわ世界!'
};

HTML 文書のヘッダ部分で

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>samples - localizer</title>
<script type="text/javascript" src="localizer.js"></script>
<script type="text/javascript" src="locale/ja.js"></script>
</head>

のように言語データ (locale/ja.js) を読み込んでもいいのですが、多くの HTML 文書の html 要素には、lang もしくは xml:lang 属性が指定されているかと思います。折角なので、この属性値を対応した言語データを動的に読み込むようにしてみます。

var __Localizer = function()
{
  this.strings = {};
  this.getLocalizedString = function(str)
  {
    if (__Localizer.strings[str] && __Localizer.strings[str] != '')
      return __Localizer.strings[str];
    return str;
  };
  var path = '';
  var jses = document.getElementsByTagName('script');
  for (var i=0,n=jses.length;i<n;i++)
  {
    if (jses[i].src.indexOf('localizer.js') == -1) continue;
    path = jses[i].src.replace('localizer.js','');
    break;
  }
  var html = document.getElementsByTagName('html')[0];
  if (html)
  {
    var lang = html.getAttribute('xml:lang') || html.getAttribute('lang');
    if (!lang) lang = 'en';
    document.write(['\n<','script type="text/javascript" src="',path,'locale/',lang,'.js"></','script>'].join(''));
  }
  return this;
};
__Localizer = new __Localizer();
_ = __Localizer.getLocalizedString;

script 要素の生成には、document.createElement を使った方法もありますが、ブラウザによってうまく動作しない場合もあるため、ここでは document.write を利用しています。

スクリプトは localizer.js という名称になり、言語データは「locale/」というディレクトリに置かれます。

  • localizer.js
  • locale/
    • en.js (英語)
    • ja.js (日本語)

サンプル HTML は以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>sample - localizer.js</title>
<script type="text/javascript" src="localizer.js"></script>
</head>
<body>
<p>「Hello world!」をローカライズした文字で表示します。</p>
<p><script type="text/javascript">
<!--
  document.write(_('Hello world!'));
// -->
</script></p>
</body>
</html>

ソースでは「Hello world!」となっていますが、表示言語として日本語 (xml:lang="ja") が指定されているため、翻訳された文字列「こんにちわ世界!」が表示されます。

また、日本語リソースが設定されていない場合は、渡した文字列 (このサンプルの場合「Hello world!」) がそのまま返ってきます。

ちなみに同様の仕組みは Serene Bach 3 でも利用されています。

当スクリプトは MIT ライセンスで配布されます → localizer とサンプルをダウンロード

スポンサーリンク

PerlMagick のインストールではまる

Movable TypeSerene Bach などのブログツールで、アップロードしたイメージのサムネイル画像を作成するために利用されるライブラリのひとつに ImageMagick があります。

Mac OS X では標準でインストールされていないため、別途インストールする必要があります。

ImageMagick をインストールして、それを perl で利用できるようにするために、以下のような手順で行いました。

  1. MacPorts のインストール
  2. ImageMagick のインストール
  3. PerlMagick のインストール

MacPorts のインストール

MacPorts は ImageMagick をはじめとした各種 UNIX ツールのインストールをサポートしてくれるツールです。パッケージの依存関係をきっちり押さえてくれますし、アップデートなども簡単に行うことができます。

同様なツールに Fink があります。MacPorts の方が Intel Mac への対応が早かったため、私は MacPorts を使っています。

MacPorst のインストールは簡単です。

  1. MacPorts 公式サイトの「Installing MacPorts」よりアーカイブをダウンロード
  2. ダウンロードしたパッケージファイルを開いてインストール

配布アーカイブは Mac OS X のバージョンによって分かれています。私の場合、Mac OS X 10.4 を利用しているので、Tiger のパッケージをダウンロードしました。

MacPorts は基本的にコマンドラインツールです。使い方などは MacWiki - MacPorts に詳細があります。

MacPorts インストール後は MacPorts のデータベースを最新の状態に更新しておきます。

ターミナル上で以下のようなコマンドを入力します。

$ sudo /opt/local/bin/port -d selfupdate

ここで、「$ 」はコマンドプロンプトです。実際に入力するのは強調された部分になります。これより先にも同様な引用が出てきますが、同じように記述しています。

ImageMagick のインストール

MacPorts のコマンド群は「/opt/local/bin」というパスにインストールされます。

一々、「/opt/local/bin/port」 のように入力するのは面倒なので、PATH を通しておくと楽です。

$ export PATH=/opt/local/bin:$PATH

bash の場合。tcsh, csh など他のシェルを使われている時はパスの通し方が異なります。

ImageMagick のインストールは MacPorts のメインコマンドである port を使います。

$ sudo port install ImageMagick +jpeg2

+jpeg2」というオプションは必須ではありません。ImageMagick で jpeg2000 ファイルを扱えるようにしたい場合は指定しておきます。

ImageMagick は以下の場所にインストールされます。

バイナリ
/opt/local/bin
ライブラリ
/opt/local/lib
ヘッダ
/opt/local/include

PerlMagick のインストール

最後に perl から ImageMagick を利用するためのモジュールをインストールします。

CPAN からアーカイブを取得します。「PerlMagick」で検索すれば、あっさり見つかると思います。

アーカイブからの perl モジュールのインストールは、基本的にはどれも一緒で、

$ tar zxf (MODULE).tar.gz
$ cd (MODULE)
$ perl Makefile.PL
$ make
$ make test
$ sudo make install

のように機械的にコマンドを実行すればいいだけです。(MODULE) の部分は、ダウンロードしたファイルによって変わるので、PerlMagick の場合、

$ tar zxf PerlMagick-6.32.tar.gz
$ cd PerlMagick-6.32
$ perl Makefile.PL
$ make
$ make test
$ sudo make install

しかし、PerlMagick の場合、そのままではインストールできません。「make」と入力した後、ずらっとエラーが表示されてしまいます。

ひとつの要因が MacPorts を利用していることに起因します。MacPorts を利用しているので、インストール場所がデフォルトとは異なるためです。

そこで Makefile.PL を修正する必要があります。PerlMagick 6.32 の場合、修正箇所は 46 行目から 65 行目にかけてです。

   # Header search specfication and preprocessor flags
   'INC'  => '-I../ -I.. -I/opt/local/include -I/opt/local/include/freetype2 -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/opt/local/include/libxml2',

   # C compiler flags (e.g. -O -g)
   'CCFLAGS'     => "-L/opt/local/lib $Config{'ccflags'} -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -O3 -g -Wall -pthread",

   # C pre-processor flags (e.g. -I & -D options)
   # 'CPPFLAGS'    => "$Config{'cppflags'} -I/usr/include/librsvg-2 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/gtk-2.0 -I/usr/include/graphviz -I/usr/include/freetype2 -I/usr/include/libxml2",

   # Linker flags for building an executable
   'LDFLAGS'    =>  "-L/usr/lib -L/opt/local/lib $Config{'ldflags'}",

   # Linker flags for building a dynamically loadable module
   'LDDLFLAGS'  => "-L/usr/lib -L/opt/local/lib $Config{'lddlflags'}",

   # Install PerlMagick binary into ImageMagick bin directory
   'INSTALLBIN'  => '/opt/local/bin',

   # Library specification
   'LIBS'  => ['-L/opt/local/lib  -lMagick -L/usr/X11R6/lib -L/usr/lib -ltiff -ljpeg -lpng -ldpstk -ldps -lXext -lXt -lSM -lICE -lX11 -lbz2 -lxml2 -lpthread -lm -lpthread'],

これで makefile が、Intel Mac 向けに生成されます。

以前はこの修正だけで正しくインストールできたのですが、ImageMagick 6.3.8 と PerlMagick 6.32 というバージョンの組み合わせではうまくいきません。

2008.02.07 時点で、MacPorts でインストールされる ImageMagick のバージョンは 6.3.8 になります。一方 CPAN から取得できる PerlMagick の最新バージョンは 6.3.2 です。

[2007.02.08 追記] ふうこさんからのコメント通り、ImageMagick 公式サイトからダウンロードできる「Source」の方に最新の PerlMagick が添付されていました。それに対応した Magick.xs がきちんと添付されているので、そちらを使うのが最も確実です。MacPorts を利用してインストールした場合、PerlMagick はついてきませんので、バイナリではなくソースの方を別途ダウンロードする必要があります。

PerlMagick 6.3.2 に添付されている Magick.xs で利用されている定数・メンバー名が ImageMagick 6.3.8 と一部互換性がありません。

[2007.02.08 追記] ImageMagick 公式サイトからダウンロードできるソースには対応した PerlMagick が添付されていて、PerlMagick 6.3.8 となっています。

例えば、

Magick.xs:203: error: ‘MagickCompositeOptions’ undeclared (first use in this function)
Magick.xs:203: error: (Each undeclared identifier is reported only once
Magick.xs:203: error: for each function it appears in.)

のようなエラーが表示されて、正しくインストールできません。これは列挙型 MagickOption の列挙定数の名称が一部変更されているために生じるエラーです。

ざっくり調べたところ、PerlMagick 6.3.2 vs ImageMagick 6.3.8 では以下のような差異があります。

  • MagickCompositeOptionsMagickComposeOptions
  • MagickCompressionOptionsMagickCompressOptions
  • MagickImageOptionsMagickTypeOptions
  • MagickLayersOptionsMagickLayerOptions

また、構造体 _Image に存在していた origin というメンバは tile_offset という名称に変わっています。

image->origin

のように ->origin となっている箇所を

image->tile_offset

と変更します。

ここまでの一連の作業を行うことで、make が通るようになり、インストールが可能になります。

$ perl Makefile.PL
$ make
$ make test
$ sudo make install

最後にきちんとインストールされているかどうか確認しておきます。

$ perl -MImage::Magick -e 'print $Image::Magick::VERSION . "\n"'

最後に私が作業した分のパッチファイル PerlMagick-6.32.osx_tiger.patch.gz を置いておきます。これは以下の環境で動作します。

  • Intel Mac
  • Mac OS X 10.4
  • MacPorts 利用
  • ImageMagick 6.3.8
  • PerlMagick 6.32

スポンサーリンク

8/13