• Верстка повторяющихся блоков

      Довольно часто при верстке сайта возникает необходимость размещать блоки одинаковой ширины, но разной высоты в контейнере с переменной шириной (читай резиновом). Плюс на этот список может применяться фильтр, который JS-ом скрывает или показывает элементы списка, при этом он не должен разрушать «строки», верстку, или образовывать дыры, поэтому решения на таблицах не катят сразу. Простейший пример — каталог товаров:


      Читать дальше →
    • Memcached. Как найти ключи по паттерну?

        Доброе утро|день|вечер|ночь, %username%!

        При использовании Memcached, иногда могут возникнуть вопросы: «А как посмотреть все ключи Memcached?» или «Как найти все ключи по маске „*“ или „sql_*“ ?»
        Вот тогда открываются мануалы и начинается поиск такой функции, но, к сожалению, такой не оказывается :-(
        Потом начинается Гугление… И там особо ничего нет :-(
        А потом начинается поиск незадокументированных возможностей :-) и тут «Ура! Нашел!»

        Читать дальше →
      • Юнит-тестирование в PHP

          Язык PHP очень легок для изучения. Это, а так же обилие литературы «Освой _что_угодно_ за 24 часа» породило большое количество, мягко говоря, некачественного кода. Как следствие, рано или поздно любой программист, который выходит за рамки создания гостевой книги или сайта-визитки сталкивается с вопросом: «а если я здесь немножко добавлю, все остальное не ляжет?» Дать ответ на этот вопрос и на многие другие может юнит-тестирование.

          В самом начале хочется оговориться — здесь речь не будет идти о TDD и методологиях разработки ПО. В данной статье я попробую показать начинающему PHP-разработчику основы использования модульного тестирования на базе фреймворка PHPUnit
          Начнем?..
        • Простое сравнение изображений с помощью php

            Алгоритм возможно не новый, и не является идеалом, но, на удивление, работает. Никаких графов и корелляции.

            Для начала, стоит отметить, что сравнение очень приблизительно (по крайней мере, на данном этапе), временами две совершенно разные фотографии оказываются похожими процентов на 60%, так же не учитываются жесткие модификации (повороты, инверсия, обрезка) – для этого нужно доводить и доводить. Лично для меня самым главным оказались два параметра: скорость, независимость от разрешения изображения и возможность сравнивать «изображения» прямо в базе данных.
            Читать дальше →
          • 10 отличных приемов с .htaccess для WordPress

              Внимание!
              Перед изменением файла .htaccess не забудьте сделать его резервную копию.


              1 — Перенаправляем WordPress RSS поток на feedburner с использованием .htaccess
              Почему некоторые вебмастера не используют feedburner? Ведь это такой замечательный инструмент для контроля за подписками на RSS. Проблема в том, что приходится руками исправлять файлы шаблонов. Этот прием поможет сохранить Ваше время.
              И не забудьте исправить в строке 6 на Ваш код

              <IfModule mod_rewrite.c>
               RewriteEngine on
               RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
               RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
               RewriteRule ^feed/?([_0-9a-z-]+)?/?$ httр://feeds2.feedburner.com/wordpress[R=302,NC,L]
              </IfModule>
              


              Читать дальше →
            • Определение периодов времени по текущей дате

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

                На мой взгляд такие задачи возникают довольно часто и иметь один инструмент, который можно впоследствии дополнять новыми функциями, соответствующими различным врменным интервалам, очень удобно. Конечно в этом нет ничего сложного, но думаю это поможет кому-то сэкономить время на этой рутинной работе. Кроме того в нете ничего готового я просто не нашёл.
                Собственно код...
              • Проект CSS: Абстрактные типы данных и алгоритмы



                  Всем привет!
                  Спасибо за очень приятный позитивный отклик!
                  По просьбам нескольких первых зрителей, сегодня тема выпуска — Abstract Data Types and Algorithms, пожалуй самый интересный курс этого семестра. Подробное описание курса доступно на сайте CSS.
                  Читать дальше →
                • Нативный шаблонизатор

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

                    1. $title = 'My title';
                    2. include('templates/index.html');
                    * This source code was highlighted with Source Code Highlighter.

                    1. <html><head><title><?php echo $title ?></title></head>
                    2. <!-- ... -->
                    * This source code was highlighted with Source Code Highlighter.


                    То есть, переменную определили и приинклюдили html-файл. Я считаю, что это в корне неверный подход. Почему?

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

                    Таким образом, я пришел к выводу, что шаблонизатор нужен, но он не должен быть навороченным тормозом типа Smarty.
                    Идеология блочных шаблонизаторов (XTemplate, например) мне не импонирует потому, что в них нет ветвлений как таковых, есть только циклы.

                    Потому я написал свой.
                    Читать дальше →
                  • Ещё один способ победить Internet Explorer

                      Рано или поздно все web-разработчики сталкиваются с ситуацией, когда Internet Explorer становится проблемой, тормозящей разработку проекта. Сайт свёрстан валидно, по стандартам. Нормально отображается в Mozilla, Opera, Safari и других нормальных браузерах. Но. Открываем его в IE. И видим. Как то, что мы подгоняли по пикселям, строго придерживаясь стандартов, размазано по странице. Ладно ещё в IE7 можно более-менее просто подогнать вёрстку (конечно зависит от дизайна), но от IE6 иногда волосы встают дыбом. К счастью, существуют способы, которые позволяют повлиять на ситуацию. Кто-то использует хаки, кто-то — conditional comments. Где-то можно пойти на компромис и упростить задумку дизайнеров, поддерживая пользователей недобраузеров.
                      Читать дальше →
                    • Селекторы (сестринский, дочерний, атрибутов), border-spacing, :first-child, :before и :after в IE.

                        В CSS 2.1 есть множество рекомендаций, не поддерживаемых одним из самых распространённых браузеров, IE6. Но иногда так хочется использовать возможности CSS на полную мощность. Например, использование дочерних, сестринских селекторов, селекторов атрибутов и т.п. могло бы упростить HTML (или даже серверные скрипты, например, при вычислении первого потомка, тогда как в CSS для таких случаев предусмотрен псевдокласс :first-child). Каким же образом можно заставить IE понимать CSS в таких случаях?
                        Читать дальше →
                      • Выкатываем в бой

                          К бою! Внедрение конечного веб-продукта является не самой приятной процедурой для создателя и часто сопровождается жутким стрессом. Нелюбовь разработчика к релизам связана не только с чувствами ответственности и страха перед эксплуатацией новой версии, но и с ощущениями неопределенности: а что будет после того, как внедримся?

                          Приложения могут разрабатываться большим коллективом программистов, инженеров по качеству, графическим интерфейсам, но в конце проектного пути ответственность на себя берет последний из могикан. Недостаток теоретических знаний заставляет нервничать нашего героя, ведь опыта, приобретенного вследствие проб и ошибок, под час не достаточно для систематически успешного внедрения. Чтобы разобраться, как правильно выкатывать веб-проекты в бой, начнем, пожалуй, с основ.
                          С процесса разработки
                        • Печатаем сайты 2 — Печать, страницы и разные броузеры

                            В прошлом своем посте я пообещал более подробно описать как ведут себя броузеры на печати с точки зрения разбивки на страницы.
                            Выполняю обещание.
                            Реальной ценности от таких изысков мало, но бумажным верстальщикам и просто эстетствующим педантам™ будет интересно.
                            Читать дальше →
                          • Атомарность операций и счетчики в memcached

                              Серия постов про “Web, кэширование и memcached” продолжается. В первом и втором постах мы поговорили о memcached, его архитектуре, возможном применении, выборе ключа кэширования и кластеризации memcached.

                              Сегодня речь пойдет о:
                              • атомарных операциях в memcached;
                              • реализации счетчиков просмотров и онлайнеров.

                              Следующий пост будет посвящен проблеме одновременного перестроения кэшей.

                              Что же с атомарностью операций?
                            • Контекстное меню на javascript: небольшое, но мощное

                                Вы наверняка не раз видели javascript-реализации контекстных меню на базе популярных библиотек, таких как jQuery и prototype. А значит обязательно сталкивались с основными их недостатками: неудобностью API, большим количеством кода, требовательностью к ресурсам, любовью к генерации огромного количества html кода. В один прекрасный момент эти проблемы пересилили мою лень и я решил бороться с ними, поставив следующие задачи:
                                • Минимум html кода, генерируемого для меню (зачем нам засорять ДОМ)
                                • Лаконичность js кода для создания меню (API вызова без копипасты)
                                • Оптимум гибкости при работе (многоуровневые, динамически модифицируемые меню)
                                • Как можно меньше кода в реализации библиотеки (6302 байта в несжатом виде)
                                • Минимальное количество jQuery-вызовов (чтобы можно было легко от них отказаться тем, кто jQuery не использует)
                                • Inline-события где это возможно вместо биндов (меньше ресурсов сожрет)

                                Контекстное меню

                                UPD: разместил проект в google code, пользуйтесь, развивайте:
                                svn checkout js-cmenu.googlecode.com/svn/trunk js-cmenu-read-only

                                Читать дальше →
                              • Как грамотно отправлять почту из скриптов (в частности — на PHP)

                                  Первая часть текста взята из инструкции хостинг-провайдера Netangels. Вторая — авторская.

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

                                  Для того, чтобы быть уверенным, что ваше сообщение отправляется действительно верно, необходимо иметь по меньшей мере базовые представления о формате почтового сообщения. Формат почтового сообщения описан в нескольких стандартизирующих документах, основными из которых являются RFC 822 (описывает формат передачи простого текста на английском языке) и RFC 2045 и далее (описывает расширения этого формата для передачи произвольных данных).
                                  Читать дальше →
                                • Удобный дебаг с BlackBird

                                    imageХочу представить вам одну библиотеку для яваскрипта, под названием BlackBird. Основное ее назначение, избавить разработчика от не нужного дебага при помощи alert(), о чем собственно и говорит слоган «Скажите привет BlackBird и скажите пока alert()» ( Say hello to Blackbird and 'goodbye' to alert() ).
                                    Читать дальше →
                                  • Полнотекстовый поиск и его возможности

                                      Многие СУБД поддерживают методы полнотекстового поиска (Fulltext search), которые позволяют очень быстро находить нужную информацию в больших объемах текста.

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

                                      В статье рассказывается как работать с полнотекстовым поиском на примере БД MySQL, а так же приведу примеры «нестандартного» использования данного механизма.

                                      Читать дальше →
                                    • Введение в Zend Framework

                                      • Translation
                                      Update (2014): Это статья 2007 года, которая, к моему удивлению, до сих пор пользуется спросом. По этой причине я обновил её в соответствии с новыми правилами оформления постов на Хабре, и добавил подсветку синтаксиса для примеров кода. Если кому-то захочется что-то добавить или исправить, исходник текста с хабра-разметкой выложен в открытый доступ: gist.github.com/dreikanter/2b4ee996d7a775e707d7

                                      Аннотация от переводчика


                                      PHP — один из самых широко распространенных языков разработки веб-приложений и при этом один из самых спорных. Я очень часто видел негативное отношение к этой технологии, да и недостатки, провоцирующие это отношение — не для кого не являются секретом. Тем не менее, PHP активно эволюционирует и во многих отношениях постепенно становитс лучше. Одним из серьезных шагов его развития, на мой взгляд, является появление MVC-фреймворков, призванных систематизировать процесс разработки веб-приложений и приучить к порядку разработчиков, которым зачастую здорово не хватает силы воли, чтобы при всей предоставляемой языком свободе, сохранить грамотную и красивую инфраструктуру разрабатываемого ПО (сразу уточню, что последнее утверждение субъективно и основано исключительно на виденном мной коде различных программных решений).

                                      В последнее время я активно заинтересовался архитектурой MVC и сделал свою собственную реализацию фреймворка на этой концепции для PHP4. Совсем недавно на глаза попался первый официальный релиз Zend Framework, о котором я давно слышал, но все руки не доходили с ним поиграть. Для PHP существуют и другие подобный библиотеки, но в данном случае привлек бренд.
                                      Читать дальше →
                                    • Стилизация файл-инпутов

                                        Результат стилизации файл-инпута
                                        Привет. Сегодня я хочу вам рассказать о том, как можно изменить внешний вид файлового инпута.

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