• Логирование чего угодно в Perl

    • Tutorial
    Проблема выбора

    Для логирования сообщений Перл предлагает несколько готовых решений. Все они, как водится, размещены на CPAN'е. По запросу «log» можно найти кучу модулей на все случаи жизни.

    Однако, среди всех этих модулей есть один особенный, называется он Log::Any.

    Особенность этого модуля для логирования заключается в том, что он не занимается, собственно, логированием. Модуль Log::Any предоставляет программе (и программисту) универсальное API для обращений к другим модулям, которые занимаются непосредственно логированием.

    Если вас мучает проблема выбора способа логирования в Перле — эта статья для вас.
    Читать дальше →
  • Как я стал мейнтейнером одного из модулей Perl на CPAN

      image

      У меня на работе, в одном из проектов, используется модуль XML::WBXML. Это модуль для работы с бинарным XML — WAP Binary XML.

      К сожалению, модуль обновлялся последний раз в 2006 году, т.е. 9 лет назад. С тех пор от Дэвида Глессера (David Glasser), автора модуля, не было ни слуху, ни духу, багрепорты висели неотвеченными, баги, соответственно, неисправленными. Модуль был забыт и заброшен.

      Нужно было что-то с этим делать. Ниже я хочу поделиться своим опытом получения контроля над заброшенным модулем Perl.
      Читать дальше →
      • +43
      • 9,9k
      • 9
    • Руководство по оформлению кода на Перле

      • Перевод
      image

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

      Главная фишка заключается в том, что ваши программы всегда должны запускаться с флагом -w. При необходимости, вы можете целенаправленно отключить это действие для конкретных участков кода через прагмы no warnings или переменную $^W. Так же, вы должны всегда запускать программы с использованием use strict, либо же четко понимать, почему вы этого не делаете. Прагмы use sigtrap и use diagnostics так же могут быть полезными.

      Что касается эстетики оформления кода, то единственная вещь, о которой всерьез заботится Ларри, это то, что закрывающая фигурная скобка многострочного блока должна быть выровнена по вертикали с ключевым словом, начинающим всю конструкцию. Кроме того, у него есть другие предпочтения, которые не так серьезны:
      Читать дальше →
    • RabbitMQ — Отложенные сообщения, часть 2

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

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

          image

          На Хабре имеется серия переводов официального руководства по RabbitMQ (1, 2, 3, 4, 5). К сожалению, в официальном руководстве не рассматривается вопрос организации отложенных сообщений, а я считаю этот вопрос весьма важным. Поэтому я решил сам написать такую статью.

          Примеры кода будут на Перле, но никаких специфических для Перла деталей в коде не будет, поэтому примеры могут быть сравнительно легко адаптированы для любого другого языка.
          Читать дальше →
        • Блокировка запуска второго экземпляра программы на Perl

            image

            Время от времени возникает необходимость сделать так, чтобы программа гарантированно работала в одном экземпляре. Например, это может быть скрипт, который генерирует некий файл — если запустить одновременно два экземпляра скрипта, то файл будет испорчен.

            Нужно проверить — является ли запускаемый процесс единственным, запущенным в данный момент, экземпляром программы, или уже есть другой, запущенный экземпляр?

            Есть несколько методов такой проверки, отличающихся надежностью.
            Читать дальше →
          • Асинхронный многопоточный пул воркеров на Perl

            image

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

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

            Для ускорения выполнения задач желательно решить две проблемы:

            • Научить воркер не ждать выполнения каждого отдельного этапа задачи (асинхронность)
            • Научить воркер выполнять одновременно несколько задач (многопоточность) (disclaimer: на самом деле термин «многопоточность» тут используется в значении «многопроцессность»)

            В этой статье мы рассмотрим вариант реализации воркера, который будет одновременно асинхронным и многопоточным.
            Читать дальше →
            • +17
            • 10,9k
            • 9
          • Репл — крохотный открытый плеер для Мака

            image

            Некоторое время назад я перешел на Мак и стал подбирать себе софт для повседневного использования. Проблема возникла с аудиоплеером. Я перепробовал множество плееров, но ни один меня не устраивал. Поэтому я решил написать свой собственный. Заодно мне было интересно попробовать разработку на Objеctive-C под Мак.

            В результате, у меня получился плеер Репл, что означает "резидентный плеер":
            Читать дальше →
          • Задачи со склонов Фудзи

              На Хабре регулярно упоминают книгу Уильяма Паундстоуна «Как сдвинуть гору Фудзи». Я тут как-раз ее прочитал и решил для всеобщего удовольствия собрать в кучу все задачи, которые в ней упоминаются.

              Обратите внимание — тут приведены только те задачи, которые имеют точное решение. Вопросы на рассуждение, типа «сколько в мире настройщиков роялей», я пропустил.
              Читать дальше →
            • Командная работа в Git

                Во всем множестве статей по git'у, которые я смог найти в сети, не хватает одного существенного момента — описания командной работы. То, что обычно описывают как командную работу, на самом деле является просто работой с удаленным репозиторием.

                Ниже я хочу описать свой опыт командной работы над проектом с использованием git'а.
                Читать дальше →
              • Как я провожу собеседования программистов

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

                  Я — ведущий разработчик. Это означает, в частности, что я могу самостоятельно принимать решение о том, сколько и каких именно специалистов следует нанять для выполнения проекта. Уровень зарплаты, как правило, изначально определяю я, затем его одобряет директор/владелец компании.

                  Что касается зарплаты. Обычно в подобных топиках пишут, мол, «зарплату вы предлагаете низкую, а требуете много». Так вот, ниже рассказывается про собеседование минимальной сложности, которое я провожу со всеми кандидатами на любую должность и при любой зарплате. Т.е. по моему мнению, это собеседование должен проходить любой человек, называющий себя программистом, независимо от зарплаты.
                  Читать дальше →
                • FastCGI-приложение на Perl. Часть третья.

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

                    Более того, в плане обработки нескольких одновременных запросов ситуация с демоном даже хуже, чем с обычным CGI-приложением. Если CGI-приложение может быть запущено веб-сервером в нужном количестве экземпляров (например, по экземпляру на каждый поступивший запрос), то демон, работающий в одном единственном экземпляре, будет вынужден ставить поступившие запросы в очередь. Пока предыдущий запрос не будет выполнен, все остальные запросы должны будут ждать.

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

                    А как создавать копии?
                    Читать дальше →
                  • FastCGI-приложение на Perl. Часть вторая.

                      Написанное в предыдущей статье FastCGI-приложение сковано одной цепью с тем терминалом, из которого его запустили. Приложение будет работать ровно до тех пор, пока открыт терминал. Как только вы закроете терминал, приложение будет немедленно убито.

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

                      Для того, чтобы FastCGI-приложение перестало зависеть от родительского терминала, оно должно быть преобразовано из простого скрипта в демон.

                      Что это еще за чертовщина?
                      Читать дальше →
                    • FastCGI-приложение на Perl. Часть первая.

                        Некоторое время назад мне поручили написать движок для онлайн-аукциона. Передо мной встал выбор — сделать движок как обычный CGI или же сделать что-то поинтереснее. Я принял решение применить в разработке движка технологию FastCGI.

                        FastCGI — это клиент-серверный протокол, обеспечивающий взаимодействие между веб-сервером и приложением. FastCGI является дальнейшим развитием протокола CGI.

                        В чем разница?
                        Читать дальше →
                      • Парковка головок винчестера на ноутбуке под FreeBSD

                          Проблема, о которой так долго писали большевики, имеет место не только в Ubuntu, но и во FreeBSD.

                          Вкратце:

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

                          Читать дальше →
                        • Устанавливаем Windows в QEMU под FreeBSD

                            Процесс установки QEMU освещен в сети довольно смутно. Все более-менее подробные статьи, которые мне удалось найти, имеют неприятные особенности:

                            Во-первых, эти статьи устарели. Так, например, для поднятия сетевого моста в новой 7-ой FreeBSD вместо устаревшего bridge следует использовать if_bridge.

                            Во-вторых, авторы этих статей как-то невзначай упускают некоторые важные моменты, без которых пошаговое выполнение описываемых процедур не дает эффекта. Например, нет внятного указания на то, что для запуска QEMU нужны либо права root'a, либо настроенный sudo.

                            В третьих, в статьях излагаются какие-то лишние процедуры, не относящиеся напрямую к делу. Например, рассказывается о том, как экспортировать окно QEMU, устанавливаемого на сервере, на локальную Windows.

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

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