Возрождение блога разработчика веба

Давно ничего не писал. То ли вдохновения не было, то ли просто думал, что «всё уже написано до нас».

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

Но скоро (надеюсь, очень скоро), буду и вновь писать код в своё удовольствие и на благо компании :-)

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

Ну и, кроме того, думаю слегка разбавлять технические статьи различными мыслеизъявлениями.

Оставайтесь на связи! ;-)

P. S. И задайте, пожалуйста, какие-нибудь темы для обсуждения. Что вы хотите узнать о разработке стартапа (но, пока, не о нём самом)? Для затравки, несколько ключевых слов про используемые технологии: mobile, iPhone, Android,  realtime, geolocationRuby, JavaScript, HTML 5Ubuntu.

Ставим рубиновый типограф на Рельсы

В продолжение вчерашней темы, добавил простой способ типографить избранные поля в модели ActiveRecord.

Достаточно написать в нужной модели примерно следующее:

class Article < ActiveRecord::Base
  typograf :title, :use_p => false, :use_br => false
  typograf :content, :teaser
end

И тогда каждый раз перед сохранением (конкретнее, перед проверкой правильности полей) будет проходить типографирование этих полей, посредством Типографа студии Артемия Лебедева.

Поддерживается несколько возможных синтаксисов объявления моделей для типографирования:

  • для одного конкретного поля:
    typograf :content
  • можно указать параметры для типографирования этого поля:
    typograf :content, :entity_type => AlsTypograf::NO_ENTITIES
  • для нескольких полей сразу (тоже с возможностью объявить параметры типографирования, общие для всех объявленных полей):
    typograf :skills, :achievements, :additional, :use_br => false, :use_p => true
  • для нескольких полей сразу (но с объявлением параметров для каждого конкретного поля):
    typograf :foo => {:entity_type => AlsTypograf::HTML_ENTITIES},
             :bar => {:use_p => true, :use_br => false},
             :baz => {:max_nobr => 5},
             :some_other_field_name => {}

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

Типограф студии Артемия Лебедева с отблеском Рубина

Понадобилось мне типографировать тексты, добавляемые в админке одного из приложений. Поиск в интернете ни одного годного типографа на Ruby не показал.
Зато, я вспомнил, что студия Артемия Лебедева позволяет типографировать тексты с помощью их веб-сервиса. Поэтому, я написал маленькую обёртку к их сервису.

Пользоваться очень просто.

  1. Установите:
    sudo gem install als_typograf --source=http://gemcutter.org/
  2. В коде приложения используйте метод process модуля AlsTypograf следующим образом:
    require 'als_typograf'
    AlsTypograf.process('- Это что, "Типограф"?') # "<p>— Это что, «Типограф»?</p>"

Обёртка поддерживает несколько опций, предоставляемых веб-сервисом Студии, их можно подставлять как к конкретному запросу:

AlsTypograf.process('- Это что, "Типограф"?', :use_p => false, :use_br => true)

так и выставлять глобально, для всех запросов на типографирование:

AlsTypograf.encoding = 'CP1251' # По-умолчанию используется кодировка UTF-8
AlsTypograf.html_entities! # Заставляет использовать сущности HTML, такие как: &nbsp;, &mdash; &hellip;

Документация для рубинового типографа хранится (и автоматически обновляется при любых изменениях) на сервисе rdoc.info, который весьма рекомендую всем разработчикам.

Метапрограммирование в Ruby

Что такое метапрограммирование?

Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, or that do part of the work at compile time that would otherwise be done at runtime. In many cases, this allows programmers to get more done in the same amount of time as they would take to write all the code manually, or it gives programs greater flexibility to efficiently handle new situations without recompilation. (via Wikipedia)

Это руководство перечисляет все стандартные методы Ruby, используемые для метапрограммирования, а так же приводит примеры их обычного употребления. В конце мы получим пример использования метапрограммирования для динамического создания классов, соответствующих таблицам в БД, включающих методы, соответствующие полям таблицы, на манер ActiveRecord.
Прочитать остальную часть записи »

Интеграция WYSiWYG-редактора TinyMCE в рельсовые приложения

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

Достаточно вставить в environment.rb:

config.gem 'tiny_mce', :source => 'http://gemcutter.org/'

В нужный контроллер:

uses_tiny_mce :only => [:new, :create, :edit, :update]

В обёртку:

= include_tiny_mce_if_needed

А в представлении указать у нужного поля текста класс mceEditor:

- form_for @page do |f|
  = f.text_area :content, :class => 'mceEditor'

После этого остановите свой проект, наберите в командной строке rake gems:install, запустите проект снова — файлы для TinyMCE автоматически установятся в нужное место. Если вы обновите гем (например, в связи с обновлением кода TinyMCE его авторами) — удалите public/javascript/tiny_mce, перезапустите приложение и новые файлы лягут в нужное место.

Всё, теперь пользователи вашего сайта смогут вытворять всякие ужасы с текстом, а так же рвать вашу вёрстку и делать прочие непотребности. Наслаждайтесь!

Ссылки проекта:

Удаление программ с помощью setup.py

Некоторые программы написанные на Питоне (например, Lekhonee) поставляются с файликом setup.py, с помощью которого довольно просто устанавливаются

python setup.py build
sudo python setup.py install

А вот удалить такую программу достаточно сложно, ибо команды sudo python setup.py uninstall нету. Ну, не предусмотрели его любители красивого кода на питоне. Красивое, ведь, лучше, чем некрасивое, ага? А код на Питоне, видимо, настолько красивый, что удалять его со своего компьютера — грех смертный.

Тем не менее, способ удаления таких программ есть, и он довольно прост:

sudo python setup.py install --record files.txt
cat files.txt | sudo xargs rm -rf

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

А если подумать перед установкой…

…то можно использовать уже упоминавшийся в блоге checkinstall:

sudo checkinstall python setup.py install

Тогда деинсталлировать это приложение можно будет как обычно, с помощью apt:

sudo apt-get purge lekhonee

Сколько стоит Ubuntu?

Да, я знаю что Ubuntu распространяется бесплатно. Сегодня меня заинтересовало другое. Сколько стоила бы аналогичная система, построенная из платных аналогов.

Посмотрим, что мы получаем в комплекте с Ubuntu:

  • операционную систему на базе ядра GNU/Linux;
  • приятную, расширяемую и настраиваемую графическую оболочку;
  • набор Офисных приложений:
    • редактор текстов (который в платных аналогах любят называть текстовым процессором);
    • приложение электронных таблиц;
    • редактор презентаций;
    • мощное приложение для ведения переписки, календаря и заметок + ещё одно, исключительно для заметок но более удобное;
  • два графических редактора: растровый и векторный;
  • кучу игрушек и прочих приятных мелочей.

Внушительный список, не правда ли? Сколько вы готовы заплатить за такой набор? А теперь посчитаем, что нам предлагают производители коммерческого ПО:

Категория ПО Ubuntu Windows Mac OS X
Итого: 0 1687,45 $ 1506 $
Ядро системы GNU/Linux 0 Windows Vista Home Premium 239.95 $1 Mac OS X 1.5.6 129 $
Офисный пакет OpenOffice, Evolution или KOffice, Kontact 0, 0 Office Home and Student 2007 149,95 $2 iWork 09 79 $
Растровый графический редактор GIMP или Krita (из KOffice) 0, 0 Adobe Photoshop CS4 699 $ Adobe Photoshop CS4 699 $
Векторный графический редактор Draw (из OpenOffice), Inkscape или Karbon (из KOffice) 0, 0 Adobe Illustrator CS4 599 $ Adobe Illustrator CS4 599 $

Берём среднее арифметическое от стоимости комплектов под Windows и Mac OS X и получаем 1596,725 $. Можно сколько угодно говорить о неточном соответствии возможностей тех или иных программ, представленных в сравнении, однако потребности большинства пользователей «ВКонтакте» и «Одноклассников» Ubuntu легко покрывает. У меня нету лишних полутора тысяч долларов, которые я отдал бы за ту толику функциональности, которая не предоставлена бесплатными аналогами. А вы?

Примечания:

  1. На русском сайте корпорации Microsoft найти цену на какие-либо продукты нереально! ↑1 ↑2

rotuka @ Ubuntu Russian Translators

Сегодня пришло письмо, что меня утвердили в группе переводчиков Ubuntu на русский. Приятно.

И я даже отличился в свежевыходящем Зайцелопе. В апплете-индикаторе новых сообщений я указан, как один из переводчиков.

Совместное использование Cucumber и Factory_Girl или роковая ошибка create_time_zone_conversion_attribute?

Недавно открыл для себя Cucumber — утилиту для описания поведения вашего приложения. Весьма хорошая штука, доложу вам. Но о ней конкретно я расскажу как-нибудь потом.

Ещё я использую вместо стендовых данных (известных также как fixtures) замечательный гем от ThoughtBot под названием Factory Girl — он позволяет делать «заготовки» моделей и ваще очень крут (о нём — как вы, может быть, уже догадались — тоже в другой раз).

Но вот соединить их при тестировании одного проекта оказалось не так-то просто! При тестировании функционала каждый сценарий, начиная со второго использования метода Factory.create вылетал с ошибкой. Как показал бэктрэйс — ошибка случалась в функции ActiveRecord::Base.create_time_zone_conversion_attribute? Гугл рассказал мне, что разработчики рельсов решают эту проблему уже очень долго, и хотя патч, решающий её, давно найден — всё никак не вольют его в основной код. И на то есть веские причины, а именно — утечка мозгов памяти в production-режиме.

Тем не менее, при тестировании функционала эта утечка памяти не так критична, потому как тестовый сервер Cucumber’а запускается и останавливается регулярно — при каждом прогоне, а сервер приложения висит довольно долго и может отъесть довольно большой кусок памяти и подавиться им. Ну, надоели вступительные слова, вот…

…решение проблемы:

Необходимо поместить в директорию lib файл activerecord_reset_sublass_fix.rb, а так же добавить его вызов в файл config/environments/test.rb следующим образом:

Ubuntu + Compiz — удобно и красиво!

Очень давно не писал в блог. Сегодня взглянул в очередной раз на черновики и решил, что буду их выкладывать потихоньку. Ну и что, что недописано (и вообще, пора менять слова «компиз фьюжн» на просто «компиз»). Будет рассказ по-частям :-)

Расскажу о композитном менеджере окон Compiz Fusion. Его историю можете прочитать на сайте проекта, а меня интересует конкретно его применение.

Прочитать остальную часть записи »