Home

Vantage Point of Queens

Emacs Again (3): dired, js2-mode and ctags

dired

dired stands for DIRectory EDit. (Not sure how it’s pronounced.) It is very useful bundled application. When you do C-x C-f then just hit enter. You’ll see something like ls but with cursor on it. You can do a lot of stuff by this, but mainly, you’ll do open files, just choosing file with cursor, and hit enter. You can also delete by press d for marking. And then press x to execute it. I’m sure there’s a lot more to do, but that’s what I do so far.

colorIf you’re a Mac person, and If you using Display ANSI colors on Terminal.app, and if you use black background theme, such as Pro, you hardly see color of Blue. You can try TerminalColoreopard. Yoshimasa Niwa made a SIBML extension for choosing ANSI color. This ANSI color setting can be only for for one user. Cannot be like theming, but I don’t change theme everyday, so that works fine for me.

js2-mode

In emacs, there are Major mode and Minor mode. Major mode work like a Perspective in Eclipse IDE. It gives certain kind of framework to work on a given issue. There are ecmascript-mode.el, javascript.el and js2.el. I use js2.el for now.

In order to make js2.el work, emacs needs to know which directory autoload search for. It’s like a path setting in your shell. How do you know which directories your emacs search for? Type C-h v load-path. It will return your emacs’ search path. I found a nice article about load-path on emacs wiki. I wanna load everything in ~/.emacs.d is represented as follows.

(progn (cd "~") (normal-top-level-add-to-load-path '(".emacs.d")))

And download js2.el, put it into my ~/.emacs.d/. Open js2.el, then do M-x byte-compile-file. You’ll get js2.elc, which is pre-compiled version. Then add following lines in .emacs.el

;; js2-mode
(autoload 'js2-mode "js2" nil t)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))

now whenever you open *.js, you’ll use Js2 Major mode.

ctags

Tag is not like delicious tag. It’s more like search index.

EmacsTags

I use exuberant ctags. Just compile and install (./configure ;; make;; sudo make install). And disable original ctags (sudo chmod a-x /usr/bin/ctags).

Outside of emacs, go to top directory of your source file. Try ctags -e --recurse --languages=javascript. Then you’ll get TAGS file in the same directory.

You can do
M-x visit-tags-table and choose TAGS file first. But if you don’t choose TAGS file and try to do tag jump by M-., you’ll be asked which file emacs should read anyway.

JavaScript: The Good Parts Talk available on Google Tech Talks

JavaScript: The Good Parts by Douglas Crockford A few times, I mentioned on my blog here, “JavaScript: The Good Parts.” The author of the book, Douglas Crockford gave a talk at Google Campus on Feb 27, 2009. You can check it out on YouTube.

JavaScript: The Good Parts

The talk is very insightful. And it actually very much about what he wrote on the book. If you are interested in reading that book but haven’t got that yet, you may get at least half of his points by watching this Google TeckTalk. And also he is touching what the future of JavaScript will be. Strict mode will be interesting. And I guess it would boost the speed.

I pick up some of his points what I was interested in.

Continue reading

Emacs Again (2): auto-save and font

Auto save revisited

So I joined irc.freenode.net#emacs, and asked how to configure auto-save. Several nice people helped me out. Here’s my .emacs.el for backup and auto-save.

(setq make-backup-files t)       ; enable backup file
;;; locate where you backup files
(setq backup-directory-alist
      (cons (cons "\\.*$" (expand-file-name "~/.backup"))
            backup-directory-alist))

(setq version-control t)     ; enable versions of backup
(setq kept-new-versions 5)   ; how many keep new verisons
(setq kept-old-versions 5)   ; how many keep old versions
(setq delete-old-versions t) ; delete old version without asking
(setq vc-make-backup-files t) ; still make a backup for version-controled files                

;;; Autosave in .backup dir
(setq auto-save-file-name-transforms
  '(("\\([^/]*/\\)*\\([^/]*\\)\\'" "~/.backup/\\2" t)))

Originally, I was very confused by auto-save and backup. FIles of backup are named usually like FILE_NAME~ and autosave are like #FILE_NAME#. At this point, I’m not quite sure that auto-save-file-name-transforms will take, but that’s alright. What I wanted to d

Japanese (or other multibyte)

Me as a native Japanese speaker, I often times, use Japanese Characters, plus I learned Chinese these days, I may have chances to read and write in Chinese Characters as well. Here’s what I use now for Japanese language. They are all copied from some of XEmacs distribution package I guess. It’s still just a magic spells…

;; ============= Japanese language setting ======================                              

;; A. inline input method (window-system)
(when (eq window-system 'mac)
  (add-hook 'minibuffer-setup-hook 'mac-change-language-to-us)
  (mac-translate-from-yen-to-backslash) ;; yen => backslash
  (set-language-info "Japanese" 'input-method "MacOSX") ;; bad fix
  ;; input method in read-only buffer (e.g. C-s in dired-mode)
  (setq mac-pass-key-to-system-on-read-only-buffer t)
  )
;; A. end                                                                                      

;; B. language environment
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8-unix)
(set-keyboard-coding-system 'utf-8)
(set-clipboard-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
;; (set-file-name-coding-system 'utf-8m) ; already set
(prefer-coding-system 'utf-8-unix)
;; B. end                                                                                      

;; C. fix: Unicode => Japanese mapping
;; Thanks to saiki-san (see [macemacsjp-users 870])
;; register circle around digits to cjk table (by Ando-san)
(defadvice utf-translate-cjk-load-tables
  (after my-ad-circled-digit activate)
  (dotimes (i 20)
    (let ((unicode (+ #x2460 i))
          (char (+ 54433 i)))
      (if (utf-translate-cjk-substitutable-p unicode)
          (puthash unicode char ucs-unicode-to-mule-cjk))
      (puthash char unicode ucs-mule-cjk-to-unicode))))
;; prevent to use half-width marks (by Nanba-san)
(utf-translate-cjk-set-unicode-range
 '((#x2e80 . #xd7a3)
   (#xff00 . #xffef)
   (#xa7 . #xa7)                        ;
   (#xb0 . #xb1)                        ;
   (#xb4 . #xb4)                        ;
   (#xb6 . #xb6)                        ;
   (#xd7 . #xd7)                        ;
   (#xf7 . #xf7)                        ;
   (#x370 . #x3ff)                      ; ギリシャ
   (#x400 . #x4ff)                      ; キリル
   (#x2000 . #x206f)                    ; 一般句読点
   (#x2103 . #x2103)                    ; ℃
   (#x212b . #x212b)                    ; Å
   (#x2190 . #x21ff)                    ; 矢印
   (#x2200 . #x22ff)                    ; 数学記号
   (#x2300 . #x23ff)                    ; 技術記号
   (#x2460 . #x2473)                    ; 円囲み数字
   (#x2500 . #x257f)                    ; 罫線
   (#x25a0 . #x25ff)                    ; 幾何学模様
   (#x2600 . #x26ff)                    ; その他の記号
   ))
;; C. end

Font for Terminal

And for terminal font, I really appreciate Droid Sans Mono. Droid Family is designed for Google’s Android.

Download the Android SDK

Unzip the archive, and you’ll find .ttf files under tools/lib/fonts/default/. what it’s cool about is, very readable with small font size, mono space and comes with CJK typeface as well. License-wise, maybe ok for your personal use, you can at least develop Android with this. Small note: Android SDK comes with Android.el as well.

Emacs Again (1): config

As my tradition, I moved, and I changed a title of my blog. It was called “Ten Eyck,” but now it’s called “Vantage Point of Queens.” Go visit my flickr page, you’ll see some of my house warming pictures.

So, I desperately try again on Scheme, Emacs and SICP. This time, I have a Kindle to read on, a friend working with me (again). I have experienced more than ever… Well let’s see what’s going on.

As a first time (and I wish this will keep going on), I will start with writing about how to configure emacs. Although there are tons of XEmacs implementation on Mac OS X, I run emacs on Terminal.app. I guess it’s because… (1) one of the fundamental reason to use emacs is because you can use on almost any platform. And if I just use one of those “OS X Specialized” emacs, then I will not remember how to configure. I don’t wanna miss anything. Terminal.app: Use Option as meta key(2) Terminal.app can do “Alt as Meta” natively. (3) Apple keeps evolving Termianl.app. It has great transparent setting, multi-byte char enable, UTF-8 clear and a lot more.

But I digress. In order to configure emacs, you edit .emacs.el file. It usually stay on your home directory. Since it’s already 21st century and the cloud computing is really coming, why don’t I put on the cloud? I setup Dropbox account, and I mkdir-ed ~/Dropbox/config/emacs. I mv-ed .emacs.el and .emacs.d into there and make a symbolic link to them. It works great.

no welcome message

(setq inhibit-startup-message t)

By having this line in your .emacs.el, you don’t see welcome message anymore. That also indicates that your change is applied to your emacs.

aggregate all backup craps

(setq make-backup-files t)
(setq backup-directory-alist
  (cons (cons "\\.*$" (expand-file-name "~/.backup"))
    backup-directory-alist))

You have to mkdir for this before relaunch emacs. Hmm… I don’t see this working. I may try it later again.

Google Sync v. NuevaSync

Picture 1しばらく前から、Google Calendar を僕の iPhone で使いたくて、NuevaSync を使っていました。NuevaSync を通せば Google Calendar が Microsoft Exchange Server のように見える、という優れたサービスで、かつ無料です。

何も文句はなかったのですが、今日 Google Calendar を見てみたら Sync with iPhone なんてあったので、試してみました。英語ですが、次のリンクに説明があります: Sync: Set Up Your iPhone or iPod Touch

IMG_0001 4現状では NuevaSync の方がいいです。左の写真のように Google Sync ではメインのカレンダーにしかアクセスできません(何かほかに設定があるのでしょうか?)。NuevaSync ならすべてのカレンダーにアクセスできます。

これまでの Google からすると、きっと改善されるんでしょうがとりあえず現状はこうですよ、という覚え書きでした。

あ、そうだ。iPhone が Exchange Server のアカウントを1つしか設定できない、というのも酷いと思いました…

システム起動時に xampp のサービスを開始させる

以前は、開発者たるもの全てのソフトはソースから作るべし!なんて思っていましたが、さすがに何年もやってると、継続してメンテされるソフトウェアパッケージのありがたみもよくわかるようになってきました。

しばらく前から xampp をローカル開発用によく使っています。最近アップデートされていないのが少し心配ですが、インストールは簡単だし、よく出来ていると思います。ただ実際に使ってみると少し手を加えた方が使いやすいので、自分が銜える変更などを備忘録としてまとめておきます。

今回は起動時に xampp パッケージのソフトをシステム起動時に全部稼働させる、ということを扱います。

ダブルクリックできるようなアプリケーションは、Classic OS でやっていたのと、まぁ何となく似ているように、GUI (システム環境設定) から設定できますね?

ここでは、そうではなくて、いわゆるコマンドラインから立ち上げるアプリケーションを扱います。なおこの方法を使えばは他のサービス系のソフトウェアでも同じように応用できます。

Mac OS X では、10.4 (Tiger) から launchd というサービス管理機構が組み込まれ、10.5 (Leopard) では従来型の rc を廃止しました。

launchd は、起動スクリプトと、設定ファイル (.xml) で制御します。英語が出来る方は developer.apple.com: System Startup Programming Topics: Creating a Startup Item をどうぞ。僕のこのエントリは基本的に Creating a Startup Item 以上の情報はありませんので。

  1. /Library/StartupItems に起動項目となる directory を作成
    起動項目に任意の名前を付けます。今回は /Library/StartupItems/XamppBoot という directory を作りました。
  2. (1) の中に起動スクリプトを書く
    親ディレクトリと同じ名前のシェルスクリプト (/Library/StartupItems/XamppBoot/XamppBoot) です。もう写経で。start|stop|restart の各項目は、xampp の起動スクリプトへのパス(と引数)が含まれています。

    #! /bin/sh
    
    . /etc/rc.common
    StartService() { /Applications/xampp/xamppfiles/mampp start }
    StopService() { /Applications/xampp/xamppfiles/mampp stop }
    RestartService() { /Applications/xampp/xamppfiles/mampp restart }
    RunService "$1"
  3. (1) の中に設定ファイルを書く
    Mac OS X ではおなじみ .plist 形式の設定ファイル (/Library/StartupItems/XamppBoot/StartupParameters.plist) 。description と message はあんまり大事じゃないと思う。Provides で指定される文字列が、システム全体でユニーク(一意)な値でないと行けないはず。requires などは先に上げた資料を参考のこと。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
      <dict>
        <key>Description</key>
        <string>xampp startup items</string>
        <key>Messages</key>
        <dict>
          <key>restart</key>
          <string>restarting xampp service</string>
          <key>start</key>
          <string>Starting xampp service</string>
          <key>stop</key>
          <string>Stopping xampp service</string>
        </dict>
        <key>OrderPreference</key>
        <string>Late</string>
        <key>Provides</key>
        <array>
          <string>XamppDeamon</string>
        </array>
        <key>Requires</key>
        <array>
          <string>Network</string>
        </array>
        <key>Uses</key>
        <array>
          <string>Network</string>
        </array>
      </dict>
    </plist>
    
  4. permission を確認する
    全てディレクトリ/ファイルは root:wheel の所有で 755 パーミッションで。

全て設定がうまく行っていたら、コマンドラインの起動項目管理アプリである SystemStarter を使って起動、停止、再起動が

sudo /sbin/SystemStarter start XamppDeamon
sudo /sbin/SystemStarter restart XamppDeamon
sudo /sbin/SystemStarter stop XamppDeamon

という風にできるようになります。お試しあれ。

H1-B ビザに関する 2, 3 のこと

日本語を母語とする方で、僕のようにアメリカで働く人がどれほどいるか知りませんが、外国人 (この場合、正確にはアメリカ人あるいはカナダ人でない人ですね) がアメリカで合法的に働くには、Visa (査証) が必要です。先日、東京赤坂のアメリカ大使館で、NIV (Non-Immigrant Visa: 非移民査証) 面接を受けてきました。

査証にも種類がたくさんあり、一概に云えないでしょうけれど、自分の経験ももしかしたら誰かの役に立つかもしれません。というよりむしろ、自分への備忘録として、査証のスタンプをパスポートに押してもらうまで、どんなことをしたかメモしておきます。

大使館面接に臨むまで

僕は米国の企業に雇用されています。そこに至るまでの何か、というのはこの項で扱いません。多くの米国企業は外国人を雇っているでしょうし、顧問弁護士などもいますから、その辺は“良きに”やってくれるはずです。ここで僕がお勧めしたいのは、個人的に話しができる弁護士を自分の味方として持っておくことです。

幸か不幸か、僕は何度か職場を変えてきました。米国で僕は “alien (異邦人)” ですから間違いなく不利な部分はあるわけです。そこで書類や条件のうえで自分には何が必要なのか、それらはいつまでに必要なのか、そういったことを理解しておくことはとても大事なことです。全て web 上で調べられることですけれど、最新情報にアップデートしてあることとか、電話したらすぐに聞けることとか、そういったことを鑑みると僕は、誰か一人知り合いの attorney (法律家) を持っておくべきだと思います。僕にとっては、米国で雇用されることが目的なのではなく、自分自身のしたいことをすることが目的なのですから、一番大事なこと以外は他の人に頼んでもいんではないかな。高い、という疑問もあるでしょうけれど、英語がしゃべれるなら、安く頼める人は沢山います。それこそ web で調べましょう。

そして合衆国政府の DHS USCIS (Department of Homeland Security, U.S. Citizenship and immigration Services) から、”I-797A, Notice of Action” という書類が来たら、査証面接への準備開始です (もちろん、Notice Type が Approval でないとダメですけど…)。

準備する書類

米国大使館非移民ビザの項目は良く読んでおきましょう。非移民ビザ: 予約ステップには必要な書類がすべて列挙されています。これらを指定された順番 (PDF) でクリアファイルに入れて、持っていきます。僕と同じく H1-B の申請の場合は…

  • パスポート
  • DS-156「オンライン入力式ビザ申請書」
    • カラー写真
    • 申請料金の支払い
  • DS-157「非移民ビザ補足申請書」
  • オリジナルの I-797許可通知
  • I-129請願書のコピー
  • 雇用証明
  • エクスパック 500
  • 面接予約確認書

が必要です。

I-129請願書のコピーというのは、H1-B を申請した時の書類です。普通は会社の法律家が用意しますから、しかるべき人にお願いすれば、すぐにコピーを作ってくれるはずです。

雇用証明に関しては法律家と相談しましょう。新規雇用の場合は Offer Letter (内定通知) 、そこの会社から給料を既にもらっている場合は Pay stub (給与明細) などがよく使われるみたいですね。僕は出来るだけ会社の偉い人の署名の入った何かを持っていくようにしています。

DS-156 について

非移民ビザ: 予約ステップにある通り、DS-156 はオンライン入力式ビザ申請書のページから記入します。プレビューもない Web フォームなので僕はちょっとビビりました。form を submit すると PDF ファイルのダウンロードがあって、開いてみると、自分の情報が入力された DS-156 が出来上がり、というわけです。でも多分、登録番号を作っているだけで、入力内容はどうなんだろう…僕は None と書くべき部分を空白にしてしまって、印刷したあとで、None と書き入れた部分はいくつかあります。あと Signature (署名) は必ず必要です。

また、大使館に入館する際に、書類の不備などをチェックしてくれる受付の方がいるんですが、彼女に 25. Name and telephone numbers of person in U.S. Who you will be staying with or visiting for tourism or business. に上司の名前を書けと云われました。H1-B の形態を考えると少々混乱する記入事項だと思うのですが、まぁそういうことです。

あとこれはいうまでもないことかもしれませんが、DS-156 と DS-157 のコピーを是非取っておくべきです。滞在したことのある国のリストとか、学校に行っていた日付とか、なかなか調べられない情報を沢山書きますので…将来のまた記入する時にコピーがあれば一貫性を保てます。

DS-156 を作成するのに、正直に言えば、I-797A は必要ありません。そして DS-156 を作成しないと、NIV 面接の予約を入れることができません。また NIV 面接は常に混雑しています。なので、もし時間に余裕がなくて、日程を早く決めておきたいのならば、DS-156 を早い段階で作成して、前もって予約を入れておく、というのは手かもしれません。

面接当日

東京赤坂の大使館では、まず正門脇の警備室を通過します。そこはもうほとんど空港のゲート並みに(にこやかですが)調べられます。予約確認証を見せることから始まるので、すぐ取り出せるようにしておくべきでしょう。また全ての電子機器は預けさせられます。ノートパソコンを持っていくのはあまり良い考えとは思いません。デジタルカメラ、携帯電話もそこで預けます。

そして入館前に先ほども云いましたが、書類のチェックが行われます。係員の方はてきぱきとしていますが、やってくる人には日本語を母語としない方も結構います。ので、寛容になりましょう。あと僕のように冬に来る人は寒い中でしばらく待たされますので、その辺は準備をしっかりと。

面接、というと、静かな部屋で厳かに、一人一人行われるようなものを、僕はイメージしていましたが、大分違います。実際は…透明な板で仕切られたカウンター越しに、書類を提出して、待って、呼ばれて、また待って、呼ばれて…銀行や運転免許センターのような感じでしょうか。焦らず、気張らず、リラックスしているのがいいと思います。

まずは用意した書類を最初の窓口に提出します。そして指紋採取、その後面接となります。僕は2回目の申請ですが指紋はまた採取されました…

注意深く人の流れを見ていると、質問の量や質に違いがあるのがわかると思います。その流れは属人的なように思えますが… つまり面接で聞かれる内容が多い人は、それを聞く専門の人の窓口に流れているように、僕は観察しましたが、もしかしたら違うかもしれません。しかし間違いないのは、ごく数分の会話で (笑顔で) 窓口を去る人もいるし、時間をかけて書類を持って帰らされる人もいる、ということです。僕はいつもその多く質問する人の窓から呼ばれないことを祈りつつ、待ちます。

待ち時間は単調かつ思っているより絶対長いです。僕は小説を持っていきましたが、呼び声が気になってしまってなかなか読み進められませんでした。気が散ってもいいアナログな何か、新聞とか雑誌とかを持っていくといいかもしれません。あとトイレも最初に書類を出したらすぐに行くべきですね。

幸い、僕の面接はほんの数分で終わりました。ゲートをくぐって出るまで、大使館の滞在時間はざっと2〜3時間程度だったでしょうか。 (その多くは待ち時間ですよ!)

今回は驚いたことに、提出から 25 時間程 (つまり翌日) で、手元にパスポートが帰ってきました!前回はやっぱり(営業日換算で)4日程かかったけどなぁ…ちなみに提出した DS-156 と DS-157 を除く、全ての書類は返却されます。

False となる値 – JavaScript: The Good Parts

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス“の Appendix A に収録されている(であろう)表を引用しています。

False となる値

以下にあげる値は、if や switch の条件式の中で、false となります。

Type Value
number 0
number NaN
string ""(要素が空(から)の文字列)
boolean false
Object null
undefined undefined

意識/無意識のうちにでも理解しているとは思いますが、こうやって整理されているとまたわかりやすいですね。

さてここからは余談です。多くの言語では、文字列と配列は非常によく似た存在です。つまりどちらであっても、長さというプロパティがあって、添字によって中のデータに一つ一つアクセスできる、というものです。もし要素が空(から)の文字列が false であるなら、要素が空の配列はどうでしょう?実際には要素が空(から)の配列は false とは評価されません。おそらく JavaScript の Array は Object に帰するもので、空配列は null でない Object と云う意味で、例外になってしまうからでしょうか。

Falsy values – “JavaScript: The Good Parts”

This entry is a note from “JavaScript: The Good Parts” on page 106, Appendix A: Awful Parts.

Falsy Values

In JavaScript, following values are considered as “false” when they come to conditional expression.

Type Value
number 0
number NaN
string ""(empty string)
boolean false
Object null
undefined undefined

You must have understood them already, but it’s good to have it organized.

In most of languages, String and Array is very similar. I mean, both instances have a length property for nature and you can access stored values by their own indexes. So I was wondering, if an empty string is falsy, why not an empty array is? No, an empty array is not falsy. I guess its because an array is acutally an object. Try typeof operator with one.

Here, I tried to evaluate an array with JavaScript’s nature, duck typing, but well, it doesn’t work as I imagined.

var a = [];
console.log( a ? 'true' : 'false'); //of course, true;

console.log( (String.prototype.constructor.apply(a)) ? 'true' : 'false'); //Oh? false... so..?

var b = ['b'];
console.log( (String.prototype.constructor.apply(b)) ? 'true' : 'false'); //still false...

Any value, even if it’s a string type of a String wrapper object, passed to string constructor makes an empty string.

String.prototype.constructor(['a']);

will do more as what you can imagine. String.prototype.constructor will run .valueOf() on the argument.

文字列比較 – JavaScript: The Good Parts

いつだったか、この blog にも何度か登場している Mauvis に勧められて購入した “JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス” は原書で何度か読みました。なんだか翻訳が最近出たそうなのですが(訳の問題はわかりませんが)、これはお勧めです。すごく薄いけど、気付かされることがすくなくとも、僕には沢山ありました。しばらくこの本から学んだことをいくつか紹介していきたいと思います。

最初は String の比較です。

以下の expression は共に true と評価されます。

('cat' == 'c' + 'a' + 't') // true
('cat' === 'c' + 'a' + 't') // true

この本を読むまでは、JavaScript はなんとなくインスタンスベースの比較をしてるのかなぁと思ってました。それはつまり、等号( == あるいは === )の左右両辺にが全く同じメモリアドレスを指し示している時だけ、true と評価される、ということです。しかし実際には、String の比較時はその文字列の内容を評価していました。

var s1 = s2 = 'foo';
var s3 = 'foo';
s1 == s2; // true
s1 == s3; // still true, of course.

従って、もし万が一、インスタンスで文字列を比較したい場合は、以下のようにするといいでしょう。

var s4 = new String('foo');
var s5 = new String('foo');
s4 == s5 //false

しかし本の中になんども登場する通り(そして僕も強く同意しますが)、Wrapper Object (String, Number そして Boolean) は混乱の元です。必要となるシチュエーションもあまり想像できません。

ところでインスタンスベースの文字列比較、というのはもうあまりポピュラーではないんでしょうか?僕が多分最初に Java を学んだときはインスタンスベースの比較だったような気がしたのですが、今試してみたら (1.5.0_16 on Intel Mac) 内容で比較していますね。PHP も同じようです。

Home

Search
Feeds
Meta
Links
Ads!

Return to page top