2008年11月26日水曜日

日本人のビザは出せません

ニューヨークには外国人差別がない、と言い切ったら過言というものだが、病院や図書館など公共の場所で国籍を問題にされることはない。ここアメリカで外国人として生きていくには居心地の良い都市である。居心地が良すぎて自分が外国人であることを忘れそうになるが、足元をすくわれることもある。

それは中東と西アジアに行く準備をしたときのことだった。

中東A国の場合

石油資本のおかげで建設ラッシュのA国。観光にも力を入れていて、日本人は入国の際にビザがいらない。ネットを見ても日本人の観光旅行記がたくさんみつかる。しかしガイドブックには「ビザの件は流動的なので大使館に確認すること」とも書いてある。

そういうわけで、念のためにA国の出先機関に問い合わせてみた。ところが「日本人だからビザはいらないですよね?」というだけの要件のはずが長電話になってしまった。

A国の係員「アメリカに住んでますか?」

日本のパスポートを持ち米国ビザでアメリカに滞在しています、と説明。滞在年数を聞かれた後、

A国「あなたは日本のパスポートを持っていても状況が若干特殊なのでビザを取ったほうがいいでしょう」

ではすみませんがビザの手続方法を教えてもらえますか。

A国「いえ、ここでは日本人用のビザは出せません」

なんと。

A国「現地の空港に到着したときに到着ビザを取ってください。A国人の書いた招聘状が必要になりますから滞在先のホテルにあらかじめ書いてもらって、それを入国係官に提出してください」

……。

結局面倒になり、A国に行くのはやめてしまった。

西アジアB国の場合

西アジアのB国。発展を続けてはいるものの、他の西アジアの国と同じく観光の目的地としては一般的でない。日本人がB国に入国するにはビザが必要である。ビザの有効期間は数か月から10年まであるが、今回は5年のビザを申し込んでみた。

ビザを申し込みしてから数日、ビザの手配を頼んだ旅行社から電話がかかってきた。

旅行社「5年のビザは無理ですねー」

特に制限はなかったはずだが、と思っていると

旅行社「あなたの場合アメリカに住んでいる日本人なので、通常のアメリカ人や日本人に比べて制限が厳しくなります」

ううむ、ここでもか。

旅行社「1年ビザなら出ますので、また必要になったらビザを取り直してください」

注釈

蛇足ながら真面目な話を書いておくと、上記の話は理由のないことではない。

A国のように、ビザ申請者(私)が国籍のない国(アメリカ)でビザを取得できないのは特別なことではない。在アメリカA国領事の仕事はアメリカ人の入国資格を審査してビザを発給することであり、日本人は審査不可能と言われても仕方がないのだ。日本にあるA国大使館に行ってください、と言われないだけまだましというものである。B国も同様で、期間が短縮されたもののビザを発給してくれたのには感謝するべきだと思う。

それにしても、自分が外国人であることを認識したのはひさしぶりだった。

2008年11月23日日曜日

Perl 6超入門(その3)Perl 5との基本的な違い

Perl Seminar NYという集まりでPerl 6の文法をおさらいした。会場で習ってきたことをインストールしたてのPerl 6を使って自分で試してみる。

まずはバージョン表示

% ./perl6 -v
This is Rakudo Perl 6, revision 0 built on parrot 0.8.1
for darwin-thread-multi-2level.

Copyright 2006-2008, The Perl Foundation.

%

文字列連結

Perl 5の「.」は「~」になった。メソッド呼び出しが「obj->method()」から「obj.method()」になったため。

Perl 5

my $x = 'a';
my $y = 'b';
print $x . $y; # abを表示

Perl 6

my $x = 'a';
my $y = 'b';
say $x ~ $y;

三項演算子(条件演算子)

「条件 ? 正の場合の値 : 偽の場合の値」という書き方はCからの伝統だったが、「条件 ?? 正の場合 !! 偽の場合」になった。

Perl 5

my $x = 1;
print $x == 1 ? 'yes' : 'no'; # yesを表示

Perl 6

my $x = 1;
say $x == 1 ?? 'yes' !! 'no';

配列に対するx演算子はxx

Perl 6

my @array = (1, 2, 3);
my @longarray = @array xx 3;
say join',', @longarray; # 1,2,3,1,2,3,1,2,3を表示

ジャンクション

Perl 6

「3」は「1または2または3」にマッチするので「yes」を表示する。

if (3 == (1 | 2 | 3)) {
say "yes";
}
else {
say "no";
}

「1かつ2かつ3」にはマッチしないので「no」を表示する。

if (3 == (1 & 2 & 3)) {
say "yes";
}
else {
say "no";
}

その他

エラーメッセージが(まだ)不親切。セミナーの会場でもエラーメッセージがわからずにみんなではまった。

たとえば、これを見せられて「=」ではなくて「==」にしなければいけないんだな、とわかるのは無理だ。ドキュメントの整備はこれから行われるとのこと。

% ./perl6 -e 'say "yes" if 3 = (1|2|3)'   
Method 'lvalue' not found for invocant of class 'PAST;Val'
current instr.: 'parrot;PAST;Compiler;as_post' pc 2924 (src/PAST/Compiler.pir:742)
called from Sub 'parrot;PAST;Compiler;if' pc 3461 (src/PAST/Compiler.pir:934)
called from Sub 'parrot;PAST;Compiler;post_children' pc 1783 (src/PAST/Compiler.pir:368)
called from Sub 'parrot;PAST;Compiler;as_post' pc 2060 (src/PAST/Compiler.pir:500)
called from Sub 'parrot;PAST;Compiler;post_children' pc 1783 (src/PAST/Compiler.pir:368)
called from Sub 'parrot;PAST;Compiler;pirop' pc 3061 (src/PAST/Compiler.pir:796)
called from Sub 'parrot;PAST;Compiler;post_children' pc 1783 (src/PAST/Compiler.pir:368)
called from Sub 'parrot;PAST;Compiler;as_post' pc 2408 (src/PAST/Compiler.pir:614)
called from Sub 'parrot;PCT;HLLCompiler;compile' pc 434 (src/PCT/HLLCompiler.pir:303)
called from Sub 'parrot;PCT;HLLCompiler;eval' pc 868 (src/PCT/HLLCompiler.pir:502)
called from Sub 'parrot;PCT;HLLCompiler;command_line' pc 1450 (src/PCT/HLLCompiler.pir:774)
called from Sub 'parrot;Perl6;Compiler;main' pc 16140 (perl6.pir:168)
%

関連記事

2008年11月22日土曜日

Perl 6(Rakudo Perl)をインストール

Perl 6の実装は複数あり、PugsRakudo Perlが有名である。今回は手もとのLeopardでRakudoを試してみる。

ダウンロード

CPANで最新版のParrotをダウンロードする。MacportsにもParrotはあるが、月一度のリリースに追いついていないのでCPANを使ったほうがよいようだ。

展開

% tar zxvf parrot-0.8.1.tar.gz 
parrot-0.8.1/CREDITS
parrot-0.8.1/ChangeLog
parrot-0.8.1/Configure.pl
parrot-0.8.1/DEPRECATED.pod
parrot-0.8.1/DONORS.pod
parrot-0.8.1/LICENSE
parrot-0.8.1/MANIFEST
parrot-0.8.1/MANIFEST.SKIP
parrot-0.8.1/MANIFEST.generated
parrot-0.8.1/META.yml
parrot-0.8.1/Makefile.PL
parrot-0.8.1/NEWS
parrot-0.8.1/PBC_COMPAT
parrot-0.8.1/PLATFORMS
(略)
parrot-0.8.1/tools/util/templates.json
parrot-0.8.1/tools/util/update_copyright.pl
parrot-0.8.1/xconf/samples/testfoobar
parrot-0.8.1/xconf/samples/yourfoobar
%

コンパイル

LeopardだとXcodeが必要。

% cd parrot-0.8.1
% perl Configure.pl
Parrot Version 0.8.1 Configure 2.0
Copyright (C) 2001-2008, The Perl Foundation.

Hello, I'm Configure. My job is to poke and prod your system to figure out
how to build Parrot. The process is completely automated, unless you passed in
the `--ask' flag on the command line, in which case I'll prompt you for a few
pieces of info.
(略)
Okay, we're done!

You can now use `make' to build your Parrot.
After that, you can use `make test' to run the test suite.

Happy Hacking,
The Parrot Team
%
% make
Compiling with:
xx.c
(略)
-L/Users/mint/tmp/parrot-0.8.1/blib/lib -L/Users/mint/tmp/parrot-0.8.1/blib/lib -lparrot -lm -lgmp -lreadline -framework OpenGL -framework GLUT -lcrypto -lintl -undefined dynamic_lookup -L/opt/local/lib
%
% make test
Compiling with:
xx.c
(略)
Test Summary Report
-------------------
t/stm/runtime.t (Wstat: 256 Tests: 5 Failed: 1)
Failed test: 4
Non-zero exit status: 1
Files=396, Tests=11657, 367 wallclock secs ( 3.43 usr 2.24 sys + 169.59 cusr 70.23 csys = 245.49 CPU)
Result: FAIL
make: *** [test] Error 1
%

失敗するテストもあるが気にしない。

% ./parrot -V
This is parrot version 0.8.1 built for nojit.
Copyright (C) 2001-2008, The Perl Foundation.

This code is distributed under the terms of the Artistic License 2.0.
For more details, see the full text of the license in the LICENSE file
included in the Parrot source tree.

%

コンパイル完了。実行可能なParrotのバイナリができる。

Perl 6をビルドするのは簡単で

% make perl6
make -C compilers/pct
make[1]: Nothing to be done for `all'.
(略)
perl -MExtUtils::Command -e cp languages/perl6/perl6 ./perl6
perl -MExtUtils::Command -e ExtUtils::Command::chmod 0755 ./perl6
./perl6 -e"say 'Hello, world.'"
Hello, world.
%

こうするとperl 6のバイナリもできる。最後のところで「Hello, world」を実際にPerl 6で実行している。

「make reallyinstall」をすると/usr/localにParrotがインストールされる(perl6は自動でインストールされない)が、遊んでみるだけなら自分の作業ディレクトリで十分である。

関連記事

2008年11月19日水曜日

iPhoneの修理代金は199ドル

前に書いたとおり、昨年に399ドルで買った旧型iPhoneがこわれた。そこで、修理見積もりをしてもらいにアップルストアに行ってきた。新しくて好きなWest 14th Street店である。

日本のアップルストアと同様Genius Barというシステムがあって、ジーニアスという係の人がトラブルの相談に乗ってくれる。午前中にでも行かない限り予約はまず必須なので、オンラインで予約する。

予約の当日。指定の時間に5分だけ遅れて到着したら20分待たされた。何たる仕打ちかと思ったけれど、iMacがたくさん展示されているし(子供がゲームで遊んでいた)、壁の大画面にOS Xの便利な使い方のビデオが流されているのでMac初心者の私は退屈しない。「mp3が1曲だけ音量が大きく聞こえる。そういうときはiTunesで補正しよう」ふむふむ。そうこうするうちに係の人と面談。30代ラテン系男子。毛深い。

私「iPhoneのマナースイッチがこわれたみたいなんですけど」
係「接触が悪くなってますね」
私「保証期間が切れてるんですけど、修理代はいくらですか」
係「199ドル+税金です」
私「部品を交換するんですか」
係「内部の部品はそのままにして、液晶ガラスを含め外側を全部交換です」
私「考えてみます」

399ドルで買ったiPhone。199ドルで見た目が新しくなるのならお得のようにも思える。しかし、199ドルというのは新しい3GのiPhoneにアップグレードするのと同じ価格である。これだと誰でも3Gの新しい電話を買うだろう。それがアップルの狙いなんだろうけれど。

一つだけ気になるのは、外側が新品、内側が旧式というiPhoneの具合である。3Gのケースで中身が2Gなのだろうか。だとすると話のタネにひとつほしい気はする。

関連記事

2008年11月13日木曜日

MacのFirefoxが「Stuffit Expanderで開く」というありえない選択肢を出してくる

前から少し不思議に思っていたことがある。FirefoxでZIPファイルをダウンロードすると、こういう画面が現れる。

StuffIt

一見なんの不思議もない画面だ。「このファイルをStuffIt Expanderで開きますか、それとも保存しますか」というのはごく自然な言い方である。StuffIt Expanderがインストールされていさえすれば。

私のLeopardはインストール時からあまりいじっていないのでStuffIt Expanderなんてものは入っていない。現に「StuffIt Expanderで開く」を選んでも、OS標準の解凍ソフトウェアが立ち上がる。

では、どうして「StuffIt Expanderで開く」が出てくるのか。

ネットを検索していたら、同じことを考えている人がいた。

Bug 440041 – StuffIt Expander appears in "Open With" dialog box even if StuffIt has never been installed.

On a virgin OSX 10.5.3 install with firefox 3 (build noted in the Build Identifier field), downloading a .ZIP archive gives the option of "Open With" or "Download to." Among the options for "Open With" is "StuffIt Expander," a program which has never been installed on the machine.

「StuffIt Expanderはインストールしたことないのに、どうしてここに出てくるの」という内容。

残念ながらこのフォーラムでも未解決の問題で、

Has this been confirmed on a clean install of Firefox? A quick search shows:

http://mxr.mozilla.org/mozilla-central/search?string=stuffit

that we don't refer to StuffIt in our codebase at all.

「Firefoxのソースコード中にはstuffitという文字列がない、だからOS側でZIP→StuffItの関連づけがされているのに違いない」という主張。もっともらしく聞こえる。

しかし

If this is coming from the OS, the OS should behave similarly when attempting to handle this type of file. a .SIT file is a better example because OSX handles .ZIP files without a third-party app.

「OS側で関連づけがされているのだったら.SITファイルでも同じ挙動になるはずだ。しかしそうならない」という反論もある。

謎は深まるばかりだが、表示上の細かい問題なので原因をつきとめるだけの熱意がある人がいるかどうか。直るのには時間がかかりそうだ。

11月15日追記

鳥獣保護区」の方が丁寧に解説してくださった。スッキリ。

2008年11月11日火曜日

OS XでRARファイルを扱う

ファイルの圧縮解凍はZIPかLHAかbzip2か、のような不毛な論争は昔からあるけれど、今日はRARという形式のファイルを受け取った。「ここからRARファイルをダウンロードしてください」と言われたのだが、RAR形式のファイルなんて初めて受け取った。

MacintoshでRARを開くにはUnRarXStuffIt Expanderが定番らしい。が、ソフトウェアは一元管理ができるといいな、と思いMacPortsを見たらちゃんとunrarがあった。

% sudo port install unrar

としてインストール。ファイルの解凍は

% unrar x hoge.rar

とした。ちなみに、RARファイルのダウンロードが異常に遅かったのでダウンロードの途中で

% unrar -kb x hoge.rar

とすると不完全ながら中身を取り出すことができた。

関連記事

2008年11月9日日曜日

iPhoneがこわれました(ただし左上のスイッチ)

iPhoneがこわれた、といっても昨年買った2Gの携帯。3Gを買った今でも細々と使い続けていた。

会話ができなくなったわけではなく、側面左上にあるマナースイッチが動かなくなったのである。着信音が鳴らないマナーモードに切り替えようとしてもスイッチがグラグラして切り替えられない。スイッチが物理的におかしくなったらしい。

iPhoneにカバーもつけずに無造作に扱っていたからとはいえ、別に落としたわけでもない。Appleのフォーラムを見ると同じ問題をかかえている人もいる。→Apple - Support - Discussions - iPhone 3G Silent Switch Broken ...

あちこち検索すると、解決方法はAppleに持って行くか自分で直すかしかないようだ。自分で直すのはiPhoneを分解するということで、できれば避けたい。Appleに持って行っても保証期間が切れているので有償修理になる。

現実的な答えはマナーモードをあきらめてiPhone本体の寿命まで使いつぶすことだが、結構このマナースイッチは重宝していた。来る日も来る日も何度もスイッチを切り替えたからこわれたのだろうと言われると返す言葉もないけれど。

iPhoneの本体、特に液晶画面は衝撃に強い。落としたりしてもめったにこわれないようだが、スイッチの取り扱いには注意しましょう。