win32ole でリモートパワーポイント
http://d.hatena.ne.jp/fuji-jr/20060617/p1より。リファクタリングしてみた。自信の無いところはいっぱいあるけど、とりあえずクラスを作ってみた。
client.rb
#!/usr/bin/ruby
require "socket"
require "win32ole"
################################################################################
## class RemotePPTClient
################################################################################
class RemotePPTClient < UDPSocket
def initialize(host, port)
# socket
super()
@host = host
@port = port
bind(@host, @port)
# PowerPoint
@pres = WIN32OLE.new("PowerPoint.application").Presentations.add
@slide = @pres.Slides.add(1, 1)
end
def writeLine(str)
item = @slide.Shapes.Item(1)
item.Top = 200
item.TextFrame.TextRange.text = str
item.TextFrame.TextRange.font.size = 128
@pres.SlideShowSettings.Run
end
def run(strlen = 256)
writeLine(recv(strlen))
end
end
################################################################################
## main
################################################################################
client = RemotePPTClient.new("localhost", 9876)
while true
client.run
sleep(0.5)
end
server.rb
#!/usr/bin/ruby
require "socket"
################################################################################
## class RemotePPTServer
################################################################################
class RemotePPTServer < UDPSocket
def initialize(host, port)
super()
@host = host
@port = port
end
def send(str)
super(str, 0, @host, @port)
end
end
################################################################################
##
## main
##
################################################################################
server = RemotePPTServer.new("localhost", 9876)
while gets
server.send($_.chop)
end標準入力から読むようになってるので、
> ./client.rb & > ./server.rb < tekito.txt
などとやると、tekito.txt の内容が 1 行ずつスライドになる。スライドは 0.5 秒間隔で切り替わる。
UDPSocket#send を上書きしてるのは微妙。クライアントの方のクラスにパワーポイントのインスタンスを持たせてるけど、多重継承できないからなぁ。
一番痛いのは、win32ole がよく分からないところ。まあ、id:fuji-jr さんが解決してくれるでしょう。
とりあえずクラス化したことで、データの依存性はすっきりしたと思う。
トップレベル (main) を短くしたのは、自分の好み。