Hatena::Grouprubyist

Rubyを勉強しようと思ってはじめた日記

2008-04-30

SQLで集計してランキングを出す(0.2)

| 07:38 | SQLで集計してランキングを出す(0.2) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - SQLで集計してランキングを出す(0.2) - Rubyを勉強しようと思ってはじめた日記 SQLで集計してランキングを出す(0.2) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

10個に並び替え

select url,count(*) from entry GROUP BY url limit 0,10;

違うなあ。調べてみよう!

調べてみた

GROUP BYのとき、集計した値で条件付けをしたい場合、HAVING句というのがあるらしい。

あと、昇順とかは別な方法もあるらしいので、これを試しにやってみる。

ninjatottorininjatottori2008/05/01 01:14こんなんどうでしょ?

select top 10 url,count(url) from entry group by url order by count(url) desc;

top句というのを使うといいと思います。
havingはgroup byした後のwhereと私は理解してます。

d4-1977d4-19772008/05/03 09:56ありがとうございます!お返事が遅くなりました。top句というのがあるんですね。なるほど。調べてみて試してみます。

2008-04-28

SQLで集計してランキングを出す(0.1)

| 13:13 | SQLで集計してランキングを出す(0.1) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - SQLで集計してランキングを出す(0.1) - Rubyを勉強しようと思ってはじめた日記 SQLで集計してランキングを出す(0.1) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

とりあえず集計してしまえばこっちのものかも?

ということに気づいた。

select url from entry,count(url) GROUP BY url;

という感じかな?手元に何もないので、今度試す。

追記:実際に試したらエラーでした...。

2008-04-27

SQLで集計してランキングを出す(0)

| 20:24 | SQLで集計してランキングを出す(0) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - SQLで集計してランキングを出す(0) - Rubyを勉強しようと思ってはじめた日記 SQLで集計してランキングを出す(0) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

書いてから思ったんですが、SQLというかデーターベースに疎いのでSQLでどうやったら集計できるのか?から調べることになりそうです。いいお勉強になりそうです。

参考

Rubyでアクセス解析をする(0.73)課題

| 19:58 | Rubyでアクセス解析をする(0.73)課題 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.73)課題 - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.73)課題 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Apacheのログファイルの内容をMySQLに登録することは出来ました。ということで、次の課題。

課題を思いついたのですが、とくにランキングは欲しい機能です。これを先にやらないと!

UTF8の文字列がログにありそこがエンコードされたままで記録されている

ログにUTF8の文字列があります。この文字列は、エンコードされた状態になっているのでこれをデコードしたい

ランキングを出したい

Rubyでアクセス解析をする(0.72)例外処理を加えてみる

| 18:56 | Rubyでアクセス解析をする(0.72)例外処理を加えてみる - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.72)例外処理を加えてみる - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.72)例外処理を加えてみる - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

例外処理を加えてみて、エラーの内容を明確にしてみようと思いました。

例外処理を付け加えてみた

while text = logs.gets do
/^([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^ ]*)(?: *([^ ]*) *([^ ]*))?" ([^ ]*) ([^ ]*) "(.*?)" "(.*?)"/u =~ text
    begin
    entry = Entrys.new
        entry.url = $6
        entry.ref = $10
        entry.ua  = $11
        /^(.*)\/(.*)\/(.*):(.*):(.*):(.*) \+0900/ =~ $4
        at_time = Time.local($3, montn_array[$2], $1, $4, $5, $6)
        entry.access_date = at_time
    entry.save
    rescue => ex
        print ex,' : ',text
    end
end
logs.close

するとエラー内容が判明しました。エラーが発生しなかった部分については、きちんと、MySQLに登録されてました。

エラー内容

ruby setup.rb 
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:21:12 +0900] "GET /tag/\x93n\x95\xd3 \x89p\x8bP HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:21:17 +0900] "GET /tag/TEAM NACS HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:22:52 +0900] "GET /tag/\x8a\x94\x8e\xae\x89\xef\x8e\xd0 \x9a\xe6\x8ei\x8a\xe2 HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:25:02 +0900] "GET /tag/INFOBAR 2 HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"

うん?「NetTracker/7.5 Enterprise」というのがおかしいのかな?とりあえず、エラーの内容がわかりました。原因究明はまた別のときにします(おそらく正規表現で取得できた値が、nilなんだけれど、intに変換できないよ!というエラー)

Rubyでアクセス解析をする(0.71)

| 18:21 | Rubyでアクセス解析をする(0.71) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.71) - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.71) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

昨日、アクセスログをデータベースに登録できました。きちんと登録できたかどうか確かめてみることにしました。

まず、アクセスログのファイルは何行があったのか確認。

$ wc -l access_log 
10827 access_log

10827行。じゃあ、登録できた数は?

mysql> select * from entry;
1548 rows in set (0.07 sec)

うん?かなり少ないです。エラーが出ていたので、そこで処理がとまってしまったようです。そこで一旦登録された情報を削除。

delete from entry

ということで、少し考え直し。

2008-04-26

Rubyでアクセス解析をする(0.7)データベースに保存する

| 16:53 | Rubyでアクセス解析をする(0.7)データベースに保存する - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.7)データベースに保存する - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.7)データベースに保存する - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

テーブル定義

  • 初めてDBを使うのでよくわからないけれど、定義してみた
  • これでいいかはわからないけれど、あれこれしてみようと思います
create table entry(
 entry_id int auto_increment primary key,
 url text,
 ref text,
 ua text,
 access_date timestamp
);

定義してみた結果

mysql> show columns from entry;
+-------------+-----------+------+-----+-------------------+----------------+
| Field       | Type      | Null | Key | Default           | Extra          |
+-------------+-----------+------+-----+-------------------+----------------+
| entry_id    | int(11)   | NO   | PRI | NULL              | auto_increment | 
| url         | text      | YES  |     | NULL              |                | 
| ref         | text      | YES  |     | NULL              |                | 
| ua          | text      | YES  |     | NULL              |                | 
| access_date | timestamp | NO   |     | CURRENT_TIMESTAMP |                | 
+-------------+-----------+------+-----+-------------------+----------------+

ActiveRecordを使って保存

  • 日付は指定しないと、insertを行った日付がINSERTされる
  • Timeオブジェクトを、timestampのカラムに渡すときちんと日付で入れてくれる
  • #saveによって保存される

Rubyスクリプト

ログファイルを読み込んで、MySQLに流し込でみました。

  • 画像ファイルとか、cssファイルとかのアクセス数はいらない
  • 一部エラーが出た「no implicit conversion from nil to integer (TypeError)」
require 'rubygems'
require 'active_record'
require 'date'
require 'time'

ActiveRecord::Base.establish_connection(
   :adapter  => 'mysql',
   :host     => 'localhost',
   :username => 'root',
   :password => 'mysql',
   :database => 'access_log'
)

class Entrys < ActiveRecord::Base
    set_table_name "entry"
end

montn_array = { 
    'Jan' => 1,
    'Feb' => 2,
    'Mar' => 3,
    'Apr' => 4,
    'May' => 5,
    'Jun' => 6,
    'Jul' => 7,
    'Aug' => 8,
    'Sep' => 9,
    'Oct' => 10, 
    'Nov' => 11, 
    'Dec' => 12
}

logfile = '../access_log'
logs    = open(logfile,'r')
while text = logs.gets do
/^([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^ ]*)(?: *([^ ]*) *([^ ]*))?" ([^ ]*) ([^ ]*) "(.*?)" "(.*?)"/u =~ text
    entry = Entrys.new
        entry.url = $6
        entry.ref = $10 
        entry.ua  = $11 
        /^(.*)\/(.*)\/(.*):(.*):(.*):(.*) \+0900/ =~ $4
        at_time = Time.local($3, montn_array[$2], $1, $4, $5, $6) 
        entry.access_date = at_time
    entry.save
end
logs.close

2008-04-23

Rubyでアクセス解析をする(始まり?)

| 01:34 | Rubyでアクセス解析をする(始まり?) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(始まり?) - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(始まり?) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Rubyでアクセス解析をする」といいつつなかなか進まないので、何をしようと思っているのかまとめておくことにします。

関連

Apacheのログをデータベースに登録する

  • ログファイルを解析する
  • 1アクセスごとに1カラムずつ入れてしまう
  • たぶん破綻するけれど、とりあえずはそのまま
  • 登録するのは.htmlと.phpファイルだけ

登録されたデータを表示する

  • データベースに登録された情報を表示する
    • ページが多いと思うのでページャーとかあるといいね
  • 検索する
  • 並び替える

アクセスランキングを計算する

  • 前日
  • 1週間
  • 時間帯?

Rubyのドキュメントは、どこを読むべき?

| 01:08 | Rubyのドキュメントは、どこを読むべき? - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyのドキュメントは、どこを読むべき? - Rubyを勉強しようと思ってはじめた日記 Rubyのドキュメントは、どこを読むべき? - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

コメントで教えていただいて気づいたのですが、Rubyのドキュメントとして青い画面のページがあるんです。

これが、リファレンスマニュアルの刷新計画進行中の現物なんですね。

こっちを読みながら勉強を進めたほうがいいのかな?

Rubyでアクセス解析をする(0.61)日付の文字列を分解する4

| 01:04 | Rubyでアクセス解析をする(0.61)日付の文字列を分解する4 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.61)日付の文字列を分解する4 - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.61)日付の文字列を分解する4 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

コメントをもらって、気づきました。書き出せばいいじゃん。

ということで、書き出してみたら、合ってました。合ったのをそのまま流用してなんですが...。

montn_array = { 
    'Jan' => 1,
    'Feb' => 2,
    'Mar' => 3,
    'Apr' => 4,
    'May' => 5,
    'Jun' => 6,
    'Jul' => 7,
    'Aug' => 8,
    'Sep' => 9,
    'Oct' => 10, 
    'Nov' => 11, 
    'Dec' => 12
}

montn_array.each{|key,value|
    now   = Time.local(2008, value, 1)
    print value, now.strftime("%b"), '<br>'
}

2008-04-19

Rubyでアクセス解析をする(0.6)日付の文字列を分解する3

| 23:06 | Rubyでアクセス解析をする(0.6)日付の文字列を分解する3 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.6)日付の文字列を分解する3 - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.6)日付の文字列を分解する3 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

とりあえず分解してみましたが...英語の月の短縮がいまいちわからない...。

とりあえずは、Timeオブジェクトになりましたよ、と。

montn_array = { 
    'Jan' => 1,
    'Feb' => 2,
    'Mar' => 3,
    'Apr' => 4,
    'May' => 5,
    'Jun' => 6,
    'Jul' => 7,
    'Aug' => 8,
    'Sep' => 9,
    'Oct' => 10, 
    'Nov' => 11, 
    'Dec' => 12
}
access_time = ['30/Mar/2008:04:11:41 +0900','30/Mar/2008:13:09:31 +0900']

access_time.each{|at|
    /^(.*)\/(.*)\/(.*):(.*):(.*):(.*) \+0900/ =~ at
    at_time = Time.local($3, montn_array[$2], $1, $4, $5, $6) 
    p at_time
    print '<hr>'
}

hiro-uedahiro-ueda2008/04/20 13:34Time#strftime を使って出力時に書式を指定するのが簡単だと思いますよ。月の省略形は %b みたいですね(参考:http://doc.loveruby.net/refm/api/view/method/Time/i/strftime)。

2008-04-18

Rubyでアクセス解析をする(0.5)日付の文字列を分解する2

| 07:39 | Rubyでアクセス解析をする(0.5)日付の文字列を分解する2 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.5)日付の文字列を分解する2 - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.5)日付の文字列を分解する2 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Aapcheのログにある日付をさらに分解したいと思い悩み中。する必要があるのか?とも思いましたけれど。

結局、正規表現で分解してみました。すごい適当...。

at = '30/Mar/2008:04:11:41 +0900'
/^(.*)\/(.*)\/(.*):(.*):(.*):(.*) \+0900/ =~ at

今回のに固定だけれど、とりあえず取得は出来ましたよ。もしかしたら、Apacheから用意できるときは、分解しやすい形式でログを取っておくといいのかもしれません。

参考

2008-04-16

Rubyでアクセス解析をする(0.4)日付の文字列を分解する

| 07:07 | Rubyでアクセス解析をする(0.4)日付の文字列を分解する - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.4)日付の文字列を分解する - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.4)日付の文字列を分解する - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

久々にRubyです。思い出しながらです。やっぱり毎日続けたいですね。

で、アクセスログを正規表現でパースすると、日付の部分が「30/Mar/2008:04:11:41 +0900」という形式のstrngクラスになります。これをtimeオブジェクトにしたい。

ParseDateモジュール

これを利用すると、「30/Mar/2008:04:11:41 +0900」という形式の文字列は配列にできました

こんな感じ。

p at_ary  = ParseDate::parsedate(at)    #[nil, 3, 30, 2008, 4, 11, nil, nil]

あれ?と思ったのが41秒はどこに?ParseDateモジュールで分解できる形式を知る必要がありそうです。

hiro-uedahiro-ueda2008/04/20 13:121.8.6 ですが

module ParseDate
def parsedate(str, comp=false)
Date._parse(str, comp).
values_at(:year, :mon, :mday, :hour, :min, :sec, :zone, :wday)
end
end

とあるので、戻り値は [年, 月, 日, 時, 分, 秒, タイムゾーン, 曜日] の順ですね。ですので [nil, 3, 30, 2008, 4, 11, nil, nil] は (年不明の)3/30 2008:4:11 で、秒とタイムゾーンが不明、という結果ではないかと。

d4-1977d4-19772008/04/21 22:19id:hiro-uedaさん、ありがとうございます!きちんと、ParseDate.parsedateを見るべきでした。おっしゃるとおりでした。受け付ける表現としても、Apacheのログのような形式は載っていないので、一発で解析は出来なさそうですね。

2008-04-08

Rubyをバージョンアップしよう

| 19:16 | Rubyをバージョンアップしよう - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyをバージョンアップしよう - Rubyを勉強しようと思ってはじめた日記 Rubyをバージョンアップしよう - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Rubyをバージョンアップしようと思って、やり方がイマイチわからなかった。

調べてみると、「404 Not Found」に詳しかったです。

# cd /etc/yum.repos.d
# wget http://dev.centos.org/centos/4/CentOS-Testing.repo
yum --enablerepo=c4-testing update ruby ruby-devel ruby-libs ri ruby-mode irb rdoc

Rubyはすでにインストールしていたので、updateで実施。無事に1.8.5になりました。

2008-04-07

RubyからMySQLに接続する(2.1)でありRubyでアクセス解析をする(0.3)

| 01:45 | RubyからMySQLに接続する(2.1)でありRubyでアクセス解析をする(0.3) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - RubyからMySQLに接続する(2.1)でありRubyでアクセス解析をする(0.3) - Rubyを勉強しようと思ってはじめた日記 RubyからMySQLに接続する(2.1)でありRubyでアクセス解析をする(0.3) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

アクセス解析を行い、その結果をDBに格納して参照するというのが、できそうな感じです。

今後の方針

  • アクセス解析をしっかり行う
  • 解析結果を、DBに格納する
  • アクセス解析結果を表示してみる

まだまだかかりそうだけれど、やってて面白いです。

気になるところ

でも、色々といじってきて思ったのは、デバッグってどうやったらいいの?というのが気になります。

あと、Ruby自体のドキュメントとか、なんだか手探りな状態になりやすい気がします。

RubyからMySQLに接続する(2)ActiveRecord編

| 01:29 | RubyからMySQLに接続する(2)ActiveRecord編 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - RubyからMySQLに接続する(2)ActiveRecord編 - Rubyを勉強しようと思ってはじめた日記 RubyからMySQLに接続する(2)ActiveRecord編 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Ruby on Railsで名前を知ったActiveRecordを試してみました。

命名規則

命名規則により、複数形のテーブルを持っていると、楽チンのようです。

今回でいえば、usersというテーブルがあると、Userというクラスを用意すれば、usersというテーブルを参照します。

テーブル名を明示的に指定する

従来あるテーブルへのアクセスもしたいと思うことがあるので、今回は(も?)Movable Typeのテーブルを利用してみました。mt_entryにアクセスして、mt_textというカラムを取得してみました。

テーブル名を明示して利用する場合、set_table_nameを利用すると良いようです。

ここらへんは、ソースを見たほうがいいのかもしれませんね。

参考
#!/usr/local/bin/ruby
print "Content-Type: text/html\n\n"
require 'rubygems'
require 'active_record'

ActiveRecord::Base.establish_connection(
   :adapter => 'mysql',
   :host => 'localhost',
   :username => 'username',
   :password => 'password',
   :database => 'database'
)


class User < ActiveRecord::Base
end

class Entrys < ActiveRecord::Base
    set_table_name "mt_entry"
end

users = User.find(:all)
users.each {|entry|
    p entry
}

entrys = Entrys.find(:all)
entrys.each{|entry|
    print entry.entry_text,'<br>'
}

情報たくさん

| 13:40 | 情報たくさん - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - 情報たくさん - Rubyを勉強しようと思ってはじめた日記 情報たくさん - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Rubyについて色々と書いているサイトを見つけました

すごいなあ。

2008-04-04

RubyからMySQLに接続する(1)

| 00:32 | RubyからMySQLに接続する(1) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - RubyからMySQLに接続する(1) - Rubyを勉強しようと思ってはじめた日記 RubyからMySQLに接続する(1) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

じゃあ、と思ってくるのがActiveRecordはどうなっているんだ?と

参考

RubyからMySQLに接続する(0)

| 00:11 | RubyからMySQLに接続する(0) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - RubyからMySQLに接続する(0) - Rubyを勉強しようと思ってはじめた日記 RubyからMySQLに接続する(0) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

一応接続できたけれど、これは面倒すぎるよ...。

ちなみに、手ごろなデータとしてMovable Type 4のテーブルを使いました。

インストール

gem install mysql -- --with-mysql-dir=/usr/local/mysql

スクリプト

#!/usr/local/bin/ruby
print "Content-Type: text/html\n\n"
require 'rubygems'
require 'mysql'

begin
my = Mysql::new("localhost","mtuser","mtpasswd")
my.query("use mte4")

result = my.query("select * from mt_entry")
result.each{|col|
    p col,'<br>',"\n"
}
my.close

rescue => e
    print e
end

2008-04-03

アクセス解析の結果を見ていると

| 23:40 | アクセス解析の結果を見ていると - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - アクセス解析の結果を見ていると - Rubyを勉強しようと思ってはじめた日記 アクセス解析の結果を見ていると - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

全然関係ないんだけれど、ログを見ていると

botとか、ゲートウェイとか色々とあるんだなあ。

Rubyでアクセス解析をする(0.2)正規表現で

| 23:13 | Rubyでアクセス解析をする(0.2)正規表現で - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.2)正規表現で - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.2)正規表現で - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

アクセスログを後方参照でしっかり情報取得が出来ました。わー、正規表現はコピペでした。

正規表現

Rubyで正規表現を初めて使いました。Perlの演算子で書けるので、違和感なし。

PHPのときはちょっと面倒な感じがしたので、これはうれしいです。

正規表現で、文字コードを指定する必要があるのかな?これは初めて。

今後・検討事項

  • 得た結果をDBに流し込みたい
  • DBからデータを取得したい
  • 時間の部分はさらに分解?
  • UAの情報はどうしたらいいだろうか

コード

#!/usr/local/bin/ruby
print "Content-Type: text/html\n\n"

logfile = 'access_log'

File = open(logfile,'r')

while text = File.gets do
/^([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^ ]*)(?: *([^ ]*) *([^ ]*))?" ([^ ]*) ([^ ]*) "(.*?)" "(.*?)"/u =~ text

print $1,'<br>'
print $2,'<br>'
print $3,'<br>'
print $4, '<br>'
print $5, '<br>'
print $6, '<br>'
print $7, '<br>'
print $8, '<br>'
print $9, '<br>'
print $10, '<br>'
print $11, '<br>'
print '<hr />'
end

File.close
カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2009 | 06 | 08 |