basyura's blog

あしたになったらほんきだす。

ruby

Sequel: The Database Toolkit for Ruby (v3.7.0)

なんとなく和訳してみる Sequel provides thread safety, connection pooling and a concise DSL for constructing database queries and table schemas. Sequel: The Database Toolkit for Ruby (v3.7.0) スレッドセーフなコネクションプーリングとDB 並び…

migrate

実行されないと思ったらファイル名に規則がある The Migrator module performs migrations based on migration files in a specified directory. The migration files should be named using the following pattern (in similar fashion to ActiveRecord mig…

ROneUsers で県別新着ユーザを RSS 配信

半径 1 クリックの範囲を収集した地域別 Twitter ユーザ数 あーるわんゆーざーず タイムゾーンが日本のユーザがフォローしているユーザを地域別に丸めて(新宿区→東京 etc)集計 一時間に一回ぐらい統計データを更新 ROneUsers 県別に新着ユーザを RSS 配信す…

Hash.new([]) にたまにハマる

Array#inject でキーに対する値を配列で持つ Hash を生成する際に、 m = ["a","a","b","b"].inject(Hash.new([])){|map,v| map[v] << v.upcase map } p m #=> {} としちゃって返ってきた Hash が空でたまにハマる。 デフォルト値として、毎回同一のオブジェ…

RSS配信してみた

http://basyura.org/rone/ Twitter ユーザを県別に集計している(地味に)んだけど、これの新着ユーザを RSS で配信するようにしてみた。RSS を取得して中身を見るのは何回かやったことあるんだけど、自分で生成するのは始めて。差分更新の仕方がよく分からな…

トップ画面まるごとキャッシュした

http://basyura.org/rone/ require でいろいろロードしたり、Sequel で DB につなげたりと cgi で呼び出されるごとに毎回やるのは非常に厳しいので、トップ画面を cache = erb :index // この後 cache を PStore で書き込み // 1 時間おきに cache の作り直…

ROneUsers を手直し

してみた → http://basyura.org/rone/ 新しく取り込んだユーザを非同期表示してみたり。 cgi だとレスポンスが微妙すぎる・・・。集計結果を PStore でキャッシュしてるけど require でムダにライブラリ読んだり DB つなげたりしちゃってるのもあるだろうな…

なぜそう思ったか?

「なんとなくそう感じた」というような思いこみではなく、「このような事実が観測された」、「このような理由でこう思った」というような事実の積み重ねがなければ、正しい知識を身につけることはできないと思います。 [http://blade.nagaokaut.ac.jp/cgi-bi…

つくりなおし

ROneUsers を放置してたらブクマがついてたので慌てて修正。 ユーザ情報を API でクロールしまくっといてその後は MapReduce ヨロシク的な事をしたかったのだけど、さくらサーバで CGI じゃ分散処理もできないしキャッシュも厳しいので困り果ててたところ。3…

なにこれ気持ち悪い

ここから class A def execute(msg) puts msg end end A.new.execute(<<-MSG) HELLO WORLD NANI KORE KIMOCHIWARUI MSG #=> HELLO WORLD #=> NANI KORE KIMOCHIWARUIすげー便利だと思う。ただ・・・なにこれ・・・気持ち悪い。 はみってるよね・・・MSG くん…

csv 出力

sql 実行しただけなんだけど。 require 'sequel' DB = Sequel.connect('mysql://root:pass@127.0.0.1/tusers') DB.execute("select * from users into outfile '/tmp/mout.csv' fields terminated by \',\'") find_all で全件取得するよりも、csv に吐いたも…

PStore のファイルサイズは小さい方がいい

PStore を使ってファイルから要素を取り出す場合、 37M より 700K の方が圧倒的に早い。 前者が 3.1 [s] で後者が 0.09 [s]。 こんなに差が出るとはなぁ。適当に分割するか。

全件検索の時間

スキーマ定義 unless DB.table_exists? :users DB.create_table :users do primary_key :id String :screen_name, :unique => true String :uid String :name varchar :description , :length => 500 varchar :profile_image_url , :length => 500 varchar :…

Snow Leopard で Mysql

Sequel 経由で mysql にアクセスしても Mysql::Error が無いって(NameError)怒られちゃう。インストールした mysql.rb を require しても require 'mysql_api'で失敗してた。 port からインストールした mysql を全部消して http://dev.mysql.com/downloads/…

sqlite3 の CR

twitter のユーザ情報をクロールして sqlite3 に突っ込んでみてるんだけど性能がちょっと。 84000件のレコード を find_all → 16 [s] create → 526.722367 [s] transaction 付きで create → 432 [s]こんな使い方するのが間違いか・・・。一時間に一回、デー…

あたりまえだけどトランザクション

class Users < Sequel::Model ; end DB.transaction do # テーブルのレコード全削除 Users.delete # レコード insert Users.create( :screen_name => "bbbb", :description => "いいいい" ) # エラーが発生してロールバックするので # テーブルの削除も inse…

Sequel で トランザクション管理

直感的に Users.create が独立してるように見えてトランザクション管理されないように感じるんだけど、 素直に transaction を使えばいい。 require 'rubygems' require 'sequel' # DB オープン DB = Sequel.sqlite("transaction.db") # テーブルを生成 unle…

ROneUsers を作ってみた

Twitter で発言場所導入の話が上がってきてる中、自力で半径 1 クリックの範囲を収集した地域別 Twitter ユーザ数を集計。自分の住んでる地域に近い人を探したい人にぴったり(かもしれないけど、なかなか地方の人にはヒットしない)。特徴 あーるわんゆーざー…

さくらで sinatra

ようやくさくらサーバで sinatra が動いた。情報は探せばすぐ出てくると思うけど自分のまとめ。 sinatra rack 0.9.1 /home/basyura/lib/ruby/gem/gems/rack-0.9.1/lib/rack/request.rb を修正 begin @env["rack.input"].rewind if @env["rack.input"].respon…

テーブルを作ってインデックスを追加

DB = Sequel.sqlite('tusers.db') unless DB.table_exists? :users DB.create_table :users do primary_key :id text :screen_name, :unique => true text :name text :description integer :utc_offset text :time_zone text :location integer :followers_…

API を素直に使う方がいい

API というかライブラリだけど。 require 'rubygems' require 'twitter' t = Twitter::Base.new(Twitter::HTTPAuth.new("user_name", "password")) u = t.user("basyura") puts u.name puts u.screen_name puts u.description puts u.screen_name puts u.utc…

ユーザ情報をスクレイピング

特にレスポンス気にせずに xpath 使うとかなり楽に書けるね。 require 'rubygems' require 'mechanize' class TScraper def initialize(user_name , password) @agent = WWW::Mechanize.new @agent.max_history = 1 page = @agent.get('http://twitter.com')…

mechanize でスクレイピングして json 形式にする

0.9.0 から nokogiri に変わってたらしく、以前書いていたものが動かなくなってた。 書き直してみたんだけどリファレンス引くのが大変・・・。メソッド呼び出しした結果でどのクラスのインスタンスが返ってくるかとか、それはどのメソッドがあるのかとか。Ru…

mechanize 0.9.0 から nokogiri

記事をチラチラと見かけてはいたけど、久々に mechanize 動かしたらエラーが出たのでようやく認識した感じ。 各クラスが入り組んでるライブラリを使うのって大変だな・・・リファレンス見て・・・ソースを見て、たまにメソッドの実行結果を puts obj.class.t…

カスタムフィールドのカスタム表示

チケットのカスタムフィールドをカスタム表示させたい。 入力するときはテキストボックス。表示するときは url に変換してリンクを表示。ってなぐあいに。

Twitter の発言時間を月別・時間別に出力してみた

過去の自分の発言を API 制限がかかるまでさかのぼって取得(2008年12月までの3600)。それを月別・時間別の発言数にまとめた。日別も有るけど長いので省略。 twitter gem を使ったので取得は簡単だったけど、pstore で保存できなかったので別の入れ物にうつし…

redmine のチケット一覧にカスタムフィールドを表示する方法がいかにイケてないか

なんでこんな UI なのか。 フィルタ条件のチェックを全て外す。 保存する。 新しいクエリ作成画面に移るので「規定の項目」のチェックを外すと下にカスタムフィールドを含んだ項目の一覧が表示される。カスタムフィールドを追加する。 カスタムフィールドを…

Solaris8 に ruby 環境構築

プロジェクトで使わなくなってしまった Solaris8 sparc サーバに ubuntu を入れて redmine を動かしたかったんだ、本当は。9 は sparc 対応して無いし(UltraSPARC 対応)、7.10 を入れようとしたんだけど対応していない機種だったらしく失敗。 方針を変えて、…

Ruby 技術者認定試験に合格した!

94/100 点で合格した♪ io#seek と io#pos を間違えたのは確実だけど、あと二つはどれだったか分からない・・・。最初に 50 問解いた時点で自信が無いのが 10 個あったので、3 問間違いで済んだのはちょっとびっくりした。 試験を実際に解いてみて必要と感じ…

cygwin 上の Ruby で Excel ファイルを作成する

http://d.hatena.ne.jp/takihiro/20090710/1247233280 これのパクリです。直したのはエンコーディングの所。 Spreadsheet.client_encoding = 'shift_jis' # SJIS でも OK だった