ひまつぶし雑記帖

おひとり様ActivityPubサーバーにBlock実装

2023/12/27 [09:44:09] (水) 天気

おひとり様APサーバーにBlockを実装した。
ActivityでBlockが飛んできてもめっちゃレアケースなのでスルーしてたんだけど念のため。

というか、アドベントカレンダーに参加して投入したエントリ 「Fediverseの辺境で秘密基地」「SNSのソーシャルディスタンス」 がどこかでブーストされたらしくて、珍しくぷちバズった。
Followリクエストも飛んできてフォロワーさんも増えた。のと、珍しくBlockリクエストも飛んできた。記憶に間違いがなければ、これまで半年ほどやっててBlockリクエストは3度目。

届けたいところじゃないところに届いたんだなぁ…じゃなくて、ちゃんと対応を考えないといけない。ツイッターのブロックと同じ扱いで、ブロックされた該当アカウントの投稿がブーストやなんかで飛んできてもタイムラインに流さない・間違ってフォローリクエストを送ったらまずい。
てことで、ブロックされてるリストを作成して、該当アカウントを登録することにした。

おひとり様サーバーでは投稿はJSONファイルのまま、Signature検証がOKだったら、所定のフォルダに移動してるんで、その前にブロックリストを確認してそこで弾くようにした。Followリクエストも同様。
ActivityPubというプロトコル、とかいうとなんか難しそうだけど、約束事の塊とその約束事を守ることで成立している。極端な話というか乱暴な話、約束事を守る/守らないはサーバー管理者次第。
だからこそ仕様上のMUSTやSHOULDはちゃんと対応する必要がある。

image 
久しぶりに上手く巻けた、かな。
弁当用で、出汁少なめなので失敗は少ない。ウチで食べる用だと出汁を150ccぐらい入れるんでゆるゆるで難易度があがるんだよなあ。

»電子書籍制作代行についてはこちら

SNSのソーシャルディスタンス

2023/12/25 [10:55:05] (月) 天気

Twitter(X)やFacebookからFediverseに引っ越しを開始したのが7月。それからちょっとずつ移住を進めて8月にはほぼ引っ越し完了。
Fediverse生活5ヶ月弱の振り返りが今回のエントリ。

Twitter、facebookからfediverseに移住して変わったところ

1)リプライやメンションをほぼしなくなった
2)RTをほぼしなくなった
3)いいねが増えた

こうしよう、と自分の意志で決めたことじゃなくて、Fediverseの特徴というか、おひとり様サーバーのポリシー、仕様が原因。
1)
リプライは実装していない。
メンションは実装済みだけど、DM的な使い方をしたいので簡単にできるようなUIはつけてない(送りたい相手のユーザー名サーバー名をいちいち手入力する必要がある)
2)
RTが減ったのは、ActiviryPubのRTは自分の投稿としての扱いになるから。ということは、RTするためにはDBに登録する必要がある。
おひとり様サーバーではひとのデータを極力持たないという方針で、ひとの投稿をDBに取り込んだりしたくない。ので、RTとうちのおひとり様サーバーは相性が悪い。
急場しのぎで、7日間の期限付きでDBに登録。期限がきたら削除&Undoを飛ばすことにした。
3)
いいねが増えたのは、リプライ代わりでweb拍手みたいな位置づけになったからかな。リプライほど積極的じゃない、ちょっとしたリアクションを送る感じで使ってる。

瓢箪から駒とか。
このおかげでSNSでのソーシャルディスタンスが保たれることになった

ツイッターの良いところは、
ネットを通じて人と出会いがあって、人との繋がりができること。Twitterがきっかけでリアルでの繋がりにまで広がることもある。
個人でもちょっとしたメディア並みの拡散力、影響力をもつ、こともある。

その仕組として、リプライやメンションするのも手軽だし、RTも気楽にできる。
他人の投稿に対して、たとえばテレビのニュースやワイドショーを見て、テレビに向かって何かいうのと同じような気軽さじゃないかな。
リアクションしてリアクションされてるうちに、距離感を間違えてしまうことがあるような気がする。

まだ様子見かなあというお店に何回か通って
「いつも」ありがとうございます
と言われると引いてしまって足が遠のくことがあったり。

向こうから顔見知りのひとがきたので満面の笑みで手をふったら相手も手を降ってやって来た、と思ったら、おれの後ろの人に手を降って笑いかけてて、満面に笑みを貼りつけたまま通り過ぎるしかない状況だったり。

いやいや、だいたいわたしとあなたは赤の他人ですよ?

ツイッターではありがちな光景だと思う。

その点、FediverseというかActivityPubのおひとり様サーバーは、ちょっとずつ面倒くさいんで、距離感を意識することができる。

そもそもおひとり様サーバーで壁打ちと言いつつ、ActivityPubで繋がる別サーバー、リモートサーバーに投稿を投げることになっている。
ぜんぶ「よそんちのお宅」だ。まずそこで少しハードルがあがって(これでも)ちょっと「よそ行き」になっている。

もちろん、ツイッターなどで、適切な距離感を保てるなら問題ない。
なんせ億単位でひとが集まっている。情報収集や情報拡散は巨大SNSの方がメリットが大きい。

ツイッターFacebookから離れて、わたしはそちらではソーシャルディスタンスが保てないということを痛感した。いや、いい歳こいて振り回されすぎるんだよなあ。みっともない。

おひとり様サーバーは20個しか表示しないし、検索もできない。
でも、平穏は得られている。

コロナ禍と同じ。SNSでもソーシャルディスタンスは必要だよなぁ。
image
Blueskyにも登録した。AT protocol?分散型というのに興味があったから。
けどなあ、ツイッターを作って放りだした・だされたジャック・ドーシーだよ?信用できるかとなると、イーロン・マスクやマーク・ザッカーバーグと同じ穴の狢だと思う。

»電子書籍制作代行についてはこちら

おひとり様ActivityPubサーバーにLike実装

2023/10/6 [10:10:37] (金) 天気

おひとり様APサーバーにもLikeを実装してみた。
自分の投稿に対するLikeはどうでもよくて、Likeされる方じゃなくて、する方の実装。

せっかくSNSだし、WEB拍手的なノリ(あれ?もしかして「Web拍手」って死語?)でポチっとできればなあ、と。
リプライ(返信する)のはちょっと厚かましい?馴れ馴れしい?恥ずかしい?空気読んで遠慮した方がいい?的なところに「WEB拍手」という控えめなリアクションは(主語を大きくすると)日本人向きの仕組みだなあ、と思う。

Likeに使うjson

{"@context": [
    "https://www.w3.org/ns/activitystreams",
     {"Hashtag": "as:Hashtag"}],
"type": "Like",
"id": "https://tokoroten.doncha.net/t2aki#a69b50a5-636b-11ee-83a8-d34678f16ad4",
"actor": "https://tokoroten.doncha.net/t2aki",
"object":"https://example.com/users/status/123456"}


typeがLikeのjsonで、actorは自分、objectに対象となる投稿のURLというお約束。
このjsonをお相手のエンドポイントにPOSTするだけ。他になにかが必要ということもなかった。
ブーストと違って運用的に考えなきゃいけないこともないんでサクっと実装できた。

とはいえ。
Like、イイネも承認欲求の対象、ハマると危険なので、自分の投稿に対するLikeは取得しない。
この危険はブースト(リツイート、リポスト)と同じだ。
これらに引きずられて言わなくてもいいことを言ってしまったり、デマ拡散に加担してしまったり。ロクなことはない。

SNSのもっともダメなところだ…SNSのせいにしちゃいけない。か。ひとの弱いところをつかれてしまう、ということだな。

[10/17 05:23:58]
とか言いつつ、前言撤回。
自分に対するLikeも取得するようにした。
Likeするひとにしてみたら、Likeしたのになんの反応もないんじゃ無視されてるように見えるなあ、と。とりあえずLikeについては3日間保持ということで対応。

[2024/01/11 02:32:48]
like一覧を実装してみた。
Likeしたものについては、タイムラインのJSONと違って投稿のURLだけで投稿内容はないので大丈夫だろうとそのまま保存してたら…上記したように、Web拍手的なノリでLikeをポチっとしてるので保存しているJSONが大量に溜まっていく。
ページングするのも面倒くさいんで、タイムライン同様、保存上限を設定して古いものは削除ということにした。保存期間は2週間。
一覧するのは日付と投稿のリンク。リンクを叩いてNoteのJSONをGETして表示。投稿を確認して手動でも削除できるようにした。
「いいね」するのもされるのも、その時その場、だなあ。
残しておきたいような投稿は、それこそひとり掲示板にメモしてるしね。

image
河童べこ。久しぶりにガチャガチャ回してる。

»電子書籍制作代行についてはこちら

おひとり様ActivityPubサーバーのjsonの実例

2023/10/3 [09:14:42] (火) 天気

今さらだけど改めて。
おひとり様ActivityPubサーバーで投稿する・しゃべる時に必要になりそうなもの。
・投稿本体(Note)
・画像添付
・メンション(リプライやDM)
・ハッシュタグ(検索する/される時のキーワード設定)

投稿本体は当たり前として。
画像添付やMention、Hashtagも実装してあるので、忘れないうちにメモ…というか、ActivityPubで使うJsonの実例、exampleをメモ。ソースを見ればいいだけの話なんだけど、覚えてないことの方が多いので具体例をちゃっちゃと見られるように。

以下のJSONがウチで使ってる、上記を実装した投稿のフルセット。
投稿はCreateの中のobjectにあるNoteが本体で、その中の本文(content)はともかく、それ以外について。

{"@context":
    ["https://www.w3.org/ns/activitystreams",
    {"Hashtag": "as:Hashtag"}
    ],
"type": "Create",
"id": "https://tokoroten.doncha.net/t2aki/activity/00341-20231003",
"url": "https://tokoroten.doncha.net/t2aki/activity/00341-20231003",
"published": "2023-10-03T00:01:31Z",
"actor": "https://tokoroten.doncha.net/t2aki",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": ["https://tokoroten.doncha.net/t2aki/followers"],
"object": {
    "type": "Note",
    "id": "https://tokoroten.doncha.net/t2aki/items/00341-20231003",
    "url": "https://tokoroten.doncha.net/t2aki/items/00341-20231003",
    "published": "2023-10-03T00:01:31Z",
    "to": ["https://www.w3.org/ns/activitystreams#Public"],
    "cc": ["https://tokoroten.doncha.net/t2aki/followers",
          "https://mstdn.jp/users/donbe2023"],
    "attributedTo": "https://tokoroten.doncha.net/t2aki",
    "content": "\u003ca href=\"https://mstdn.jp/users/donbe2023\"\u003e@donbe2023@mstdn.jp\u003c/a\u003e うちでも花を飾ることになって、駅前の花屋さんを見てると、けっこうな人が花を買っていてビックリ。ほんと、今さらだけど、世間のひとたちはカジュアルに花を買っていくんだなー。\u003ca href=\"https://tokoroten.doncha.net/tameike.pl?tag=%23%E3%81%B2%E3%81%BE%E3%82%8F%E3%82%8A\"\u003e#ひまわり\u003c/a\u003e",
    "attachment"[
        {"type":"Document",
        "mediaType":"image/png",
        "url":"https://tokoroten.doncha.net/20231003.png",
        "name":null,
        "blurhash":null,
        "width":271,
        "height":320}
    ],
    "tag": [
        {"name":"@donbe2023@mstdn.jp",
        "type":"Mention",
        "href":"https://mstdn.jp/users/donbe2023"
        },
        {"name":"#ひまわり",
        "href":"https://tokoroten.doncha.net/tameike.pl?tag=%23%E3%81%B2%E3%81%BE%E3%82%8F%E3%82%8A",
        "type":"Hashtag"
        }
    ]
}
}


・画像添付
Noteのアタッチメントという配列に入る。

"attachment"[
    {"type":"Document",
    "mediaType":"image/png",
    "url":"https://tokoroten.doncha.net/20231003.png",
    "name":null,
    "blurhash":null,
    "width":271,
    "height":320}
]


配列の中、typeがDocumentのブロックひとつが1枚の画像の情報。ウチは1枚限定なので、ブロックはひとつだけ。複数入れる場合はここに追加。
画像情報として。
・画像のURL
・画像の種類(mediaType)
・名前(たぶんAltで使われる)
・blurhash
↑ぼや〜っとしたプレビュー用のハッシュ文字列。よくわからないんで未対応。
・画像の縦横サイズ

・メンション(リプライやDM)
Noteの中の宛先「cc」にお相手のinbox、エンドポイントを追加。

"cc": ["https://tokoroten.doncha.net/t2aki/followers",
      "https://mstdn.jp/users/donbe2023"]


「to」に入れるのか「cc」に入れるのか、特に決まりごとはないっぽいけど、現状これで問題なくお相手に通知が届く。

ただ、twitterやfacebook、あるいはLINEのように相手にだけ直接送ってそれ以外のひとに見えなくするのは無理。ActivityPubというか分散型サーバーというか。サーバー管理者はPublic指定がないものも含めて全部見ることができる。
twitterだからLINEだから安心とは言えないんだけど、なにかあった時に、抗議する先が一箇所なのか、あちこちいろいろあるのかということ。
ネットは信用しちゃいけいない(閑話休題)

Noteの中の「tag」の配列にMentionのブロックを追加。

"tag": [
    {"name":"@donbe2023@mstdn.jp",
    "type":"Mention",
    "href":"https://mstdn.jp/users/donbe2023"
    },


Mentionブロックは
・お相手の名前
・お相手の届け先(エンドポイント)

・ハッシュタグ(検索する/される時のキーワード設定)

@context": [
"https://www.w3.org/ns/activitystreams",
{"Hashtag": "as:Hashtag"}
]


ハッシュタグはActivityPubで決められたものじゃないということで「@context」に定義する必要があるらしい。

定義したら、Mentionと同じくNoteの中の「tag」の配列にHashtagのブロックを追加。

"tag": [
    {"name":"#ひまわり",
    "href":"https://tokoroten.doncha.net/tameike.pl?tag=%23%E3%81%B2%E3%81%BE%E3%82%8F%E3%82%8A",
    "type":"Hashtag"
    }


Hashtagブロックは
・タグの名前
・タグのURL

ハッシュタグは、おひとり様ActivityPubサーバーで使う意味があるか疑問。
そもそもハッシュタグは複数人で共有するもの。それをひとりしかいないサーバーで使う意味は、たぶんない。ただまあ、データベースに検索かける時にリンク一発叩けばいいだけになるので、便利っちゃ便利なので実装してみた。

仕様・規格からちゃんと読めと言われたら謝るしかできないんだけど、何をするにしても、素人なので実例、exampleが欲しいんだよなあ。
image
にしても、駅近くの花屋さんの盛況っぷりに驚いた。ウチに花を飾る、なんてことを自発的にやったことがなかったんで、なおさら。

»電子書籍制作代行についてはこちら

おひとり様ActivityPubサーバーにブースト実装

2023/9/21 [09:25:34] (木) 天気

twitter(現X)に代表されるSNSの一番の特徴はリツート(ブースト、リポスト)
これがあるおかげで?せいで?SNSへの投稿は拡散力を持つことになった。良い悪いはおいといて、ウチのおひとり様APサーバーにも実装してみた。

考えなきゃいけない一番の優先順位は。
「デマの拡散に加担してはいけない」

なので、ブーストはブースト取り消しの実装と同時。

ブーストはActivityPubだとタイプAnnounceのjson。対象となるNoteのIDをobjectに入れる。
宛先の「cc」には自分のfollowersに、対象となるNoteの投稿者も含めておく。

{"@context": ["https://www.w3.org/ns/activitystreams", {"Hashtag": "as:Hashtag"}],
"type": "Announce",
"id": "https://tokoroten.doncha.net/t2aki/announce/TIMESTAMP",
"actor": "https://tokoroten.doncha.net/t2aki",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": [DELIVER-LIST],
"object":"NoteID"}



Announceの取り消しはタイプUndoのjsonに、Announceに使ったjsonをobjectにそのまま入れる。

{"@context": ["https://www.w3.org/ns/activitystreams", {"Hashtag": "as:Hashtag"}],
"type": "Undo",
"id": "https://tokoroten.doncha.net/t2aki#UUID",
"actor": "https://tokoroten.doncha.net/t2aki",
"object":ANNOUNCE-OBJECT}


以上のjsonを自分のフォロワーさんのinboxに署名付きpostでリクエストをすれば、ブースト・ブーストの取り消しとなる。

これだけっちゃこれだけなんだけど、ブーストはスクリプトじゃないところに問題があるんだよなあ。

ブーストを実装したいと思ったのは。
いま、フォロワーさんの数が16人ほどで拡散力もなにもないんだけど、それでもイベントのお知らせや、発売の宣伝なんかは、微力ながら協力できればなあ、というのが動機。
せっかくSNSなんだし。

ブーストはヤバイなあと思うのは。
デマの拡散に加担する可能性、というのがもちろん一番で。
それ以外というか、他人の投稿を拡散することで自分が何かを語ったつもりになる、という乗っかりの承認欲求、自己顕示欲を得られるところ。

自分の頭で考えて自分の言葉で語ることをしなくなる、簡単に闇落ちする(自戒をこめて)
実装はしたけど、ブーストするのは基本的にイベントや発売告知だけにする。

また、ウチのおひとり様は、他人のデータを持たない、というのが原則。
なので、Annouceの投稿も期限つき。最長7日間にした。
イベントなんかは終わってたら残念だし、発売関連は初動に少し貢献できれば十分かなあ、と。

image
ひとつ何かを実装するのに、やっぱりけっこういろいろ考慮しなきゃいけないことってあるもんだなあ(今さら
自分のとこだけのことならどうでもいいんだけど、ActiviyPubで繋がるわけだから、そりゃそうかという話。

»電子書籍制作代行についてはこちら

iPhoneで撮った写真の向きが逆

2023/9/14 [22:03:58] (木) 天気

iPhoneで撮った写真が、タテのはずがヨコになったり、ヨコのはずがタテになったり。iPhoneを縦に構えて撮ってるのに、写真では横になる。
前からちょっと気になってた。

「写真」アプリだと意図通り縦で表示されている。
WEBにアップすると横に転んでしまう。意味がわからない。なんでやねん。
image
検索してみるとiPhoneのジャイロセンサーで縦横が決められるという話が出てくるんだけど、なんか違う。

identify -verbose
してみたら。
Geometry: 4032x3024+0+0
Orientation: RightTop
て、思いっきり横位置で保存されていた。それをExifのOrientationで縦に起こしている。
RightTop
「Right」は横向きで保存されている上側を右側にする
「Top」は横向きで保存されている左側を上側にする
という指示。この通りに表示すれば時計回りに90度回転して縦位置となる。Exif情報を読んで表示できる環境(アプリ)であれば。

とはいえ、そもそも横位置で保存されてしまってるんで、そのままjpgファイルをpngファイルに変換したら横写真になる。

しょうがないんで、画像の回転指示(Orientation)を確認して、指示が入っていたらRotateして縦位置で保存するようにした。
image
Image::ExifToolというexif情報を取得できるモジュールがlolipopにはインストールされていたので実装はすんなり。

my $is_rotate;
my $exif = new Image::ExifTool;
my $pinfo = $exif->ImageInfo($ofile);
$is_rotate = $1 if( $pinfo->{'Orientation'} =~ m!Rotate *90 *(CW|CCW)! )


iPhoneで縦位置で写真を撮る=デジカメを縦に構えて写真を撮るということらしい。
ということなら、写真を横で保存するのは正しい動作。てことで回転は90度決め打ち。

だけど、Exif情報にカメラ位置補正を入れるぐらいなら、保存する時に補正してくれ。

てのはともかく、上野の科学博物館で開催の「海展」は、ほんと語彙をなくすほどの凄さだった。どの展示も目を奪われて立ち尽くす時間が長くなる。はやぶさがリュウグウから持ち帰った砂を見られるとは思わなった。ほんとスゲー。
まじオススメ!
「国立科学博物館」
「海 ―生命のみなもと―」

»電子書籍制作代行についてはこちら

profile

profile

 
doncha.net
contact:
»運営者
@t2aki@tokoroten.doncha.net

ところてんx5

2024/2/21 06:50

スパム騒ぎも収束したっぽいのでメンション受付のフォロー限定を解除しよう。
今回の騒ぎのおかげで、1つの投稿の中に複数のメンションがあったらスパムとして処理する、てのを実装したしな

2024/2/20 13:55

どこで漏れてるよなあ、絶対。
とりあえずdiffで差分を取るところから始めるしかなくて。でもボリュームがあるので、winmergeを使って目で追う集中力なんてもはや1mmもない。コマンドラインでdiffをを使ってその結果だけを表示させるスクリプト、というのが落としどころか。ディレ...

2024/2/20 13:42

今回、けっこうボリュームのあるものなので目で探してひとつずつ確認修正作業、なんて「絶対」(世の中には絶対はないんだけどこれは絶対)にミスが入る。
こんなことになると、結局検証用のスクリプトを書いて機械的に洗ってみることになる=余分なスクリプトを書かなきゃいけない…orz

検索
<<2024/2>>
    123
45678910
11121314151617
18192021222324
2526272829

リンク

WINDOWS版サウンドノベル
おかえりください PC WINDOWS版サウンドノベル
『おかえりください』体験版

[30 Page] »
1 2 3 4 5 6 7 8 9 10

TOTAL:2981

2024 (4)
1 (2)
2 (2)
2023 (53)
1 (1)
2 (5)
3 (1)
4 (1)
5 (3)
6 (9)
7 (9)
8 (6)
9 (5)
10 (3)
11 (2)
12 (8)
2022 (16)
1 (1)
3 (2)
6 (2)
7 (1)
8 (4)
9 (2)
10 (1)
11 (2)
12 (1)
2021 (12)
1 (3)
2 (1)
6 (1)
8 (2)
9 (1)
10 (1)
11 (2)
12 (1)
2020 (18)
1 (2)
2 (6)
4 (1)
6 (1)
7 (2)
8 (2)
12 (4)
2019 (17)
1 (3)
2 (4)
3 (2)
4 (2)
5 (1)
6 (1)
8 (1)
10 (1)
12 (2)
2018 (21)
1 (3)
2 (2)
3 (2)
4 (1)
5 (1)
6 (6)
8 (1)
9 (1)
10 (2)
12 (2)
2017 (32)
1 (2)
2 (1)
4 (2)
5 (1)
6 (6)
7 (3)
8 (5)
9 (3)
10 (2)
11 (2)
12 (5)
2016 (41)
1 (5)
2 (5)
3 (2)
4 (3)
5 (4)
6 (6)
7 (2)
8 (2)
9 (3)
10 (1)
11 (4)
12 (4)
2015 (99)
1 (11)
2 (12)
3 (9)
4 (6)
5 (8)
6 (8)
7 (3)
8 (5)
9 (16)
10 (6)
11 (1)
12 (14)
2014 (112)
1 (16)
2 (5)
3 (6)
4 (12)
5 (16)
6 (19)
7 (9)
8 (6)
9 (4)
10 (8)
11 (6)
12 (5)
2013 (145)
1 (24)
2 (15)
3 (18)
4 (23)
5 (14)
6 (11)
7 (7)
8 (11)
9 (5)
10 (4)
11 (6)
12 (7)
2012 (103)
1 (1)
2 (1)
3 (4)
4 (3)
5 (7)
6 (26)
7 (17)
8 (5)
9 (8)
10 (10)
11 (11)
12 (10)
2011 (54)
1 (4)
3 (7)
4 (4)
5 (14)
6 (6)
7 (3)
8 (3)
9 (1)
10 (4)
11 (2)
12 (6)
2010 (70)
1 (12)
2 (7)
3 (6)
4 (6)
5 (3)
6 (10)
7 (6)
8 (4)
9 (3)
10 (4)
11 (3)
12 (6)
2009 (144)
1 (15)
2 (12)
3 (12)
4 (6)
5 (15)
6 (6)
7 (10)
8 (9)
9 (17)
10 (12)
11 (14)
12 (16)
2008 (148)
1 (10)
2 (6)
3 (10)
4 (11)
5 (13)
6 (10)
7 (13)
8 (19)
9 (18)
10 (12)
11 (13)
12 (13)
2007 (106)
1 (7)
2 (5)
3 (3)
4 (7)
5 (5)
6 (9)
7 (8)
8 (13)
9 (18)
10 (11)
11 (8)
12 (12)
2006 (158)
1 (28)
2 (28)
3 (25)
4 (7)
5 (9)
6 (7)
7 (12)
8 (13)
9 (10)
10 (7)
11 (6)
12 (6)
2005 (350)
1 (31)
2 (26)
3 (26)
4 (27)
5 (29)
6 (30)
7 (32)
8 (30)
9 (30)
10 (32)
11 (29)
12 (28)
2004 (292)
1 (24)
2 (24)
3 (29)
4 (27)
5 (28)
6 (25)
7 (26)
8 (24)
9 (12)
10 (19)
11 (26)
12 (28)
2003 (318)
1 (22)
2 (25)
3 (21)
4 (28)
5 (28)
6 (28)
7 (28)
8 (29)
9 (26)
10 (29)
11 (28)
12 (26)
2002 (317)
1 (29)
2 (26)
3 (26)
4 (25)
5 (28)
6 (30)
7 (27)
8 (21)
9 (25)
10 (27)
11 (28)
12 (25)
2001 (277)
1 (17)
2 (21)
3 (23)
4 (20)
5 (31)
6 (18)
7 (26)
8 (25)
9 (29)
10 (19)
11 (24)
12 (24)
2000 (53)
6 (9)
7 (4)
8 (2)
9 (3)
10 (1)
11 (15)
12 (19)
1999 (3)
7 (1)
10 (2)
1998 (18)
9 (9)
10 (7)
11 (2)