October 28, 2003

RubyでHashのsort

アクセスログをとっているのですが、そろそろどんな感じか整理してみようということで、Rubyでスクリプトを書いてみました。データの保管にはPStoreを使っているので、プログラムにはHashをいじっているのと同じ感覚でログの抽出操作ができるのです。

で、ここで問題となるのがHashのソート。今回はHashのキーにURL、値にアクセス回数が入っているものとして、アクセス回数の多いものを優先に、かつ、回数が等しいものはアルファベット順に整理してみることにしました。
この機能は次のコードで実現できます。

hash = {'http://www.yahoo.co.jp/' => 3, 'http://www.google.co.jp/' => 3, 'http://fenrir.naruoka.org/' => 5}
hash.to_a.sort{|a, b|
    (b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
}
# => [['http://fenrir.naruoka.org/', 5], ['http://www.google.co.jp/', 3], ['http://www.yahoo.co.jp/', 3]]

これで目的のソート済み配列([[key, value], [key, value],…]の二重配列になっています)が得られるので、後はeachかなんかでイテレーションすれば目的の操作ができると思います。
いちおう解説すると、to_aでHashのArray化⇒[[key, value], [key, value],…]の二重配列ができる⇒sortする、sortのブロック内の戻り値が大きい順に配列は並び替えられる、という手順をとっています。

今回作成したスクリプトの成果は、右上のカウンタをクリックしてみてください。アクセスログが見られます。

あと、こんなサイトを見つけました。ドキュメントがしょぼいRubyにとっては初心者の方には役に立つかも。
『逆引きRuby』

23:38 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/61
コメント

田島です。
お。結構カスタマイズしてるね。かっこえーじゃん。

アクセスログ解析、自分で書くのもいいけど(俺も自分で書こうとしてパイチャートのFlashまで作ったのに途中で飽きてやめちゃいました。)
これが結構いいかもよ。
http://awstats.sourceforge.net

そいじゃ、これからもちょくちょく見に来まーす。

Posted by: tomo : October 29, 2003 12:22 AM

Apacheのログを管理するツールのようですね。自分でつくると見栄えまわりがどうもしょぼくなってしまうので、近日中にこれをいれてみようかと。
また来てね~。

Posted by: fenrir : October 29, 2003 07:00 PM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。