アメリカのF1/学生ビザを取得するまで(サンノゼ州立大学の語学コース SAL)

ヨーダは Do, or do not. There is no try. と言っているし悪魔の7つの質問に相当凹まされたので(その他いろいろあったが)真剣にアメリカに行こうと思い立ち、そして紆余曲折あったものの3月からサンノゼ州立大学の語学コースにしばらく留学することになりました。

View Larger Map

赤松さんにお世話になりました。このページも参考になります。
F-1ビザ (アメリカ留学ビザ) を取得したときのメモ : a++ My RSS 管理人ブログ

以下は、学生ビザを取得するまでの経緯。参考になれば幸いです。
2009年初頭の情報であり、変更される部分は多いと思うのでその点はご注意を。

  • ベイエリアに1週間滞在、天気のよさに感動する(2005年4月)
  • アメリカに行こうという思いが強くなる(2008年8月頃)
  • 具体的な計画はないが日本を離れる準備として住居撤収、仕事の縮小を徐々に開始(8月)
  • ベルリッツの昼間の短期コースに1ヶ月通う(10月)
  • 偵察のためベイエリアに2週間滞在(12月上旬)
  • それまで学校に行くつもりは全くなかったが一転、語学留学を決意(12月中旬)

決意した時点で貯金はそこそこあった。生活防衛資金があることで、生活費のことを考えなくてすむし絶対的な安心感がある。貯まり始めると保守的になる、というのもその通りだな、と実感した。(参考:404 Blog Not Found:自営するあなたへ!これだけは知っておきたい10個のつっこみ

さて、学校決めは最終的には赤松さんの勧めに従ったのだが(曰く、大学のキャンパスが使えるのはいい&州立大学の知名度は役に立つ&本気度の高い学生が多そう)自分でも調べた。サンフランシスコを中心にあれこれ調べた結果がこちら。

http://spreadsheets.google.com/ccc?key=pDWwIWtega2s4dLR7mGV-Eg

表の数字の単位はドル。何校かにメールで問い合わせたがBrandonCollegeの対応は感じがよかった。
いくつか参考になったサイト。

で、サンノゼ州立大学(略してSJSU)に決めたところで手続き開始。大学とは言っても、入学にTOEFLのスコアやテストは必要ない。正確には San Jose State University の Studies in American Language の中の Academic and TOEFL Preparation コースを17週間受ける予定。

  • 学生寮が空いているか問い合わせ、クリスマス直前だったが案外すぐ返事が来た
  • オンラインでコース申し込み、先払いちょっとあり
  • 銀行の英文ドル立て残高証明 2通申請(三菱東京UFJのそれは住所不記載だが今回は問題無かった)
  • 大学の英文成績証明書 郵送で1通申請
  • Passportと残高証明をファミリーマートでFAX、1枚100円、一応送信した旨をメールした
  • 学生寮の申し込みで Spring 2009 ONLY, $640の小切手, 2008-2009 Campus Village Housing Documents.pdf, A4の封筒に入れて国際郵便、260円(ドキュメントを送る前にPDFに記入してメールして確認してもらった、費用は5ヶ月で$4000ぐらい)
  • 授業料 $4890 をクレジットカード払い
  • 大学からI-20をはじめとする書類がDHLで郵送されてくる(DHLは速達みたいなもので自分で選択したのだが$70もするので時間に余裕があれば不要かも)
  • 大使館に持って行く書類の準備、面接予約(DS-156のIDと面接予約がひもづいているので、DS-156を書き直すと予約を取り直すはめになる、DS-157,158はAdobe Acrobatの体験版でPDFに直接書いた、サインは印刷してから手書きで)
  • コンビニでEXPACK 500を購入
  • 証明写真は以前撮ってもらったものをJPEGで持っていたので210円で現像できた(国際免許証に必要な写真とサイズが違う)
  • ペイジーの振込 12400円(みずほのATMはキャッシュカードのみ、ゆうちょ銀行は現金OKだった)
  • SEVIS費をオンラインで振込 $200
  • 大使館で書類提出、面接(予約した時間に少し遅刻していったら荷物検査の前で列ができていた、中で簡単な書類チェック、DS-158の家族の名前を記入する欄で父の名前しか書いておらずその場で書き直し、窓口で書類を手渡し、しばらく待って指紋採取、さらに待って面接、二言三言日本語で聞かれハイ、ハイと答えるのがほとんどであっという間に終了、全部で1時間程度、10時過ぎには歩道で長蛇の列だったので早い時間帯に予約した方がベターだと思われる)
  • 数日後、パスポートにF-1ビザが貼付けられて送付されてきた
  • 保険は大学の用意したプランで、オンラインでクレジットカード払い $416

ここまで1ヶ月ちょい。学生寮の手続きがまだ終わっていない。1月に入って授業が開始したので忙しいらしい。結構事務局にメールを送ったが、24時間ぐらいでだいたい返事はもらえたし、丁寧に教えてくれたので大変助かった。英語の練習にもなる。

約5ヶ月間の留学で100万円ぐらい。財政証明の際、1年間の留学だと$23000必要。留学は高そう、という先入観があったが円高の今、高くはないと思う。

途中にある小切手の用意は、前回の滞在でスタンフォード大学内のWellsFargo銀行で口座を作っておいたので簡単だった。WellsFargoは、滞在先がマンスリーのアパートで住所として使えたのと、スタンフォードの学生になるつもりなんだ、と言った(つもり)ら問題なく口座を開けた。小切手の束などは後日東京の自宅まで転送してくれた。が、キャッシュカードがいつまで経っても届かず、担当になってくれた人にメールしてもなぜか返事をもらえず面倒なことになった。電話を試みたが、英語でのやり取りでどうにも伝わらず断念。オンラインでログインしてからサポートにメッセージを送ってみた。こちらは24時間程度で返事があり、届くはずの30営業日を過ぎていたので再送をお願いしたら10日程で届いた。届いた数日後、同じカードが届いてなんだ?と思ったら前のやつだった。宛先をよく見ると、CHINAと書いてある。。いったいどこを旅してきたのやら。

三菱東京UFJ銀行の海外送金は、書類で送金先を登録してあとは電話。手数料が3500円かかる。1回で200万円まで。インターネットバンクにも登録していないと使えないと思う。(電話の最中に音声ガイドになってIDやらパスワードやら聞かれた)ネットから送金するにはもう1つグローバルダイレクトというサービスにも登録しなくてはいけないらしく月額料金がかかるので諦めた。電話は海外からでもかけられる。

あと留学と関係ないが国際免許証は、日本の運転免許センターで証明写真と3000円ぐらい払うとその場で発行してもらえた。とはいえ結構ルールが違うので知っている人に習わないと危ない。

それからMasterかVisaのカードは無いと困る。限度額は上げておいた。

というわけで。
当面はシリコンバレーのエンジニアとつるめるようになるべく、せっせと語学に励みます。

追記
SALでの生活の模様更新中

Posted in SAL at SJSU, 感動する | Comments closed

PDFの検索結果に画像でスニペットを表示する実験

お蔵入りしていたコード。
PDFを検索したときの結果には画像でスニペットを返した方が見やすいかも、というアイディアを実現しようとしたもの。なぜ画像の方がいいかというと検索語近辺のテキストをスニペットにしても、表だったりPDFの中で文字列が表示される順に記述されていなかったときに脈絡がなくて役に立たないことがあるから。

さて、デモコードはまずユーザからURLで指定されたPDFファイルをサーバでダウンロード、テキストを抽出する。テキストにはPDF上での位置情報が付与されているので、それを含めてJSON形式でJavaScriptのコードに直接出力。文字列の検索はJavaScriptでやって、ハイライトは先の位置情報から画像の上にCSSで乗せる。

現状では、重い、PNGへの変換精度がいまいち、検索の機能が貧弱、等々実用化するまでには問題がたくさんある。

PDFからテキストを抽出、PNGに変換するところにはいくつか既存のアプリを使っている。

<?php
require_once 'Zend/Uri.php';
define('PDF_SAVE_PATH', '/tmp/pdfsearch/');
define('PNG_SAVE_PATH', '/var/www/zuzara.org/pdfsearch/png/');
dl('json.so');
$errorMessage = '';
$pdfUrl = (isset($_GET['pdfurl']) ? $_GET['pdfurl'] : '');
$seed   = '';
$images = array();
$data = array();
if ($pdfUrl != '') {
    try {
        $uri = Zend_Uri::factory($pdfUrl);
        if ($uri->valid() === true) {
            $seed = md5($pdfUrl);
            $pdfFile = PDF_SAVE_PATH . $seed . '.pdf';
            $txtFile = PDF_SAVE_PATH . "$seed.txt";
            if (!file_exists($pdfFile)) {
                `wget -q -O $pdfFile "$pdfUrl"`;
                `pdftoppm -f 1 -l 1 $pdfFile $pdfFile`;
                `mogrify -format png $pdfFile-*`;
                $cmd = "$pdfFile-*.png " . PNG_SAVE_PATH;
                `mv $cmd`;
                `/usr/local/src/xpdf-3.02/xpdf/pdftotext $pdfFile -f 1 -l 1 -cfg /etc/xpdfrc -layout -enc UTF-8 >$txtFile`;
                $buf = file_get_contents($txtFile);
                $frags = explode('*** line fragments ***', $buf);
                foreach ($frags as $i => $frag) {
                    $d = preg_match_all('@x=([\d\.]+)\.\.([\d\.]+) y=([\d\.]+)\.\.([\d\.]+) base=[\d\.]+ \', text: (.*?)\'@s', $frag, $m);
                    $data[$i] = array();
                    for ($j = 0; $j < $d; $j++) {
                        //$data[$i][] = array('text' => $m[5][$j], 'xMin' => $m[1][$j], 'xMax' => $m[2][$j], 'yMin' => $m[3][$j], 'yMax' => $m[4][$j], );
                        for ($k = 1; $k <= 4; $k++) {
                            $m[$k][$j] = intval($m[$k][$j]) * 2.084;
                        }
                        $data[$i][] = array('text' => $m[5][$j], 'top' => $m[3][$j], 'left' => $m[1][$j], 'width' => $m[2][$j] - $m[1][$j], 'height' => $m[4][$j] - $m[3][$j], );
                    }
                }
                file_put_contents($txtFile, serialize($data));
            } else {
                $data = unserialize(file_get_contents($txtFile));
            }
            foreach (new DirectoryIterator(PNG_SAVE_PATH) as $file) {
                if (strpos($file->getFilename(), $seed) !== false) {
                    $images[] = $file->getFilename();
                }
            }
            sort($images);
        } else {
            $pdfUrl = '';
        }
    } catch (Zend_Uri_Exception $e) {
        $errorMessage = $e->getMessage();
    }
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>pdfsearch</title>
<script type="text/javascript" src="jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="jquery.dimensions.js"></script>
<script type="text/javascript">
data = <?php echo json_encode($data); ?>;
$(function() {
    $('#searchbox').submit(function() {
        var query = $(':text').val();
        var matched = 0;
        jQuery.each(data, function(i) {
                jQuery.each(data[i], function(j) {
                        if (data[i][j].text.match(query)) {
                            var t = $('#p-0').position().top + data[i][j].top;
                            $('#highlight').css({ top: t,
                                                  left: ($('#p-0').position().left + data[i][j].left),
                                                  width: data[i][j].width,
                                                  height: data[i][j].height,
                                                  });
                            $(window).scrollTop(t - 50);
                            $('#highlight').show('fast');
                            matched++;
                            return;
                        }
                    }
                );
            }
        );
        if (matched == 0) {
            alert("did not match.");
        }
        return false;
    });
});
</script>
<link rel="stylesheet" href="style.css" type="text/css" media="screen" />
</head>
<body>
<h1>pdfsearch</h1>
<?php if ($errorMessage != ''): ?>
<div id="errormessage"><?php echo $errorMessage; ?></div>
<?php endif; ?>
<?php if (count($images) > 0): ?>
<form id="searchbox" action="" method="GET">
<input type="text" name="search" />
<input type="submit" value="submit" />
</form>
<?php endif; ?>
<?php foreach ($images as $p => $image): ?>
<h2>page: <?php echo $p+1; ?></h2>
<img id="p-<?php echo $p; ?>" src="png/<?php echo $image; ?>" alt="" />
<?php break; /*XXX*/ endforeach; ?>
<form id="submitpdfurl" action="" method="GET">
pdf url:&nbsp;
<input type="text" id="pdfurl" name="pdfurl" value="<?php echo htmlspecialchars($pdfUrl, ENT_QUOTES); ?>" />
<input type="submit" value="Convert!" />
</form>
<div id="highlight"></div>
</body>
</html>
Posted in いじる | Comments closed

PukiWikiにHTTP経由でデータをインポートする

紙copi のデータを PukiWiki に移行しようと思って適当なスクリプトを書いた。
wiki フォーマットで書いていないので見た目は乱れるがMacを使うことが多くなったのでPukiWiki一本にまとめることにした。

<?php
/**
 *  PukiWiki HTTP API
 *
 *  @since  2009.1.18
 */
require_once 'Zend/Http/Client.php';
class Pukiwiki_API
{
    const DEFAULT_ENCODING = 'EUC-JP';
    private $_http;
    public function __construct($serverName, $httpAuthUserName, $httpAuthPassword)
    {
        $this->_http = new Zend_Http_Client($serverName, array('keepalive' => true));
        $this->_http->setAuth($httpAuthUserName, $httpAuthPassword);
    }
    public function write($title, $body)
    {
        $this->_http->setParameterPost(array(
                        'encode_hint' => $this->encode('ぷ'),
                        'template_page' => '',
                        'cmd' => 'edit',
                        'page' => $this->encode($title),
                        'digest' => md5(''),
                        'msg' => $this->encode($body),
                        'write' => $this->encode('ページの更新'),
                        'notimestamp' => 'true', // 効いてる??
                        'original' => $this->encode($body),
                    ));
        $response = $this->_http->request('POST');
        //echo mb_convert_encoding($response->getBody(), 'UTF-8', self::DEFAULT_ENCODING);
    }
    private function encode($str)
    {
        return mb_convert_encoding($str, self::DEFAULT_ENCODING, 'UTF-8');
    }
}

呼び出し側は

<?php
require_once 'Pukiwiki_API.php';
$p = new Pukiwiki_API('http://PukiWikiを設置したサーバ/', 'ベーシック認証用のユーザ名', $argv[1]);
$path = realpath($argv[2]); // 紙copi のディレクトリを指定
$pathLen = strlen($path);
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object) {
    if ($object->isFile()) {
        $pageName = "kami" . substr($name, $pathLen);
        $body = mb_convert_encoding(file_get_contents($name), 'UTF-8', 'SJIS');
        echo $pageName, "\n";
        $p->write($pageName, $body);
    }
}
Posted in いじる | Comments closed

ムームードメインDNSカスタム設定 + Google Apps

先月からムームードメインがようやくDNSをいじれるようになった。大歓迎。
で、全部無料なのが怖いぐらいGoogleに依存しているのでGoogle Appsを使うことにした。

ムームーDNS:カスタム設定でレコード情報を変更 – NEO-SHOCKER.COM
ここに書いてある内容で網羅されているが一応設定を書いておくと、

MX ASPMX.L.GOOGLE.COM 10
MX ALT1.ASPMX.L.GOOGLE.COM 20
MX ALT2.ASPMX.L.GOOGLE.COM 20
MX ASPMX2.GOOGLEMAIL.COM 30
MX ASPMX3.GOOGLEMAIL.COM 30
MX ASPMX4.GOOGLEMAIL.COM 30
MX ASPMX5.GOOGLEMAIL.COM 30
TXT v=spf1 include:aspmx.googlemail.com ~all
mail CNAME ghs.google.com
etc...

最後に、ネームサーバをムームDNSに変更して設定完了です。

この部分を抜かしていてハマった。。48hを過ぎてもAppsはいっこうに使えるようにならず。。

ムームードメイン – ネームサーバ設定変更
このページで「ムームードメインのネームサーバ(ムームーDNS)を使用する 」にチェックを入れて更新すればOK。僕の場合は、カスタム設定をしたつもりがここのチェックがロリポップのままで反映されていなかった模様。
設定後、しばらく待てば反映される。

CNAMEが設定されているかのチェックは
Creating CNAME records – Google Apps for Administrators
ここの「Check the status of your CNAME record」でできる。

GmailのLab機能がGoogle Appsのメールでは使えないようで、ちょっと不便になった。
labelやfilterをエクスポートしてインポートしたいがそれはできないようだ。

iPhoneのiCalとGoogle Calendarの同期にNuevaSyncを使っている。こちらも移行しないといけない。

追記
Appsのカレンダーの同期も簡単になった。
Apps専用の設定でOnにしてから後は普通のGoogle Calendarと同じ
Google Sync via ActiveSync – Google Apps Help

参考:
格安サーバ・ロリポップを使い倒す « zuzara

Posted in いじる | Comments closed

VimM#3 に行ってきた

僕もvimは使い始めてかれこれ5年ぐらい経っていますがVimMで発表していた方々のレベルは次元が違いました。

特にvim神と呼ばれているらしいkana氏operator, the true power of Vimはためになりました。

Lv4. who doesn't use Visual mode
で、cwとかdwはまぁよく使っていたのですが=ipは使ったことがなかった。VisualModeで選択してから=していました。ci"も使ってなかったですね。

あとVimperatorの使用率が会場の40人中半数ぐらいだったのにびびりました。ぱっと使い始めてみた限りでは、妙に手にしっくりくる。。

いやはや面白かった。

Posted in 感動する | Comments closed

KeyRemap4MacBookでかなをEscapeに変換

ここ最近、iPhoneと同時に買ったiMacを常用しているのですがやっぱりスペースキーの右隣(かな)はEscapeじゃなきゃ嫌!ということでKeyRemap4MacBookを使いました。

以前からブックマークしていた紹介記事。
KeyRemap4MacBook最強過ぎる – antipop

このソフト、残念ながら「かな」をEscapeに変換する機能はついていません。あきらめていたのですが機能追加もやってみたら案外簡単でした。

公式のドキュメントを参照。

ソースをダウンロードして以下の2つのファイルを編集。

KeyRemap4MacBook-5.1.0/src/core/kext/remap.cpp

<   void
2081,2088d2072
<   remap_jis_kana2escape(const RemapParams &params)
<   {
<     if (! config.remap_jis_kana2escape) return;
<
<     RemapUtil::keyToKey(params, KeyCode::JIS_KANA, KeyCode::ESCAPE);
<   }
<
<   void
2700d2682
<   remap_jis_kana2escape(params);

KeyRemap4MacBook-5.1.0/files/prefpane/checkbox.xml

1271,1274d1266
<               <name>KANA to Esc</name>
<               <sysctl>remap.jis_kana2escape</sysctl>
<             </item>
<             <item>

編集するファイル内にたくさんサンプルがあるのでコピペです。
ドキュメント通りにビルドして出来上がったpkgファイルを開いてインストール。

vim使いの中でもスペースの隣をEscにする人はあまり多くないようですが、、やはり快適。
ついでに「英数」で日本語入力のOn/Offを担えるようにしました。

同等の機能を持ったソフトでWindowsならKeyCtrl

Posted in いじる | Comments closed

握った瞬間世界が変わるマウスを試してみた

マウスにはそれほどこだわりはないのですが、知人に勧められたのとその謳い文句に惹かれて買ってみました。
握った瞬間世界が変わる。WowPen JOY Pen Mouse

さぞ高いのだろうと思いきや2980円なので気に入らなくてもあきらめられる値段。
普通のマウスと何が違うかと言うと、手のそえ方。指で操作ではなく握って腕で動かす感じになります。

細かい動きには向いていないのと、薬指に当たる右クリックを間違えて押しがちなのが欠点。
とはいえ悪くない使い心地です。

Posted in 感動する | Comments closed

PHP5.3.0alpha2 の試用メモ

新機能盛りだくさんなのでちょっと試してみた。

PHP: doc:scratchpad:upgrade:53 [PHP Wiki]
ここに大まかな新機能は載っている。新機能としてnamespace, goto, closureが並んでいるのはPHPらしいと言うか何と言うか。

インストールは特に問題なし。Fedora5。

wget http://downloads.php.net/johannes/php-5.3.0alpha2.tar.bz2
tar jxvf php-5.3.0alpha2.tar.bz2
cd php-5.3.0alpha2
./configure
make
./sapi/cli/php -v

namespace、あると便利そう、と思っていたがクラスごとにuseを書くのは面倒でないか?

namespace Funaki::Test;
class Hoge { ... }
class Foo { ... }

こんな感じにクラスファイルを作っても(HogeとFooは別ファイルでもいい)呼び出すときに

use Funaki::Test;
$obj = new Hoge;

だけでは
Fatal error: Class 'Hoge' not found
が出る。use Funaki::Test::Hoge; と書く必要があるようだ。::の前に$hogeと変数は使えないのでuseよりフルネームで書くことの方が多そう。

closureは、、使うだろうか。
?:も

$hoge = (isset($array['idx']) ? $array['idx'] : null);

$hoge = ($array['idx'] ?: null);

と書けるならよかったのだが、idxがないとNotice: Undefined offsetエラーが出るので使う機会はないと思う。

__DIR__は地味に便利だ。dirname(__FILE__)のエイリアス。
NEWDOCやDateTimeとかPharも使う機会はありそう。gotoも使ってしまうかもしれない。

vimのsyntax highlightがまだ対応していないのでちょっと寂しい。

この辺も気になる。
PHPTypeSafeで目から鱗が落ちた – Do You PHP はてな

本を読む PHPカンファレンス2008に参加しました
mysqlndで速くなったらしい。
PHP本体も
php.internals: Re: re2c scanner issue
パーサーをre2cなるものに変えて速くなったらしい。メモリ効率の改善はうれしい。

CentOSのyumで入れられるようになるのはいつかなー。

Posted in いじる | Tagged | Comments closed

PHPでmixi OpenIDを使うときのメモ

使う機会がありそうだなぁ、と思って試してみた。
ライブラリはPHP OpenID Libraryを使った。バージョンは2.1.1。
Zend Frameworkは1.6.0RC2現在、
@todo OpenID 2.0 (7.3) XRI and Yadis discovery
とYadisに非対応なので使えない。openid_identifierにhttp://mixi.jp/を指定してもDiscovery failed.となってしまう。

さて、PHP OpenID Libraryの使い方は、基本的にはライブラリに入っているexamplesの通りだがところどころ不要な箇所もあるので書き直してみた。
http://zuzara.com/pub/mixiopenid.phps
>demo

GMPとCURLのextensionが必要。手元のFedoraに付属しているPHP5.1.6では問題なく動いた。
examplesにあるtry_auth.phpで$auth_request->shouldSendRedirect()としている箇所があるが、mixiはOpenID2なので常にfalseになる。上記ソースではその部分は削った。

最初、既にOpenIDを使っているサイトのHTTP通信を見て参考にしようと思ったが見た目にはリダイレクトしているのに302がなくて不思議に思っていた。OpenID2では、JavaScriptのPOSTで飛ぶ、とtry_auth.phpにコメントが書かれている。htmlMarkupというメソッドでHTMLを取得して、echoするという仕組み。

Posted in いじる | Comments closed

運転免許の更新をしたらICチップが付いていた

すっかりペーパードライバーだが、身分証明書として使っている運転免許証を更新してきた。
ちょっと驚いたのがICチップ付になっていたこと。電球に透かすと小さな四角い影が見える。
Wikipediaによると去年辺りかららしい。
運転免許証 – Wikipedia

この記事が詳しい。
本籍地の記載が消えたIC運転免許証を取得して思ったこと – 日経エレクトロニクス – Tech-On!

個人情報保護の観点で本籍が無記載になったというわけだが、最近不動産屋でも免許証のコピーを取るときに本籍部分をマーカーで消したりしたなぁ、と思い出した。

リーダーはNECが作っているのか。利便性が上がったとは思えないが、結構な額のお金が動いているのだと思う。
NECネッツエスアイ | IC免許証ICチップ記載内容確認パッケージ

講習の際に見る20分の番組はこんな会社が作っていた。
◆交通安全創出企業◆ -株式会社電脳-

免許更新センター内の、廊下に赤いテープで順路を示すナビゲーションは秀逸だと思った。ダサさ爆発だが誰も間違えない。

Posted in 感動する | Comments closed

Page optimized by WP Minify WordPress Plugin