Записи с меткой «ruby»

Про Twietry

29.01.2012

Как бы то ни было, а проектик уже более-менее похож на что-то приличное, и можно уже начинать потихоньку им хвастаться. Для начала — о том, что это такое. Twietry (twitter + poetry) — это игра в сочинение стихов по очереди, когда каждый пишет одну строчку и передает листок следующему «поэту». Твиттер не то, чтобы сильно необходим для этого, но в twietry играет крайне важную роль: у нас сквозная авторизация через него, а каждая добавленная пользователем строчка публикуется в его личной ленточке.

Набор фич довольно скромный: авторизовавшиеся пользователи могут создавать стихи, добавлять строчки к существующим стихам (создание стиха != добавление первой строчки в него), голосовать за стихи и строчки, классифицировать стихи хэштегами (пока только внутри добавляемых строчек) и всячески морально разлагаться. Неавторизованные этого счастья лишены и могут только читать.

Теоретически у нас есть oEmbed стихов (тип rich), но на практике пока не получается проверить, насколько все круто. В крайнем случае, можно просто посмотреть стих в более читаемом виде, чем режим добавления строчек (сцылок на это нигде нет, но если добавить в конце URL стиха «/simple», то все получится. Пасхалка, с понтом дела). К некоторым сущностям прилагаются идентиконы. В качестве экспериментальной фичи я решил использовать алгоритм, отличный от того, что используется в id.dxfoto.ru, и автором которого являюсь я лично (не буду, впрочем, утверждать, что до этого больше никто не додумался). На самом деле, они на фиг не нужны, но с ними красивее. Кстати, Ксения Николаевна сделала для сайта несколько картиночек. Их пока не видно (да и вообще, с оформлением бида), потому что на текущий момент они существуют только в блокноте, а до сканера я никак не дойду. Еще одна запланированная фича, связанная с картинками — это загрузка пользовательских иллюстраций к стихам. Я пока не знаю, действительно ли нужно это, но на всякий случай запилим. Также активно выдумывается и пилится приляпывание пользователям бэджей (рабочее название — «плюшки») за различные заслуги. Пока придуманы аж два вида плюшек (не скажу, каких). Ну, и мы, как бы, всегда рады гениальным идеям наших юзеров.

В общем, сам проектик (пока) крутится по адресу twietry.dxfoto.ru, время от времени обновляется, иногда падает, ну, как бы, так и должно быть. Исходники открытые и лежат в гитхабе — github.com/at8eqeq3/twietry, мы будем рады помощи (внутри Ruby on Rails и MongoDB).

Как-то так.

Про идентиконы

09.05.2011

Запустил смеха ради онлайн-генератор идентиконов. Это небольшая Rack-миддлеварька, которая дергает библиотечку, рисующую идентикон. Оригинальная библиотечка написана на PHP, активно юзается в WordPress, Gravatar и еще черт знает где. Меня же заморочило переписать ее на Ruby, что я, собсна, и сделал. На досуге пульну это дело на GitHub, если кому вдруг интересно. Мордочка же кружится по адресу http://id.dxfoto.ru/. Welcome.

As most of the viewers of this post are not russian-speaking, here is an english translation (there is nothing interesting, though) (sorry for possible mistakes):

Now, I am running my own online identicon generator. It’s a small Rack middleware that calls to the lib that draws an identicon. The original library was written in PHP (not by me) and actively used in WordPress, Gravatar and many other services. I have decided to re-write it in Ruby and, as you can see, done it. Some time later I will put it’s sources to GitHub, if it matters. At this time, my own web-face to it is running at http://id.dxfoto.ru/. Welcome.

Про чаты и паучков

30.06.2010

Вот, очередной кусочек гомнокода из себя выдавил. Нет бы по делу, всё какой-то фигнёй занимаюсь. История, как обычно, начинается издалека. А именно — всё с тех же замечательных Ответов@mail.ru. Кто там бывает — наверняка видел там в каждом разделе по замечательному чятику. Кое-где эти чятики унылы и пустынны, а кое-где прямо кипят жизнью. Периодически там такие дискуссии образуются — закачаишсо (ну, эт вообще-то везде так, но речь не об этом). А самое печальное что? То, что в чятике видно только 25 последних сообщений, а все предыдущие отправляются к Евгении Марковне на веки вечные, и назад не возвращаются. А ведь так хочется иногда почитать на досуге, вспомнить всю эту фигню… Ну, копипастить — это, конечно, вариант, но утомительно и вообще, не будешь же круглосуточно сидеть и F5 жмакать. В общем, сочинил я гадость, слегка облегчающую эту задачу. Первая часть гадости, и самая важная — это кагбе паучок. Получает страничку с репликами, разбирает ее hpricot‘ом и кладет в БД (sqlite). Поскольку разработчики чятика не позаботились об удобстве автоматизированного разбора (о, сколько там косяков: штампы времени с точностью до минуты, каждая реплика разбита на 2 части — имя с таймстампом и собственно текст, причем вся эта бодяга лежит кучей в общем div’е, красотища…), приходится извращаться. Против div’ной свалки помогает each_slice(2), с отсутствием идентификации реплик при сохранении борется хитрый constraint в базе, следящий за уникальностью пары время + текст сообщения (сначала думал добавить еще и имя автора, но решил, что это будет косяк: имя можно поменять, и тогда появятся лишние записи, да еще и кучей). Вот такой паучок:

#! /usr/local/bin/ruby
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'sqlite3'
db = SQLite3::Database.new(File.dirname(__FILE__) + "/chat.db") # или тут лучше File.join()?
doc = open("http://otvet.mail.ru/doit?action=chatmessages&cid=4") { |f| Hpricot(f) }
divs = doc.search("body/.Dialog/div")
unless divs.empty?
  File.new("last", "w").puts Time.now.to_s
  chat = []
  divs.each_slice(2) do |line|
    chat < < [line[0].inner_text.split("\n"), line[1].inner_text].flatten # всё через жо
  end
  chat.uniq!
  chat.reverse! # странно, почему цепочкой не работает?
  chat.each do |r|
    db.execute("insert into chat values ( ?, ?, ? )", r[0], r[1], r[2])
  end
end

Гомнокод во всей красе, объёмом 20 строчек. Пока умеет парсить только чятик в разделе «Компьютеры и Интернет», но впилить все остальные, в общем-то, не трудно. Займусь как-нибудь на досуге. А пока оно вполне себе успешно дергается сron’ом каждые 3 минуты (интервал подбирать надо бы, да) и делает своё чёрное дельце.

Вторая часть (код, уж извините, показывать не буду, ибо это сущий п[ой!]здец, да и не столь принципиальна она) организует к нашей БД замечательную веб-мордочку. Запускается через rack (кстати, у меня не получилось смонтировать приложение в подкаталог вхоста, хотя всё по инструкции. К чему бы это?) и бесхитростно так (с пагинацией даже) в pre всё выводит. Полюбоваться можно (пока что) тут: http://toys.dxfoto.ru/.

про картинки в черной рамке и с подписью

22.12.2009

А ТЫ НАПИСАЛ? / свой генератор (де)мотивационных постеровНаверное, их только ленивый не сочиняет. Меня вот тоже заморочило, и — очередной кусочек гомнокода на ruby таки берет картинку, ставит в рамочку и пишет буквы. Ура,товарищи. Исходник невозбранно:

#! /usr/local/bin/ruby
 
require 'rubygems'
require 'rvg/rvg'
include Magick
 
p "Usage: poster sourceimage slogan tagline destimage" unless ARGV[0]
i = ARGV[0] || 'stub.png'
o = ARGV[3] || 'shit.png'
s = ARGV[1] || "А ТЫ НАПИСАЛ?"
t = ARGV[2] || "свой генератор (де)мотивационных постеров"
s = s[0..24]  if s.length > 25
t = t[0..99] if t.length >100
 
src = Image.read i
src = src[0].auto_orient
src = src.resize_to_fill(642, 432)
rvg = RVG.new(800, 640).viewbox(0, 0, 800, 640) do |canvas|
  canvas.background_fill= 'black'
  canvas.styles :fill => 'white'
  canvas.rect 650, 440, 75, 50
  canvas.image src, 642, 432, 79, 54
  canvas.text(400, 555) do |slogan|
    slogan.tspan(s).styles(:text_anchor => 'middle',
                           :font_size => 55,
                           :font_family => 'georgia',
                           :fill => 'white')
  end
  canvas.text(400, 600) do |tagline|
    tagline.tspan(t).styles(:text_anchor => 'middle',
                            :font_size => 24,
                            :font_family => 'tahoma',
                            :fill => 'white')
  end
end
rvg.draw.write o

Для работы требуется RMagick и, соответственно, ImageMagick

Икси отреспаунилась (наверное)

10.11.2009

И да, мы е[ой!]анулись. Аццкий костылище, призванный связать ProgramR и XMPP4R, кажется, работает (частично: валится, когда приходит «печатает…», как бы это обойти?). И AIML’ы пока не слишком разнообразны. И с распознаванием русского языка у нее проблемы… Но все же, если закрыть глаза на эти косяки — Ixie, мать ее за ногу, up and running время от времени :) Ура, товарищи

upd: Вылет пофиксил, достаточно было зарядить вывод всех stanza — и все стало понятно. Но с чугуниевым моском все же надо что-то делать. А то оно только глупо таращится на сообщения

upd: Интересненький глючок всплыл, но не у меня. Почему-то сообщеня, содержищие слово «Ruby», не проходят через mrim-транспорт на jabber.ru. В джаббер уходят, а из mrim не выходят 0_о7 А на чем, собственно, написан транспорт? Это саботаж? А почему тогда из обычного клиента (Psi, например) все работает?

upd: Итог публичного тестирования: вцелом работает. Необходимо: черный список (во избежание), научиться определять, что говорим с ботом (мы гордые), более разумное поведение (за счет более совершенных AIML’ов), нормализация кириллического текста в понятный ProgramR вид (само оно, похоже, не в силах), немножко оптимизации. Также, по непостижимой причине, если не выставлен

Jabber::debug = true

через несколько минут отваливаемся от сервера (от jabber.ru, по крайней мере. На локальном сервере все ОК), это огорчает. И, что самое забавное, анализ логов выявил не самый высокий коэффициент интеллекта у бывших собеседников бывшей Икси: отдельные личности умудрялись вести с ботом беседу в течение нескольких минут, при том, что на подавляющее большинство фраз (адекватно реагируем только на некоторые приветствия, вопросы «кто ты» и «ты кто», слово «тест») он рандомно выбрасывает один из 5 ответов. Логи позволю себе не цитировать, ибо некрасиво. Такие пироги. Вперед, к версии 0.2!

инфернальненькое

04.08.2009

Пожалел денег на VDS, мучался с установкой ruby+rails+mod_rails. Твердо убедился, что при имеющихся вычислительных ресурсах ни буя не заработает и после зарплаты надо будет сменить тариф. А пока развлекаюсь, как могу. Пока возился с установкой — призывал Ктулху и долбал клавиатурой по раскладушке (за отсутствием бубна). В итоге получил вот такую фигню:

infernal server error

infernal server error

Мутные воды Гугла вынесли…

09.06.2009

…интересный проект http://railsforphp.com/, суть которого — помочь разрабочикам переползти с привычного им PHP на Ruby (прям для меня, ага). Ресурс оказался мне полезен еще и тем, что там я нашел ответ на мучивший меня вопрос: как узнать, сколько места осталось на диске? Решение, конечно, идеальным не выглядит, работает исключительно на *nix, пользуя вызов df и разбирая вывод, но за неимением лучшего…

epic fail

25.05.2009

FreeBSD 7.1 + Ruby 1.8.7 + Rails 2.3.2 = эпичный фэйл с матами на camelize. Или руки у меня кривые, или одно из двух. Что же я делаю не так?

мысля

03.04.2009

railsВот подумалось: наш блог нефигово попадается в поисковиках по запросу насчет установки Ruby и Rails, так может быть, сочинить какой-то туториал на эту тему? Глядишь, будет кому-то полезно. Да и самому пригодится. А то как-то неловко даже — люди заходят, а тут шиш с маслом)))

Обновлю вот фряшечку до 7.1 и займусь. Всенепременно займусь. Нет, правда.

мучительная установка ruby и rails

12.03.2009

Вот, прибило однажды в мою дурную голову, что надо в целях самообразования сделать сервер приложений rails, и не просто так, а непременно на freebsd, ибо Windows как платформа официально не рекомендована, а *никсов других у меня не нашлось.

Итак, дано: выделенная машинка с установленным freebsd 6.1 stable, а также ruby 1.9.1, apache 2.2.11 и mysql 5.1.31 в виде исходников. Также стоит отметить, что интернет на этой машинке отсутствует в принципе, как, впрочем, и где-либо поблизости. Так что такое удовольствие, как порты, мне недоступно, а под словом «скачать» в случае, если размер скачиваемого объекта превышает пару мегабайт подразумевается «дождаться ближайшего дежурства, скачать на работе, привести домой», что приблизительно занимает 2е суток. Вот так вот не быстро.

Началось все просто замечательно, исходники скомпилировались без ошибок, apache и ruby заработали, а вот с mysql приключился облом. Плакал, что «Manager of pid-file quit without updating file» и не запускался. Ни курение мануалов, ни гугление, ни консультирование у более сведущих товарищей не подсказали лучшего решения, чем установка из бинарников (100 МБ, следовательно, см. выше).

Ладно, из бинарников все поставилось. Ставим рельсы и прочее добро. Утыкаемся в mongrel. Тупо не совместим (обещают допилить к 1.2) с 1.9.1, стало быть, надо откатываться. Сказано — сделано. Скачал 1.8.7 (не подумав, что у меня в заначках уже есть одна копия, потом только увидел), mongrel чудесным образом воткнулся и заработал.

Не долго музыка играла, однако. rails (версии 2.2.2) при попытке сгенерировать новое приложение орал матом что-то невнятное. Гугление навело на мысль об установке ruby-iconv. По причине отсутствия интернетов, это стоило мне немалых трудов, однако же нужный пакет был установлен. Впрочем, rails этому не сильно обрадовался. Вспомнив проблему с mongrel, накатил завалявшуюся у меня какую-то древнюю версию, естественно, успешно. Параллельно знающие люди присоветовали поменять входной сервер с apache на nginx (0.6.35, исходники), успешно. Также до кучи был воткнут postgresql 8.3.6, тоже из исходников, тоже успешно.

Однако же, не все шоколадно. Ковыряемое мною в настоящее время приложение сделано под rails 2.1.2 и не желает ничего более старого. Но это уже мелочи, завтра скачаю, послезавтра установлю, и, надеюсь, оно таки заработает.


Алсо, этот псто есть тестирование пстописалки, встроенной в браузер flock