2013-12-01

配列 - Bash Advent Calendar - Day1

毎日続くかどうかわかりませんが、できる限り続けていきたいと思います。

さて、何から書いていいかわからないので、とりあえず最初は A から始まる単語はないかと探してみたところ、alias, array, associative array, argument, arithmetic evaluation と、とりあえず数日はいけそうな感じ。

というわけで今日は配列について。

まず注意点として、配列は sh にはない Bash 独自の機能です。なので #!/bin/sh で書き始めてあるスクリプト内で使うと、後々困ることがあるかもしれなので要注意。そもそも /bin/sh が Bash ってどうなのという議論は勝手にやりたい人だけがしてください。

変数の宣言、初期化

ちょっとかしこまった宣言

普段目にすることはあまりないかもしれませんが、C 言語出身者が好むスタイル(偏見100%)。
$ declare -a foo
これで変数 foo は配列変数になります。

変数には初期値を入れた明示的な初期化が必要と考える、gccマンセー、もしくはC++出身者であれば(これも偏見100%、以下同じ)
$ declare -a foo=()
で、同じ中身が空の配列変数が宣言されます。

ちなみに、想像で適当に書いてるので、実際にこんな空の配列を使ってるのを見たことは一度たりともありませんw

値の代入による初期化

普通の変数の場合、わざわざ宣言などせず、いきなり値を代入しますよね。配列変数においても同じです。ある書式にのっとって値を代入すれば勝手に配列変数になります。
$ foo=("bar" "baz")
中身が実際にどうなってるかを確認したい場合には、
$ declare -p foo
declare -a foo='([0]="bar" [1]="baz")'
というように declare -p を使いましょう。ちゃんと declare -a と配列変数になっているのが分かります。配列のインデックスもこれで確認できます。

さて、配列のインデックスが出てきたのでもう一つ。初期化時に、インデックスを指定することもできます。上の declare -p の出力から類推できるように、
$ foo=([1]="bar" [3]="baz")
$ declare -p foo
declare -a foo='([1]="bar" [3]="baz")'
とすることで、特定の位置に値を代入できます。またこの例から分かるように、インデックスは飛び飛びでも構いません。

最後にもう一つ、あまりおすすめしませんが
$ foo[1]="bar"
$ declare -p foo
declare -a foo='([1]="bar")'
という形の代入でも配列変数を作成できます。これは、本来は foo という配列変数が既に存在しているときにその値を書き換えるものです。なので、これを初期化に使ってしまうと、foo という変数がそれまでに初期化されてないのがバグなのか、それともこれが意図したものかが分かりづらくなってしまいます。

値の代入、追加

初期化時に値を代入する方法は既に述べました。ここでは既存の配列に値を追加、配列内の値を変更する方法について述べます。

まず、初期化の最後で述べた通り、
$ foo=("bar" "baz")
$ foo[1]="qux"
$ declare -p foo
declare -a foo='([0]="bar" [1]="qux")'
変数名に続けてインデックスを指定することで、特定のインデックスの値を変更、または挿入することができます。

"+=" を使って複数値をまとめて追加することもできます。
$ foo=("bar" "baz")
$ foo+=("qux" "quux")
$ declare -p foo
declare -a foo='([0]="bar" [1]="baz" [2]="qux" [3]="quux")'
"+=" は配列の末尾に与えられた配列を追加するので、その応用として
foo=("a" "b")
for ((i=0;i<10;i++)); do
  foo+=($i)
done
のように、値が1個だけの配列を使って、値を末尾に追加するのはよくあるパターンです。

一度たりとも使ったことがないし、他の人が使ってるのも見たことがないのですが、右辺の配列にインデックスが指定されていれば、その値が尊重されます。すなわち
$ foo=([0]="bar" [2]="qux")
$ foo+=([1]="baz" [3]="quux")
$ declare -p foo
declare -a foo='([0]="bar" [1]="baz" [2]="qux" [3]="quux")'
と配列のマージができるのですが、インデックスが重複した場合の挙動がお節介
$ foo=([0]="bar" [2]="qux")
$ foo+=([0]="baz" [1]="quux")
$ declare -p foo
declare -a foo='([0]="barbaz" [1]="quux" [2]="qux")'
だったり、そもそも
$ foo=([0]="bar" [2]="qux")
$ foo+=("baz" "quux")
$ declare -p foo
declare -a foo='([0]="bar" [2]="qux" [3]="baz" [4]="quux")'
と挙動が違う、すなわち ([0]="baz" [1]="quux") と ("baz" "quux") が等価ではない時点で糞仕様認定は避けられません。

予想外に長くなったので、明日に続く。

追記

この手のIT系 Advent Calendar の定番だと毎日違う人が担当したりしますが、俺が一人で勝手にやってるだけなので、他に Bash Advent Calendar を担当している人はいません。

というわけで、一日で完結しないなんて当たり前w

追記その2

拡張 POSIX シェルスクリプト Advent Calendar 2013とかいうのを見つけたので、有用なのを探している方はこんなのよりそちらへどうぞ。


2013-09-23

アメリカのオンラインバンキング

なんか進化の方向が間違ってる。

相変わらずの小切手文化のまま IT 化が進んでます。この前銀行にの窓口に用があって行ったのですが、となりの窓口のにーちゃんがしきりに「スマホでできるよ、写真をとってうんたらかんたら」と顧客に説明してました。

話からして多分小切手の換金ができるんじゃないかな、そういえば俺も換金してない小切手があったなとスマホアプリをインストール、小切手の換金ができるかどうか試してみました。

小切手をそのアプリ内の写真機能で撮ると画像認識処理が走り、やれ枠内に収まってないとか、裏書きが認識できないとか教えてくれます。そしてちゃんとした写真が撮れると前に進めて、やっとアップロード完了。多分処理時間からして、小切手の発行元の口座番号あたりは事前に判別してそうな感じです。スマホアプリも進化したね。

でも、なんか日本での感覚からするとおもいっきり何かが間違ってる感じがします。普通に振り込んでくれればいいんじゃないかと。システムとか手数料体系が小切手文化に合わせてあるっぽいので、振込の方が手数料が高そうだけど、明らかに小切手を使ったやり取りのほうが人的コストが掛かってるよね。

きっと何年も住んでるうちに慣れてしまうのだろうけど、今の時点では何かおかしなことをやってる感がぬぐえません。

Raiders完敗

MNF は地区内ライバルのデンバー戦でしたが、P. Manning はファンブルロスト以外ほぼ完璧、なすすべなしでした。T. Branch 一人欠けたからとかそんなレベルじゃなかったようです。おまけに D. McFadden のランも完全に封じられて攻守ともに完敗です。

相手は3戦全勝で早くも地区優勝は厳しい感じなので、後はワイルドカード争いに加われるかというのがポイントになってくるかと思います。

2013-09-11

NFL 2013-2014 シーズン開幕

NFLって書いたけど、Raiders以外のはノーチェックです。

さて、我らがRaidersは残念ながら黒星発進です。最後まで惜しかったですが、Red Zoneで2度もインターセプトされてたら勝てる試合も勝てません。

さて、次週は Jaguarsとの対戦なのですが、いきなりリーグ最下位決定戦とか言われています。というのもESPNのランキングで我らがRaidersがブービーの31位、そして相手のJaguarsがドベの32位だからです。

どうせ弱いなら負けに負けまくって、来年のドラフトで頑張るしかないですね。

ブログの見た目をちょっと変更

Google+への統合が進んだらしいので、設定見直しのついでにゴテゴテとガジェットを追加してみました。

とりあえず上部にある検索バーが超絶カッコ悪い気がしますが、とりあえずはこのままでいこうかと思います。

2013-06-19

免許取れました

今日は Redwood City の DMV で実技試験を受けてきました。10:30の予約で10:15に受付、1時間待って11:20からやっと試験。さらっとスケジュール表を(盗み)見た感じ、10:30(からの30分)の予約枠には6人いたようですが、試験官が2人で試験に30分かかります。何かがおかしい。さらに、試験官2人は車体検査の担当を兼務しているみたいで、かつそっちの方がが優先のようです。私は同じ予約枠の中では2番目ぐらいでこの有り様なので、同じ枠の最後の人は12:30ぐらいからテストだったんじゃないでしょうか。

さて肝心の試験ですが、試験官は母親が日本人で本人も日本に20年住んでたとかで日本語ペラペラ。試験の説明書も英語/日本語の2か国語バージョンでした。ペーパーテストが日本語で受けられるのは知ってましたが、実技試験も頼めば日本語でできるのかもしれません。

もとい、私は特にリクエストしたわけじゃないのですが、名前がどっからどうみても日本人ということで「英語と日本語のどっちがいい?」と聞かれました。実技試験という他に頭を使う余裕があまりない状況ですので、「日本語でお願いします」と即答しました。

この日本語を話せる試験官のおかげで大変助かりました。正直、英語で試験してたら落ちてたかもしれません。他の州は知りませんがカリフォルニでは15点減点まではOKなのですが、なんとか10点減点で収まり無事合格です。

なお、その10点減点のうち7点は停止時の前の車との車間の短さと一旦停止時の停止線までの距離の短さでした。言い訳をすると、急遽前日に車が変わったのでブレーキが(前の車と比べて)効きにくかったんです。それは分かってたことなのでもうちょっと気をつけるべきだったのですが、予想外に減点されてました。残りは車線変更での後方確認不備(もっとちゃんと首振って確認しろ)が2回と、後退時の後方確認不備でした。

ちなみに縦列駐車はなかったです。戦々恐々としてたのに拍子抜けです。英語で試験、かつ縦列駐車のチェックがあったら試験に落ちてたと思います。

2013-06-16

レンタカーで運転免許試験を受ける予定

さて、国土が広いアメリカでは車が必須なわけでして、このたび運転免許の実技試験を受ける予定です。この実技試験、日本との一番の違いは自分の持ち込んだ車で試験の受けることです。慣れた車で試験を受けられるっていいですよね。日本と違い、身分証代わりにとりあえず取っておくなんてことはないので、家族の誰も車を持ってないのに免許を取るなんてシチュエーションはそうそうないんでしょう。

で、当初の予定では、実技試験を受ける頃には新車を既に購入しているはずだったのですが、なんだかんだでまだ自分の車がありません。そんなわけで渡米後から借りてるレンタカーを延長し、そのレンタカーで試験を受けることになります。

さて、ここで問題発覚。なんといわゆる車検証がありません。実技試験に車を持ち込むにあたっては車検証と自賠責が必要なんですが(追記を参照のこと)、そういえば自賠責の保険証もないよ!

というわけで期限延長の電話をしたついでに「車検証ないけどどうしたらいいのさ」って聞いてみたところ、「借りたとこに行ってね」という素晴らしいお返事が。うそーーーーーーーーーーーーーーーーん、車を借りたのはSFO空港なんですけど。

そんなこんなで今日はSFOまでドライブしてきました。ここでも色々あって2時間ぐらいかかったんですが、もう書く気力もありません。

とりあえず教訓としては借りるときにちゃんと確認しておくと。それと、レンタカーの窓口で車を実技試験に使うとちゃんと申告しておくことです。自賠責の保険証も今は手元にあるのですが、「借主はこの車の自賠責保険でちゃんとカバーされますよ」的な手紙を貰えました。この手紙はレンタカー会社の支店ならどこでも発行してくれるとは思いますが、最初に貰っておいて損はないでしょう。

ちなみに、まだ解決されてない問題がありまして、明日は朝からまた近所のレンタカー屋さんですorz

[追記]
その後、今度は車が故障して車体交換したのですが、やっぱり車検証(vehicle registration)がない。でそれじゃ困るって話をしたら Hertz の優しいお兄さんがどこかに電話して確認してくれました。曰く、保険に入ってる証明書さえあればレンタカーはOK(ただし、ライセンスプレートがちゃんとしてること)だよと。実際、大丈夫でした。

結論としては、何はなくとも「使用者は車の保険でカバーされます」というペーパーをちゃんと貰えばOKということです。

prometheusのrate()関数の罠

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