TransFreeBSDの日記 このページをアンテナに追加 RSSフィード

2006-01-30

[]2006年問題 2006年問題 - TransFreeBSDの日記 を含むブックマーク

はてなアイデアクロール&集計スクリプトをアップデートしました。アーカイブファイル名は変わっていませんが、中身は7つのファイルが更新され、新たに1つファイルが追加され*1て合計10となっています。

ファイルはid:TransFreeBSD:20050914:p1から入手して下さい。

注意:2006年4月以降は正常に動かない部分があります

主な変更点は次の通りです。

  • 年数が2005決め打ちだった箇所を修正しました。
    • 年数が取得できない場合3月までなら2006年、4月以降なら2005年としました。
  • CSVへの出力の際、日付に年を付けるようにしました。
  • 取得するhtmlソースが変更になっている部分に対処しました。
  • fetchのオプションを-m*2から-a*3と-q*4へ変更しました
  • market.plにて総選挙はてな分を別計算するようにしました。
  • はてな決裁時の表記の揺れなどへ対処しました。
  • IdeaPayment.pmはData::Dumperを使用しないためuseする部分を削除しました。

以下は余談とパッチです。

パッチを見てもらえば分かる通り、

  • 年を決め打ちしていた部分があります。2000年問題と一緒ですね。
  • しかも、いくつか分散してあるため対処が面倒です。2000年問題と一緒ですね。
  • これは、このはてなアイデアが半年以上も続くとは思わなかったからです。2000年問題と...(略
  • 場当りパッチで根本解決がなされていません。2000...(略
  • しかし、もうさほど長く使わないと思われます。2...(略

こういうのってリファクタとかカプセル化とかしてればまだ楽なんだろうけど。でも、このスクリプトは動けばいいやって感じで、そこまでする気はないわけですが。というか、歴史に学んでない時点でダメなんですけどね。

以下パッチ

diff -ru hatenaidea.orig/HatenaIdea.pm hatenaidea/HatenaIdea.pm
--- hatenaidea.orig/HatenaIdea.pm	Thu Sep  8 19:45:30 2005
+++ hatenaidea/HatenaIdea.pm	Sun Jan 29 23:32:34 2006
@@ -9,7 +9,7 @@
 $url_base_senkyo = "http://senkyo.i.hatena.ne.jp";
 $protect	 = 1;
 
-my @cmd		= qw(/usr/bin/fetch -m -o);
+my @cmd		= qw(/usr/bin/fetch -a -q -o);
 my $wait	= 1;
 
 sub get_content {
diff -ru hatenaidea.orig/IdRecord.pm hatenaidea/IdRecord.pm
--- hatenaidea.orig/IdRecord.pm	Mon Sep 12 22:07:49 2005
+++ hatenaidea/IdRecord.pm	Sun Jan 29 16:47:54 2006
@@ -74,7 +74,7 @@
 				print "$id of $n, ",scalar @records,", 1, ",$content[1];
 			}
 			if ($content[6] =~ m|<td class="digit">(\d\d)/(\d\d)|) {
-				$record->time(timegm(0,0,0,$2,$1-1,2005));
+				$record->time(timegm(0,0,0,$2,$1-1,$1>3?2005:2006));
 			} else {
 				print "$id of $n, ",scalar @records,", 6, ",$content[6];
 			}
diff -ru hatenaidea.orig/IdeaPayment.pm hatenaidea/IdeaPayment.pm
--- hatenaidea.orig/IdeaPayment.pm	Thu Sep  8 19:45:30 2005
+++ hatenaidea/IdeaPayment.pm	Sun Jan 29 16:16:55 2006
@@ -1,7 +1,6 @@
 package IdeaPayment;
 use strict;
 use warnings;
-use Data::Dumper;
 use HatenaIdea;
 use base qw(Class::Accessor);
 IdeaPayment->mk_accessors(qw(idea stock price seller buyer time));
@@ -134,14 +133,14 @@
 		$fh->eof and last;
 		$_ = join "", map {$fh->getline} (1..2);
 		$fh->eof and last;
-		if (m{(\d+)? @(\d+.\d\d)\n\s*(<a href="/[^/]+/">([^<]+)</a> \&gt; )?(<a href="/[^/]+/">([^<]+)</a>|hatena).* \(2005-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)\)}) {
+		if (m{(\d+)?( @(\d+.\d\d))?\n\s*(<a href="/[^/]+/">([^<]+)</a> \&gt; )?(<a href="/[^/]+/">([^<]+)</a>|hatena).* \((\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)\)}) {
 			my $payment = new IdeaPayment;
 			$payment->idea($num);
 			$payment->stock($1);
-			$payment->price($2);
-			$payment->seller($4);
-			$payment->buyer($6 || $5);
-			$payment->time(timegm($11,$10,$9,$8,$7-1,2005));
+			$payment->price($3);
+			$payment->seller($5);
+			$payment->buyer($7 || $6);
+			$payment->time(timegm($13,$12,$11,$10,$9-1,$8));
 			unshift @payments, $payment;
 		} else {
 			print "idea $num, ",scalar @payments,", $_";
diff -ru hatenaidea.orig/fixed.pl hatenaidea/fixed.pl
--- hatenaidea.orig/fixed.pl	Thu Sep  8 19:45:30 2005
+++ hatenaidea/fixed.pl	Sun Jan 29 16:38:01 2006
@@ -13,7 +13,7 @@
 		next;
 	}
 	while (<$fh>) {
-		if (m{\shatena(\s.+)?\s\((\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)\)}) {
+		if (m{\s?hatena(\s.+)?\s\((\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)\)}) {
 			$count++ if (-w $fh);
 			my $time = timelocal($7,$6,$5,$4,$3-1,$2);
 			utime $time, $time, $file;
Only in hatenaidea: get.pl
diff -ru hatenaidea.orig/list.pl hatenaidea/list.pl
--- hatenaidea.orig/list.pl	Mon Sep 12 22:07:49 2005
+++ hatenaidea/list.pl	Mon Jan 30 01:47:40 2006
@@ -155,13 +155,13 @@
 sub date_to_days
 {
 	my ($m,$d) = @_;
-	return int(timegm(0,0,0,$d,$m-1,2005) / (24*60*60));
+	return int(timegm(0,0,0,$d,$m-1,$m>3?2005:2006) / (24*60*60));
 }
 
 sub days_to_date
 {
 	my $days = shift;
 	$days *= 24*60*60;
-	return sprintf("%02d-%02d",(gmtime $days)[4]+1,(gmtime $days)[3]);
+	return sprintf("%04d-%02d-%02d",(gmtime $days)[5]+1900,(gmtime $days)[4]+1,(gmtime $days)[3]);
 }
 
diff -ru hatenaidea.orig/market.pl hatenaidea/market.pl
--- hatenaidea.orig/market.pl	Thu Sep  8 19:45:30 2005
+++ hatenaidea/market.pl	Mon Jan 30 22:47:02 2006
@@ -50,6 +50,7 @@
 my %users;
 my %sum = (
 	dividend	 => 0,
+	senkyo_dividend	 => 0,
 	new_stock	 => 0,
 	new_user	 => 0,
 	settlement	 => 0,
@@ -60,8 +61,10 @@
 	idea_invest_sum	 => 0,
 	total_invest_sum => 0,
 );
+print "today $today, days $days\n";
 while ($days <= $today) {
 	$sum{dividend}		= 0;
+	$sum{senkyo_dividend}	= 0;
 	$sum{new_stock}		= 0;
 	$sum{new_user}		= 0;
 	$sum{settlement}	= 0;
@@ -91,11 +94,21 @@
 				}
 				$users{$payment->seller} = 1;
 			} elsif ($payment->buyer eq "hatena") {
-				if ($idea{$num}->status eq "canceled") {
+				if ($idea{$num}->status and $idea{$num}->status eq "canceled") {
 					$sum{canceled} += $idea{$num}->stock;
 				} else {
-					$sum{settlement} += $idea{$num}->stock;
-					$sum{dividend} += $idea{$num}->stock * $idea{$num}->dividend;
+					$sum{settlement} += $idea{$num}->stock unless (exists $senkyo{$num});
+					if ($idea{$num}->dividend eq "-") {
+						$idea{$num}->dividend(0);
+					} elsif ($idea{$num}->dividend =~ /[^.\d]/) {
+						print STDERR "dividend is not numeric.\n";
+						print STDERR Dumper $idea{$num};
+					}
+					if (exists $senkyo{$num}) {
+						$sum{senkyo_dividend} += $idea{$num}->stock * $idea{$num}->dividend;
+					} else {
+						$sum{dividend} += $idea{$num}->stock * $idea{$num}->dividend;
+					}
 				}
 			} else {
 				$idea{$num}->stock($idea{$num}->stock + $payment->stock);
@@ -109,6 +122,7 @@
 		}
 	}
 	$sum{dividend} /= 1000;
+	$sum{senkyo_dividend} /= 1000;
 	$sum{new_stock} /= 1000;
 	$sum{settlement} /= 1000;
 	$sum{trade} /= 1000;
@@ -117,6 +131,11 @@
 	$sum{senkyo_trade} /= 1000;
 	$sum{idea_invest_sum} += $sum{new_stock} - $sum{settlement} - $sum{canceled};
 	$sum{total_invest_sum} += $sum{new_stock} - $sum{settlement} - $sum{canceled} + $sum{senkyo_invest};
+	if ($sum{senkyo_dividend}) {
+		$sum{senkyo_invest} += $sum{idea_invest_sum} - $sum{total_invest_sum};
+		$sum{dividend} += $sum{senkyo_dividend} +  $sum{senkyo_invest};
+		$sum{total_invest_sum} = $sum{idea_invest_sum};
+	}
 	$sum{new_user} = scalar(keys %users) - $new_user;
 	$new_user = scalar(keys %users);
 
@@ -132,13 +151,13 @@
 sub date_to_days
 {
 	my ($m,$d) = @_;
-	return int(timegm(0,0,0,$d,$m-1,2005) / (24*60*60));
+	return int(timegm(0,0,0,$d,$m-1,$m>3?2005:2006) / (24*60*60));
 }
 
 sub days_to_date
 {
 	my $days = shift;
 	$days *= 24*60*60;
-	return sprintf("%02d-%02d",(gmtime $days)[4]+1,(gmtime $days)[3]);
+	return sprintf("%04d-%02d-%02d",(gmtime $days)[5]+1900,(gmtime $days)[4]+1,(gmtime $days)[3]);
 }
 
diff -ru hatenaidea.orig/senkyo.pl hatenaidea/senkyo.pl
--- hatenaidea.orig/senkyo.pl	Thu Sep  8 19:45:30 2005
+++ hatenaidea/senkyo.pl	Mon Jan 30 01:31:37 2006
@@ -111,13 +111,13 @@
 sub date_to_days
 {
 	my ($m,$d) = @_;
-	return int(timegm(0,0,0,$d,$m-1,2005) / (24*60*60));
+	return int(timegm(0,0,0,$d,$m-1,$m>3?2005:2006) / (24*60*60));
 }
 
 sub days_to_date
 {
 	my $days = shift;
 	$days *= 24*60*60;
-	return sprintf("%02d-%02d",(gmtime $days)[4]+1,(gmtime $days)[3]);
+	return sprintf("%04d-%02d-%02d",(gmtime $days)[5]+1900,(gmtime $days)[4]+1,(gmtime $days)[3]);
 }
 

*1:get.pl 詳細はid:TransFreeBSD:20050914:p3にて

*2:ミラーモード

*3:自動リトライ

*4:quietモード

トラックバック - http://freebsd.g.hatena.ne.jp/TransFreeBSD/20060130

2006-01-06

[]旧年中はお世話になりました(笑) 旧年中はお世話になりました(笑) - TransFreeBSDの日記 を含むブックマーク

何人かの方にアイデアポイントをお送りしました。特に深い意味はありません。新年のご挨拶代わりみたいな物です。

私はよく思いつきで飛び移ってしまう。飛び付くのなら良いが、以前の物を放り出して飛び移る。まぁ、あまり良い事ではないですが、はてなアイデアにもそんな感じで飛び移ったあと、色々やって、そしてよそへ飛び移ってしまったわけです。そのため、気が付けばここ2ヶ月程はてなアイデアに触っていませんでした。

多分、思いつけばまた構うだろうけど、しばらくはほとんど構う事がないと思います。ただ、そうなると眠っているポイントがもったいない。

そんなわけで、幾らかのアイデアは整理して、昨年交流のあった方ではてなアイデア活用しておられる方に手持ちのポイントを送る事にしました。

最後に、「あれ?もらってないよ?」と言う方もいると思いますが、今年も変わらぬご愛顧を宜しくお願いします。

トラックバック - http://freebsd.g.hatena.ne.jp/TransFreeBSD/20060106

2005-09-25

[]売出し 売出し - TransFreeBSDの日記 を含むブックマーク

No.売価株数最低売却希望価格
61211.50101.10
トラックバック - http://freebsd.g.hatena.ne.jp/TransFreeBSD/20050925

2005-09-24

[][]アイデアが塩漬けとなってしまう期間は? アイデアが塩漬けとなってしまう期間は? - TransFreeBSDの日記 を含むブックマーク

はてなアイデアで株取引が活発でない理由の一つとして、発案されるアイデアの数が多く、注文が分散されて取引が成立しにくいというのがある。そして時間が経てば経つほど注目度が下がり取り引きできる可能性が下がる。結果、気が付くと売れない/実装されない/キャンセルできない=塩漬け状態となる。

では、その期間はどの程度か?リスクヘッジのためにはおおよその傾向を知る必要があるでしょう。

というわけで、それではどのように計算すると良いか、メモ的に書いておく。

まず、前提条件

で、計算方法

  1. 発案から最終取引までの日数の分布から、アイデア数がある閾値に達する取引期間
  2. 各取引の発案からの日数分布から求めた取引期間
  3. 上記を出来高で重み付けした分布

1と2は意味的には同じだと思うが、1の方が計算が簡単で、2の方がより正確だと思う。3は取引できる株数の指標となり、保持株数による評価ができると思う。

閾値は63.2%とかかな?とりあえずグラフを書いて見て決める。

トラックバック - http://freebsd.g.hatena.ne.jp/TransFreeBSD/20050924

2005-09-21

[]売出し 売出し - TransFreeBSDの日記 を含むブックマーク

No.売価株数
61913.0010
トラックバック - http://freebsd.g.hatena.ne.jp/TransFreeBSD/20050921