Web API関連

ちょっとPythonの勉強をし始めたので、以前Rubyで書いたWeb APIを参照するためのものをPythonで書き直してみた。

対象は、はてなブックマークはてなスターlivedoor readerlivedoor clip、Google PageRank。以前と同じくエラーや例外の処理はしていない。

#!/usr/bin/python
#coding: utf-8
#for Python2.5

from xml.etree import ElementTree
import xmlrpclib
import urllib
import re

username = "geiinbashoku2"

# はてなブックマーク件数
srv = xmlrpclib.ServerProxy('http://b.hatena.ne.jp/xmlrpc')
print srv.bookmark.getTotalCount("http://d.hatena.ne.jp/" + username + "/")

# livedoor reader 購読者数
d = urllib.urlopen("http://rpc.reader.livedoor.com/count?feedlink=http://d.hatena.ne.jp/" + username + "/rss")
print d.read() 
d.close()

# はてなスター数
d = urllib.urlopen("http://s.hatena.ne.jp/blog.json/http://d.hatena.ne.jp/" + username + "/")
print re.compile(r'\"(star_count)\":(?P<count>\d+)').search(d.read()).group('count')
d.close()

# livedoor clip数
srv = xmlrpclib.ServerProxy('http://rpc.clip.livedoor.com/count')
print srv.clip.getCount("http://d.hatena.ne.jp/" + username + "/").values()[0]

# PageRank
d = urllib.urlopen("http://www.trynt.com/google-pagerank-api/v1/?u=http://d.hatena.ne.jp/" + username + "/")
print ElementTree.parse(d).findall("//Pagerank")[0].text
d.close()

もっときれいに書けそうな気がする。正規表現のところとか。

MPICHとMPI::BOOL

C++のコードをMPIを用いて並列化しようとした時の話。Ubuntu上でOpenMPIを用いてテストを行い、大丈夫そうなので実際にOpenSUSE上でMPICHを用いてコンパイルしようとするとエラーが出た。「'BOOL' is not a member of 'MPI'」と表示されるので、MPI::BOOLがいけないらしい。よく分からないけど「MPI-2 Errata Topics」には、C++にはあってCやFortranにはないMPI::BOOLとかMPI::COMPLEX, MPI::DOUBLE_COMPLEX, MPI:LONG_DOUBLE_COMPLEXの話が出ている。

とりあえず実装上はboolからintに変換してMPI::INTで通信を行い、また変換する流れにしたがどうにも気持ちが悪い。インクルードすべきものをしてないとかそういう問題なのかもしれないけど、OpenMPI上では動作するわけだし、どうしたものか。

LDAP環境下で新しいホスト名をつけた時

先日、計算機に新しいホスト名をつけたときの話。

DNS(namedとかbind)にホスト名とIPの対応を記述するというのは当たり前の話。ssh でリモートからの接続も問題なく行える。しかし、なぜかログインしたときにストレージサーバにあるホームディレクトリをマウントしてくれない状況に陥った。結論から言うと、LDAPでアカウントを管理しているので、ホスト名も登録しなければならなかったのだ。

LDAPの扱いはいまいち分からないけど、ldapsearch で見てみると、どうやら新しいホスト名を登録すればよさそうだということはなんとなく分かった。そこでldifを書き、ldapmodify でホスト名の追加を試みるが、なぜかエラーがでる。

結局のところ、OpenSUSEのマシン上でGUIツールを使って追加することで解決した。OpenSUSEKDEしか使ってないのでGNOMEではどうなのかわからないけど、YaSTのNetwork ServicesにLDAP Browserがあるので、これを用いた。

RubyでPPM出力のメモ

geiinbashoku22009-02-15


Rubyで簡単な画像を作る機会があったのでそのときのメモ。CとかJavaでのPPMファイルの作り方のドキュメントはウェブ上にたくさんあるのでそちらも参考に。PPMについては「http://en.wikipedia.org/wiki/Portable_pixmap」を参照。気づかなかったけど、Windowsでは標準でPPMを開くことはできないみたい。

PPMファイルには以下のようにP1からP6まであるようだ。というか、PPMと呼ぶのはカラーのP3とP6で、P1とP4はPBM、P2とP5はPGMと呼ぶ方が正しいのかもしれない。

P1 白黒2値・アスキー
P2 モノクロ・アスキー
P3 RGBカラー・アスキー
P4 白黒2値・バイナリ
P5 モノクロ・バイナリ
P6 RGBカラー・バイナリ

アスキー形式で出す方が手軽だけど、ファイルサイズは大きくなる。本当はP4形式でことたりたのだけど、Rubyでビット単位で出力する方法がいまいち分からなかったので、P5で出力することにした。

#!/usr/bin/ruby
#p5.rb

width = 256
height = 256

puts "P5"
puts "#{width} #{height}"
puts "255"
  
i=0
while i<height do
  j=0
  while j<width do
    g = (i+j) % 256
    printf("%c",g)
    j+=1
  end
  i+=1
end

標準出力に出力してるので、リダイレクトでこんな感じ。

ruby p5.rb > p5.ppm

ついでにカラーのP6形式。

#!/usr/bin/ruby
#p6.rb

width = 256
height = 256

puts "P6"
puts "#{width} #{height}"
puts "255"
  
i=0
while i<height do
  j=0
  while j<width do
    r = i % 256
    g = j % 256
    b = (i+j) % 256
    printf("%c%c%c",r,g,b)
    j+=1
  end
  i+=1
end

テキストファイル入力のメモ

私はRubyをテキストファイルを一行ずつ入力し、処理して出力するという用途でよく使う。その時のメモ。

よく使うのはIOクラスでファイルを読み込む方法。

#!/usr/bin/ruby
#IO.rb

in_file = ARGV.shift

IO.foreach(in_file) do |line|
  if line =~ /^http\:\/\/d\.hatena\.ne\.jp\/(.+?)\//
    id = $1
    puts id
  end
end

この例では"http://d.hatena.ne.jp/id/"からidを抜き出して出力する。urlset.txtにURLが一行ずつ書かれているとしてこう使う

$ ruby IO.rb urlset.txt

次は標準入力を使う方法。

#!/usr/bin/ruby
#stdin.rb

$stdin.each_line do |line|
  if line =~ /^http\:\/\/d\.hatena\.ne\.jp\/(.+?)\//
    id = $1
    puts id
  end
end

リダイレクトを用いてこう使う。

$ ruby stdin.rb < urlset.txt

もしくはパイプを使ってこう。

$ cat urlset.txt | ruby stdin.rb

上の例は入力が素のテキストファイルだったが、テキストファイルが巨大になるとgzで圧縮して扱いたい時もある。圧縮したものをurlset.txt.gzだとする。

添付ライブラリのzlibを使う方法。

#!/usr/bin/ruby
#gz.rb
require 'zlib'

in_file = ARGV.shift

Zlib::GzipReader.open(in_file).each_line do |line|
  if line =~ /^http\:\/\/d\.hatena\.ne\.jp\/(.+?)\//
    id = $1
    puts id
  end
end

IO.rbと同じようにこう使う。

$ ruby gz.rb urlset.txt.gz

上の標準入力を使うものにgzipを組み合わせることもできる。

$ gzip -dc urlset.txt.gz | ruby stdin.rb

標準入力を用いるとパイプで処理を続けることができる。実行権限を付けてあげればrubyと書かなくていいわけだし便利。

livedoor clipでクリップされてるはてなダイアリー

前回書いたように「クローリングしてる暇があるなら…論文かいたら? | EDGE Datasets(研究用データセット)」で手に入れたlivedoor clipのデータ(2008年12月版)をドメインごとに分類するとd.hatena.ne.jpが一番多かった。そこでid別にカウントしてみた。どう利用するかは分からないけど需要があるようなので。

データ全体では2546のidが含まれていた。以下はクリップ数40以上の499。

続きを読む

livedoor clipでクリップされてるドメイン

クローリングしてる暇があるなら…論文かいたら? | EDGE Datasets(研究用データセット)」で手に入れたlivedoor clipのデータ(2008年12月版)をどう使用しようかと考えている。ソーシャルブックマークの研究という点では、レコメンデーションやリンク予測が定番かなとも思う。2009年の6月には新しいデータが書き出されるようなので、今回のデータで学習して次回のデータでテストする、なんて使い方ができるわけだ(次回の書き出しを待つまでもなく日時でデータ分割すればいいのだけど)。

本格的にデータをこねまわす前に、簡単にデータの概要みたいなものを調べてみた。以下はクリップ数が多いドメイン100。

やっぱりと言っていいのかは分からないが、はてなダイアリーのクリップ数が多かった。データ全体でのクリップ数が1,570,527なので7.65%ほどをはてなダイアリーが占めていることになる。その次がlivedoor blogで、以下ニュースサイトなどが並んでいる。

続きを読む