От редакции

Соскучились? Мы за вами - очень.

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

Или причина может крыться в Кантовской теории, согласно которой время субъективно и есть "чистая форма чувственного созерцания". Что время есть лишь одним из чувств человека и время без наблюдателя - ничто. Ведь именно благодаря этой теории можно оправдать ту крупицу информации, представленную в выпуске, за ту вечность, прошедшую со второго выпуска.

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

Можно придумать еще тысячу оправданий и сто причин из-за которых выпуск не состоялся или же был бы не таким какой он есть. Война Алой и Белой розы, Юстинианова пандемия и Великая депрессия стали лишь малыми элементами паззла, собрав который, мы увидели будущий выпуск стенгазеты который и представлен вашему вниманию.

Comments

Поиграй со мной

Итак, собственно что такое 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 - сырой стек, и использовать его я бы не рекомендовал.

Comments

Суровые донбасские тестеры


Субботу 10 декабря 2011 года по праву можно обвести в красный кружочек в IT-календаре Донецка. Именно в этот день прошла первая встреча Donetsk QA Community Инициатором встречи выступил Алексей Деркач, который вдохновившись примером днепропетровских коллег и cnc.dn.ua, решил попытаться собрать донецких QA-специалистов.

"Избу-читальню" заслуженно стоит назвать самым IT-кафе из всех кафе города. К традиционному Кофе-и-коду теперь добавились собрания QA Community. Теплая уютная обстановка и вкусный чай/кофе определенно способствуют интересному общению на IT-темы. Стоит также отметить тот факт, что на встречу пришли не только тестировщики, но и заинтересованные программисты.

Основой первой встречи стал доклад Алексея Деркача "Особенности тестирование Web-приложений", в котором Алексей поделился наблюдениями из своего личного опыта. Автор рассказал о тех пунктах в тестировании Web-приложений, на которых стоит сделать акценты. Слушатели положительно оценили доклад. Единственной нераскрытой темой осталось нагрузочное тестирование - Алексей честно признался, что у него пока еще нет достаточного опыта в этой области.

После небольшого перерыва встреча была продолжена обсуждением вопроса "Место тестировщика в современных проектах". Все пришедшие поделились своим мнением, рассказами из личного опыта, обменялись полезными сведениями.

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

Comments

Хакатон


“Вы даже себе не представляете на что способна группа программистов, у которых поджимают сроки”, говорят нам организаторы Хакатона. По своей сути - изнурительное мероприятие. Длится сутки, но доставляет массу удовольствия и приносит кучу положительных эмоций - днепропетровский отчет это ярко демонстрирует. Что ж, настало время донецких программистов показать свои способности.
Задаток у донбасских айтишников достаточно неплохой - подали заявку уже более семидесяти участников. К слову, на предыдущем днепропетровском хакатоне участников было около пятидесяти. А значит у Донецка есть все шансы стать самым крупным хакатоном. Не стоит сомневаться, айтишник! Присоединившись к участникам, оставив комментарий к новости, ты увеличишь активное сообщество разработчиков Донецка и тем самым поднимешь IT-статус родного города.
И не стоит переживать об отсутствии команды - много команд будут формироваться прямо на месте.
Как известно, сборище программистов редко делает что-то эстетически красивое и глазу приятное. И опыт прошлых хакатонов показывает, что на мероприятии интересно будет не только матерым программистам и адским админам, но и людям с развитым чувством прекрасного. Дизайнеров, готовых помочь проектам, программисты любят и ценят.
Всех сопереживающих, разработчики будут ждать на презентации своих проектов на финишной прямой мероприятия - 26 февраля в 13:45. Не пропусти!

Comments

Посидим, поокаем

Благодаря инициативе Анны Воловенко и при помощи КА "Шаг" появилась возможность провести в Донецке "AT.info посиделки". Организаторы встреч Миша Поляруш и Андрей Дзыня выступили с докладами об автоматизации тестирования веб и мобильных приложений. Встреча получилась интересной и вызвала бурные дискуссии как непосредственно во время докладов, так и в кулуарах. Как и бывает на подобных посиделках, пользу получили обе стороны: интересные подходы показали как Михаил и Андрей, так и наши донецкие разработчики и тестеры. Надеемся, что мы еще не раз встретимся в этом формате.

Comments

Руби-гномик


Андрей Кутейко недавно стал одним из членов команды 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 очень мало десктоп-программ. И внимание к этому проекту невелико. Но несмотря на это, проект неплохо документирован. У меня, как у новичка, вообще не вызвало никаких трудностей разобраться с кодом.” - заметил Андрей.

Comments

Драпируем клиентский код

Команда разработчиков 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.

Comments

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 и сделать Трекер еще лучше :)

Comments

Разминки


Каждый день мы сталкиваемся с удивительным и прекрасным в мире программирования. Каждый раз мы изучаем что-то новое, неизведанное. И это вдвойне интересно, потому что мир программирования подчиняется строгим правилам, все его законы четко описаны. А все новое и непонятное становится логичным и последовательным вскоре после того, как процесс изучен досконально.

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

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

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

Comments

Принцип неопределенности джаваскрипта

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 не переопределяется.

Предупреждение: Будьте бдительны! Строгий режим на то и строгий, чтобы бить по рукам за каждую оплошность.

Ссылки по теме:

Comments

Вовремя записанное


  • “Три достоинства программиста: лень, гордыня и третью не помню. Вероятно забывчивость.” Дмитрий Кириенко
  • “Вауэффектизация rails началась с динамических скаффолдов” Павел Митин
  • “JOPA не в сортирах и не в Java - JOPA в головах!” Александр Михальчук
  • "Жаваскриптовое программирование пора уже давно определить в отдельный паттерн: жаваскрипт-ориентированное программирование. ЖОП получается. " автор неизвестен
Comments

Спасибы

Огромное спасибо редакция выражает контрибьюторам этого выпуска стенгазеты: Алексею Деркачу, Алексею Левжинскому, Дмитрию Кириенко, Павлу Митину, Андрею Кутейко и Дмитрию Стропалову. Без вас, ребята, этого выпуска бы не было.

Отдельное спасибо модели текущего выпуска Сергею Петровичу и дизайнеру обложки Максиму Довбенко.

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

Comments