• Быстрый пул для php+websocket без прослойки nodejs на основе lua+nginx

    nginx + lua

    Кратко: nginx не умеет пулить websockets, а php работает per request. Нужна прослойка которая будет держать открытыми вебсокеты и при поступлении данных соединяться с php (через тот же fastcgi) и отправлять обратно ответ.

    update: Здесь не идётся про решения на php, так как по сравнению даже с nodejs, они гораздо медленнее.

    Тема, как оказалось, не нова, исходники тянуться аж из 2014, но, тем не менее, информации о трюке, про который здесь пойдёт речь, крайне мало. Можете погуглить "websockets php". Усугубляется тема ещё тем, что найденные примеры реализации (два, точнее) не работают, включая тот, что в документации :)
    Читать дальше →
  • Как я создавал прибыльный глобальный SaaS проект, от разработки до продаж

    • Tutorial
    Некоторые люди здесь знают меня как основателя двух прибыльных SaaS проектов и автора популярных статей о них (статья про Postio, статья про Menumake). В этом тьюториале я расскажу о том как я, обыкновенный разработчик, в одиночку создавал свой первый глобальный проект и что из этого получилось (TL;DR: хеппи-энд и первые продажи). Ну и заодно пробежимся по всем проблемным вопросам, начиная о том как найти неконкурентную и гарантированно прибыльную идею (оставим создание следующего Гугла более амбициозным и умным людям), и заканчивая тем, как принимать платежи глобально, находясь при этом в России. Летс гоу.

    Ищем идею


    Я всегда был сторонником правила, что поиск хорошей идеи — это не случайность, а обычный аналитический процесс. Есть много мест и способов найти проверенную реальностью идею, но поскольку однажды я твитнул это…
    Читать дальше →
  • Assert. Что это?

    Assert — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы. Эта конструкция может автоматически сигнализировать при обнаружении некорректных данных, что обычно приводит к аварийному завершению программы с указанием места обнаружения некорректных данных. Странная, на первый взгляд, конструкция — может завалить программу в самый неподходящий момент. Какой же в ней смысл?
    Читать дальше →
  • Что нового в PHP 7.2?

      Несмотря на то, что мы активно работаем с Python и Go, всё же существенная часть нашего серверного кода написана на PHP. Поэтому мы внимательно следим за всеми нововведениями языка. Прошло меньше года после релиза предыдущей минорной версии, и вот уже последний бета-релиз запланирован на 17 августа. Его ещё не рекомендуется использовать в production, но уже можно скачать docker-образ. Пора разбираться, что изменилось в новой версии языка.


      Читать дальше →
    • Ожидание длиной в 15 лет. Nginx Application Server

        Начиная с момента появления Nginx в 2004 году, мы все задавались вопросом: когда же на nginx можно будет запускать приложения? Мы запускали PHP в php-fpm и на апаче, запускали Python через uWSGI, иногда жили с Apache, а если нам нужны были разные версии PHP — жили с зоопарком из FPM-ов.

        image

        Только что на конференции NginxConf в Портленде Nginx, Inc. объявил о запуске Nginx Application Platform. ITSumma тестировала один из его компонентов, собственно сам Application Server под названием Nginx Unit с закрытой версии. В этом посте мы расскажем о том, как выглядит Nginx Unit, и как на нем запускать приложения.
        Читать дальше →
      • Отчет о хакатоне команды Навального

          Я работаю в IT-отделе штаба кампании за регистрацию Алексея Навального кандидатом на выборах Президента России в 2018 году. У нас есть небольшой штат разработчиков, но не всегда хватает ресурсов, чтобы реализовать все интересные проекты и генерировать свежие идеи.

          Хакатон команды Навального

          Поэтому 26 июля мы объявили о проведении хакатона по созданию продуктов и инструментов для помощи кампании и её волонтерам.
          Читать дальше →
        • Собеседование для фронтенд-разработчика на JavaScript: самые лучшие вопросы

          • Translation
          Недавно мне довелось побывать на встрече участников проекта FreeCodeCamp в Сан-Франциско. Если кто не знает, Free Code Camp — это сообщество, нацеленное на изучение JavaScript и веб-программирования. Там один человек, который готовился к собеседованиям на позицию фронтенд-разработчика, попросил меня подсказать, какие вопросы по JavaScript стоит проработать. Я немного погуглил, но не смог найти подходящего списка вопросов, на который я бы мог дать ссылку и сказать: «Разбери эти вопросы и работа твоя». Некоторые списки были близки к тому, что мне хотелось найти, некоторые выглядели очень уж простыми, но все они были либо неполными, либо содержали вопросы, которые вряд ли кто станет задавать на реальном собеседовании.

          image
          Читать дальше →
        • Ростелеком и лимиты: ответ РТ

            image
            Как вы помните по предыдущей новости, 20 июня Ростелеком на своем портале разместил новость об ограничении скорости передачи данных до 64 Кбит/с при достижении лимита в 1 ТБ. Ограничения должны были коснуться 14 областей центрального региона. После того, как новость стала потихоньку расползаться по интернет-порталам, ее с сайта срочно удалили.
            Читать дальше →
          • О дженериках в PHP и о том, зачем они нам нужны

            • Translation


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

            Читать дальше →
          • Индексы в PostgreSQL — 1

              Предисловие


              В этой серии статей речь пойдет об индексах в PostgreSQL.

              Любой вопрос можно рассматривать с разных точек зрения. Мы будем говорить о том, что должно интересовать прикладного разработчика, использующего СУБД: какие индексы существуют, почему в PostgreSQL их так много разных, и как их использовать для ускорения запросов. Пожалуй, тему можно было бы раскрыть и меньшим числом слов, но мы втайне надеемся на любознательного разработчика, которому также интересны и подробности внутреннего устройства, тем более, что понимание таких подробностей позволяет не только прислушиваться к чужому мнению, но и делать собственные выводы.

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

              В этой части мы поговорим про разделение сфер ответственности между общим механизмом индексирования, относящимся к ядру СУБД, и отдельными методами индексного доступа, которые в PostgreSQL можно добавлять как расширения. В следующей части мы рассмотрим интерфейс метода доступа и такие важные понятия, как классы и семейства операторов. После такого длинного, но необходимого введения мы подробно рассмотрим устройство и применение различных типов индексов: Hash, B-tree, GiST, SP-GiST, GIN и RUM, BRIN и Bloom.

              Индексы


              Индексы в PostgreSQL — специальные объекты базы данных, предназначенные в основном для ускорения доступа к данным. Это вспомогательные структуры: любой индекс можно удалить и восстановить заново по информации в таблице. Иногда приходится слышать, что СУБД может работать и без индексов, просто медленно. Однако это не так, ведь индексы служат также для поддержки некоторых ограничений целостности.
              Читать дальше →
            • Индексы в PostgreSQL — 2


                Интерфейс


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

                Свойства


                Все свойства методов доступа представлены в таблице pg_am (am — access method). Из этой таблицы можно получить и сам список доступных методов:

                postgres=# select amname from pg_am;
                 amname
                --------
                 btree
                 hash
                 gist
                 gin
                 spgist
                 brin
                (6 rows)

                Хотя к методам доступа можно с полным правом отнести и последовательное сканирование, исторически сложилось так, что оно отсутствует в этом списке.

                В версиях PostgreSQL 9.5 и более старых каждое свойство было представлено отдельным полем таблицы pg_am. Начиная с версии 9.6 свойства опрашиваются специальными функциями и разделены на несколько уровней:

                • свойства метода доступа — pg_indexam_has_property,
                • свойства конкретного индекса — pg_index_has_property,
                • свойства отдельных столбцов индекса — pg_index_column_has_property.

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

                Читать дальше →
              • Хорошо в деревне летом со стамегабитным интернетом

                  Один из самых сложных вызовов, которые перед нами стояли – сделать в поселке полноценный интернет, достаточный для стабильной связи, тяжелых файлов и SSH. Сегодня мы справились с этой задачей. К каждому дому в поселке подходит оптический кабель со стамегабитным интернетом и пингом до яндекса 20 мс. Скорость ограничена только тарифами провайдера – с технической точки зрения, каждый дом оснащен 4 гигабитными каналами до их узла. Под катом – история наших приключений и технические подробности.

                  Читать дальше →
                • Bash-скрипты, часть 9: регулярные выражения

                  • Translation
                  Bash-скрипты: начало
                  Bash-скрипты, часть 2: циклы
                  Bash-скрипты, часть 3: параметры и ключи командной строки
                  Bash-скрипты, часть 4: ввод и вывод
                  Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями
                  Bash-скрипты, часть 6: функции и разработка библиотек
                  Bash-скрипты, часть 7: sed и обработка текстов
                  Bash-скрипты, часть 8: язык обработки данных awk
                  Bash-скрипты, часть 9: регулярные выражения
                  Bash-скрипты, часть 10: практические примеры
                  Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит

                  Для того, чтобы полноценно обрабатывать тексты в bash-скриптах с помощью sed и awk, просто необходимо разобраться с регулярными выражениями. Реализации этого полезнейшего инструмента можно найти буквально повсюду, и хотя устроены все регулярные выражения схожим образом, основаны на одних и тех же идеях, в разных средах работа с ними имеет определённые особенности. Тут мы поговорим о регулярных выражениях, которые подходят для использования в сценариях командной строки Linux.



                  Этот материал задуман как введение в регулярные выражения, рассчитанное на тех, кто может совершенно не знать о том, что это такое. Поэтому начнём с самого начала.
                  Читать дальше →
                • Шифрование в EXT4. How It Works?

                  image Паранойя не лечится! Но и не преследуется по закону. Поэтому в Linux Kernel 4.1 добавлена поддержка шифрования файловой системы ext4 на уровне отдельных файлов и директорий. Зашифровать можно только пустую директорию. Все файлы, которые будут созданы в такой директории, также будут зашифрованы. Шифруются только имена файлов и содержимое, метаданные не шифруются, inline data (когда данные файла, не превышающие по размеру 60 байт, хранятся в айноде) в файлах не поддерживается. Поскольку расшифровка содержимого файла выполняется непосредственно в памяти, шифрование доступно только в том случае, когда размер кластера совпадает с PAGE_SIZE, т.е. равен 4К.
                  Читать дальше →
                • Уточка говорит «кря-кря», коровка говорит «му-му», «Runn Me!» — говорит нам очередной фреймворк* на PHP. Часть 1

                    «О нет!», воскликнет читатель, утомлённый разными мини-микро-слим-фреймворками и QueryBuilder-ами и будет прав.

                    Нет ничего скучнее, чем очередной фреймворк на PHP. Разве что «принципиально новая» CMS или новый дейтинг.



                    Так зачем же я с упорством, достойным лучшего применения, шагаю по неудобным подводным камням и выставляю на потеху публике суд товарищей своё творение? Заранее зная, что гнев критиков, как мощное цунами обрушится на этот пост и похоронит его на самом днище Хабра?

                    Не знаю. Как не знал в своё время Колумб, зачем он отплывает от уютных берегов Испании. Надеялся ли он найти путь в Индию? Конечно да. Но не знал точно — доплывёт ли?

                    Видимо и у программистов на PHP, к которым я вот уже 13 лет себя причисляю, есть такая же внутренняя потребность — выставлять свой код и зажмуривать глаза, ожидая реакции коллег.

                    Что вас ждет под катом?

                    • Открытый исходный код, лицензия LGPL
                    • Код, полностью совместимый с PHP 7.0-7.2
                    • 100% покрытие юнит-тестами
                    • Библиотеки, проверенные временем в реальных проектах (и только проклятая прокрастинация мешала мне опубликовать их ранее!)

                    Ну и, разумеется, история изобретения очередного велосипеда на костыльном приводе фреймворка*!

                    * вообще говоря это пока еще не фреймворк, а просто набор библиотек, фреймворком он станет чуть позже

                    Вперед!
                  • Процессоры в бюджетных ноутбуках: что выбрать?

                      На текущий момент на рынке мирно сосуществует до десяти поколений разных платформ, запутаться в которых может даже профи. Кто быстрее: Apollo Lake или Stoney Ridge? Чем отличаются некоторые модели Celeron, Pentium и Atom, сделанные на чипах с одинаковой архитектурой?



                      А если учесть, что помимо процессора общая производительность зависит от количества каналов памяти, ее типа и частоты, наличия Турбо-режима, а также скорости графического ядра, то и специалист подчас не сможет дать правильный совет.

                      Мы предлагаем вам взглянуть на бюджетные ноутбуки в диапазоне 10-30 тыс. рублей и познакомиться с полным ассортиментом их «сердец».
                      Читать дальше →
                    • Здоровый программист — счастливый программист

                      • Translation


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

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

                      Переведено в Alconost
                      Читать дальше →
                    • Что же такое этот GraphQL?

                      Вашему вниманию предлагаю перевод статьи Sacha Greif "Что же такое этот GraphQL?"


                      Если вы такой же, как и я, вы обычно проходите через три этапа, когда узнаёте о новой технологии:


                      • Отрицание: Ещё одна JavaScript библиотека?! Зачем? У меня уже есть jQuery!
                      • Интерес: Хм, наверное мне следует взглянуть на эту библиотеку...
                      • Паника: Помогите! Мне нужно изучить эту библиотеку прямо сейчас, иначе мои знания устареют!

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


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

                      Читать дальше →
                    • Виртуальная Машина PHP 7

                      • Translation
                      Всем доброго времени суток! Меня зовут Константин, в Badoo я работаю в команде Features Team. Скорее всего, вы уже знаете, что наш бэкенд написан на PHP и обслуживает более трёх сотен миллионов пользователей. Так что я не мог упустить шанс перевести эту статью core-разработчика PHP Никиты Попова. Уверен, она будет полезна разработчикам всех уровней, но новичкам может показаться сложноватой. Приятного (и полезного) чтения!



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

                      Описание сделано на основе PHP версии 7.2 (в настоящее время находится в разработке), но почти всё справедливо и для PHP 7.0/7.1. Однако отличия от виртуальных машин серии PHP 5.x являются значительными, и с ними я, как правило, не проводил параллели.
                      Читать дальше →
                    • Легальный вывод средств с Upwork в РФ

                      • Tutorial
                      На Хабре уже написано достаточно много статьей по теме, в частности:


                      В ответ на повторяющиеся просьбы написать статью, в которой:

                      • разбросанные по разным статьям крупицы будут собранны в единое целое
                      • всевозможные противоречия будут устранены
                      • все сведения будут иметь актуальный характер
                      • будут учтены пожелания такие как «а можно с картинками? :)»

                      родилось следующее руководство.
                      Читать дальше →