Hatena::Grouprubyist

たばさの RSSフィード

04/24(月) 2017

はやりもの観察

はやりもの観察 - たばさの を含むブックマーク はてなブックマーク - はやりもの観察 - たばさの

https://instances.mastodon.xyz/list

jpぽいものの比率をなまあたかかく観察。

使う場合は、上のをユーザー数で並べ替えてからコピーしてファイルに保存しましょう。


#!/usr/bin/ruby
# -*- coding: utf-8 -*-

require 'optparse'

selector='mstdn\.jp|pawoo|\.jp|\.nico|\.tokyo|\.nagoya|yokohama|\.osaka|japan|okinawa|ryukyu'
barsize=100
file=false
max=false
limit=false
raw=false
upto=70
jp=false

opt = OptionParser.new
opt.on('-s size',"bar size") {|v| barsize=v.to_i }
opt.on('-f d',"file name") {|v| file=v }
opt.on('-m d',"max") {|v| max=v.to_i }
opt.on('-l d',"limit") {|v| limit=v.to_i }
opt.on('-u d',"limit sumPercent") {|v| upto=v.to_i }
opt.parse!(ARGV)

def mshow mark,num,max
  max=max.to_i
  half=max/2
  mid1=max/4
  mid2=max/4*3
  st=max/8.0
  blnk=" "
  max.times{|i|
    #break if i>num
    case i
    when half
      print"/"
    when max-1
      print"|"
    when mid1,mid2
      print":"
    when (st*5).to_i,(st*6).to_i,(st*7).to_i
      print"." 
    when num..max
      print blnk
    else
      print mark
    end
  }
  per=format"%.1f",num*100/max
  per="" if mark=="-"
  puts " #{per}"
end
class Array
  def rejtop
    dust="Statuses.*Connections.*Registrations.*Uptime"
    if self.select{|i|i=~/^###|#{dust}/}.size>0
      st=false
      tmp=[]
      self.each{|i|
        if st
          tmp<<i
        elsif i=~/^###|#{dust}/
          st=true
        end
      }
      tmp
    else
      self
    end
  end
end
def ver li
  v=1
  k=li.select{|i|i=~/Score.*Instance.*Version/}.size
  p k
  v=2 if k>0
  v
end
class String
  def field
    split(/\t/)
  end
end
def usersField f
  ver=ver(File.readlines(f))
  n=case ver
    when 1
      [2,3]
    when 2
      [2,4]
    else
      [2,3]
    end
  p [:v,ver]
  n
end
def calc f,k,fnum
  p k
  liAll=File.readlines(f)
  li0=liAll.rejtop
  li=li0.map{|d|d.field[fnum].to_i}-[0]
  jpRaw=li0.select{|i|i=~/#{k}/}
  jp=jpRaw.map{|d|d.field[fnum].to_i}
  sum=li.inject(0){|i,s|s+i}
  sumj=jp.inject(0){|i,s|s+i}
  med=li[li.size/2]
  li2=li-[1]
  med2=li2[li2.size/2]
  li3=li-[1,2]
  med3=li3[li3.size/2]
  under=Proc.new{|n,l|
    total=l.size
    [:"u#{n}", s=l.select{|i|i<n}.size,(format"%.1f%",s*100.0/total)]
  }
  small=[]
  small<<under.call(10,li)
  small<<under.call(100,li)
  small<<under.call(1000,li)
  wall=[]
  rate=0.84
  li.each_cons(2){|i,j|
    r=format"%.2f",i.to_f/j
    wall<<[j,r] if i*rate>j && i-j>5
  }
  [wall,med,med2,med3,small,sum,sumj,li,jpRaw,li0]
end
li=ARGV.map{|i|i.to_i}
max=li.shift if ! max
nf=2
uf=3
medium=0
medium2=0
medium3=0
small=0
wall=[]
if file
  nf,uf=usersField(file)
  wall,medium,medium2,medium3,small,max,sumj,li,jp,raw=calc(file,selector,uf)
end
size=limit||li.size
p [:user,max,:jp,sumj,format("%.2f%",sumj.to_f*100/max),:foreign,max-sumj,:medium,medium,:dropSmall,medium2,medium3,:instance,li.size,:jp,jp.size,format("%.2f%",jp.size.to_f*100/li.size),:iSmall,small]
p [:cliff,wall]
if $DEBUG
  p li 
  p jp.map{|i|tmp=i.field;[tmp[nf],tmp[uf]]}
  p jp.size
end
ex=raw.map{|i|i.field[nf]=~/(\.[^\. ]*) *$/;$1}
hs=Hash.new(0)
ex.each{|k|hs[k]+=1}
elimit=50
elimit=-1 if $DEBUG
sep=" "
puts "[rank order]",hs.keys.sort_by{|k|-hs[k]}.map{|k|"#{hs[k]}#{k}"}[0..elimit]*sep
if $DEBUG
  puts "[name order]",hs.keys.sort.map{|k|"#{hs[k]}#{k}"}[0..elimit]*sep
end
puts raw[0,10].map{|i|
  d=i.field
  d=format"%-5s %7s %-26s %10s %15s",*d[0,5] if d.size>5
  d
}

if upto
  n=0
  tmp=0
  pto=upto.to_f/100
  li.each{|i|
    tmp+=i
    n+=1
    break if tmp>pto*max
  }
  size=n
end
rate=barsize*1.0
size.times{|i|
  n=li[i]*rate/max
  mshow "*",n,rate
}
mshow "-",rate,rate
def v list,key,num=3
  (list.select{|i|i=~/#{key}/}[0]||"").field[num].to_i
end
def top3 list,key,nf=2,num=3
  limit=3
  ns0=list.select{|i|i=~/#{key}/}.map{|i|[i.field[nf],(i.field[num]||"").to_i]}.sort_by{|n,v|-v}
  ns=ns0[0,limit]
  cnum=5
  p [:top,*ns0[0,cnum]]
  sum=ns.inject(0){|s,i|s+i[1]}
end
m,p,n=v(raw,"mstdn.jp",uf),v(raw,"pawoo",uf),v(raw,".nico",uf)
t=top3(jp,"",nf,uf)
puts "mstdn.jp #{m} pawoo #{p} :diff #{m-p}(#{format "%.2f",(m-p).to_f/m*100}%) jptop3:#{format"%.2f",t*100.0/max}%"

(動かないままだと何なので更新するが、それ以上の意味はないので、何かの参考にはしないように。手元で動くと面白いでしょうっていう程度の趣旨。jsonがあるようなのでそれを使った方がよい 2017-05-02)


むにゃむにゃ追っていたら

なんだかpawooのusersが一度1000くらい減った、id消せないということらしいのに、なにがあったのだろうか。調べないけど

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20170424

12/09(金) 2016

平方根 その3

平方根 その3 - たばさの を含むブックマーク はてなブックマーク - 平方根 その3 - たばさの

そしてニュートン法。

bigdecimalでも使っているようです。

しかし終了時間が予測できないし、続きを計算という手段がないので自前で作ります。

というより、bigdecimalというのがあったんだぁ、と後で気づくわけですが。


参考に収束する様子のグラフを探す。

> http://s-taichan.blogspot.jp/2012/02/sicp17.html

適当なxの値とその時点の接線から徐々に真の値に近づけていく感じ。ほんとに近づくのかとか、収束の速さはとか、思ったら結構速い。さすがニュートン。

#!/usr/bin/ruby
# -*- coding: utf-8 -*-

require 'optparse'

max=5
check=false
opt = OptionParser.new
opt.on('-a v',"loop max") {|v| max=v.to_i }
opt.on('-c',"check") {|v| check=v }
opt.parse!(ARGV)

def sqrtN x
  s=x.to_s.size-1
  d=("1"+"0"*(s*2)).to_i
  y=x*x-2*d
  a=2*x
  b=-(a*x-y)
  x=-b*d/a
end

st=Time.now
r=sqrtN(141421)
lim=6
max.times{|i|
  r=sqrtN(r)
  lim*=2
  r=r.to_s[0,lim].to_i
  STDERR.print","
  if check
    (r**2).to_s=~/^(20*|19*)/
    et=Time.now
    STDERR.puts "#{format"%.2f",et-st},#{$&.size}" if $&
  else
    et=Time.now
    STDERR.puts "#{format("%.2f",et-st)} #{i}"
  end
  print i,": "
  puts r
}

説明書こうかと思ったけど面倒なのでやめておくすまん。ルート2限定でとりあえず。前回と違い、検算しないと何桁まであっているか分からない状態。桁が増えると検算がまた大変。

実際に動かすと割と収束が速いなという印象だけども、印象だとか適当なこと言っているとまじめにやっている人には怒られてしまうのだ。たぶん。


そして、どうやら数値から文字列への変換がコストが高いよう。高速化を検索して見つかったので使ってみるも速くはならない、すでにruby本体に取り込まれている感触。感触?


有効桁数を考えなければ、1ステップごとに桁が倍々になる感じなので、そのへんが前回のbigdecimalでやった時の癖に関わるのかなという印象。

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20161209

12/08(木) 2016

ランダムっぽい数列

ランダムっぽい数列 - たばさの を含むブックマーク はてなブックマーク - ランダムっぽい数列 - たばさの

息抜きに、2の平方根を2万桁ほど求めたところで、

ans.scan(/[12345]+/).sort_by{|i|i.size}

などとやって1から5までの数字だけから構成されるランダムっぽい長めの数列を探してみます

[:pos, 10780, :val, "1221413242532", :size, 13]

[:pos, 10293, :val, "134142214511", :size, 12]

[:pos, 19875, :val, "245352422314", :size, 12]

[:pos, 5217, :val, "45444122255", :size, 11]

[:pos, 8959, :val, "41123515355", :size, 11]

[:pos, 2024, :val, "45512331421", :size, 11]

[:pos, 5631, :val, "3152512411", :size, 10]

[:pos, 11596, :val, "1245211244", :size, 10]

[:pos, 11679, :val, "352454514", :size, 9]

[:pos, 5316, :val, "454512424", :size, 9]

まあそこそこいいんじゃないでしょうか。(なにが?)

下のほうにはランダムっぽくないのもありますね。

一応、ネットで検索して意味ありげな結果があるか確かめておきましょう。

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20161208
カレンダー
<< 2017/08 >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
archive Error : RSSが取得できませんでした。