2007年 04月 14日

mono TwitterIrcGateway.exe on ubuntu

$ sudo apt-get install mono

$ mono TwitterIrcGateway.exe
The assembly mscorlib.dll was not found or could not be loaded.
It should have been installed in the `/usr/lib/mono/2.0/mscorlib.dll' directory.

$ lm /usr/lib/mono/2.0
ls: /usr/lib/mono/2.0: No such file or directory

$ sudo apt-get install mono-classlib-2.0
$ mono TwitterIrcGateway.exe
** (TwitterIrcGateway.exe:4924): WARNING **: exception inside UnhandledException handler: An exception was thrown by the type initializer for System.Windows.Forms.Form

ねむい!

RICE

いろいろバグあるみたいだなぁ。つかってるひといないのかな
Replay.rpl_welcome 系は使えない。数値コマンドなのに文字列でおくってしまう。とか
あとどこだかわすれたけどチャンネル名プリフィックスの正規表現がまちがってたきがする。

とちゅうでやめた

#!/usr/bin/ruby -d


require 'rubygems'
require 'twitter'

require 'socket'
require 'rice/irc'
require 'nkf'


class IrcTwitterGateway

	def initialize(host, port)
		@clients = []

		s = TCPServer.new(host, port)
		Thread.start(s) do |s|
			loop do
				@clients << Session.new(s.accept)
			end
		end

		# @pass, @nick, @login, @user

	end


	class Session
		include RICE

		NAME = "twittergw"
		VERSION = -1
		CHANNEL = "#twitter"

		def initialize(socket)
			@s = socket
			begin
				while l = @s.gets
					$stderr.puts 's <- c: ' + l.inspect if $DEBUG
					begin
						m = Message.parse(l)
						p m
						case m
						when Command::PASS
							@pass = m.params[0]

						when Command::NICK
							@nick = m.params[0]

						when Command::USER
							@login, @real = m.params[0], m.params[3]
							@host = @s.peeraddr[2]
							@mask = "#{@nick}!#{@login}@#{@host}"
							p [@nick, @login, @real, @pass]

							on_user(m)

						when Command::PRIVMSG
							on_privmsg(m)

						end
					rescue InvalidMessage, UnknownCommand
						$stderr.puts '- -: ' + l.inspect if $DEBUG
					end
					break if m.kind_of?(Command::QUIT)
				end
			#rescue IOError
			ensure
				@s.close
			end
		end

		def on_user(m)
			@s << Message.new(NAME, "001", [@nick, "Welcome to the Internet Relay Network #{@mask}"])
			@s << Message.new(NAME, "002", [@nick, "Your host is #{NAME}, running version #{VERSION}"])
			@s << Message.new(NAME, "003", [@nick, "This server was created #{Time.now}"])
			@s << Message.new(NAME, "004", [@nick, "#{NAME} `Tynoq` v#{VERSION}"])
			@s << Message.new(@mask, "JOIN", [CHANNEL, ""])
			log "Hello this is Twitter Gateway."


			@twitter = ::Twitter::Base.new(@real, @pass)
			@friends = @twitter.friends
			@s << Message.new(NAME, "353", [@nick, "=", CHANNEL, @friends.map{|i| i.screen_name }.join(" ")])
			@s << Message.new(NAME, "366", [@nick, CHANNEL, "End of NAMES list"])

			@timeline = []
			Thread.start do
				loop do
					check_timeline
					check_friends
					sleep 60
				end
			end
		end

		def on_privmsg(m)
		end

		private
		def check_timeline
			@twitter.timeline.each do |s|
				message(s.user.screen_name, CHANNEL, s.created_at.to_s + s.text)
			end
		end

		def message(sender, target, str)
			str.gsub!(/&#(x)?([0-9a-f]+);/i) do |m|
				[$1 ? $2.hex : $2.to_i].pack("U")
			end
			@s << Message.new(sender, "PRIVMSG", [target, NKF.nkf("-j", str)])
		end

		def log(str)
			@s << Message.new(NAME, "NOTICE", [CHANNEL, str])
		end
	end
end

host, port = nil, 19876
IrcTwitterGateway.new(host, port)
sleep

rubyforge の twitter gem package は依存が微妙にやっかい (外部サイトへの依存がある) なのと、since 指定でとってこれないので、自分でかいたほうがいい。

やっぱつづきかいた

http://lab.lowreal.net/trac/browser/chokan/trunk/tig.rb
update.json からの書きこみがうまくいかない……

LimeChat の IRC ログをそのまま表示機能をつかってデバッグしてる。べんりべんり

あーPOST にするんだ。
てかあたりまえだ

chokan のディレクトリ下に入っているのは修正済み RICE がそこにあってそれを使っているってだけなので、べつに chokan つかっているわけじゃないです。

direct messages もいけるようにした。あんまてすとしてないけど……

Ruby の 例外

いまいち理解してないかんじだ……
ここでキャッチできるよなぁってときにキャッチできてなかったりする。うーんスタックたどってくんだよなぁ

2007年 04月 10日

NeoOffice + AquaSKK

「い」がそのまま入力できず、かならず「i」になってしまう。I と入力して確定するしかない。なんなんだ

ああ

きょうも gerry

2007年 04月 09日

完全なる Gerry

ここ最近おおかったのだけど、きょうのはひどい……

2007年 04月 07日

LDR で Basic 認証かかってるフィード読める

っていうの YAPC で mala さんが LT のときに一瞬そんなことを言っていて、まじで!って思った。(なぜハッシュじゃないといけないのか、みたいなとき)
なるほどなぁって思ってフィードの追加で http://user:pass@host/index.atom みたいにして登録してみた。けどフィードの追加から追加するとデフォルトが公開になるっぽくてこわい。すぐに user/cho45 をひらいて編集非公開にした。

あとオートディスカバリは効かないっぽいのかな。うえみたいに直接指定したらいけた。

2007年 04月 05日

非同期を同期っぽくする方法

callcc
コールバックからもとの継続を呼ぶ (一度メソッドから抜ける)

# 同時にいくつも呼ぶことを想定していない
	def hoge(sender)
		@foo.set_callback(self, :event_callback)
		@foo.load_something 
		if callcc { |@c| false }
			p "loaded"
			@c = nil
		end
	end

	def event_callback
		@c.call(true) if @c
	end

Queue
Queue#pop のブロッキングを使う

# 同時にいくつも呼ぶことを想定していない
	def hoge(sender)
		@q ||= Queue.new
		@foo.set_callback(self, :event_callback)
		@foo.load_something 
		@q.pop
		p "loaded"
	end

	def event_callback
		@q << :callback
	end

なんかもっと簡単なのがあるのかなぁ