20 дек. 2010 г.

RR, mock, stub, mocha. Назад в будущее.


Мне нужно было протеcтировать фичу которая обрабатывала данные с определенным сроком давности.
Решение "в лоб" - срок давности максимально уменьшить и "подождать" 2-3 секунды в тесте.

Но там 2 секунды, там 3 секунди и я уже слышу ворчание о "медленных тестах" и отдельной машине для их прогонке, и вообще о "тормозности" ruby.


Поскольку база данных и приложение у меня на одной машине, то я передаю время в запросы непосредственно.

Решение простое - перевести стрелки, "застабить" время.

Инструментов маса. Это же Ruby. Mocha, Flex Mock, RSpec mock. Но я выбрал RR.

Причин несколько: rspec-1.x не имеет выделенной библиотеки для моков, как rspec 2.x, а експерементировать намного приятней и быстрей в консоли чем ждать прогона тестов. Mocha и Flex mock довольно "старые", хотелось понять зачем люди написали еще одну бибилотеку(rr). Возможности которые дает RR выше всех перечисленных, да и код с RR насного лаконичнее других. Да и, что немаловажно, RR - лидер на http://ruby-toolbox.com

Итак.
./script/console
extend RR::Adapters::RRMethods
>> now = Time.now
=> Mon Dec 20 10:17:57 +0200 2010
>> stub(Time).now { now.end_of_year + 1.minute }
>> Time.now
=> Sat Jan 01 00:00:59 +0200 2011


И у меня уже новый год!

15 дек. 2010 г.

Выход за рамки. Rails3 scopes are obsolete

В Rails 3 рамки(scopes) стали не актуальны, так как фактически дублируют стандартный функционал Ruby: некий метод который парсит другой метод, что-бы потом его выполнить.

В итоге, методы класса модели стали chainable: последовательный вызов действует как и scopes - объединяет условия.


class Post
scope :recent, imit(5).order(:'create_at desc')
scope :published, where(:published => true)

def self.locked
where('is_locked > 0')
end
end



>> Post.recent
Post Load (0.2ms) SELECT "posts".* FROM "posts" ORDER BY created_at DESC LIMIT 5
=> []
>> Post.recent.locked
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE (is_locked > 0) ORDER BY created_at DESC LIMIT 5
=> []
>> Post.recent.locked.published
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE (is_locked > 0) AND ("posts"."published" = 't') ORDER BY created_at DESC, is_locked DESC, created_at DESC LIMIT 5
=> []

6 нояб. 2010 г.

.gitignore. Настройтесь индивидуально

Игнорьте всех, они мешают вам работать.


Какие файлы игнорить в проекте? Та все. Особенное если вы работаете не один.

Игнорить все dot-файлы. На то они и дотфайлы, что-бы содержать индивидиаольные настройки.

Ником не интересно в какой IDE или текстовом редакторе вы кодите? Папочки .idea, netbeans

Временные файлы которые плодит ваш инструмент тоже отправте в игнор: это просто они обычно начинаются с точки или тильды.

.autotest & .rspec, .rvm ?

туда же...

config/*.yml

туда же...

Аааа... как же без них, заново каждый раз настраивать?

[filename].example спасет вас от ругани, плевков и ударов в грудь пяткой.

Создайте файлы образцов для настроек .autotest.example, .rspec.example, database.example и т.д.
и положите под Git

Тяжко переименовывать каждый раз ?

Создайте рейк который сделает это за вас, это 1 строка кода.

.bundle & Gemfile.lock

Туда же... еем... низя... религия не позволяет... ну не может бандлер без него жить, пока... надеюсь
Придеться мириться.

Резюме: игнорить все настройки и создавать для них образцы.

Примерно так.

.gitignore
.*
~*
config/*.yml
!.gitignore
!*.example

19 окт. 2010 г.

RubyConfUA 2010. Post factum.

Я прожил 33 года. Собираюсь подвести тут небольшой итог. Чуть позже...

Вместе с замечательной командой Aejis подготовил и провел RubyConfUA 2010



Когда полгода назад мы с @josevalim планировали его визит на это мероприятие я был уверен, что оно выйдет за рамки "постсоветского" пространства. Почти так и произошло: Россия, Польша, Израиль, Франция, Англия и собственно Бразилия, которую должен был представлять Жозе.

"Спасибо огромное" от всего нашего сообщества и от меня лично украинскому консульству в Польше за оказанное "содействие" в выдаче визы Jose с началом строка действия ровно на следующий день после окончания нашего мероприятия.


и такое же огромное спасибо(без кавычек) ребятам Aejis которые буквально слепили skype конференцию с JoseValim из того, что было в их распоряжении и, что с натяжкой можно было назвать интернетом.
2Чуваксменившийадминскийпарольнароутереэтонеприкольноэтоподло.

Спасибо Жозе за реальное и искреннее участие в подготовке и заметчательных докладчиков Петра и Губерта





#TODO Окончательного текста еще нет, но начинаю собирать отзывы.





У меня был настоящий день рождение, 33-й



Самый тихий, спокой и безалкогольный... с настоящими подарками



— Поздравляю с днём рождения,— повторил Пятачок.
— Это ты меня?
— Конечно, Иа-Иа.
— С моим днём рождения?
— Да.
— Значит, у меня настоящий день рождения?
— Конечно, Иа, и я принёс тебе подарок. Иа-Иа медленно опустил правую ногу и с немалым трудом поднял левую.
— Я хочу послушать ещё другим ухом,— пояснил он.— Теперь говори.
— По-да-рок!




UPD: Подарок от Aejis ;-) Выглядит прикольно, пить - удобно, мешать сахар - расплескивается.


Спасибо Таня, Андрей, Дима, Дима, Дима, Стас, Женя, Вадик и Марийка без вас было бы не менее тяжело, но не так интересно.

Привет, Коля :-) Конференции я сам реально не видел, так, что как и ты жду видео и мы еще проведем мастерклас :-)



... to be continue

В нашей стране надо либо умереть, либо уволиться, чтобы тебе наговорили кучу приятных слов


Вот оно, ту Бир ор нот ту Бир... два пива или не два пива... "плюсы" порадовали, эксклюзивное пиво с октоуберфеста, на который я пойти "пожмотился"

Спасибо Аня, Маша, Саша, Коля, Ярик ;-)

И вам спасибо дорогие мои обалдуи "ойтишники" за подаренную "лицензионную венду". Вы бы мне еще слюнявчик с бюстом дяди Била презентовали.

Спасибо Андрей, Рул, Дима, Дима, Дима (количество Дим среди айтишников просто зашкаливает, чувствую себя ископаемым), Саша, Серега, Андрей.

Спасибо вам "киношники": Олег, Володя, Саша(за то, что сделал из моего слоника капитолийскую волчицу), Глеб, Оксана за отличную душевную компанию ;-)

13 окт. 2010 г.

Refactoring

Так было ...



def self.options_for_select(entry)
options = []
options << ["",""] if entry.entry_type_id.nil?
all.map{|entry_type| options<<[entry_type.title,entry_type.id]}
options
end

Тренируемся на кошках ...



irb(main):021:0> [1,2,5].inject( true ? [nil] : [] ){|a, b| a + [b, 1]}
=> [nil, 1, 1, 2, 1, 5, 1]
irb(main):022:0> [1,2,5].inject( false ? [nil] : [] ){|a, b| a + [b, 1]}
=> [1, 1, 2, 1, 5, 1]

Так будет ....



def self.options_for_select(entry)
self.all.inject(entry.entry_type.present? ? [] : [nil]) \
{|options, item| options + [item.title, item.id]}
end

Мы избавились от лишних переменных, вчетверо сократили количество строк и наконец просто получили удовольствие от процеса и результата.

20 сент. 2010 г.

Установка Ruby on Rails на Windows

Как установить Ruby on Rails на Windows ?
Очень просто.

Всего три этапа:



Вам остается только прописать в своем ~/.profile путь куда вы поставили Ruby
где-то так
PATH=$PATH:/opt/ruby-enterprise-1.8.7/bin


Не удивляйтесь если все будет работать под любым пользователем, только не под root, если вы прописали путь в /etc/profile. sudo игнорит этот файл и берет пути из /root/.profile

Вот теперь можно отвлечся от файтинга с гемами и заняться программингом.

З.Ы. Советы расчитаны на новичков. Я знаю о Bitnami Ruby Stak, InstantRails и то, что у некоторых никогда не возникало проблем с работой на "этой системе", но не показывайте мне трассу стека которая начинается с "C:\path\to\ruby.exe" и тому подобное.

10 сент. 2010 г.

REE+Debian Lenny+SQLite3

При установке Ruby Entrerprise Edition на Debian Lenny инсталлер пытается установить SQLite3 начиная с версии sqlite3-ruby 1.3.0 так как требует версии 3.6.6+

Выход установить из бекпортов свежую версию SQLite3

/etc/apt/sources.list
deb http://www.backports.org/debian lenny-backports main


apt-get install -t lenny-backports libsqlite3-dev 


UPD: @ptico подсказывает, что-есть официальный репозитарий бекпортов


deb http://backports.debian.org/debian-backports\
lenny-backports main

9 сент. 2010 г.

Миграция на Bundler и Rails 2.3.9



i18n


Изменился систаксис интерполяции
Замена в VIM
:%/s/{{/%{/gc
:%/s/}}/}/gc

или так



Зависимости


Bundler'у нужен json_pure >=1.4.6. Надо удалить все пакеты которые могут зависеть от младших версий. Например: gemcuter 0.5.0

Сессии


Перед запуском на продакшене желательно сделать rake db:sessions:clear, иначе получим ошибку защиты от подделок ActionController::InvalidAuthenticityToken.

Bundler на Rails 2.x


Надо сделать указанные на сайте изменения для того, что-бы бандлер мог работать с Rails 2.x

Ошибки Passenger


Иногда после обновление гемов пассажир не поднимает приложения, причину можно понять только навесившись на логи вебсервера:
log -f /var/log/apache2/errors.log


Сессии


Сессии на ActiveRecord и Memcache сломались.
ActionController::InvalidAuthenticityToken лечиться установкой патча
wget http://gist.github.com/570149.txt \
-O config/initializers/sessions_patch.rb

8 сент. 2010 г.

Мастеркласс по Rails3 на RubyConfUA 2010


В ходе мастеркласса мы напишем коллективный блог на Ruby on Rails 3 используя самые популярные в Ruby & Rails мире инструменты и гемы.
Наш блог будет содержать следующим функционал:
- контроль доступа пользователей(devise);
- разделения доступа к действиям по ролям(declarative_authorization);
- создание новых постов(RedCloth + state_machine);
- загрузка фото и видеофайлов на сервер(Carrierwave);
- поиск и фильтрация(acts-as-taggable-on,searchlogic,thinking-sphinx);
- локализированный интерфейс(i18n)
Основной упор будет сделан на минимизацию количества кода используя haml, simple_form, inherited_resources, polymorphic associations и основной принцип Ruby - DRY(Don't repeat yourself).

Так, что кто хочет научиться писать прилоложения на самом новом и продвинутом фреймворке прошу записываться :-)

7 сент. 2010 г.

Переход на Rails3

Rails3 уже готов и вышел финальный релиз.
Пора пересмотреть код своих апликаций для предстоящих миграций.

Можно несколько упростить такой процес пользуясь тремя правилами:

- устранять warnings, а особенно те которые касаются deprecations;
- прогонять код через rails_best_practices;
- мониторить код спецаиальным гемом rails_upgrade, который на 80% укажет проблемные места для перехода на новые рельсы.

Как пользоваться новыми рельсами читать тут, обзорная статья тут.

16 авг. 2010 г.

Autotest Growl на GNU/Linux debian & Ubuntu

Autotest - библиотека для автоматического запуска тестов.

Обычно я использую второй монитор для просмотра результатов прогона тестов, но в нынешней ситуации его просто нет :-)

Я работаю с VIM и каждый раз переключается на окно где крутятся тесты - накладно.

Потому я решил использовать Autotest Growl. Это гем который соединяет libnotify и Autotest

$ sudo aptitude install libnotify-bin

тестируем
notify-send 'test', 'Hello world'

Интегрируем с Growl & Autotest

$ sudo gem install autotest-growl

~/.autotest
require 'autotest/growl'

Есть несколько настроек, назначение которых можно почитать в документации.

Выглядит это примерно так:

4 авг. 2010 г.

Книги по Git на русском.

Некоторое время назад я начал использовать Git как основную систему контроля версий в своих проектах.

Поскольку переводные изданий купить бывает довольно дорого, а то, что существует опаздывает как минимум на год от текущих версий, то находка первода «Git Magic» Бена Лина (Ben Lynn) заслуживает как минимум поста в моем блоге.


# клонировать репозитарий
$ git clone git://github.com/mifistor/gitmagic-ru.git
# создаст pdf-файл на русском языке.
$ make book.pdf LANG=ru
# Создаст книгу в HTML, pdf и xml-формате на русском языке
$ make LANG=ru


Кому не хочеться заморачиваться можно взять готовый pdf файл.

P.S. Мне предварительно пришлось установить утилиту asciidoc

2 июл. 2010 г.

Краткий путь к rubygems

Я часто смотрю исходные тексты, это одна из привилегий OpenSource, что бы там не говорили "бизнесмены" шароварщики и прочие лодыри. Но я не меньший лодырь и потому ...

sudo ln -s /usr/lib/ruby/gems/1.8/gems/ /gems

21 июн. 2010 г.

20 июн. 2010 г.

Пересечение интервалов. Тупеем вместе.

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

Для меня сейчас намного важнее понимать, "что" я делаю, а не "как" я это делаю.

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

Вообще классическая физика говорит, что находясь внутри закрытого вагона, нельзя определить с какой скоростью он движется. Другими словами говоря, что-бы определить рамки системы мы должны выйти за ее пределы.

Уже сейчас выделяю схожесть, человека и компьютера: долговременная память(HDD), сознание(RAM), объем обеих видов памяти(этот параметр для меня трансцендентный, просто не имею информации), фрагментированность(способность к упорядочиванию информации и скорости ее поиска) и как обратный эффект "засранность" ненужными вещами для жизнеобеспечения, будь-то работа, бизнес или выживаемость.

Самое интересное, что я затрудняюсь сказать, что было первичным: устройство компьютера или человека, но то, что оснащенный компьютером и интернетом человек существенно расширяет свои возможности, фактически являюсь "киборгом", так это однозначно.

Единственное узкое место, это руки и глаза для передачи информации и ее получения ;-)

Вобщем-то я написал это только ради следующих вещей:

А для дураков и идиотов, которые не могут запомнить есть книжечка. Вот такая как у меня. (С) Прапорщик.


И что-то в этом есть...


#условие непересечения:

#d3>d2 - дата начала второго периода
# больше даты конца первого периода
#или
#d1>d4 - дата начала первого
#периода больше даты конца второго

# Условия пересечения:
#(b1,e1), (b2,e2)
#e1 > b2 && e2 > b1
#b1 < e2 && e1 > b2

19 июн. 2010 г.

Кириличные субтитры в mplayer

Что-бы использовать субтитры в mplayer надо воспользоваться командой
mplayer  -sub 

зачастую субтитры на екране появляються кракозяблами или знаками повроса
решается конвертацией с помощью enca
enca -L ru -x utf-8 

копируем любой ttf шрифт который поддерживает кирилицу в ~/.mplayer/subtitle.ttf
и прописывем в ~/.mplayer/config
subcp=utf-8

17 июн. 2010 г.

Именование каталогов.

Назвал папку project_5:54 и поимел проблемы: плагины напрочь отказались видеть собственные файлы.
Промучился полчаса. Лишний раз доказывает, что фреймворк это набор ограничений, которые позволяют быстро работать.

Если вы собираетесь нарушать правила игры, то ответственность ложиться исключительно на вас.


Если так не делает Девид, то и вы так не делайте. Ибо скорее всего это не будет работать.(C) Зед Шоу(автор mongrel)

Конфигурация сети в Debian



З.Ы. Комментарии должны быть только с новой строки!!!

24 мая 2010 г.

RubyShift 2010, Kyiv | Работа над ошибками

Еще одно событие позади. Хочу излить свои эмоции по поводу Wokrshop.

Задание

Решение

Исполнители: Вторая поющая Team2

- Я сбил. Я сбил, товарищ командир!
- Ай-ай-ай... что ты натворил! Придется родителей к директору вызывать...
- Честное слово, сбил!
- С испугу, наверное. /Вторая эскадрилья/


Как же все это было...

Нас будет трое, из которых один раненый, и в придачу юноша, почти ребёнок, а скажут, что нас было четверо.





И тем не менее группа мушкетеров успешно побеждает гвардейцев кардинала. Даже присутствие великолепного фехтовальщика ДеЖюсака не спасает от поражения.
Что-то подобное случилось и у нас: У меня не заработал WiFi, так, что сражаться в полную силу я не мог, да это и не потребовалось. Если присмотреться повнимательней, то нападение гвардейцев группой ведет к тому, что они только мешают друг другу.

Изначально задача была разделена на две части: алгоритм оптимизации движения поездов и часть отвечающая за отображение схемы метро на гуглокарте,

Поэтому оценив количество векторов задач - решили играть:

2 нападающих слева - пишут код модели оптимизации движения поездов
1 нападающий справа - пишет отображение на гуглокарте и вообще вебморду
1 полузащитник - самый молодой участник помогает обеим командам попеременно осуществляя коммуникацию и контролируя использование GeoKit
я - весь из себя Балтача, "играю последнего", подношу патроны пицу, соки, пиво и иногда втыкаюсь в процесс, что-бы устранить "залипание" на моментах принятия решения "квасторкой или не квасторкой".

Принятие решений и нахождение ошибок/опечаток имхо ключевой фактор в стрессовых ситуациях, поэтому, непроизвольно применили принципы парного программирования.

Довольно быстро определились с оружием, которым мы будем фихтовать инструментарием.
Чужеродных элементов, навроди, Windows, к счастью не оказалось: MacOS, Debain/Ubuntu.
Rails 2.3.5, ибо стабильность она и в Африке стабильность, не смотря на рюшики и синтаксический сахар 3ки. Принципиального перевеса выбор платформы не давал, а установка и согласование 5ти машин - была бы непростительным расточительством времени и боевого настроя.

Система контроля и шаред хостинг: Git + Github. Слава Аллаху, на Subversion никто не настаивал.

С базой данных тоже было принято довольно простое и обоснованное решение: SQLite3.

Для перевозки мешка цемента не нужен грузовик


Потому настройка пользователей, синхронизация и т.д. MySQL, PostgreSQL - это еще несколько минут не потраченного времени.
К тому же учитывая Database Agnostic мы смогли бы сменить БД в будущем относительно безболезненно, если бы только нам не понадобился полнотекстовый поиск на Sphinx или же регистронезависимый LIKE, но этого в задаче не требовалось.

...Арфы нет, возьмите бубен. (C) В бой идут одни старики" /Титаренко/


Первоочередной задачей было получить пятисимвольный пароль для доступа к заданию, который был размещен на heroku. Окромя как брутфорсом вариантов не нашли. Ну да и как еще? Мы же программисты, а не взломщики.
В общем пока местный WiFi валялся в дауне, как поплавок при хорошем клеве, то появляясь то исчезая, одна из наших машин подключенная через бубен мобильный девайс одного из мушкетеров членов команды продолжала упорно долбить указанный адрес в несколько потоков подбирая заветный ключик.

В общем обе поставленные задачи мы решили успешно, оставалось соединить но...

Только выигрывать начал, а тут деньги время кончились...


Итак мы вторые

Но...

Не всякий бой можно выиграть. Великий Помпей проиграл Фарсальскую битву, а король Франциск Первый, который, как я слышал, кое-чего стоил, — бой при Павии.


Можно было бы выразиться в духе советских газет:

Наш бегун был в числе первых. Американский бегун прибежал предпоследним.


Но я этого делать не буду. Владимир Олейник и Антон Васильев весьма достойные соперники, равно как остальные сеньоры их команды перед которыми я снимаю шляпу в глубоком реверансе почтения.

Рябата, спасибо за игру!

Спасибо _ВСЕМ_ ;-), кто принимал участие в организации данного мероприятия.

Ой, как пафосно получилось. Ну и что?

Хотя бы я и жадничаю, за то от чистого сердца.




P.S. Рябит в глазах от опечаток? "Не пишите мне писем графиня..." найдите способ сообщить мне об этом вне комментариев.

Спасибо GeraIT за оказанное сочувствие, радушие и теплый чай холодное пиво ;-)

29 апр. 2010 г.

Руссикие напополам с Китайцами купили аську

Российско-китайский фонд Digital Sky Technologies все-таки купил мессенджер ICQ у компании AOL. Сумма сделки составила 187,5 миллионов долларов, сообщается в пресс-релизе DST.

«Приобретение ICQ - стратегический шаг в развитии нашего бизнеса в России и Восточной Европе. Многолетняя история бренда ICQ и значительная база постоянных лояльных пользователей предоставляют отличную возможность для дальнейшего усиления наших позиций в регионе», - заявил генеральный директор DST Юрий Мильнер.


Как по мне так база лояльных пользователей, наличие довольно популярного ICQ клиента QIP и потребность таких великих стран как Китай и Россия в присмотре заботе за своими гражданами очень выгодная сделка.

Едакая мегаэкономия на жучках.

Лично я минимизирую свое общение по этому протоколу.

Источник: http://webplanet.ru/news/service/2010/04/28/icq_mrk.html

11 апр. 2010 г.

Как правильно Атены и Етер или Афины и Эфир в Украинском языке

Раз и навсегда хочу этим постом закрепить свое отношение к словам греческого происхождения и их произношению в украинском языке.

Проблема состоит в том говорить Ф или Т в словах типа Ат(Ф)е(і)ни и Ет(ф)е(і)р.

Что-бы разобраться надо понимать как появлялись такие слова в языке. На древнегреческом уже никто не говорит и между языками не существует прямой фонетической биекции.

Мы знаем, что римляне записали эту проблемную букву как TH и сейчас она звучит ближе к Эс(С).

Я подчеркиваю, что речь идет о словах греческого и латинского происхождения с буквосочетанием TH. Слова через F и PH во внимание не берутся.

Фестиваль, фотография... сюда попросту не относятся...

Рассмотрим несколько ситуаций. Для примера возьмем ту же википедию ОРТОПЕДИЯ и ОРФОГРАФИЯ

Везде, есть часть слова ОРТО, в одному случае оно читается как ОРФО, а во втором ОРТО.

Хочется нормального понимания и последовательного отношения к эволюции языка.

"Библиотека" вы говорите? а вот и фиг... Древняя российская вивлиофика», первое крупное издание письменных источников по истории России, предпринятое Н. И. Новиковым в 1773-75 в 10 частях для ознакомления с историей родины широких слоёв русского общества.

Несколько интересных фактов:

Украинская литературная библия "Кобзарь" не содержит слов с буквой "Ф".

Впрочем вы не найдете ее и в Пушкинских "Песне о вещем Олеге" и "Сказке о попе и работнике его балде".

И только в поэме "Полтава" состоящей из 30 000 буков на 378 строке будет одно слово с этой буквой и таких случаев будет еще аж целых два.

Лермонтов "Когда волнуется желтеющая нива" и Крылов "Вороне и лисице" не использовали эту букву ни разу.

"Сказке о царе Салтане" Пушкина содержит троекратное упоминание этой буквы в одном и тоже слове "флот".

Все это говорит, о том, что буква "ф" крайне тяжело проникала в российскую речь, а в украинскую еще меньше.

Мы(украинцы) прекрасно обходились буквосочетанием "хв" и буквой "т" там где это было нужно.

Так, что к Атенам и Етеру я отношусь совершенно НОРМАЛЬНО.

Язык несомненно должен эволюционировать, но не путем насильственного сближения двух практически разных языков и менталитетов.

Примерно такое же у меня отношение к возврату буквы "Ґ" і передаче английского звука "H" через "г", а не через "х".

Так, что при встрече, я скорей скажу Вам "Гелов" чем "хеллоу" :-)

2 апр. 2010 г.

Безумству храбрых поем мы песню. Ода Microsoft.

Microsoft Windows EULA - End User's Licence Agreement и что это всё значит

Проработав 8 лет программистом на Windows/Delphi/Firebird и Windows/Ruby+Rails я таки готов признать себя трусом. Ставить сие чудо на свой рабочую машину страшно и не практично.

Сейчас у меня есть Debian/Fluxbox/Console/Vim/Ruby/Rails/mplayer + 6 DVD различного свободного и OpenSource ПО и я абсолютно счастлив :-)

P.S. А с программистами M$ действительно не повезло.

P.S.S Шутка. Но своего мнения я не меняю :-)

28 мар. 2010 г.

Paperclip | is not recognized by the 'identify'

Море проблем и решений..

Кто-то советует из сорцов поставить ImageMagick, кто-то костыли в "ifoв".


#Uses ImageMagick to determing the dimensions of a file, passed in as either a
# File or path.
def self.from_file file
file = file.path if file.respond_to? "path"
geometry = begin
Paperclip.run("identify", %Q[-format "%wx%h" "#{file}"[0]])
rescue PaperclipCommandLineError
""
end
parse(geometry) ||
raise(NotIdentifiedByImageMagickError.new("#{file} is not recognized by the 'identify' command."))
end


Настоящей ошибки мы никогда не увидим пока не уберем блока "begin rescue".

5 мар. 2010 г.

Арфы нет, возьмите бубен...




хотел себе тулбар потавить.. вот поистине антиреклама...

Современный украинский язык | сЫрия и дИзеля

Украинский язык считается одним из самых мелодичных. И это действительно так. Но когда я встречаю в новостях слово СЫРИЯ(страна такая Сирия) я начинаю в этом сомневаться.

Урок русского языка в грузинской школе. Учитель объясняет правила чтения Гоге:
- Запомни, Гоги, что слова "столь" и "стуль" пишутся бэз мягкого знака, а слова "сол" и "фасол" - с мягким. Это нэльзя объяснить, это нужно только запомнить...


оказывается ноги этого безобразия растут из новых правил согласно которым

и пишемо:
після приголосних д, т, з, с, ц, ж, дж, ч, ш, р - перед наступним приголосним

у власних назвах (особових іменах і географічних назвах) и пишеться тільки після дж, ж, ч, ш, щ, ц
нотомість після д, т, з, с, р - пишемо і


Должна быть сИрия, так как это имя собственное... но тут действует другое "правило"

"згідно з традиційною вимовою"


но почему производное название двигателя и имя его изобретателя пишутся по-разному ? .. это нелзя ПОНЯТЬ можно только запомнить ...

4 мар. 2010 г.

Rails 3 beta

Попробовал сабж. Работает быстрее чем 2.3 но, огорчает неработоспособность таких пакетов: thinking_sphinx, paperclip, inherired_resources обломила весь кайф... ждемс...

28 февр. 2010 г.

"на Украине" | Российская википедия жжжет :-)



Полез както я на википедию посмотреть за "Goblin'a" в миру Дми́трий Ю́рьевич Пучко́в

Читаю биографию

Родился 2 августа 1961 года в семье военнослужащего в г. Кировограде


ну чудесно, но дальше ...

В школу пошёл на Украине,


я никогда не слышал "на России", "на Беларуси" и т.д. в отношении государства. По моей логике: человек рождается в государстве, а не на "территории" - понятии размытом и не устойчивом во времени. Ну, думаю, надо бы поправить... ан нет...




Хамство чистой воды призывает не устраивать войны правок o_O


Оказывается Украине дадено особое исключение



ПОСОЛЬСТВО РОССИЙСКОЙ ФЕДЕРАЦИИ В УКРАИНЕ
и
Указ Президента РФ №937 от 5 августа 2009 о назначении "Чрезвычайным и Полномочным Послом Российской Федерации НА Украине" г-на М. Ю. Зурабова.

По ходу кто-то при подготовке указа таки прочитал Википедию :-)

P.S. Предлагаю внести в правила российской википедии пункт об обязательных хамских "камментах" в отношении безграмотных и наглых "самостийников" aka украиноязычных жителей родившихся _в_ Украине которые учат нас как правильно "гаварить".

P.S.S Если кому показалось "абыдным", то сорри... я хотя-бы пишу об этом не в "камментах" и не вношу в правила. Но завтра мы договоримся называть буйвола слоном...

ЧаВО по Украине В_НА

25 февр. 2010 г.

Кеширование счетчиков в Rails

Иногда требуется получить некую статистику, проще говоря агрегировать информацию.
Получение количества членов ассоциации самый простой случай.
Но бывает и так, что желаемая величина состоит из многих факторов и подсчетов.
Например, подсчет рейтингов по многим параметраи или кармы в социальных сетях.

Запускать трехэтажные запросы с пересчетов на каждый чих просто расточительство и рано или поздно сервер ляжет под непосильной нагрузкой даже если запросы идеально оптимизированны и проиндексированы. Единственный выход это расчитать все зарание или же расчитывать только изменения которые произошли с момента последнего пересчета.


class Blog
has_many :posts
end

class Post
belongs_to :blog, :counter_cache => true
end



create_table :blogs do |t|
...
t.integer :posts_count
...
end


Такой вот нехитрый код позволит вам избавиться от довольно дорогостоящей операции COUNT, которая в версионных RDBMS еще, как правило инициализирует сборку мусора.

Такой подход работает только на добавление и удаление объекта в ассоциацию.

Если расчет более сложен чем увеличение увеличение/уменьшение счетчика, то можно использовать обратные вызовы модели(before_save, after_save) или триггеры, если их поддерживает ваша БД.

Если операция не требует сиюминутного пересчета, то можно подвесить ее как периодическую задачу для cron, предварительно оформив как Raketask или использовать delayed_job. Такой подход был использована мною при подсчете рейтинга пользователей на rubyclub.com.ua когда величина состоит из оценки которую дали не только топику или комментарию но и посту в блоге.

P.S. В начале своей каръеры я считал это бредом начитавшись книг по построению БД и нормальным формам. Правило, "если информацию можно получить двумя путями то один должен быть устранен", долго было основным и значимым. Но когда написанная мною учетная система которая считала итоги по всем торговым накладным SQL запросом начала безбожно тормозить через некоторое время здравый смысл подсказал, что теория не всегда практична :-) И стало легко и быстро.

22 февр. 2010 г.

Bundler - инструмент для управления rubygems

Описание


Bundler - инструмент для управления зависимостями в ваших ruby-приложениях. После опредиления файла манифеста вы можете скачивать и устанавливать пакеты и все зависимости, которые определены в этом файле. Так же возможно управление обновлениеми уставноленных пакетов и выполнения ruby кода в контексте установленных пакетов.

Основной функцией Bundler является сохранение работоспособности приложения в системе с отсутсвующими зависимостями и решение проблемы когда установлены версии пакетов более новых чем требуются приложению. Например пакет responders версии 0.5.0 работает с Rails 3 и приложения на Rails 2.3 не могут стартовать с версиями ниже указанной. C Bundler это возможно.

Установка


$ sudo gem install bundler 


для Rails 2.3.5
$ sudo gem install bundler -v=0.9.5 


так как это единственная на данный момент версия которую мне удалось более-менее нормальнольно заставить работать с Rails 2.3.5

в старших версиях почемуто была удалена возможность указывать несколько рабочих окружений в параметре :group

так раньше я писал
gem "sqlite3-ruby", :require => "sqlite", :group => [:development, :test] 

и это работало.

В версиях выше 0.9.5 это возможность убрали и по логике теперь я должен писать две строки вместо одной. ИМХО это дублирование кода.

Использование


Заходим в каталог проекта и пишем
$ bundle init

после этого получаем в корне файла манифеста вида

# A sample Gemfile
source :gemcutter
#
# gem "rails"


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

# A sample Gemfile
source :gemcutter
#
gem "rails", "2.3.5"
gem "haml"

# если имя пакета отличается от включаемого файла,
# то положение можно исправить с помощью опции :require
gem 'thinking-sphinx', :require => 'thinking_sphinx'

# Эти пакеты будут включены в :test и :development
# окружении
gem "faker", :group => [:test, :development]
gem "populator", :group => [:test, :development]

group :test do
gem "factory_girl", "1.2.3"
gem "shoulda"
end



Комманды



bundle check # Проверка зависимостей указанных в файле манифеста
bundle exec # Запуски ruby-кода в контексте установленных пакетов
# указанных в файле манифеста
bundle help [TASK] # Получение помощи по указанной команде
bundle init # Генерация файла манифеста
bundle install # Установка зависимостей по указанному
# окружению(пакеты без указания окружения
# относятся к группе default)
bundle lock # Фиксация зависимостей, включая все дочерние
bundle pack # Установка всех зависимостей в папку vendor/cache
bundle show # Показ всех установленных пакетов
bundle unlock # Снятие фиксации с установленного набора зависимостей


При использовании Bundler надобность указывать зависимости в файлах окружения через config.gem отпадает и может быть удалена, кроме случаев которые будут описаны ниже.

Проблемы


Для использования с Rails 2.3.5 необходимо внести в проект изменения описанные тут

config/preinitializer.rb

begin
# Require the preresolved locked set of gems.
require File.expand_path('../../.bundle/environment', __FILE__)
rescue LoadError
# Fallback on doing the resolve at runtime.
require "rubygems"
require "bundler"
if Bundler::VERSION <= "0.9.5"
raise RuntimeError, "Bundler incompatible.\n" +
"Your bundler version is incompatible with Rails 2.3 and an unlocked bundle.\n" +
"Run `gem install bundler` to upgrade or `bundle lock` to lock."
else
Bundler.setup
end
end


config/boot.rb

class Rails::Boot
def run
load_initializer
extend_environment
Rails::Initializer.run(:set_load_path)
end

def extend_environment
Rails::Initializer.class_eval do
old_load = instance_method(:load_environment)
define_method(:load_environment) do
Bundler.require :default, Rails.env
old_load.bind(self).call
end
end
end
end


Bundler не поддерживает функцию autoload для модулей и потому такие пакеты как inherited_resources, devise, fails-footnotes могут не работать.
Решение: прописать config.gem "имя_пакета" в соответствующем файле окружения. Например, environment.rb

Отсутствие пакетного индекса
Решение: закоментировать в файле bundler/lib/runtime.rb строки с 246 по 252.

21 февр. 2010 г.

the update | RubyGems.org

Gemcutter закончил миграцию RubyGems.org.
Вышла новая версия RubyGems 1.3.6 поэтому пора выполнить команду

sudo gem update --system


Скорее всего gem.rubyforge.org будет отключен, а будет использоваться Gemcutter.

the update | RubyGems.org

14 февр. 2010 г.

Rubybarcamp Kyiv, 2009. Видео.

Не прошло и полгода... как говориться ... :-)

Видеоматериал с ноябрскокого Ruby && Rails Barcamp 2009 года в Киеве.

Thor. Инструмент автоматизации рабочего процесса.







З.Ы. За это время Jose Valim успел присоединиться к команде Rails ;-)