Debian Description Trendsは次のようなかんじで作った。
まず、wordのとりだし。UNIX shellパワーを駆使(というか超適当)
for file in */*/01/debian/dists/sid/main/binary-i386/Packages.gz
do
date=$(date -d $(echo $file | sed -e 's/\/debian.*//') +%Y-%m)
gunzip < $file |
sed -ne 's/Description: //p' -e '/^ /p' |
tr '[[:upper:]]' '[[:lower:]]' |
sed -e 's/[^-\/+[:alnum:]]/ /g'
-e 's/[[:space:]][[:space:]]*/\n/g' |
sort | uniq -c |
sort -nr > ~/tmp/desc-words-$date.lst
done
これで desc-words-$YYYY-$mm.lst にwordごとのcountが示されたファイルができる
最初これを ruby scriptで gnuplot script を生成してgraphを生成していたのだが、webで見られるようにしたほうが便利だろうと思い途中でcgiに変更。
使ってみるとscanしてgnuplot script生成がかなり遅かったのでデータをsqliteにつっこんでみた。
CREATE TABLE words (
year integer,
month integer,
word string,
count integer
);
CREATE INDEX words_word on words ( word );
つっこむ時はこんなかんじで
#!/usr/bin/ruby
require 'sqlite3'
..
db = SQLite3::Database.new(dbname)
..
sql.push("insert into words values (#{year}, #{month}, '#{kw}', #{n});")
..
db.execute_batch(sql.join("\n"))
cgiの中はこうやってとりだし
#!/usr/bin/ruby
require 'sqlite3'
...
keyword = q.gsub(/,/, "").split
kwv = {}
db = SQLite3::Database.new(DATAFILE)
db.results_as_hash = true
db.execute("select year, month, word, count from words "+
"where word in " +
"(#{keyword.collect{|v| '?'}.join(', ')})",
*keyword) do |row|
date = "#{row['year']}-#{row['month']}"
kwv[date] ||= {}
kwv[date][row['word']] = row['count'].to_s
end
...
No comments:
Post a Comment