• Отправка уведомлений на почту при деплое проекта

      В нашем проекте при каждом деплое разработчики, тестеры и ещё пара людей получают замечательные письма:
      Subject: Наш проект версии v1.1.1 обновлён на сервере 'testing'

      user1 выложил следующие обновления на сервер 'testing':

      Коммиты по задачам:
      jira.local/browse/PROJECT-1234

      Полный список коммитов с предыдущего обновления:
      4392a53 Thu Aug 18 17:50:32 2011 +0700 user1 / [PROJECT-1234] сделал полезное
      f2fcfe2 Thu Aug 18 17:37:53 2011 +0700 user1 / сделал страшное
      cb1fcbe Wed Aug 17 15:18:10 2011 +0700 user2 / зарефакторил

      Изменения по файлам:
      file1 | 4 ++--
      file2 | 8 ++++----
      file3 | 8 ++++----
      3 files changed, 10 insertions(+), 10 deletions(-)

      Такое решение помогло нам избавиться от вопросов тестеров «Ну что, выложили уже исправление бага XXX?», «Что нового на тестовом сервере?». Так же — все члены команды, отдел внедрения и руководство в курсе, что происходит с кодом на серверах.
      Для работы используется git, capistrano (+ multistage), php, bash (+ некоторые консольные утилитки). Если интересно — заходим под кат.
      Читать дальше →
    • Реанимируем dctc для борьбы с ложными файлами

        Года 4 назад у меня родилась идея — написать бота, который бы отслеживал активность в нашем локальном DC-хабе — просто логировал чат и выполнял простые команды в приват. За пару вечеров был найден прекрасный консольный клиент — dctc, с которым можно взаимодействовать через unix-socket; а ещё за пару вечеров — написан простенький бот на php. При создании бота были внесены первые поправки в код dctc, чтобы он не посылал странные команды на сервер. Через некоторое время меня сделали модератором на этом самом хабе и я начал безжалостно банить. Но удобной системы для отслеживания количества банов у конкретных людей не было, но администратор каждые 5 минут генерировал информацию по текущим банам — ещё несколько убитых вечеров — и вот администрация обрела лёгкую возможность отслеживать порядковый номер бана.

        Спустя ещё несколько месяцев в сети стали появляться фэйки — это когда, например, скачиваешь Шрэка, а там вовсе даже не Шрэк, а красная шапочка и трое непонятных мужиков… Некоторое время боролись своими силами, но душа поэта не выдержала — и я решил улучшить бота.
        что же было сделано и как всё это заиметь себе?
      • QR для оплаты по СМС

          Сегодня первый раз в жизни производил оплату услуги через SMS, и чтобы не нажимать на неудобные, маленькие кнопочки смартфона я просто открыл qrcode.kaywa.com и заполнил необходимые поля на компьютере, затем скормил картинку сканеру штрих-кодов на телефоне — и получил готовую SMS (с заполненным номером и текстом) — оставалось только нажать «отправить».
          Так вот, почему бы вам, господам принимающим оплату через SMS не упростить жизнь пользователю и не добавить небольшую картинку рядом с информацией о платеже? Благо делается это предельно просто — например код по ссылке chart.apis.google.com/.../ сгенерирует сообщение на номер 01 с текстом abcdef123. Да и существуют готовые решения для генерации QR-кодов для популярных языков программирования, если у вас нет желания зависеть от гугла.
          Реализовать не сложно (разве что в дизайн вписать), а пользователю — приятно.
        • Странности с php-модулем Memcached

            На 4 серверах стоит модуль Memcached (1.0, libmemcached 0.34, memcached 1.2.6), который прикручен к:
            1. Nginx + PHP-FPM (5.2.11)
            2. Nginx + SpawnFCGI + PHP (5.2.6)

            Через некоторые промежуток времени php перестаёт принимать новые соединения — в error.log nginx'a валится «connection refused». Когда использовался модуль Memcache подобных проблем не наблюдалось. Сейчас проблема решается костылём — что-то вроде nc -w 2 localhost 9000 || /etc/init.d/php restart. Кто-нибудь сталкивался с подобной проблемой? Есть идеи, как её решить? Возврат к memcache, смену ЯП и т.п. не предлагать.
          • Об одном эвристическом методе детекции вирусных инжекций на сайтах

              ! Пост написал RomanL, но за неимением необходимого количества кармы — опубликовать его не может.

              Хочу рассказать об одном решении, как можно обнаружить внедрения полиморфного вирусного JavaScript-кода в страницы сайтов. Заметка расcчитана на подготовленных пользователей, которым не надо объяснять элементарных вещей и которые могут сами найти дополнительную информацию не требуя ссылок на википедию :)

              Читать дальше →
            • Отслеживание iframe

                Однажды мне надоели жалобы клиентов, вроде «на моём сайте вирус, сделайте что-нибудь!». Объяснять людям об опасности сохранения паролей от ФТП на небезопасной машине так же надоело. Гениальное оказалось рядом — обычно поражаются файлы index.* и default.* — так почему бы не отслеживать изменение этих файлов. Сказано — сделано.
                UPD: код переписан — теперь никакого SQL и PHP, тупо парсим xferlog bash'ем
                Читать дальше →
              • вывод новостей с группировкой по дате

                  Дано: MODx 1.0.0
                  Нужно: выводить список новостей в следующем формате:
                  25.08.09
                  > заголовок 2 новости от 25 августа
                  описание

                  > заголовок 1 новости от 25 августа
                  описание

                  24.08.09
                  > заголовок новости от 24 августа
                  описание

                  Реально ли это сделать без переписывания куска Ditto?
                  Читать дальше →
                • конфигурация модуля

                    Дано: ZF1.9.1;
                    2 модуля — default и admin: default лежит в /application, admin — в /application/modules/admin
                    есть единый конфиг — /application/config/application.ini
                    Если добавить в него строку (?)
                    admin.resources.layout.layout = admin
                    то модуль admin продолжает подгружать layout по умолчанию, если же добавить другую строчку:
                    resources.layout.layout = admin
                    то layout меняется, но для всего сайта.

                    Если создать Admin_Bootstrap — то в первом случае layout меняется для всего сайта.

                    Внимание вопрос: как корректно добавлять модуль-ориентированные настройки?

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

                      Буквально вчера хабраюзер Arceny поведал нам об установке дебиана с USB-flash. В статье он упомянул о возможности установки «С помощью загрузки по сети (PXE boot)», благодаря чему я решил наконец написать материал по созданию сервера pxe boot.
                      понеслась
                    • Поднимаем subversion для приятной разработки

                        В один прекрасный день мне надоело заливать по ftp\ssh все изменения, внесённые в проект. К этому моменту я уже вынашивал идею перенести разработку под управление SVN — контроль версий, всё-таки приятная штука. В итоге было решено совместить приятное с полезным — и контроль версий, и автоматическое обновление проекта. По традиции — повествование будет вестись на примере моего любимого debian'a.
                        Заметку можно считать дополнением статьи svn tips (по крайней мере — первого пункта).
                        поехали