皆様こんにちは。
アメリカにビザ持ちで入国するときに記入が必要だったI-94が電子化されました。僕は電子化された直後にアメリカに来たのですが、DeltaのCAはまだ電子化のことを知らなかったみたいで、わざわざ紙のI-94を機内で書きました。せっかく書いた紙のI-94は入国審査時に目の前でビリビリに破かれました。
さて、I-94 が電子化されたのなら、従来言われていた「SSNの申請は入国してから10日ぐらい経ってからじゃないとデータがないって追い返される」というのはもうないんじゃないか、ということで入国4日後に SSA オフィスに行ってみました。
すると何やら画面を操作して手続きを進めてる様子。これはすんなり行くかと思ったらまさかのどんでん返し。「DHSに登録されてる誕生日とお前のパスポートの誕生日が違うからダメ」と。意味わかんねーよ。どうすりゃいいのよと聞いたところ「DHSに登録されている情報が修正されるのを待て。もしダメだったら手紙が行くからね」と。
最終的にはそれから10日後ぐらいに郵便で届きましたが、やっぱり10日ぐらい経ってから行ったほうがよかったのかもしれません。
2013-06-16
2013-04-01
転勤のご挨拶
このたび5月13日付けでアメリカ Google Inc. の Mountain View 本社で働くことになりました。 Google 日本法人は退社という形になるので、世間一般で言う転籍にあたるかと存じます。
皆様には、今まで公私にわたり大変お世話になり感謝しております。インターネットに国境なんて無いし、毎年1回ぐらいは帰国する予定でいるので、これからも変わらずお付き合い出来るかと思います。というわけで、これからもよろしくお願いいたします。
取り急ぎご報告まで。
(追記) いわゆる栄転じゃありません。うちの部署の性質上、転勤できる場所が限られているのでたまたま本社になっただけです。
皆様には、今まで公私にわたり大変お世話になり感謝しております。インターネットに国境なんて無いし、毎年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がすげー使い辛くて困ってます。
まー、それは許すとしても(もとい、依然として解決策不明なので)、じゃー手でウィンドウをリサイズしようとすると、リサイズ中はカラム数が分からない。何という無理ゲー。これは既にBugが上がってて、解決策も乗ってます。
デフォルトでオンにしておいて欲しい。
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で設定マネージャが起動するので、左のカテゴリから「ユーティリティ」を選択、「Resize Info」というのがあるので、それを有効にすれば解決です。
ccsm
デフォルトでオンにしておいて欲しい。
MyUnityがデフォルトでインストールされない
徹底的に設定ツールはデフォルトでインストールしない方針なのでしょうか。大して設定する項目があるわけじゃないけど、とりあえずインストールされててもいいんじゃないかと。2012-07-28
シェル操作課題への回答
http://d.hatena.ne.jp/Yamashiro0217/20120727/1343371036
シェル操作課題ということで bash のみでやってみた。CSVじゃなくてあくまでもカンマ区切りということでクォーティング処理とかは全くなし。ファイル名が与えられてないので、すべてhoge.logとします。
シェル操作課題ということで 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でソートして表示しろ
なー、なんとまたソートしなきゃじゃん。めんどー。ちゃんとしたソート関数定義しておけばよかったorzdeclare -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
2012-04-25
花粉症の薬がジェネリックだった
(妻の実家の)近所の病院に行ったら、何の選択肢も示されず「薬出しておきます」と。で、出てきたのがジェネリック医薬品だった。医療費抑制のためなのだろうか。
ちなみに、ここら辺には調剤薬局があるものの、どこも院内処方らしい。これまた医療費抑制のためなのだろうか。
ちなみに、ここら辺には調剤薬局があるものの、どこも院内処方らしい。これまた医療費抑制のためなのだろうか。
登録:
投稿 (Atom)
prometheusのrate()関数の罠
久しぶりのAdventカレンダー挑戦、うまくいく気がしません。 閑話休題。実のところ、rate()関数というよりは、サーバー側のmetric初期化問題です。 さて、何らかのサーバーAがあったとして、それが更に他のサーバーBにRPCを送っているとします。サーバーBの方でホワイトボ...
-
http://d.hatena.ne.jp/Yamashiro0217/20120727/1343371036 シェル操作課題ということで bash のみでやってみた。CSVじゃなくてあくまでもカンマ区切りということでクォーティング処理とかは全くなし。ファイル名が与えられてないの...
-
CVE-2014-6271 の件について、何かわかってない記事が散見されるので簡単にまとめ。 問題点 環境変数が特殊な文字列の場合、Bash はそれを関数定義とみなす(この仕様がそもそもどうなのよ、と思う人は/bin/shをbashにするのはもうやめましょう)。そのロジ...
-
皆様にご報告です。この度、縁あって11月23日に結婚することとなりました。 つきましては、お友達の皆様の中で2次会に参加していただける方はお手数ですが 11月8日までに 下記メールアドレスに以下の要領でご連 絡をください。 宛先:nijikai.2007.11.23@gmail....