Hatena::Groupkakisute

g5nの書き殴り

2008-05-24

ブログサービスのアクティブユーザ数

ブログサービスのアクティブユーザ数 - g5nの書き殴り を含むブックマーク はてなブックマーク - ブログサービスのアクティブユーザ数 - g5nの書き殴り

http://www.blogfan.org/service/ から、最新のアクティブユーザー数の一覧をつくる。

% ruby blogfan.rb =(w3m -dump_source http://www.blogfan.org/service/)
アメーバブログ     415037 (18.8%)
FC2ブログ          394841 (17.9%)
Yahoo!ブログ       226763 (10.3%)
livedoor Blog      210874 ( 9.6%)
ヤプログ!         133781 ( 6.1%)
Seesaaブログ       124669 ( 5.7%)
楽天ブログ         120064 ( 5.4%)
goo ブログ         118218 ( 5.4%)
JUGEM              115691 ( 5.2%)
ココログ            72414 ( 3.3%)
はてなダイアリー    58980 ( 2.7%)
AutoPage            40897 ( 1.9%)
CURURU              39812 ( 1.8%)
エキサイトブログ    39435 ( 1.8%)
ウェブリブログ      35014 ( 1.6%)
So-net blog         26790 ( 1.2%)
ブログ人            12688 ( 0.6%)
LOVELOG              7057 ( 0.3%)
ドリコムブログ       6468 ( 0.3%)
Doblog               2469 ( 0.1%)
AOLダイアリー     2233 ( 0.1%)

ソース

require "nkf"
require "pp"
html = NKF::nkf("-We", $<.read)
table = html.scan(%r_(<h3>.*?</h3>)|(<caption>毎月のアクティブユーザー数</caption>.*?</tbody>)_im)

result = []
table.each{|provider, monthly|
  if provider
    result << [provider.scan(%r_>([^<]*?)</a>_im).flatten.last]
  elsif monthly
    monthly.scan(%r_<th>(.*?)</th>_im).flatten.last
    result.last << monthly.scan(%r_<td>(.*?)</td>_im).flatten.last.to_i
  end
}

sum = result.inject(0){|i,j| j[1]+i}
max = result.inject(0){|i,j| [j[0].size, i].max}
puts result.sort_by{|n,m| -m}.map{|a,b| sprintf("%-#{max}s %8d (%4.1f%%)\n", a,b,b*100.0/sum)}

2008-03-28

コンプリートできる確率と買う個数の期待値

 コンプリートできる確率と買う個数の期待値 - g5nの書き殴り を含むブックマーク はてなブックマーク -  コンプリートできる確率と買う個数の期待値 - g5nの書き殴り

http://d.hatena.ne.jp/m_seki/20080328#c 関連

# -*- coding: utf-8 -*-
require "rational"

def akb44(n)
  # n 枚買ってそろう確率
  omake(44, n, 44)
end

def omake(k,n,m=nil)
  # n 個買って k 種類のおまけのうち m 種類がそろう確率
  m = k if m.nil?
  omake_general(k,0,k,m,n)
end

def omake_general(k,a,b,m,n)
  # k 種類のおまけのうち、欲しいものが b 種類ある。
  # そして、すでに a 種類入手しているとする。
  # これから n 個のおかしを買い増ししたとき、
  # 手元に揃った種類数が m になる確率
  # http://aquarius10.cse.kyutech.ac.jp/~otabe/shokugan/
  comb(b-a, m-a) * sum(b-m, b-a){|i|
    (-1)**(b-m+i) * comb(m-a, m-b+i) * Rational(k-i, k)**n
  }
end

def comb(x,y)
  y = x - y if y > x/2
  return 0 if x < y
  return 1 if y == 0
  return 1 if x == 0
  (x-y+1..x).inject(:*)/(1..y).inject(:*)
end

def sum(x,y)
  (x..y).inject(0){|part,i| part + yield(i)}
end

def ex(k)
  # k 種類のおまけがすべてそろうまで買う個数の期待値
  # http://kakuritsu.hp.infoseek.co.jp/omake2.html
  sum(0, k-1){|i| Rational(k,k-i)}
end

if __FILE__ == $0
  # 44種類のおまけをコンプリートするまでに買う個数の期待値
  p ex(44).to_f

  # http://d.hatena.ne.jp/m_seki/20080328#c

  # > 12種類のカードが入ってるチョコを15個買って、11種類まであつまる確率
  p omake(12,15,11).to_f
  # > 44種類を45回でそろえる確率は、44回でそろえる確率の何倍か
  p akb44(45).to_f/akb44(44).to_f
end

2008-03-07

DHCPのリースファイルを監視する

22:50 | DHCPのリースファイルを監視する - g5nの書き殴り を含むブックマーク はてなブックマーク - DHCPのリースファイルを監視する - g5nの書き殴り

% ruby -rtempfile -e 'f = "/var/db/dhcpd/var/db/dhcpd/dhcpd.leases"; a = File.read(f); loop{b = File.read(f); t0,t1 = Tempfile.new("t0"), Tempfile.new("t1"); t0.write(a); t0.flush; t1.write(b); t1.flush; diff = `diff -u #{t0.path} #{t1.path}`; puts("-"*200,diff) if !diff.empty?; a = b; t0.close; t1.close; sleep 3}'

これじゃあんまりなので、改行しておくか。

require "tempfile"
f = "/var/db/dhcpd/var/db/dhcpd/dhcpd.leases"
a = File.read(f)
loop{
  b = File.read(f)
  t0,t1 = Tempfile.new("t0"), Tempfile.new("t1")
  t0.write(a)
  t0.flush
  t1.write(b)
  t1.flush
  diff = `diff -u #{t0.path} #{t1.path}`
  puts("-"*200,diff) if !diff.empty?
  a = b
  t0.close
  t1.close
  sleep 3
}

ああ、書き直したい。でも書き直さない。それがカキステ。

2007-12-20

指定した名前のファイルを HTTP GET する

20:48 | 指定した名前のファイルを HTTP GET する - g5nの書き殴り を含むブックマーク はてなブックマーク - 指定した名前のファイルを HTTP GET する - g5nの書き殴り

ふつうのファイルがインターネットに載っててそれの URL のリストがあって、それを GET したい。たぶん wgetオプションで同じことは出来るんだろうけど、難しすぎるので書いてしまった。URLのリストはとりあえず __END__ に書くことに。

httpgetfiles.rb

require "fileutils"
require "logger"
require "uri"
require "open-uri"

include FileUtils
@logger = Logger.new(STDERR)

def http_get(c)
  if !File.exist?(c)
    mkdir_p(File.dirname(c)) unless File.directory?(File.dirname(c))
    atime = Time.now
    begin
      open(c, "w"){|f|
        @logger.info("getting #{c}")
        open("http://#{c}"){|src|
          atime = src.last_modified
          f.write(src.read.to_s)
          File.utime(atime, atime, c) if atime
        }
      }
    rescue
      @logger.warn("#{c}: #{$!.inspect}")
      rm c
    end
  else
    @logger.info("exists #{c} (not get)")
  end
end

DATA.read.scan(/\S+/).each{|path|
  http_get(path)
}
__END__
www.google.co.jp/intl/ja/about.html
www.google.co.jp/intl/ja/contact/index.html

客から戻ってきたコードはうちのどのリリースと同じか

22:41 | 客から戻ってきたコードはうちのどのリリースと同じか - g5nの書き殴り を含むブックマーク はてなブックマーク - 客から戻ってきたコードはうちのどのリリースと同じか - g5nの書き殴り

何回かリリースした後、客から不具合のレポートが来たが再現できない。聞くところによると、いろいろ手を入れたという。ファイルによっては最新リリースではないという。えっと。

とりあえずお客さんの手元にあるソースをみて、これまでのリリースのどれかと同じファイルがどれくらいあるかを調べてみた。

  • /given/files/from/your/client/ ... 客から戻ってきたソース
  • /your/checked/out/releases/*/ ... これまでのリリースのコピー。ディレクトリ名の辞書式順序と新しさの順序は等しいとする。

find_latest_identical_release.rb

require "find"
require "digest/md5"

product = "/given/files/from/your/client/"
set = Dir["/your/checked/out/releases/*/"]

hash = {}
src_base = File.basename(src)
hash[src_base] = {}

Find.find(src){|i|
  next if !File.file?(i)
  path = i.sub(src, "")
  hash[src_base][path] = Digest::MD5.hexdigest(File.read(i))
}

set.each{|dir|
  base = File.basename(dir)
  hash[base] = {}
  Find.find(dir){|i|
    next if !File.file?(i)
    path = i.sub(dir, "")
    hash[base][path] = Digest::MD5.hexdigest(File.read(i))
  }
}

dst_base = hash.keys - [src_base]

printf("%s\t\%s\n", "path", "latest release")

hash[src_base].each{|path, md5|
  match = dst_base.find_all{|version|
    hash[version][path] == md5
  }

  printf("%s\t%s\n", path, match.sort.last)
}

nqjxtqgaqmnqjxtqgaqm2013/12/17 15:02rjayolbljtvuf, <a href="http://www.gsecmphkjo.com/">jmmtepgnqn</a> , [url=http://www.ydplktqubr.com/]auhlfysmkq[/url], http://www.bfelbbfnrd.com/ jmmtepgnqn

2007-12-14

IE7が横スクロールバーの高さのために不要な縦スクロールバーを出す

10:14 | IE7が横スクロールバーの高さのために不要な縦スクロールバーを出す - g5nの書き殴り を含むブックマーク はてなブックマーク - IE7が横スクロールバーの高さのために不要な縦スクロールバーを出す - g5nの書き殴り

むかついたので再現ページつくった。

IE7 unneeded vertical scrollbar with horizontal scrollbar

とりあえずの逃げ

<!--[if IE]>
<script type="text/javascript">
<!--
window.attachEvent('onload', function(){
  bugcase.style.height = ''+(bugcase.offsetHeight+17)+'px';
});
//-->
</script>
<![endif]-->