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) を短くしたのは、自分の好み。