Rails 感想と再入門しないと

久しぶりに新しいサービスを作ろうかという事になり、最新のRailsでやろうとしたのですが・・・
今のRailsの最新は 2.3.4 ですか。えらい変わってますね。
家のLinuxマシンでgem listすると、以下のように古いRailsがたくさんって感じです。

rails (2.1.0, 2.0.2, 1.2.3, 1.2.1, 1.1.6, 1.1.4, 0.14.3, 0.14.2, 0.13.1, 0.12.1)

0.12.1なんて、リリースは2005年4月ですか。確かにいろいろ調べたのは、2005-2006年頃だな。某Rails本の著者が知り合いのところに居候していて、いろいろ教えてもらったりとか。前のサービスは1.2.3で作ってリリースしたはず。それから2年以上経ってるんだし、そんなもんかな。Railsも完全にメジャーになったしなぁ。

しかし、2.0で大きく変わって、最新の2.2->2.3でもいろいろ変わってるようで、これは再度勉強し直さないといけない。

アクセスログをAWKで処理

アクセスログの、特定のアクセスパターンを調べたいときにAWKで処理しているのですが、時々、携帯キャリア毎に調べたい時があります。User-Agentを見て振り分けてもいいのですが、どうも偽装されてるものとかがあります。そこで、携帯キャリアの公開しているIPレンジからマッチングをしたいと思うと、rubyとかperlでちょろっと書く方が早いはず。でも、さっと調べるならawkが楽。それに、困って調べるサーバは、大抵rubyが入ってない事もあるし、他人のサーバでむやみにrubyとかperlのモジュールを入れられない。でもGoogleさんに聞いてもawkでIPの処理を書いてるのはみかけない。

そこで、何処にでも入っている awk (gawk) のみで処理させたい。

で、書いてみた。条件は、

    • awk (gawk) のみを使う
    • マッチ処理は、ビット処理で比較のみに(でないとギガ単位のログは食わせられない)
    • 携帯キャリアのIPレンジは別ファイルで管理
    • キャリア毎に、メソッド毎に、5分単位で集計
#!/bin/awk -f
#

function ip2bin(address){
  split(address,ip,".")
  return lshift(ip[1],24) + lshift(ip[2],16) + lshift(ip[3],8) + ip[4]
}

function ip2mask(address,mask) {
  return sprintf("H%x",lshift(rshift(address,(32 - mask)),(32 - mask)))
}

function is_match(ipaddr, iparray) {
  result = 0
  for (var in iparray) {
    split(iparray[var],a,":")
    ip_s = ip2mask(ip2bin(ipaddr),a[2])
    if (ip_s == a[1] ) {result = 1; break}
  }
  return result
}

function is_mobile(ipaddr) {
  career = "PC"
  if (is_match(ipaddr, ip_docomo))   {career = "DoCoMo"}
  if (is_match(ipaddr, ip_kddiau))   {career = "KDDIAU"}
  if (is_match(ipaddr, ip_softbank)) {career = "SoftBank"}
  if (is_match(ipaddr, ip_emobile))  {career = "Emobile"}
  return career
}

function get_asso_time(time) {
  split(time, time_a, ":")
  min = time_a[3] - time_a[3] % 5
  return sprintf("T%s%02d",time_a[2],min)
}

function get_method(method) {
  split(method, m_a, " ")
  return m_a[1]
}

BEGIN {
  FS = "/"
  while (getline < "mobile_docomo.lst"   > 0) ip_docomo[++n]   = ip2mask(ip2bin($1),$2)":"$2
  while (getline < "mobile_kddiau.lst"   > 0) ip_kddiau[++n]   = ip2mask(ip2bin($1),$2)":"$2
  while (getline < "mobile_softbank.lst" > 0) ip_softbank[++n] = ip2mask(ip2bin($1),$2)":"$2
  while (getline < "mobile_emnet.lst"    > 0) ip_emobile[++n]  = ip2mask(ip2bin($1),$2)":"$2
  FS = " "
  car[1] = "PC"
  car[2] = "DoCoMo"
  car[3] = "KDDIAU"
  car[4] = "SoftBank"
  car[5] = "Emobile"
  met[1] = "GET"
  met[2] = "POST"
  met[3] = "HEAD"

  printf("T[Time]\tAll")
  for (c = 1; c <= 5; c++) {
    for (m =1; m <= 2; m++) {
      printf("\t%s %s",car[c],met[m])
    }
  }
  printf("\n")
}

{
  gsub(/"/,"",$6)

  time = get_asso_time($4)
  mobile = is_mobile($1)
  method = get_method($6)

  count[time] += 1

  if (count[time] == 1) {
    for (c in car){
      for (m in met) {
        carmet_count[time,car[c],met[m]] = 0
      }
      car_count[time,car[c]] = 0
    }
  }

  car_count[time,mobile] += 1
  carmet_count[time,mobile,method] += 1
}

END {
  n = asorti(count,dest)
  for (i = 1; i <= n; i++){
    printf("%s\t%d", dest[i],count[dest[i]])
    for (c = 1; c <= 5; c++) {
      for (m =1; m <= 2; m++) {
        #printf("\t%s %s : %d\n",car[c],met[m], carmet_count[dest[i],car[c],met[m]])
        printf("\t%d",carmet_count[dest[i],car[c],met[m]])
      }
    }
    printf("\n")
  }
}

携帯キャリアのIPレンジのファイルは、以下のような感じで用意。これは DoCoMoさん

210.153.84.0/24
210.136.161.0/24
210.153.86.0/24
124.146.174.0/24
124.146.175.0/24
202.229.176.0/24
202.229.177.0/24
202.229.178.0/24

メモ

    • 変数の初期化とか、いまいち納得できてないが、とりあえず動くようにした
    • 変数のスコープとかも良くわからん
    • 数値は大きいと浮動小数点で持つことになり、配列につっこんで取り出すとおかしくなった
    • 連想配列で数字の変数もおかしくなるようなので、先頭に H とか T とつけてごまかした
    • 連想配列って、for で取り出すと順番保持されてないのね
    • gawkの拡張を一つ使ってみた asorti
    • やっぱrubyって便利だと実感

チェーンのとんかつ と 専門店のとんかつ

昨日、遅い昼食で、新しい経団連ビル地下の某とんかつ屋チェーンに入った。
最悪!
衣は雑、油切れてなくべったり。出てきたものをパッと見てウエーと思ったぐらい。案の定、味もダメで、なぜか味噌汁とかも微妙に甘くて?チェーンなのに味が違う気がした。同じチェーンで渋谷の店とかだとこんな事はなく、こんな思いをしたのは始めてでした。
あと、店の奥で、マネージャーかわからんけど、怒鳴ってて雰囲気最悪。フロアの店員さんは、普通に接客してて感じは良いのだけど、たぶん一番偉い人と思われる人が全部ブチ壊してる感じです。


で、今日は、別のちゃんとした専門のとんかつ屋でリベンジです。
http://doumon.jp/
何時もながら、とっても美味しい。店も落ち着いている。さらに、こちらの方が安いというのは何故?

ESXi 4.0 と Windows 7

ESXi 4.0を評価しようと入れてみたところ、Windows7で管理クライアントのVMWare vShere clientが動きませんでした。xmlのエラーとか出ます。
対応は、こちら http://communities.vmware.com/thread/211440
Windows 7 は未だRCなんだからとか書かれてますが、結局製品版も同じだったという事ですね。

1. 他のXPとかのマシンから.NET関連のライブラリをコピーする
%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\System.dll


%ProgramFiles%\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\Lib
にコピーしました。 Lib ディレクトリは作ってます。

2. VpxClient.exe.config に追記する
... の部分を追加

  

...



 

3. DEVPATH という環境変数で、1.のライブラリのPATHを指定
これは、ユーザ環境変数の所に設定しておけばOK