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