• Пишем Referrer tracker: мал да удал, с хранимыми процедурами MySQL

      Часто возникает желание посмотреть отуда приходят люди на ваш сайт, дабы пойти туда почитать что про нас любимых пишут, и рьяно вступить в полемику не отходя от кассы. Казалось бы, такая популярная штука как Google Analitycs должна делать это, но есть одна проблема — в отчете отрезаются GET-параметры, и если вы видите что ссылка с огромного форума, то вам еще предстоит найти нужную тему, что отнимает время (стоит упомянуть, что Google Analitycs требует дополнительного JS кода на страницах, что также отнимает время и трафик).
      Дальше кратко про альтернативы и вперед изобретать велосипед
    • Редактор для хабра

        Хабра редактор.


        Предыстория

        Делал для своего блога online редактор контента. Причем я привык пользоваться обычным редактором типа notepad++. Я не сторонник WYSIWYG редакторов, поэтому сделал свой редактор на основе обычного textarea. Какие же преимущества у редактора?
        1. Удобная панель инструментов в стиле Office 2007 (на скока покажет практика)
        2. Поддержка горячих клавиш (почти на весь функционал)
        3. Tab ставит именно табуляцию, а не прыгает на следующий элемент (ставит 4 пробела)
        4. Shif+Tab удаляет табуляцию
        5. Умный Enter (при переносе вставляет табуляцию как у предыдущей строки для выравнивания)
        6. Shift + Enter вставляет перенос строки в стиле HTML тег

        К чему это я клоню?

        Мне показалось это удобно по этому я решил, поделиться этим счастьем с другими, и сделал сервис для написания статей для хабра. А так как на хабр пишут много кода, решил реализовать и подцветку кода используемую на моем блоге. А так как добрый хабр вырезает все не угодные ему теги, а я использую библиотеку GeSHi. Пришлось немного доработать напильником, и теперь у хабросообщества появилась возможность писать код в красках. А так как эта библиотека довольно популярна она может подсвечивать более 80 языков. Подцветка реализуется прямо в тексте статьи, надо просто указать класс для тега code вот так <code class="html"></code >.
        Если не хотите чтобы подцвечивал, то не надо не чего указывать тогда он просто отформатирует отступы без подцветки.

        Также был подключен типограф подробнее, что он может, можно посмотреть здесь*4.
        Читать дальше
      • Prett Parsing — метод Вогана Пратта для разбора выражений

          В тему компиляций и вычислений выражений.

          В далёком 1973 году Воган Прэтт (Vaughan Pratt) предложил простой и эффективный метод разбора выражений, не использующий ни автоматы, ни грамматику как таковую.

          Идея заключается в том, что каждый символ (token) наделяется свойствами:
          lbp = приоритет связывания символа слева,
          nud = функция, определяющая результат применения оператора в начале выражения,
          led = функция, определяющая результат применения в середине выражения.

          Основной разбор осуществляется по схеме:
          разбор(приоритет продолжения):
              вытолкнуть символ из входного потока
              результат = вызов nud этого символа
              пока приоритет lbp следующего в потоке символа > приоритета продолжения:
                  вытолкнуть символ из входного потока
                  результат = применени led этого символа к текущему результату
          

          Константы и переменные имеют приоритет связывания 0, а функция nud возвращает их значение (или ссылку). Поэтому применение разбора к константам сразу возратит их значение.
          Для бинарных операторов функция led рекурсивно вызывает продолжение разбора (справа) вплоть до более низкого приоритета, и делает что-нибудь с уже накопленым (слева) результатом, и полученным рекурсивно.
          Результат применения оператора аггрегируется для внешнего вызова.
          Много-арные операторы — получают аргументы дополнительным вызовом функции разбора.
          Префиксные операторы делаются с помощью определения для них функции nud.
          Для правостороннего связывания меняется приоритет продолжения рекурсивного разбора.

          На сайте effbot.org приводится подробная реализация на питоне.
          Там же есть ссылки для жаваскрипта и схемы.
          наглядный пример на питоне
        • Debian штуки — apt-mirror

          • Tutorial
          Очередной пост, посвящённый полезным утилитам. из состава Debian =)) На этот раз хочется вспомнить про программу apt-mirror, которая позволяет не много не мало, а создавать свои собственные зеркала Debian репозитариев с ежедневным обновлением онных.

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

          Читать дальше →
        • Парсер математических выражений

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

            К примеру, можно написать приложение, которое принимает ввод функции пользователем в виде строки, анализирует корректность синтаксиса, вычисляет его значение в указанных точках, оптимизирует введенное выражение, минимизируя количество операций, требуемых для вычисления, и может выдавать результат в виде строки, представляющей собой корректное строковое представление оптимизированной функции. В качестве конкретных применений можно отметить различные специализированные калькуляторы (в том числе, построенные наподобие программируемых), приложения, используемые для построения графиков или других отчетов, требующие задания начальных функций, или как оригинальное средство для построения защиты от спама / автоматических регистраций.
            Читать дальше →
          • Как наладить производство в Китае?

              Я придумал недорогое и очень нужное (хоть и нишевое) устройство — вариацию на тему USB-клавиатуры.
              У меня есть трёхмерная модель, построенная в AutoCAD, рендеры и описание того, что я хочу получить. Дело за малым — превратить модель в тысячу готовых девайсов в красивых коробках.

              Если вы каким-либо образом были связаны с аутсорс-производством техники в Китае, поделитесь, пожалуйста, опытом. Меня интересуют все стадии, начиная от поиска завода (на alibaba.com их тысячи) до получения сертификатов и доставки.

              Заранее спасибо. Я верю, что не обязательно быть Артемием Л., чтобы выпустить устройство своей мечты.

              UPD: Целевая аудитория — не айтишники. Не ждите yet another happy hacking keyboard.
            • Делаем Liquid Resize своими руками

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


                (НЛО прилетело и растянуло этот рисунок здесь)
                Читать дальше →
              • «Совершенный Ajax» – новый подход к построению настоящих клиент-серверных web-приложений

                  «Совершенный Ajax» — новый подход к построению web-приложений, при котором web-сервер не генерирует ни строчки HTML-кода и взаимодействует с внешним миром только посредством web-служб; а клиентский интерфейс реализуется только на основе клиентских HTML, CSS, JavaScript.

                  Статья состоит из двух частей. В первой части — более живой и провокационной я постараюсь заинтересовать проблемой, рассказать о технологии «Совершенный Ajax» и показать ее применение на примере нашего проекта «Система Интерактивного Тестирования Знаний “Синтез”» (который имеет ряд интересных особенностей, таких, как использование серверного JavaScript на платформе Mozilla Rhino, прототипно-ориентированная ORM и поддержка SPARQL — языка запросов к Semantic Web).

                  Вторая часть – более занудная будет содержать много технических деталей и выйдет в следующий раз.

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



                  Попробуйте угадать: к какой архитектуре относятся web-приложения?

                  К клиент-серверной говорите? Я ожидал, что Вы так ответите :-)

                  Что ж, давайте разберемся. В клиент-серверной архитектуре выделяют:
                  • Сервер — отвечает за хранение данных и реализацию бизнес-логики приложения.

                  • Клиент — отвечает за взаимодействие с пользователем [1].

                  Реализация бизнес-логики на сервере и взаимодействие с пользователем на клиенте четко разделены.

                  Преимущества клиент-серверной архитектуры очевидны; мы их все знаем:
                  1. Бизнес-логика не смешивается с пользовательским интерфейсом.
                  2. Можно реализовать несколько клиентов с разными пользовательскими интерфейсами: интерфейс командной строки, оконный Windows-интерфейс, Flash, web-интерфейс, мобильный интерфейс и т.д.
                  3. Клиентский компьютер не требователен к ресурсам;
                  4. И т.д.


                  Но, относятся ли web-приложения к клиент-серверной архитектуре? Web-сервер

                  Действительно, в web-приложениях есть сервер, отвечающий за бизнес логику приложения.

                  Но! За реализацию интерфейса отвечает не клиент, а тоже сервер. На сервере происходит обработка клиентской формы. Сервер генерирует HTML-код пользовательского интерфейса.

                  Браузер Клиент, т.е. браузер лишь визуализирует уже готовый HTML-код интерфейса. Это, фактически, то же самое, что прицепить к серверу монитор и объявить этот монитор клиентом…

                  Читать дальше →
                • Иерархические структуры данных и производительность

                    Введение



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

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

                    Читать дальше →
                  • GNU Make может больше чем ты думаешь

                      Как только исходники проекта надо распространять, то возникает необходимость использовать систему сборке, вместо того что нагенерила любимая IDE. В мире unix (с подачи gnu) традиционно используется autotools, ему есть отличные альтернативы в виде cmake или scons. Но почему-то ядро Linux собирается при помощи GNU Make, а вся FreeBSD включая порты при помощи BSD Make. WTF?

                      Однажды намучившись с autotools, я решил провести эксперимент — насколько можно перелопатить Makefile, чтобы обеспечить себе более-менее удобную сборку.

                      Читать дальше →
                    • Скрипты Python против Bash

                        Не секрет, что в плане автоматизации каких-либо простых действий и тот, и другой вариант скриптов — мощное орудие. Прочел я эту статейку, и подумал — а чем мы хуже? Возьму, да и опишу, как автоматизировать простые консольные действия с помощью python-скриптов, даром что это тема довольно широкая.
                        Интересно?
                      • Иерархические структуры данных и Doctrine

                          Введение



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

                          В первую очередь, это связано с тем, что реляционные базы не приспособлены к хранению иерархических структур (как, например, XML-файлы), структура реляционных таблиц представляет из себя простые списки. Иерархические же данные имеют связь «родитель-наследники», которая не реализована в реляционной структуре.

                          Тем не менее, задача «хранить деревья в базе данных» рано или поздно возникает перед любым разработчиком.

                          Ниже мы подробно рассмотрим, какие существуют подходы в организации хранения деревьев в реляционных БД, а также рассмотрим инструментарий, который нам предоставляет ORM Doctrine для работы с такими структурами.
                          Читать дальше →
                        • Qt4: Интересные и приятные виджеты. Часть 1

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

                            image

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

                            Виджеты с описаниями и скриншотами
                          • Паттерны дизайна веб-форм: формы подписки

                            • Translation
                            Это перевод довольно новой статьи, которая вышла 4 июля 2008 года. Если вы уже читали ее, то навряд ли найдете что-то новое, но для тех, кто не знаком с оригиналом в статье найдется масса интересного. Сначала я хотел перевести и подписи к картинкам, но позже понял, что не стоит этого делать, так как статья ориентирована на грамотного читателя, который способен сам определить простейшие фразы.

                            UPD: Опубликована вторая часть статьи habrahabr.ru/blogs/ui_design_and_usability/45680


                            Когда вы хотите увеличить доход вашего сервиса вы должны увеличить количество заполнений ваших веб-форм. Даже, если, на первый взгляд, у вас есть какие-то революционные идеи для того чтобы удивить посетителей, недостаточно просто добавить возможность регистрации на вашем сайте. Для того, чтобы сервис достиг максимальных посещений мы, дизайнеры, должны предоставить пользователю хорошие решения (good user experience). Мы должны завлечь их, описать им, как работает сервис, объяснить им, почему стоит заполнить форму и описать выгоду, которую они от этого получат. И, конечно, мы должны сделать их участие максимально простым.

                            Тем не менее, разработка дизайна веб-форм — это не простое дело. И здесь есть одна простая причина: никто не любит заполнять формы — ни в оффлайне ни в онлайне. Следовательно, как дизайнеры, мы обязаны найти дизайнерские решения, чтобы сделать заполнение форм делом простым, интуитивным и безболезненным.

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

                            Ниже мы представляем результаты обзора по текущим паттернам дизайна веб-форм — результат анализа ста популярных веб-сайтов, в которых веб-формы (должны бы) многое значат. Мы решили начать с форм регистрации. Ниже мы представляем первую часть наших исследований, вторая часть результатов обозрения будет опубликована на следующей неделе [прим. перев. — перевод второй части будет позже].
                            Читать дальше →
                          • Nginx UploadProgress Module

                              Модуль для nginx, с помощью которого достаточно просто мониторить прогресс загрузки файлов на сервер. Ранее были подобные решения, через модули к php, ruby, через стороние скрипты, flash объекты итп. Автор предлагает универсальное решение на уровне web сервера. Подробную информацию и инструкции вы можете найти на wiki.codemongers.com (кстати, один из лучших проектов, посвященных nginx`у). Тут я хотел обратить внимание на другое.
                              Использовал модуль совместно с nginx upload module, работает на ура. Однако файлы, что я заливаю, достаточно большие (поддерживаю файлообменник), пытался запихнуть в директиву upload_progress размер обрабатываемых файлов — 1g, при релоаде nginx`а получил варнинг, мол непонятный размер вы поставили. Странно, т.к. в client_max_body_size у меня стоит 1g и нормально себя чувствует. Глянул исходники nginx`а и модуля, выяснелось, что модуль обрабатывает директиву upload_progress функцией ngx_parse_size, тогда как сам nginx обрабатывает ту же client_max_body_size соседней функцией ngx_parse_offset, функции абсолютно идентичны (на мой взгляд), разве что первая не понимает размерность «g», а вторая понимает =) Для того, чтобы модуль нормально обрабатывал размерность в директиве upload_progress, надо в исходнике модуля (ngx_http_uploadprogress_module.c) в строчке 1151 исправить ngx_parse_size на ngx_parse_offset.
                              В общем это не критично, т.к. директива нормально обрабатывает значение 1024m, но как-то нелепо выглядит подобная запись =)))
                              А вообще модуль очень понравился, очень удобное решение, не зависящее от бэк-енда.

                              update: Внимание, совершил глупую ошибку. Стыдно. Деректива upload_progress задает не максимальный размер загружаемых файлов для указанной зоны, как я думал, а размер оперативной памяти, выделяемой для обсчета одной загрузки в эту зону. Значение для этой дерективы — 1,2m, максимум 10-20m. Задавая 1g вы будете тратить гигабайт оперативки на каждую загрузку. Стыдно, ошибку не повторяйте.
                              p.s. тем не менее баг найден, автору сообщил, он обещал исправить.
                            • Два в одном

                                Что будет если объединить две проблемы, связанные с версткой?
                                Все мы в глубине души надеемся, что проблемы, возникающие при решении этих проблем сложатся. Однако, практика показывает, что они перемножаются.
                                Если Вам интересно, как используя только дивы и валидные CSSки сделать страницу, которая «отбрасывает тень» (слева и справа) и при этом занимает не меньше экрана по высоте, добро пожаловать под кат!
                                Читать дальше →
                              • 9 статей на тему круглых кнопок

                                  9 статей на тему круглых кнопок

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

                                  Здесь представлены
                                  9 отличных статей на тему создания кнопок с изменяемой шириной