2013-06-16

UnionBankで小切手帳取得までの長い道のり

うちの会社の場合、会社の近くにある銀行ならSSNなしでも簡単に口座が開設できますし、事前にそれは知っていました。

が、送金手続きなどの都合上、渡米前に口座番号を確定したかったので三菱東京UFJ系列のUnionBankに口座を開設しました。日本語で対応してくれるコールセンターがあるのもポイントです。

日本にいる間に口座の開設済ませ、渡米前にキャッシュカードも取得。これには少し時間がかかるので、もしUnionBankにしようとする人は早めに行動しておいたほうがいいと思います。

あとは、渡米後にどこかの支店に行ってキャッシュカードの有効化と小切手帳の発行をお願いすることになります。

仮住まいに到着後、何はなくともお金はいるよねってことで一番近いUnionBankでキャッシュカードの有効化、そして小切手帳をお願いしました。

ところがこれまたトラブル発生。「小切手帳は住所がアメリカじゃないと発行しないよ。とりあえず住所変更は受け付けるので、1営業日待ってまた来るかコールセンターに電話してね」と。そんな面倒なこと、最初の資料になかったのに。

というわけで何日か経ってコールセンターに電話してみました。前記のとおりせっかく日本語で対応してくれるので、そっちに電話。するとまだ住所変わってないのでとあと1週間ぐらい待ってみてください。ナニソレ。

で、また1週間待って電話してみました。やっぱり住所が変わってないので、結局電話で住所変更の申請。ナンダヨソレ。

また待ってと言われても面倒なので、そこから1週間我慢して、今度は最初に行った支店へ。で、住所を確認してもらったらまだ日本のまま。ドウナッテンダヨー。

支店の窓口で対応してくれた人は前回と同じ人だったのですが、「あなたの住所変更したのは覚えてるわ。おかしいわね、ちょっと待って。。。」とわざわざマニュアルを確認しながら再度入力。でもなんかうまくいってないみたい。

たまたまシニアっぽい人がいたのでその人にヘルプを求めます。すると「SSNの登録か、もしSSNがまだなら入国の証明とIDの確認がないと海外からの住所変更はできないのよ」と。ナンダッテー。

というわけでSSNの番号を教えたらやっとこさ住所変更はできました。小切手帳はそのうち送られてくるそうです。

とりあえず、窓口の人が触ってたシステムだと住所変更が失敗しても画面ではよくわからない様子だし、通常のマニュアルにも載ってない様子。UnionBankにおいては、日本で口座開設できるサービスしてるんだから、そこら辺はもうちょっとしっかりして欲しい。

それと、その過程で「あなたの当座預金のグレード、今はもう提供してない古いやつなんだけどどうする?」って言われました。なんてゆーか、全体的になんかもうちょっとちゃんとして欲しい感じでした。

敗因は、日本語喋れる担当者がいる支店にいかなかったことかもしれません。UnionBankにわざわざ日本から口座を作るような人は、きっと日本語が喋れる担当者が支店に行くんだと思います。そしたら最初から手続きがスムースだったんじゃないかと。

まーでも、多分アメリカだったらこんなん普通なんでしょと思うようにはしています。

I-94 が電子化されたけど

皆様こんにちは。

アメリカにビザ持ちで入国するときに記入が必要だったI-94が電子化されました。僕は電子化された直後にアメリカに来たのですが、DeltaのCAはまだ電子化のことを知らなかったみたいで、わざわざ紙のI-94を機内で書きました。せっかく書いた紙のI-94は入国審査時に目の前でビリビリに破かれました。

さて、I-94 が電子化されたのなら、従来言われていた「SSNの申請は入国してから10日ぐらい経ってからじゃないとデータがないって追い返される」というのはもうないんじゃないか、ということで入国4日後に SSA オフィスに行ってみました。

すると何やら画面を操作して手続きを進めてる様子。これはすんなり行くかと思ったらまさかのどんでん返し。「DHSに登録されてる誕生日とお前のパスポートの誕生日が違うからダメ」と。意味わかんねーよ。どうすりゃいいのよと聞いたところ「DHSに登録されている情報が修正されるのを待て。もしダメだったら手紙が行くからね」と。

最終的にはそれから10日後ぐらいに郵便で届きましたが、やっぱり10日ぐらい経ってから行ったほうがよかったのかもしれません。

2013-04-01

転勤のご挨拶

このたび5月13日付けでアメリカ Google Inc. の Mountain View 本社で働くことになりました。 Google 日本法人は退社という形になるので、世間一般で言う転籍にあたるかと存じます。

皆様には、今まで公私にわたり大変お世話になり感謝しております。インターネットに国境なんて無いし、毎年1回ぐらいは帰国する予定でいるので、これからも変わらずお付き合い出来るかと思います。というわけで、これからもよろしくお願いいたします。

取り急ぎご報告まで。

(追記) いわゆる栄転じゃありません。うちの部署の性質上、転勤できる場所が限られているのでたまたま本社になっただけです。

2013-02-28

やっぱり基礎って大事だよね


はじめに

元ネタ「プロセス間の期限付き排他ロック」が前の記事と一緒ですが、誰かを貶めたり中傷しようとしたりというのではなく、勝手に上から目線で「基礎知識が足りてないよね」とミサワ的な発言をすることを目的とした記事となっております。ご承知ください。

仕様のここがまずそう

「実装」のセクションに書いてある
  • シンボリックリンクを使って排他制御する 
  • 期限切れは、シンボリックリンクそのものの mtime で表現する
    • mtime <= now なら期限切れ
    • つまり、シンボリックリンクの mtime を期限が切れる時刻(未来)にする

ですが、「ロックとは何か」とか「アトミックな操作とは何か」あたりの基礎知識がある人にとっては、ちょっと考えればまずいのがすぐに分かります。シンボリックリンクの作成symlink(2)とmtimeの変更utimeutimensat(2)は別々のシステムコールであり、両者をアトミックに行えるシステムコールがありません。

すなわちsymlink(2)が成功したとして、その次にutimeutimensat(2)が実行されるまでの「間」というものが存在し、その間に他のプロセスが色々するチャンスがあるわけです。特に、作成されたシンボリックリンクはutimeutimensat(2)が実行されるまでは「期限切れ」状態にあるとみなせます。その結果、utimeutimensat(2)の実行時点で持っているシンボリックリンクは競合するプロセスから見れば期限切れなので、そのシンボリックリンクは削除されてしまう可能性があるわけです。

この一点に関しては、symlink(2)でのリンク先としてTTLをセットするということで、期限が未来であるロックをアトミックな操作で作成できます。しかし、期限切れのロックファイルをどう取り扱うかという点にも問題があるので、そう簡単にはいかないというのは元記事のコメント欄にあるとおりです。

ちなみに、その期限切れロックファイルの扱いの問題を同じようにシステムコールレベルで見れば、statlstat(2)とunlink(2)をアトミックに実行することはできない(ので、その為に別のロック機構が必要になっちゃう)よねってな話になるかと思います。

もったいない

さて超上から目線で偉そうですが、「知識が足りないのってもったい無いよね」というのが元記事に対する感想です。元ネタの著者の方がどのような方かは存じ上げませんが、
  • コードは読みやすい
  • コメント欄でのディスカッションで自分で駄目なパターンに気づいている
ことからして聡明な方だとお見受けします。にもかかわらず、上記の通りの仕様を作成してしまうというのは、アトミックな操作とかクリティカルセクションに対する排他制御とかいうのを経験的には知っていても体系的な知識としては獲得していないのではないかと想像します。

一般的にこの手の「車輪の再発明」をする場合、最初の車輪はどうやって発明されたのかをちゃんと学んでおかないと、見た目は派手だけど動かない車輪を発明したり、紆余曲折を経たら全く同じものができてしまったなんてことが起きてしまいます。そういうのも経験として重要な場合もあるとは思いますが、できればそうした無駄は省けたほうがいいんじゃないかとオジサンは思うわけです。

追記

symlinkのmtimeっていじれない?あれ?と思って調べたらutime(2)じゃなくてutimensat(2)とかいうのを使うらしい。そんなmanページ見たことないなーと思ったらhttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/futimesat.2.html
はあれどutimensatはなし。

って、書いてて気づいたけど、システムコールでのsymlinkのハンドリングって気をつけなきゃいけなかった、ってことはstat(2)もlstat(2)にしなきゃだめですね。

てなわけで、偉そうなこと言いたいのなら知識の吸収は継続しないといけないよねという反省と、ちゃんとJMにコミットしないといけないよねという反省でしめさせていただきます。

2013-02-27

関数名は大事だよね

プロセス間の期限付き排他ロックについて。

既にコメントが付いてるので、設計レベルでどうだとか、というのはおいておきます。

とにかく実装をパッと見て、これはダメそうだなというのは
52 sub lock {
中略
62             $self->unlock;
63         }
64     }
65     if (symlink $target, $self->file) {
あたりで気づけるのではないでしょうか。lock関数の中で、実際にlockを獲得しているのが65行目のsymlinkなのに、その手前でunlockを呼んでます。一般的に言って、獲得してないロックを解放するのはかなりまずいでしょう(実際、このunlockの呼び出しの直前で他のプロセスがlockに成功すると、そこで生成されたロックファイルを勝手に削除しちゃうことになり、結局2重にlockが獲得できちゃいます)。

さて、標題の「関数名は大事だよね」ですが、unlockの実装は
73 sub unlock {
74     unlink $_[0]->file;
75 }
だけなので、下手するとunlinkってな名前を付けちゃいそうです。が、実装がたまたまそうなってるだけで、呼び出し側から見ればやりたいことはunlockなのですから、この名前で大正解。これがunlockと命名されていたからこそ、lock関数の実装がダメそうなのがすぐに分かったわけです。

というわけで、関数名を横着しないできちんと付けてると、コードの間違にも気づきやすいよねというお話でした。

2012-11-20

Unity 使い辛いよー

最近、やっとPreciseに移行し始めてますが、Unityがすげー使い辛くて困ってます。

Alt+Grave (`) のキーアサインが変更できない問題

英語キーボードで漢字変換をする場合は、Alt+GraveをIMEのon/offに割り当てるのが一般的かと思いますが、これができない。というか、デフォルトでAlt+Graveにアサインされている機能が、普通の設定ツールでは見えない。ハードコーディング?変更できなくはないっぽいけど、面倒そうなのであきらめた。

Gnome Terminal のフォントサイズを変更すると、ターミナルの行数・列数が変わってしまう。そして、仕方ないのでターミナルのサイズを変更しようとすると、ターミナルの行数・列数がCompizを表示してくれない問題

タイトル長いですね。Gnome-Terminal使ってて、文字が読みづらいからフォントを大きくしようとするとしましょう。するとCompiz君、律儀にウィンドウサイズを一定に保とうと努力してくれます。結果、ターミナル上での列数が変わってしまいます。80列に固定して欲しいのにorz

まー、それは許すとしても(もとい、依然として解決策不明なので)、じゃー手でウィンドウをリサイズしようとすると、リサイズ中はカラム数が分からない。何という無理ゲー。これは既にBugが上がってて、解決策も乗ってます。
sudo apt-get install compizconfig-settings-manager compiz-plugins-extra
ccsm
で設定マネージャが起動するので、左のカテゴリから「ユーティリティ」を選択、「Resize Info」というのがあるので、それを有効にすれば解決です。

デフォルトでオンにしておいて欲しい。

MyUnityがデフォルトでインストールされない

徹底的に設定ツールはデフォルトでインストールしない方針なのでしょうか。大して設定する項目があるわけじゃないけど、とりあえずインストールされててもいいんじゃないかと。

2012-07-28

シェル操作課題への回答

http://d.hatena.ne.jp/Yamashiro0217/20120727/1343371036
シェル操作課題ということで bash のみでやってみた。CSVじゃなくてあくまでもカンマ区切りということでクォーティング処理とかは全くなし。ファイル名が与えられてないので、すべてhoge.logとします。

問1 このファイルを表示しろ

$(< file) は個人的には好きではないのだけど、外部コマンドなしだとこれになる。
echo "$(< hoge.log)"

問2 このファイルからサーバー名とアクセス先だけ表示しろ

IFS元に戻すの面倒なのでサブシェル内で。
(IFS=","; while read server t uid dest; do set -- "$server" "$dest"; echo "$*"; done < hoge.log)

問3 このファイルからserver4の行だけ表示しろ

これまた念のためサブシェル内で。
(while read line; do [[ "$line" == server4,* ]] && echo "$line"; done < hoge.log)

問4 このファイルの行数を表示しろ

これもやっぱりサブシェル内で。
(declare -i i; while read line; do let "i++"; done < hoge.log; echo $i)

問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ

うーーーーーーん、ソートを実装するのは面倒だけどしゃーない。ワンライナーは厳しいので適宜改行入りです。それと7bit前提。バブルソートとか書くの久しぶり。
function lt() {
  # return 0 if $1 < $2, else return 1
  local IFS=,
  local -a x y
  x=($1)
  y=($2)
  local -ir server=0
  local -ir uid=2
  [[ "${x[server]}" < "${y[server]}" ]] && return
  [[ "${x[server]}" > "${y[server]}" ]] && return 1
  (( ${x[uid]} < ${y[uid]} )) && return
  return 1
}
IFS=$'\n'
logs=($(< hoge.log))
declare -i i j
for ((i=0; i < ${#logs[@]}-1; i++)); do
  for ((j=1; j < ${#logs[@]}-i; j++)); do
    lt "${logs[j]}" "${logs[j-1]}" || continue
    s=${logs[j-1]}
    logs[j-1]="${logs[j]}"
    logs[j]="$s"
  done
done
for ((i=0; i<5; i++)); do
  echo "${logs[i]}"
done

問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ

せっかく前問でソート作ったので、ソートして重複除去でもいいんだけど。。。
declare -a cache
function is_cached() {
  local -i i
  for ((i=0; i < ${#cache[@]}; i++)); do
    [[ "${cache[i]}" == "$1" ]] && return
  done
  return 1
}
declare -i i=0
while read line; do
  is_cached "$line" && continue
  let "i++"
  cache+=("$line")
done < hoge.log
echo $i

問7 このログのUU(ユニークユーザー)数を表示しろ

またユニークあるんだったら、今度は連想配列で。
declare -A uids
IFS=","
while read server t uid dest; do
  uids[${uid}]=1
done < hoge.log
echo ${#uids[@]}

問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ

だんだんbashで書くのが面倒になってきた(汗
declare -iA dests
IFS=","
while read server t uid dest; do
  dests[${dest}]+=1
done < hoge.log
declare -i max=0
for dest in "${!dests[@]}"; do
  ((max >= dests[${dest}])) && continue
  max=${dests[${dest}]}
  d=${dest}
done
echo ${max} "${d}"

問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ

ソートしろとか言われてないのでこれで許してください
declare -iA servers
IFS=","
while read server t uid dest; do
  servers[${server}]+=1
done < hoge.log
for server in "${!servers[@]}"; do
  echo ${servers[$server]} ${server/server/xxx}
done

問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ

なー、なんとまたソートしなきゃじゃん。めんどー。ちゃんとしたソート関数定義しておけばよかったorz
declare -A uid_set
IFS=","
while read server t uid dest; do
  [[ ${uid} -ge 10 ]] && uid_set[${uid}]=${uid}
done < hoge.log
declare -ai uids
uids=("${!uid_set[@]}")
declare -i i j
for ((i=0; i < ${#uids[@]}-1; i++)); do
  for ((j=1; j < ${#uids[@]}-i; j++)); do
    ((uids[j] < uids[j-1])) || continue
    u=${uids[j-1]}
    uids[j-1]="${uids[j]}"
    uids[j]="$u"
  done
done
for ((i=0; i<${#uids[@]}; i++)); do
  echo "${uids[i]}"
done

prometheusのrate()関数の罠

 久しぶりのAdventカレンダー挑戦、うまくいく気がしません。 閑話休題。実のところ、rate()関数というよりは、サーバー側のmetric初期化問題です。 さて、何らかのサーバーAがあったとして、それが更に他のサーバーBにRPCを送っているとします。サーバーBの方でホワイトボ...