2009-12-07 5 views
4

Моя жена пользуется им, когда я использую свои способности для выродков, чтобы быть «романтичной», поэтому у меня появилась идея создать рубиновый скрипт на своем Mac, который отправил бы ее цитаты и небольшие заметки от меня на протяжении всего день. Я уже понял, что буду использовать GeekTool для запуска сценария в фоновом режиме, и я буду использовать growlnotify для отображения сообщений. Теперь мне нужен способ обновления скрипта из Интернета в случае его изменения. Я вообще ничего не знаю о рубине, кроме как взаимодействовать с консолью.Рубин для романтики? Как обновить скрипт от самого себя

У меня есть 2 цели: 1) Имейте XML-файл с сообщениями. Это должно быть доступно для обновления из Интернета, но быть локальным, если у нее нет сетевого подключения. 2) Обновите скрипт из Интернета, если я нахожу ошибки или хочу его улучшить.

Теперь я знаю, что я мог бы просто вручную обновить сценарий на своем Mac, если захочу, но я подумал, что это будет хороший способ узнать еще более продвинутый рубин.

Приоритет 1 будет XML-файлом, сможет загрузить новую версию, если она изменится. Какие рубиновые вещи я могу использовать для загрузки файла и сохранения его в определенном месте локально?

Я раньше использовал hpricot, это был бы хороший способ пойти?

Примечание: Mac моей жены - это Macbook, на котором работает Leopard (но, возможно, 10.4, а не на 100%).

EDIT

Если кто-то заинтересован в первой версии сценария вы можете найти его here

P.S. -> первая версия скрипта не обновляется сама по себе, она просто обновляет файл messages.xml, и все.

+2

Не пропустите пункт вашего вопроса, но Leopard является синонимом 10.5 (не 10.4). –

+0

Я имел в виду, что я не знаю, имеет ли она 10.5 или 10.4 на своей машине. Я знаю, что это не чип Intel) –

ответ

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 
+0

Хорошо, что касается приоритета 2, могу ли я иметь второй скрипт ruby, который вызывается первым скриптом ruby ​​ПОСЛЕ первого скрипта ruby ​​скачал и сохранил второй скрипт ruby? –

+0

Когда вы говорите: «Никаких дальнейших строк в скрипте1 не выполнится» вы вообще не говорите или пока не закончится первый скрипт? Возможно, у меня есть две разные строки «exec» внутри одного и того же скрипта? –

+0

Я имею в виду совсем ... один exec line. Вам нужно будет сделать другой скрипт в модуле или классе и загрузить его, если вы хотите, чтобы он обращался к нему без exec. – MattMcKnight

1

Неужели ваша жена не увидит вас, если у вас есть файл с xml-сообщениями, которые происходят случайно в течение дня? Не лучше ли вам послать сообщение и получить ее мгновенно?

Для этого вы можете использовать протокол XMPP.
Приложение вашей жены подключается к серверу XMPP; ты тоже. И вы можете отправить ей сообщение, когда захотите.
Вы даже можете заставить сообщения отправлять с некоторым расстоянием во времени между каждым из них.
Итак, когда она собирается кочевником без какой-либо связи с Интернетом, и вы это знаете, вы отправляете ей 3 или 4 сообщения заранее. И она получит их позже.

Для обновления скрипта это аналогичная проблема, чем у вас на любом сервере веб-сайта.
Итак, я бы открыл порт SSH на своей машине и использовал capistrano для развертывания самой последней версии приложения.

+0

Я хочу, чтобы скрипт выполнялся случайным образом в течение дня. Возможно, каждые 15 минут выведут ей сообщение. Это будут предопределенные сообщения, которые могут повторяться, но я хочу иметь возможность добавлять сообщения, когда бы я ни захотел, не имея доступа к ее машине. –

+0

Ну, я бы пошел на XMPP :) –

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, и он будет продолжать работать, пока вы не убьете процесс.

Смежные вопросы