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

2012-04-25

花粉症の薬がジェネリックだった

(妻の実家の)近所の病院に行ったら、何の選択肢も示されず「薬出しておきます」と。で、出てきたのがジェネリック医薬品だった。医療費抑制のためなのだろうか。

ちなみに、ここら辺には調剤薬局があるものの、どこも院内処方らしい。これまた医療費抑制のためなのだろうか。

2012-01-01

2011年を振り返る

昔は、毎年年末に「今年を振り返って」というタイトルで書いてたのですが、気がつくと年を越してることが多く、2年連続で昨年を振り返るバージョンになってしまいました。

仕事編

  • 3月11日、あまり自分にできることがなかった。なんかもっとできることがあったかもしれない
  • 2011年も年末はオンコール(障害対応のため待機)だった。2010年末はプライマリーだったけど2011年末はそのバックアップだったのでいくらかはましだったけど、PCを常に持ち歩かなければならなかったことに変わりはない。
  • チームメンバーが増えた。
  • 途中でオンコールのシフトが12:00~24:00(アメリカが夏時間中は11:00~23:00)になった。結構つらい。
  • 組織改編でいろいろあったし、マネージャーも変わった。
  • 勤続5年になった。気が付いたら周りは知らない人だらけみたいな感じ。
プライベート編
  • 3月11日、地震の約1時間前に姉のところに甥っ子が生まれた。姉は関東にいたので直接的な被害はなかったけど、その後の水探し、新生児用オムツ探しと大変だった。
  • オープンソース?それ新しいソース?的な、OSS界隈では何もしない1年だった。
なんというか、個人的には大きな変動のない1年でした。嵐の前の静けさ?今年1年が、自分にも皆さんにも良い年であるよう願っています。

2011-11-12

今、永福町のピザ戦争が熱い!

永福町にはピザで結構有名なラ・ピッコラ・ターヴォラといイタリアンレストランがあります。そこを有名にしたのがピザ職人のマッシモさんで、Google検索で「らぴっこら」まで入力したらサジェスト候補に出てくるぐらい有名です。

ところがこのマッシモさん、独立して自分の名を冠した店MASSIMOTTAVIO(マッシモッタヴィオ)を先日オープンしました。そしてその場所がなんとラ・ピッコラ・ターヴォラから徒歩1分、目と鼻の先です。名前・立地からして暖簾分けではないようです。お店の前の立看板ではマッシモさんの名前を強調してたので、まずはマッシモさんの名前で売っていくようですね。

さて一方のマッシモさんの抜けたラ・ピッコラ・ターヴォラ、彼の抜けた穴は大きく、一時期はメニューを変えざるをえない状況にまで追い込まれていたのですが、すぐにイタリアから新たなピザ職人を獲得、以前のメニューに戻し(というか包みピザとかいうメニューが増えてました)迎撃体勢を整えています。さらには、食べログではサービスの評価があまり高くなかったのですが、そこの弱点を克服すべくホールのスタッフを増員(今まで3人だったのが5人に増えた)して準備万端です。

中の人達は色々と大変かとは思いますが、両者が味・価格・サービスで競ってくれるのであれば、消費者としては嬉しい限りです。近隣の方々は是非、このピザ戦争を楽しんでくたらと思います。

2011-07-13

ボタンを増やしてみた

いつのまにかテンプレートにtwitterやFacebookなどの共有ボタンがあったので、手で編集してたテンプレートを元に戻し、テンプレートそのままを使うように変更しました。

2011-06-01

+1 ボタン付けてみました

せっかくなので+1ボタンを付けてみました。ついでにテンプレートも変更して見た目も変えてみました。

2011-05-26

台湾(2)

台湾に行って思ったことパート2

魯肉飯はお店によって味が違う。昨日のお昼に食べたのは大したことなかった。日本でも台湾系の中華料理屋なら食べられるところもあるらしい。こんど日本にいる台湾人にでも会ったら聞いてみようと思う。

日本も繁体字に戻せばいいと思う。もうどうせ手書きしなくなるんだから、それだったら繁体字にしちゃえばいいよ。それでも(今となっては)意味の違う漢字や日本では使ってない漢字なんかも一杯あるだろうけど、日本も繁体字にしておけば今より少しだけ、コミュニケーションが取りやすくなると思う。個人的には、予想以上に繁体字が認識できた(けど意味は分からなかった)のだけど、同僚(特に日本で生まれてないけど漢字が読み書きできる人)とか見てると、やっぱり漢字は統一されてた方がいいのではないかと強く思いました。

prometheusのrate()関数の罠

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