RubyでHashのsort
アクセスログをとっているのですが、そろそろどんな感じか整理してみようということで、Rubyでスクリプトを書いてみました。データの保管にはPStoreを使っているので、プログラムにはHashをいじっているのと同じ感覚でログの抽出操作ができるのです。
で、ここで問題となるのがHashのソート。今回はHashのキーにURL、値にアクセス回数が入っているものとして、アクセス回数の多いものを優先に、かつ、回数が等しいものはアルファベット順に整理してみることにしました。
この機能は次のコードで実現できます。
hash = {'http://www.yahoo.co.jp/' => 3, 'http://www.google.co.jp/' => 3, 'https://fenrir.naruoka.org/' => 5}
hash.to_a.sort{|a, b|
(b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
}
# => [['https://fenrir.naruoka.org/', 5], ['http://www.google.co.jp/', 3], ['http://www.yahoo.co.jp/', 3]]
hash.to_a.sort{|a, b|
(b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
}
# => [['https://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』
コメント
Apacheのログを管理するツールのようですね。自分でつくると見栄えまわりがどうもしょぼくなってしまうので、近日中にこれをいれてみようかと。
また来てね~。
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。
田島です。
お。結構カスタマイズしてるね。かっこえーじゃん。
アクセスログ解析、自分で書くのもいいけど(俺も自分で書こうとしてパイチャートのFlashまで作ったのに途中で飽きてやめちゃいました。)
これが結構いいかもよ。
http://awstats.sourceforge.net
そいじゃ、これからもちょくちょく見に来まーす。
Posted by: tomo : October 29, 2003 12:22 AM