4

当我使用我的极客能力变得“浪漫”时,我的妻子很喜欢它,所以我想在她的 Mac 上安装一个 ruby​​ 脚本,它可以全天发送她的报价和我的小笔记。我已经想通了,我将使用 GeekTool 在后台运行脚本,并使用 growlnotify 来显示消息。现在我需要的是一种从网络更新脚本的方法,以防我更改它。除了如何与控制台交互之外,我对 ruby​​ 基本上一无所知。

我有 2 个目标:1)有一个带有消息的 XML 文件。这需要可以从 Internet 更新,但要在本地,以防她没有网络连接。2)从互联网上更新脚本本身,以防我发现错误或想要改进它。

现在我知道,如果我愿意,我显然可以手动更新她 Mac 上的脚本,但我认为这将是学习更高级 ruby​​ 的好方法。

优先级 1 将是 XML 文件,如果它发生变化,可以下载新版本。我可以使用哪些 ruby​​ 东西来下载文件并将其保存到本地的某个位置?

我以前用过hpricot,那会是一个好方法吗?

注意:我妻子的 Mac 是 Macbook,运行 Leopard(但可能是 10.4,不是 100% 确定)。

编辑

如果有人对脚本的第一个版本感兴趣,您可以在这里找到

ps --> 脚本的第一个版本实际上并没有更新自身,它只是更新了 messages.xml 文件,仅此而已。

4

3 回答 3

1
require 'net/http'

Net::HTTP.start("your.webhost.com") { |http|
  resp = http.get("/messages/messages.xml")
  open("messages.xml", "wb") { |file|
    file.write(resp.body)
  }
}

像这样的东西应该可以工作。您也可以下载 Ruby 脚本,然后调用。

exec("ruby script2.rb")
#no further lines in script1 will execute
于 2009-12-07T15:22:21.340 回答
1

如果您有一个包含 xml 消息的文件,您的妻子不会看到您来吗?你发消息让她立刻收到不是更好吗?

您可以使用XMPP协议来执行此操作。
您妻子的应用程序将自己连接到 XMPP 服务器;你也是。您可以随时向她发送消息。
您甚至可以强制在每条消息之间以一定的时间间隔发送消息。
因此,当她在没有任何互联网连接的情况下流浪时,您知道这一点,您会提前向她发送 3 或 4 条消息。她稍后会收到。

对于脚本更新,这是一个与任何网站服务器类似的问题。
所以我会在她的机器上打开一个 SSH 端口并使用capistrano来部署最新版本的应用程序。

于 2009-12-07T16:10:51.153 回答
0

消息多长时间?如果它们很短,XML 可能有点过大了。为什么不只使用每行一条消息的文本文件?

#!/usr/bin/env ruby
require 'open-uri'

def growl_msg(msg)
  %x{growlnotify -m "#{msg}"}
end

def read_msg
  begin
    f = open("http://www.yoursite.com/messages.txt").read
    File.open("messages.txt", 'w') {|f| f.write(f) } #write local copy
  rescue
    f = File.open("messages.txt").read
  end
  growl_msg(f.split("\n").sort_by{rand}[0]) #growl a random line
end

while true do
  read_msg
  sleep(15*60) # 15 minutes between messages
end

使用 GeekTool 运行脚本可能也不是必需的。您可以启动脚本,nohup myscript.rb它会一直运行,直到您终止该进程。

于 2009-12-08T07:40:16.900 回答