下のぐるぐる回すスクリプト
てきとーに書いたやつなんだけど、ファイルの中身を読み込んでevalしていると、何回も定数を宣言してしまうので怒られるね。
まあwarningなので華麗にスルーするとよい。
下のスクリプトを修正した
予想通り大きい順と小さい順を逆に考えていた酔っぱらいプログラミング。
tweetをmixi voiceに投稿する
twitterとmixi voiceを連携したいのだけど、ぐぐって見つけたやつは微妙なカンジなのでrubyで自分で書いた。
まだテスト中だけどコードは下みたいな感じ。
飲みながら書いたのであまり地震がありません。
いや、今日は地震があった。ないのは自信な。
cronで回すか、さらに下に書いたぐるぐるスクリプトでぐるぐるまわすとtwitterのつぶやきがmixi vocieにも反映される。
MIXI_NAME = 'mail address' MIXI_PASS = 'password' TW_NAME = 'username' TW_PASS = 'password' MIXI_FOOT = '[from twitter]' SAVE_FILE = 'tweet.dat' LOG_FILE = STDOUT #'tw2mixi.log' MAX_RETRY = 10 require 'rubygems' require 'mechanize' require 'rubytter' require 'kconv' require 'logger' require 'time' $log = Logger.new(LOG_FILE) $log.level = Logger::DEBUG class Tweets def initialize(id, pass) raise 'need twitter id and password' if !(id and pass) @id = id @pass = pass @tw = nil @last_tweet = get_saved_time end def login @tw = Rubytter.new(@id, @pass) end def post_mixi mixi = MixiVoice.new(MIXI_NAME, MIXI_PASS) tweets = get_new_tweet tweets.sort!{ |new, old| Time.parse(new.created_at.to_s) <=> Time.parse(old.created_at.to_s) } tweets.each do |tweet| mixi.post(tweet.text.gsub("\n",' ') + MIXI_FOOT) File.open(SAVE_FILE, 'w') do |file| file.print Time.parse(tweet.reated_at.to_s) end $log.info(tweet.text.gsub("\n",' ') + MIXI_FOOT) end end def get_new_tweet retry_counter = 0 begin login if !@tw if @last_tweet then tmp = Array.new tweets = @tw.user_timeline(@id) tweets.each do |tweet| if Time.parse(tweet.created_at.to_s) > @last_tweet then tmp << tweet end end return tmp else return [@tw.user_timeline(@id).first] end rescue $log.error $!.to_s + 'twitter get error' retry_counter += 1 raise 'cant connect twitter' if retry_counter > MAX_RETRY @tw =nil retry end end def get_saved_time File.open(SAVE_FILE) do |file| if (str = file.read.to_s).size > 0 then return Time.parse(str) else return nil end end end end class MixiVoice VOICE_URI = 'http://mixi.jp/recent_voice.pl' def initialize(id, pass) raise 'need mixi id and password' if !(id and pass) @id = id @pass = pass @agent = nil end def post(text) retry_counter = 0 begin login if !@agent page = @agent.get(VOICE_URI) form = page.forms[1] form['body'] = text form.click_button rescue $log.error $!.to_s + 'mixi voice post error' retry_counter += 1 raise 'cant connect mixi' if retry_counter > MAX_RETRY @page = nil retry end end def login retry_counter = 0 begin @agent = Mechanize.new page = @agent.get("http://mixi.jp/") form = page.forms.first form["email"] = @id form["password"] = @pass form.submit rescue $log.error $!.to_s + 'mixi login error' retry_counter += 1 raise 'cant login mixi' if retry_counter > MAX_RETRY retry end end end Tweets.new(TW_NAME, TW_PASS).post_mixi
exec_ruby = ARGV.shift or raise ruby_file = File.open(exec_ruby).read while(1) begin eval ruby_file rescue print $! end sleep(60*5) end
指定したリストにいる人たちがフォローしている人の中で人気のある人を探す
この人はおもろいなと思った人をリストにまとめた後、自分がおもろいと思っている人がフォローしている人はおもろいだろうということで、そのリストの人たちに人気のある人たちを探してフォローしてやろうとかそういうことを考えました。
というか、前作ったやつのtwitter APIを使ったバージョン。
twitter.rb 0.8.3 をつかっているので
gem isntall twitter
してください。
とりあえず、数を数えるまで作った。
リストを作るのがとても面倒くさいことに気がづきました。おやすみなさい。
require 'rubygems' require 'twitter' TWIT_ID = 'name' TWIT_PW = 'password' TARGET_LIST = 'listname' client = Twitter::HTTPAuth.new(TWIT_ID, TWIT_PW) tw = Twitter::Base.new(client) list_members = tw.list_members(TWIT_ID, TARGET_LIST) counter = Hash.new(0) list_members.users.each do |user| print user["screen_name"], "\n" fr_lists = tw.friends(:screen_name => user["screen_name"]) fr_lists.each do |tmp_user| counter[tmp_user["screen_name"]] += 1 end sleep(1) end File.open("out.list", "w") do |f| counter.keys.sort{|a,b| counter[b] <=> counter[a]}.each do |user| f.print user, ":", counter[user], "\n" end end
Windows Media Audioのタグを頼りにフォルダ作ってファイル名変更して整理する
一部 ruby の wmainfo でタグ情報を読んだ時にエラーが出る。
iconv が UTF-8 の変換で失敗する。なぜに?
# checking wma tag informaiton and rename from tag infomation require 'rubygems' require 'wmainfo' require 'find' require 'fileutils' require 'kconv' search_path = ARGV.shift dest_path = ARGV.shift dest_path = search_path if dest_path.nil? col_name = ['AlbumTitle', 'AlbumArtist', 'TrackNumber', 'Author', 'Title'] log = File.open("log.csv", "w") log.print 'FileName,' + col_name.join(',') + "\n" Find.find(search_path) do |filename| next unless filename.match(/\.(ASF|asf|wma|WMA)$/) if FileTest.directory?(filename) then print filename, "\n" next end begin log.print filename, "," print filename, "\n" wma = WmaInfo.new(filename, :encoding=>"UTF-8") tmp = [] col_name.each do |col| tmp << wma.tags[col] end log.print tmp.join(',') new_name = [] new_path = [] if (artist = wma.tags['AlbumArtist'].to_s).size > 0 then new_path << artist elsif (artist = wma.tags['Author'].to_s).size > 0 then new_path << artist end if (album = wma.tags['AlbumTitle'].to_s).size > 0 then new_path << album end if (track = wma.tags['TrackNumber'].to_s).size > 0 then new_name << sprintf("%02d", track) end if wma.tags['Title'].to_s.size > 0 then new_name << wma.tags['Title'].to_s else next end rescue log.print $!, "\n" next end new_name = (new_name.join(' - ') + '.wma').tosjis new_path = (dest_path + '\\' + new_path.join('\\')).tosjis new_name.gsub!(/[\/:<>\\\*\?\"|]/, '_') if new_name.match(/[\/:<>\\\*\?\"|]/) new_name = new_path + '\\' + new_name if FileTest.exist?(new_name) then log.print("don't move\n") print "don't move\n" next else p new_path FileUtils.mkdir_p(new_path) if !FileTest.exist?(new_path) FileUtils.mv(filename, new_name) print new_name,"\n" log.print "," + new_name + "\n" end end
下に書いたmp3バージョンはフォルダ分類はしてなかった。
だいぶ前に作ったやつだから動作忘れてた。
mp3のタグを頼りにファイル名を変更したりフォルダに分類して入れたりする
# select mp3 files which have id3 tag # 2009/11/22 require 'find' require 'rubygems' require 'mp3info' require 'kconv' require 'fileutils' search_path = ARGV.shift dest_path = ARGV.shift Find.find(search_path) do |filename| next unless filename.match(/\.(mp3|MP3)$/) if FileTest.directory?(filename) then print filename, "\n" next end tmp = Array.new begin Mp3Info.open(filename) do |mp3| tmp = [ mp3.tag.artist.to_s.tosjis, mp3.tag.album.to_s.tosjis, mp3.tag.title.to_s.tosjis, mp3.tag.tracknum, mp3.mpeg_version, mp3.layer, mp3.bitrate, mp3.samplerate, mp3.length, FileTest.size?(filename), filename ] end rescue print $!, "\n" next end if tmp[2].to_s.size > 0 then begin tracknum = sprintf("%02d", tmp[3].to_s) rescue tracknum = "00" end new_file = [tmp[0].to_s, tmp[1].to_s, tracknum, tmp[2].to_s].join(' - ') + '.mp3' new_file.gsub!(/[\/:<>\\\*\?\"|]/, '_') if new_file.match(/[\/:<>\\\*\?\"|]/) print dest_path + '\\' + new_file, "\n" begin FileUtils.mv(filename, dest_path + '/' + new_file) rescue print $!, "\n" next end end end
64bitのRuby1.9をWindowsに入れるときのメモ
ニューマシン購入とともに64bitに移行しました。
ということでせっかくなのでRubyも64bitに移行しようと思います。
どういうメリットが有るかは良くわかってませんが使ってみるのです。
http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html
この辺から最新のx64版をダウンロードしてc:\local\ruby1.9\とかに展開しました。
ひょっとしたら拡張ライブラリも64bitにしとかないとまずいんじゃないのか?と思い、64bitでコンパイルされているやつを探しました。32bitのdllとかいれるとどうなるかは知りません。(→うごかないようです)
http://www.winimage.com/zLibDll/index.html
zlibは上記ページの「for AMD64/Intel EM64T」って書いてあるところのリンクからバイナリをゲットです。
ゲットしたものを展開し、zliwapi.dllとかいう名前になっているのでzlib.dllにリネームしてc:\local\ruby1.9\bin\にコピーして完了。
rubygemsも無事動いたようなのでこれでOKなんじゃないでしょうか。
うーん、意外とx64のバイナリが見つからなかったり、x86のモノもインストールしようかしら。