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

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

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

Дизайн

26.11.2009

Слегка пофиксили дизайн блога. Все тот же Кубрик, но немножко по-нашему. Имхо, стало чуть симпатишнее

а где же RSS?

03.02.2009

Сегодня был немало удивлен, добавив запись в Журнал и не увидев ее в rss. Как выяснилось, свеженаписанный симпатишный скриптик, генерирующий rss, уже пару недель вместо того, чтобы активно трудиться, тихо дрыхнет на тестовом сервере. Старею, видать, склероз и все такое. Скриптик залью завтра-послезавтра, если не забуду)))