От редакции
Соскучились? Мы за вами - очень.
В эфире третий выпуск Вечерки™ в котором нам предстоит много чего обсудить. Но многое останется за кадром. Причину скудности информации нужно искать в древних временах, когда наша планета только формировалась. В то далекое время слепой случай распорядился хаотически расбросаными мириадами осколков, летающими по необъятной галактике, таким образом, что наша голубая планета была вынуждена вращаться вокруг себя с частотой заставляющей всех своих обитателей мириться с этим и подстраивать свои биоритмы под этот двадцати четырех часовой ритм.
Или причина может крыться в Кантовской теории, согласно которой время субъективно и есть "чистая форма чувственного созерцания". Что время есть лишь одним из чувств человека и время без наблюдателя - ничто. Ведь именно благодаря этой теории можно оправдать ту крупицу информации, представленную в выпуске, за ту вечность, прошедшую со второго выпуска.
И простые американские рабочие девятнадцатого века, отдавшие свои жизни за восьми, а не восемнадцати часовой рабочий день, и не подозревали что они были причастны к текущему выпуску Вечерки™.
Можно придумать еще тысячу оправданий и сто причин из-за которых выпуск не состоялся или же был бы не таким какой он есть. Война Алой и Белой розы, Юстинианова пандемия и Великая депрессия стали лишь малыми элементами паззла, собрав который, мы увидели будущий выпуск стенгазеты который и представлен вашему вниманию.
Поиграй со мной
Итак, собственно что такое Play! - это современный веб-фреймворк на Java в его версии 1.x и Scala/Java в его грядущей второй версии. Одним из значительных отличий Play! от других фреймворков, основанных на Java (включая и Lift), является то, что он не базируется на Servlet API, но предоставляет свой полный стек для запуска приложений, и как написано в официальном FAQ - "Play is platform". Впрочем, если требуется, то приложение на Play! можно запустить с помощью Tomcat, Jetty или другого контейнера. Да, и ещё можно забыть об xml для конфигурации приложения.
Play! был выбран заказчиком, а нами опробован на этапе переговоров. Впечатления и тогда, и сейчас от Play!/Java целиком положительные. Простой и понятный роутинг, привычный по другим фреймворкам скелет приложения, хороший шаблонный движок, встроенная работа с тестами (включая Selenium), наличие документации, FAQ, ответов на StackOverflow, поддержка в IDE и редакторах - Eclipse, Idea, Netbeans, TextMate, Vim. Развёртывание предельно простое - распаковываем тарбол, прописываем каталог в PATH, "$ play new MyApp
" - вот и все. С Play! быстрый старт действительно получается быстрым. И я считаю, что в таком виде фреймворк вполне годен для написания настоящих, "серьёзных" приложений.
Но заказчик захотел Scala. Предполагалась тесная интеграция с внешними сервисами, используя их XML API, а в таком случае на полную бы заработали встроенные средства языка, которые в Scala очень мощные. Да и согласитесь - Scala сама по себе интереснее. Можно сказать, что в Play! 1.x встроена поддержка Scala "из коробки" - в зависимости прописывается модуль, вместе с которым в проект приехали новый шаблонный движок и DSL для SQL-запросов Anorm взамен стандартного ORM. От последнего пришлось отказаться буквально в первый день: задумка хорошая, но отсутствие нормальной документации, отсутствие поддержки сообщества и общая сырость не позволили применить Anorm. На место был возвращён ORM на основе JPA. А дальше начали проявляться проблемы обратной совместимости Scala c Java: различия в работе с коллекциями, несоответствие типов (в Scala как таковых нет перечислений (enum), например), различия в объектной модели, доступ к API фрейморка в большинстве случаев через специальную прослойку, неработающие со Scala-кодом Java-модули. Шаблонизатор тоже отличился чувствительностью к переносу строки, пробелам, а иногда и к порядку следования аргументов. Пожалуй, единственное, что действительно понравилось, это библиотека для тестирования Scala Test.
Я для себя сделал следующие выводы: выбирать надо фреймворк, изначально написанный на том языке, который вы будете использовать. В случае Scala Lift гораздо привлекательнее Play!/Scala по всем статьям. Возможно, с выходом второй версии Play!, интеграция станет гораздо лучше, но пока она очень сырая. И ещё такой момент - изначальная Java-архитектура фреймворка все равно находит отражение в Scala-коде, а зачастую и не дает применять все возможности языка. Да, можно писать map вместо for, сократить общее количество кода, но, по большому счету, это мало что меняет - писать "по-другому" не очень-то получится.
Так или иначе, но пока что Play!/Scala - сырой стек, и использовать его я бы не рекомендовал.
Суровые донбасские тестеры
Субботу 10 декабря 2011 года по праву можно обвести в красный кружочек в IT-календаре Донецка. Именно в этот день прошла первая встреча Donetsk QA Community Инициатором встречи выступил Алексей Деркач, который вдохновившись примером днепропетровских коллег и cnc.dn.ua, решил попытаться собрать донецких QA-специалистов.
"Избу-читальню" заслуженно стоит назвать самым IT-кафе из всех кафе города. К традиционному Кофе-и-коду теперь добавились собрания QA Community. Теплая уютная обстановка и вкусный чай/кофе определенно способствуют интересному общению на IT-темы. Стоит также отметить тот факт, что на встречу пришли не только тестировщики, но и заинтересованные программисты.
Основой первой встречи стал доклад Алексея Деркача "Особенности тестирование Web-приложений", в котором Алексей поделился наблюдениями из своего личного опыта. Автор рассказал о тех пунктах в тестировании Web-приложений, на которых стоит сделать акценты. Слушатели положительно оценили доклад. Единственной нераскрытой темой осталось нагрузочное тестирование - Алексей честно признался, что у него пока еще нет достаточного опыта в этой области.
После небольшого перерыва встреча была продолжена обсуждением вопроса "Место тестировщика в современных проектах". Все пришедшие поделились своим мнением, рассказами из личного опыта, обменялись полезными сведениями.
Резюмируя, можно сказать коротко - встреча удалась! Надеемся, что следующая встреча будет более богатой на доклады и число присутствующих будет увеличиваться. Тем, кто не смог посетить, эту встречу, будет интересно прочесть общий блокнот встречи и посмотреть слайды доклада Алексея
Хакатон
“Вы даже себе не представляете на что способна группа программистов, у которых поджимают сроки”, говорят нам организаторы Хакатона. По своей сути - изнурительное мероприятие. Длится сутки, но доставляет массу удовольствия и приносит кучу положительных эмоций - днепропетровский отчет это ярко демонстрирует. Что ж, настало время донецких программистов показать свои способности.
Задаток у донбасских айтишников достаточно неплохой - подали заявку уже более семидесяти участников. К слову, на предыдущем днепропетровском хакатоне участников было около пятидесяти. А значит у Донецка есть все шансы стать самым крупным хакатоном. Не стоит сомневаться, айтишник! Присоединившись к участникам, оставив комментарий к новости, ты увеличишь активное сообщество разработчиков Донецка и тем самым поднимешь IT-статус родного города.
И не стоит переживать об отсутствии команды - много команд будут формироваться прямо на месте.
Как известно, сборище программистов редко делает что-то эстетически красивое и глазу приятное. И опыт прошлых хакатонов показывает, что на мероприятии интересно будет не только матерым программистам и адским админам, но и людям с развитым чувством прекрасного. Дизайнеров, готовых помочь проектам, программисты любят и ценят.
Всех сопереживающих, разработчики будут ждать на презентации своих проектов на финишной прямой мероприятия - 26 февраля в 13:45. Не пропусти!
Посидим, поокаем
Благодаря инициативе Анны Воловенко и при помощи КА "Шаг" появилась возможность провести в Донецке "AT.info посиделки". Организаторы встреч Миша Поляруш и Андрей Дзыня выступили с докладами об автоматизации тестирования веб и мобильных приложений. Встреча получилась интересной и вызвала бурные дискуссии как непосредственно во время докладов, так и в кулуарах. Как и бывает на подобных посиделках, пользу получили обе стороны: интересные подходы показали как Михаил и Андрей, так и наши донецкие разработчики и тестеры. Надеемся, что мы еще не раз встретимся в этом формате.
Руби-гномик
Андрей Кутейко недавно стал одним из членов команды ruby-gnome2 - проекта-мостика между миром ruby и gnome. По сути, этот проект является набором привязок (bindings) к целому стеку API. С одной стороны это позволяет использовать ruby для написания кросс-платформенных desktop-приложений. С другой - использовать качественные библиотеки в веб-проектах. Например:
- GIO - инфраструктура доступа к файловой системе, прозрачное и унифицированное использование виртуальных файловых систем
- Pango - рендеринг текста с произвольными языками/шрифтами. Большинство программ в GNU/Linux (в их числе и браузеры) используют именно Pango, для превращение букв в пикселы на экране.
- RSVG - рендеринг SVG.
- Poppler - чтение PDF.
Андрею потребовалось работать с PDF файлами и извлекать из них текст и прочую метаинформацию. Для этого ему пришлось исправить несколько ошибок в коде ruby/poppler и дописать недостающие функции (ruby/poppler немного отстаёт по версиям от poppler). Создатели ruby-gnome2 заметили активность пользователя andy128k и пригласили вступить в команду.
В планах у Андрея реализовать в рамках репозитория ruby-gnome2 библиотеку cario, библиотеки для работы с векторной графикой.
“Вообще я заметил, что на ruby очень мало десктоп-программ. И внимание к этому проекту невелико. Но несмотря на это, проект неплохо документирован. У меня, как у новичка, вообще не вызвало никаких трудностей разобраться с кодом.” - заметил Андрей.
Драпируем клиентский код
Команда разработчиков Redtape в ходе решения одной задачи на днях наткнулась на проблему - создать группу "радиокнопок" в Рельсах значительно сложнее, нежели, к примеру, элемент select. Аналогично, создать группу флажков намного сложнее, чем multiple select. В качестве значения им нужно было устанавливать поле, которое в ActiveRecord модели было представлено сериализованной переменной. В случае с группой флажков туда нужно было писать массив, сама форма была глубоко вложенной, и, начав писать erb код, мы почти мгновенно в нём утонули.
Через некоторое время прозвучало "Эврика!". Select и Radiogroup концептуально - одно и то же. Multiple select и Checkbox group - опять-таки одно и то же. Так почему бы не описать в erb простой "select" и не превратить его в Radiogroup с помощью клиентского кода?
Так родился JQuery Drapper. Его смысл в том, что проектируя html, вы стараетесь сделать максимально простой и семантичный html. Соответственно, select у вас - это именно select, а что там нарисовал дизайнер, группу радиокнопок или вылетающее окошко с набором ссылок - это лирика. Лирику и берёт на себя drapper. Он может спрятать исходный элемент управления и нарисовать вместо него нечто совершенно непохожее, вдобавок организовав связь между исходным элементом и его представлением (то, что принято называть binding). Примеры на странице плагина весьма говорящие: текстовые поля с порядковым номером элемента превращаются в список, сортируемый перетаскиванием, а текстовое поле превращается в элегантный слайдер.
Плагин написан достаточно модульно, чтобы написание собственных драпперов было удобным и приятным.
Если вы сталкиваетесь с задачей, которую можно решить простым и изящным html'ем, но дизайну это не соответствует и приходится городить огород, то возможно вам поможет JQuery Drapper.
Faye
Faye -- новая система обмена асинхронными сообщениями, основанная на WebSocket. Она доступна как для Rails, так и Node.js.
Faye была выбрана для чата и обновления историй без перезагрузки страницы планирования на Трекере. Изначально faye запускали как Rack middleware. При этом варианте rails сервер вместе с faye запускаются одной командой: "rails s thin
". Работало все хорошо, и даже шустро, поэтому запустили на продакшене. Однако, через некоторое время оперативной памяти на сервере стало не хватать. Как выяснилось, трекеровский https-прокси не работает корректно с сообщениями типа keep-alive, которые активно порождает faye во время работы, и это породило утечку памяти. Кстати, чат, который разрабатывался для изучения этой технологии, а затем был интегрирован в трекер, отлично работает как отдельное приложение. На трекере решили попробовать альтернативный способ запуска -- faye-сервер на EventMachine. После этого на стейджинге снова столкнулись с проблемой пересылки SSL-трафика. Сообщения faye-серверу приходят, а вот обратно их не хотят получать некоторые браузеры (в частности, Firefox сообщает об ошибке "Security error").
Команда разработчиков Трекера борется с данной проблемой и в ближайшее время собирается окончательно победить faye и сделать Трекер еще лучше :)
Разминки
Каждый день мы сталкиваемся с удивительным и прекрасным в мире программирования. Каждый раз мы изучаем что-то новое, неизведанное. И это вдвойне интересно, потому что мир программирования подчиняется строгим правилам, все его законы четко описаны. А все новое и непонятное становится логичным и последовательным вскоре после того, как процесс изучен досконально.
Репозиторий warm-up призван помочь делиться с друг-другом интересными задачками и знаниями из удивительного мира программирования. Идея выросла из почтовой рассылки, в которой уже были заданы две джаваскриптовых и одна руби-задачка.
Процесс описан README.md и очень прост. Для того, чтобы задать задачку, необходимо сделать пулл-реквест в репозиторий с новым файлом, который содержит условие задачи. Достоинствами пулл-реквеста есть возможность коментировать строчки кода и сам пулл-реквест. Для тех, кто ни разу не делал пулл-реквесты небольшой мануал в помощь
Подписывайтесь на обновление репозитория, присылайте пулл-реквесты и давайте решать интересные задачки вместе.
Принцип неопределенности джаваскрипта
undefined
-- это глобальная переменная со значением undefined. Она не является константой или ключевым словом и с легкостью может быть переопределена.
Естественно, защититься от этого поведения можно достаточно легко и не принужденно. Варианты:
- вместо слова
undefined
использовать любое выражение, возвращающееundefined
. Допустим,void(0)
. - объявить локальную переменную undefined со значением по-умолчанию
undefined
. - Добавить дополнительный формальный параметр в вызваемую функцию и не передавать фактический:
(function(undefined) { /* ... */ })()
'undefined' === typeof variable
не зависит от переопределенной переменнойundefined
Вариант if(something) {}
писать нельзя, ибо пустая строка, ноль при конвертировании в boolean
тоже возвращают false
. А задача стоит на проверку undefined
значения.
При всех описанных вариантах необходимо помнить о таком поведении интерпретатора и постоянно заботиться о защите от переопределения.
Начиная с ECMAScript 5 включена поддержка строгого режима (англ. strict mode) в котором помимо всего прочего есть поддержка read-only свойств объекта. Используя строгий режим, включим у window.undefined
режим ‘только для чтения’:
"use strict";
Object.defineProperty(window, "undefined", {
value: void(0),
writable: false
});
После выполнения этого кода любая попытка переопределить undefined
свойство объекта window
ни к чему не приведет. Интерпретатор проигнорирует переопределение.
Поддержка браузеров, кстати, обнадеживает. Игнорируя Internet Explorer восьмой версии, можно смело пользоваться! Что касается серверного джаваскрипта, то можете быть спокойны -- undefined не переопределяется.
Предупреждение: Будьте бдительны! Строгий режим на то и строгий, чтобы бить по рукам за каждую оплошность.
Ссылки по теме:
Вовремя записанное
- “Три достоинства программиста: лень, гордыня и третью не помню. Вероятно забывчивость.” Дмитрий Кириенко
- “Вауэффектизация rails началась с динамических скаффолдов” Павел Митин
- “JOPA не в сортирах и не в Java - JOPA в головах!” Александр Михальчук
- "Жаваскриптовое программирование пора уже давно определить в отдельный паттерн: жаваскрипт-ориентированное программирование. ЖОП получается. " автор неизвестен
Спасибы
Огромное спасибо редакция выражает контрибьюторам этого выпуска стенгазеты: Алексею Деркачу, Алексею Левжинскому, Дмитрию Кириенко, Павлу Митину, Андрею Кутейко и Дмитрию Стропалову. Без вас, ребята, этого выпуска бы не было.
Отдельное спасибо модели текущего выпуска Сергею Петровичу и дизайнеру обложки Максиму Довбенко.
Пользуясь случаем, приглашаем к сотрудничеству всех желающих поучаствовать в следующем выпуске.