понедельник, 19 июля 2010 г.

Бесплатная отправка СМС

Если Вам необходимо добавить отправку смс, есть два пути:
честно поставить гем clickatell, зарегистрироваться, пополнить счет и ,буквально напиав пару строк руби-кода, наслаждаться. Однако, если денег жалко и количество пользователей невелико и все они "подконтрольные" (например, преподавтели кафедры :)), то можно обоитись вариантов посложнее, но совершенно бесплатно.
У многих операторов есть такая услуга мобильная почта (проверял на Билайн, Мегафон, МТС), например http://beonline.ru/communicate/depart/7. Подключаете услугу. заносите email в базу и с помощию обычного ActionMailer отправляете уведомления.

пятница, 4 сентября 2009 г.

Генераия word-документов.

В первом посте я говорил, что у меня не получилось менять стиль для вновь вставляемого текста. Оказывается, сделать это все же можно:

document.Bookmarks("bookmark").Select
word.Selection.Font.Size = 22
word.Selection.TypeText("Hi, Jack!")


Оказалось вот так просто!

За это время у меня так же появился относительно удобный способ разработки.
Просто открываем ворд, включаем запись макроса, выполняем необходимое вам автоматизировать действие. Далее открываем макрос, там код на VBA. Берем и переводи его на руби. Дело сделано! Если какие-то параметры вам не понятны - открываем msdn help, выбираем office и удовлетворяемся с помощью него. Весело проведете время, я вам обещаю :)
Кстати, если вы собрались заниматься серверной автоматизацией рекомендую ознакомиться
http://support.microsoft.com/?scid=kb%3Bru%3B257757&x=6&y=14

Если msdn у вас нет - идем в интернет
http://msdn.microsoft.com/ru-ru/default.aspx

вторник, 1 сентября 2009 г.

Синтаксическая глазурь для возвращаемого значенияс в Ruby

Мне всегда нравился Ruby своим "человеко подобным" синтаксисом.
Но была одна вещь, которую пальцы всегда отказывались писать.
Это код вида

def ugly
results = {}

[:x, :y, :z].each do |letter|
results[letter] = rand(100)
end

results
end



Не по-рубически это как то :).
Оказывается DHH о нас позаботился и в active support есть такая приятная штучка returning.

def sexy
returning({}) do |results|
[:x, :y, :z].each do |letter|
results[letter] = rand(100)
end
end
end


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

# File vendor/rails/activesupport/
#lib/active_support/core_ext/object/misc.rb, line 27
def returning(value)
yield(value)
value
end

суббота, 29 августа 2009 г.

Финт ушами, или форматирование текста в word средствами ruby

Давно известно, что автоматизировать линейку ms office будет только последний мудак (разрешите представиться :) ), но иногда все же надо...
Мне было жутко необходимо в одном ruby-проекте при составлении отчета вставлять заголовки и тест. Заголовки конечно же надо было как то выделить.
win32ole предоставляет для этого средства, но к сожалению это применить можно только к объекту range, символу параграфуи.т.п. (подробнее тут http://rubyonwindows.blogspot.com/2007/06/automating-word-with-ruby-formatting.html). А хотелось, что бы форматирование применялось к вновь вставляемому тексту. (update: как оказалось можно, см. 3 пост)
Для того пришлось сделать финт ушами: наставлять закладок типа:
заголовк1
текст1
....
заголовок2
текст2
...

А потом бежать по ним. Только вставить их надо было достаточное количество.
А потом просто удалить те закладки, которые не пригодились.
Вот так:


erase_range_bookmarks(first_unused_bookmarks,
last_unused_bookmarks)




def erase_range_bookmarks(bookmark_start, bookmark_end)
return unless @document.Bookmarks.Exists(bookmark_start) ||
@document.Bookmarks.Exists(bookmark_end)
range = @document.Range(bookmark_at(bookmark_start).End,
bookmark_at(bookmark_end).End)
range.Text = ""
end


def bookmark_at(bookmark_name)
raise TemplateErrorException, "Unknown bookmark: \
#{bookmark_name}" unless @document.Bookmarks.Exists(bookmark_name)
@document.Bookmarks(bookmark_name)
end



PS: такой подход позволяет определять стиль текста, человеку составляющему шаблон, а не забивать его жестко в код.
Ну а кому такой универсальности не надо, может использовать так

@document.Bookmarks("name_bookmark").Range.Text = "Hi, Jack!"
@document.Range(document.Bookmarks("name_bookmark").End,
document.Bookmarks("name_bookmark").End +
"Hi, Jack!".length).Font.Size =18


Остальные возможности форматирования текста смотрите в блоге по выше обозначенное ссылке.