Pull to refresh
0
Дмитрий Завалкин @Zyavaread⁠-⁠only

User

Send message

«Пластилиновая» архитектура

Reading time5 min
Views13K
Я думаю, любой руководитель проекта или ведущий программист хотя бы однажды сталкивался с ситуацией, когда код приложения вдруг оказывался совершенно запутанным, непонятным, а люди, его поддерживающие, в ответ на просьбу исправить ошибку или добавить новую функциональность отправлялись «в астрал» на несколько дней, прихватив с собой изрядную долю бюджета и, возвращаясь, предъявляли ещё более запутанный код с исправленной ошибкой, но добавленной парой других.

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

Большинство провальных проектов обладают одной закономерностью. Они абсолютно лишены структуры. Я называю архитектуру таких систем «пластилиновой».
Читать дальше →

Что такое анти-паттерны?

Reading time9 min
Views149K
Анти-паттерны — полная противоположность паттернам. Если паттерны проектирования —
это примеры практик хорошего программирования, то есть шаблоны решения определённых задач. То анти-паттерны — их полная противоположность, это — шаблоны ошибок, которые совершаются при решении различных задач. Частью практик хорошего программирования является именно избежание анти-паттернов. Не надо думать, что это такая непонятная теоретическая фигня — это конкретные проблемы, с которыми сталкивался практически каждый разработчик. Кто осведомлен, тот и вооружён! Рассмотрим же несколько расрпотранённых анти-паттернов в программировании.
Да, рассмотрим!

Переписываем проект с Zend Framework на Rails

Reading time9 min
Views7.9K
Около пяти месяцев назад я завязал с zend framework и пересел на рельсы. Тогда же начал переписывать свой проект www.okinfo.ru. Сейчас он уже закончен и sloccount показал что количество строк в проекте уменьшилось с 15000 до 4000. Мои знакомые php разработчики попросили success story и в итоге родилась эта статья. В ней я опишу как оно было, а так же немного расскажу о своем переходе на ruby.
Читать дальше →

Вводный обзор CMS Diem

Reading time6 min
Views3K
Полгода назад узнал от коллеги про эту CMS и она меня очень заинтересовала, недавно дошли руки в ней покопаться, спешу поделиться своими впечатлениями с хабражителями и хабрагостями.

Коротко о главном


  • Работает на Symfony1.4.
    Кто не знаком с symfony — getting started tutorial, official web-site.
  • Помимо стандартной админки имеет интерактивный интерфейс управления для frontend, все изменения подгружаются via AJAX — что очень удобно при редактировании
  • Интегрированная Google Analytics, удобный просмотр логов сервера в виде графиков, генерация админ-интерфейса для самописных модулей, веб-консоль и прочие плюшки


Подробное описание и скриншоты далее
Читать дальше →

Применение алгоритмов нечеткого поиска в PHP

Reading time7 min
Views31K
Вдохновленный топиками о нечетком поиске и фонетических алгоритмах, захотел попытаться реализовать нечто подобное похожее на гугловское «Возможно, вы имели в виду: ...» средствами PHP.

Для исправления опечаток в словах понадобится:
Расстояние Левенштейна (или расстояние Дамерау-Левенштейна — разница будет незначительной) — levenshtein()
Metaphonemetaphone()
Алгоритм Оливера — similar_text()
База русских слов (с падежами, учетом времен и т.д.).
Читать дальше →

Lift: самый мощный и безопасный веб фреймворк из всех?

Reading time4 min
Views8.7K
Весьма амбициозное утверждение можно увидеть на официальном сайте проекта. Там же предлагается в этом убедиться на примерах. Лично мне судить сложно, я пользовался только Java веб фреймворками, и то далеко не всеми. Поэтому я попробую рассказать об этом подробнее, а выводы пусть каждый сделает сам.



Самое важное, что нужно отметить — это отсутствие утверждения «лучший из всех». И это понятно, хотя бы потому, что Lift — сложнее большинства фреймворков. Во-первых, потому что он активно использует функциональную сторону Scala, во-вторых, потому что Scala — язык с сильной статической типизацией. Но, для тех, кто готов учиться, Lift — инструмент действительно адски мощный (знаю по опыту, последние несколько месяцев использую его в работе).
Читать дальше →

HTML 5 в Internet Explorer

Reading time3 min
Views58K
image

Вкратце: как заставить новые теги из HTML 5 работать в Internet Explorer.

Любой веб-разработчик смотря на HTML 5 плачет от счастья, которое наконец-то пришло в наш дом. Для большинства функций (такие как WebGL, многопоточность и веб-сокеты) придётся ждать поддержки от браузеров (а в самых правильных эти возможности уже есть), но новые удобные теги мы можем использовать уже сейчас.

Однако Internet Explorer (даже последней, 8-ой версии) и тут сумел споткнуться — новые теги вне HTML 4 он просто не замечает — на них нельзя повесить стили.

В IE проблем даже две — отдельно нужно включать поддержку HTML 5 тегов в обычном документе, и отдельно в содержимом, которое добавляется динамически (например, через AJAX).
Читать дальше →

Простая библиотека для парсинга HTML

Reading time2 min
Views10K
Недавно зарелизил Leaf, это небольшая библиотека для парсинга HTML на Python.
Она уже довольно долгое время покрывает все мои нужды в парсинге, но еще есть идеи для развития.
Эта библиотека по сути обертка над lxml, которая делает работу с ней гораздо приятней.
далее...

Полнотекстовый поиск в InnoDB

Reading time12 min
Views37K
Привет, Хабрачитатель!
Полнотекстовый поиск данных в InnoDB – это известная головная боль многих разработчиков под MySQL / InnoDB. Для тех, кто не в курсе дела я объясню. В типе таблиц MyISAM есть полноценный полнотекстовый поиск данных, однако сама таблица исторически имеет ограничения, которые являются принципиальными в отдельных проектах. В более «продвинутом» типе таблиц InnoDB полнотекстового поиска нет. Вот и приходится мириться бедным разработчикам либо с ограничениями MyISAM, либо с отсутствием поиска в InnoDB. Я хочу рассказать о том, какие есть способы организовать полноценный поиск в InnoDB без магии и исключительно штатными средствами. Также будет интересно сравнить скоростные характеристики каждого способа.
Читать дальше →

Верстка e-mail рассылок — «подводные камни». Часть первая. Картинки

Reading time5 min
Views109K
Верстка e-mail рассылок. Часть первая. Картинки.Добрый день, уважаемые хабравчане!
Не так давно мы вплотную столкнулись с задачей верстки e-mail рассылок. Это не самое приятное занятие, но многие компании активно используют корпоративные рассылки, и верстка становится всё более актуальной задачей.

Казалось бы, что сложного — сверстать простую страничку? Но есть «подводные камни», которые могут поставить в тупик даже опытного верстальщика. Именно таким «камням» и посвящен пост (оговоримся сразу — все эксперименты, описанные в посте, проводились под Windows с тем ПО, которое есть у многих под рукой).

Первый камень — Изображения


Практически каждая рассылка содержит картинки. Логотип, шапка, фотографии, иконки соц.сетей…
Есть 2 способа использования картинок:
Читать дальше →

Полезные советы проектировщикам интерфейсов

Reading time3 min
Views5.4K

Уделяйте достаточное внимание шаблонам


Люди тратят большое количество времени, используя различные интерфейсы (Facebook, Google, Windows, Mac OS и т.д.). В них уже могут быть представлены решения проблем, с которыми вы сталкиваетесь при проектировании. Поэтому не стоит изобретать колесо. Используя привычные шаблоны интерфейсов вы поможете пользователям почувствовать себя как дома.
image
CoTweet имеет привычный по почтовым клиентам шаблон.
Читать дальше →

Отладка REST-сервиса на коленке — готовое решение

Reading time1 min
Views5.6K
В процессе писания REST-сервиса уткнулся в странную проблему — не нашел приличного инструмента для отладки jsonp ответа от сервера.
За пол-дня накидал приемлемый вариант — одна html страница, которую можно хоть прямо с диска загрузить и кучка чужих js-либ, чтобы вся эта красота работала.
Выглядит примерно так:



Все бобро выложено на github, если кому-то нужно — пожалуйста!

Disclaimer: может оказаться полезным в случае если вам нужен кросс-платформенный и кросс-браузерный нативный «ajax-клиент имитатор» для кросс-доменных запросов с малым потреблением памяти и наглядным вводом и выводом ответа сервера.

Печатаем Flash в Firefox правильно

Reading time1 min
Views1.1K
С давних времен у Flash-а и Firefox-а существует множество проблем.
Одна из них заключается в том, что Flash контент не печатается в Firefox.

Мы давным давно нашли workaround и выложили его фришной либой.
Прошло три года, а баг все еще существует и фикс все еще актуален.

Итак, представляю вам flash-print-fix. Небольшую библиотеку, которая позволяет добиться нормальной печати Flash содержимого в Firefox:
code.google.com/p/flash-print-fix
Читать дальше →

Чек-лист вёрстки. Что можно отдавать клиенту, а что надо переделывать

Reading time20 min
Views317K
Идеальная вёрсткаВы PM. Как узнать – готова ли вёрстка к реальному использованию?
Вы заказчик. Как убедиться, что работа выполнена качественно?
Как оценить качество вёрстки?

Когда я стал тим-лидом, а позже PM, передо мной стала задача проверять вёрстку наших проектов. Нужно было выработать формальные, легкопроверяемые критерии, соответствие кода которым, должно было давать некую гарантию, что не будет факапов и ни клиент, ни программеры не сказажут потом “WTF?”.

Клиенту неважно насколько красив ваш код, но ему важен результат. Качественный код нужен фирме, т.к. он надёжней и в будущем его будет легче поддерживать.

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

Итак что же это за список?

Краткая версия теперь доступна на html5checklist.com (github), где можно вносить pull-request'ы.

История обновлений:
  • 2015/08/11: Актуализировал рекомендации по оптимизации скорости загрузки. Добавил требование поддержки Retina. Дополнил «19. Мелочи» требованием что изображения должны масштабироваться в зависимости от размера окна.
  • 2015/08/10: актуализирован список исключений для CSSLint
  • 2015/07/29: актуализирован пункт №13 «плохо»/«хорошо»
  • 2015/04/08: добавлено требование использования препроцессоров и рекомендация использования систем сборки
  • 2013/04/25: добавлены анализаторами качества кода: CSSLint и JSHint, указан сайт подбора css font stack (спасибо @fliptheweb), мелкие уточнения (работу интерактивных элементов страницы, что не пропадает фон на высоких разрешениях, не должно быть пустых презентационных блоков, при проверках контента — пробовать удалять заголовки, менять местами блоки)
  • 2013/04/24: добавил пункт об минимизации каскада (БЭМ-техники, MCSS, SMACSS), необходимости вписывания в экран моб. устройства, заменил ссылку на проверочный текст отображения стандартного html на код с normalize.css, поправил пример где в рекомендации встречался длинный каскад, упомянул про Opera на Presto и новый уровень семантики — в именах классов BEM.
  • 2012/04/12: отсортировал пункты проверки в порядке важности, выделил главные, дополнил статью подробностями
  • 2011/12/07: дополнил согласно доклада на WSD Минск'2011.
  • 2011/07/19: добавлено про повышение надёжности вёрстки благодаря html5-тэгам, про необходимость favicon/apple-touch-icon, отсутствие багов при ресайзе textarea
  • 2011/06/15: добавил пояснения какие ошибки валидации допустимы, рассказал про отсутствие официальной кнопки «HTML5 Valid» и про официальное лого HTML5 на сайте.


Далее с примерами - как проверить html, даже если вы ничего не понимаете в вёрстке.

Canvas Indicator — альтернатива для AjaxLoad.gif

Reading time3 min
Views3K
Многие наверняка используют индикаторы процесса, например, когда передаете/получаете какие-нибудь данные через AJAX.

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

Делать специальный GIF под каждую ситуацию довольно глупо. Поэтому правильное решение — использовать Canvas.

Если вы еще не решили эту проблему, я жду вас под катом

Работаем с jQuery Templates. Часть третья, jQuery Templates Plus

Reading time7 min
Views7.1K
Две недели назад я рассказал об основных возможностях плагина jQuery Templates и обещал на этом не останавливаться. Обещания надо выполнять, поэтому сегодня я расскажу о дополнительных функциях, не вошедших в основной код плагина.

Дополнительные функции плагина включают:
  1. Набор команд, существенно упрощающих изменение отрендеренных шаблонов при изменении связанных с ними данных;
  2. Событие rendered, которое вызывается после того, как отрендеренный шаблон добавляется в структуру документа.

Код дополнительных функций вынесен в файл jquery.tmplPlus.js, поэтому для их использования вы должны добавить ссылку на этот файл:

<script src="Scripts/jquery-1.5.js" type="text/javascript"></script>
<script src="Scripts/jquery.tmpl.js" type="text/javascript"></script>
<script src="Scripts/jquery.tmplPlus.js" type="text/javascript"></script>


Читать дальше →

Наглядно о потоке выполнения в Node.js

Reading time3 min
Views12K
В комментариях к моему предыдущему топику об асинхронном программировании, коллбеках и использовании process.NextTick() в Node.js было задано немало вопросов о том, за счёт чего получается или может быть получена большая производительность при использовании неблокирующего кода. Постараюсь это наглядно показать :) Статья призвана в основном прояснить некоторые моменты работы Node.js (и libeio в его составе), которые на словах бывает трудно описать.

Пример обработки запросов сервером с блокирующим чтением:


В первую очередь прокомментирую полезность использования неблокирующего ввода/вывода. Как правило, использовать блокирующие операции в Node.js стоит лишь на этапе инициализации приложения, и то не всегда. Правильная обработка ошибок в любом случае потребует использования try/catch, так что код при использовании неблокирующих операций не будет сложнее, чем при использовании блокирующих операций.
Нужно лишь помнить, что случае, когда запросов неблокирующих операций может оказаться больше, чем потоков libeio. В этом случае новые запросы будут становиться в очередь и блокировать выполнение, однако для программиста это будет происходить прозрачно.
Преимущества неблокирующих операций и некоторые недостатки в картинках

Каркас сайта в один клик

Reading time1 min
Views5.7K
Дизайнерская компания Volkside сделала подарок веб-разработчикам, выпустив бесплатный букмарклет Wirify, с помощью которого можно отобразить каркас (wireframe) любого сайта одним щелчком мыши. Полезная вещь, чтобы быстро оценить некоторые аспекты дизайна сайта: модульную систему вёрстки, визуальную иерархию, свободное пространство, симметрию, золотое сечение, правило третей и т.д.


Читать дальше →

Интеграция Zend_Acl и MVC. Часть 1 (простейшее использование)

Reading time3 min
Views1.3K
Итак, что не так с Zend_Acl и текущей реализацией MVC в Zend Framework? Ничего неправильного нет, просто не слишком очевидно для разработчиков, как достичь оптимальной интеграции между этими двумя важными частями фреймворка.
Читать дальше →

Динамические роли и права

Reading time3 min
Views3.8K
Случилось мне давече писать динамическую систему ролей и прав для интернет-магазина.
Поскольку в интернете ничего нужного, кроме вот этой серии статей не нашел, придумал написать все сам.
Читать дальше →

Information

Rating
Does not participate
Registered
Activity