• Массивы в РНР 7: хэш-таблицы

    • Перевод
    Хэш-таблицы используются везде, в каждой серьёзной С-программе. По сути, они позволяют программисту хранить значения в «массиве», индексируя его с помощью строк, в то время как в языке С допускаются только целочисленные ключи массива. В хэш-таблице строчные ключи сначала хэшируются, а затем уменьшаются до размеров таблицы. Здесь могут возникать коллизии, поэтому нужен алгоритм их разрешения. Существует несколько подобных алгоритмов, и в РНР используется стратегия связных списков (linked list).

    В Сети есть немало замечательных статей, подробно освещающих устройство хэш-таблиц и их реализации. Начать можно с http://preshing.com/. Но имейте в виду, вариантов структуры хэш-таблиц — несметное множество, и ни один из них не совершенен, в каждом есть компромиссы, несмотря на оптимизацию циклов процессора, использования памяти или хорошее масштабирование потокового окружения (threaded environment). Одни варианты лучше при добавлении данных, другие — при поиске и т. д. Выбирайте реализацию в зависимости от того, что для вас важнее.

    Хэш-таблицы в РНР 5 подробно рассмотрены в материале phpinternalsbook, который я написал вместе с Nikic, автором хорошей статьи про хэш-таблицы в РНР 7. Возможно, её вы тоже сочтёте интересной. Правда, она писалась до релиза, поэтому некоторые вещи в ней слегка отличаются.

    Здесь же мы подробно рассмотрим, как устроены хэш-таблицы в РНР 7, как с ними можно работать с точки зрения языка С и как ими управлять средствами РНР (используя структуры, называемые массивами). Исходный код в основном доступен в zend_hash.c. Не забывайте, что хэш-таблицы мы используем везде (обычно в роли словарей), следовательно, нужно проектировать их так, чтобы они быстро обрабатывались процессором и потребляли мало памяти. Эти структуры решающе влияют на общую производительность РНР, поскольку местные массивы не единственное место, где используются хэш-таблицы.
    Читать дальше →
  • Как не хранить секреты где придётся, или зачем нам Hashicorp Vault

    • Tutorial

    Vault header 


    Задайте себе вопрос — как правильно хранить пароль от базы данных, которая используется вашим сервисом? В отдельном репозитории с секретами? В репозитории приложения? В системе деплоя (Jenkins, Teamcity, etc)? В системе управления конфигурациями? Только на личном компьютере? Только на серверах, на которых работает ваш сервис? В некоем хранилище секретов?
    Зачем об этом думать? Чтобы минимизировать риски безопасности вашей инфраструктуры.
    Начнём исследование вопроса с определения требований к хранению секретов.


    Читать дальше →
  • Отчёт с Symfony Moscow Meetup 2 июня

      image

      В начале июня в офисе Mail.Ru Group прошла восьмая встреча сообщества Symfony Moscow Meetup — разработчиков на PHP/Symfony2. Здесь обсуждались вопросы разработки веб-приложений и смежные технологии, участники обменивались опытом и последними техническими новостями. Ну и, конечно, было много общения в неформальной обстановке. На встрече было представлено 4 доклада. Предлагаем ознакомиться с записями и презентациями выступлений.
      Читать дальше →
    • Генераторы в действии

      Небольшое вступление


      Не так давно я решил для себя, что пора восполнить большой пробел в знаниях и решил прочитать про переходы между версиями PHP, т.к. понимал, что остался где-то между 5.2 и 5.3 и этот пробел необходимо как-то устранить. До этого я читал про namespaces, traits и т.д, но дальше чтения не уходило. И вот тут я заметил генераторы, почитал документацию, одну из статей на хабре на этот счет и после этого возникла мысль — а как раньше без них жили-то?

      Данным переводом хочу помочь хотя бы новичкам, поскольку на php.net документация по генераторам на английском и, на мой взгляд, должным образом не раскрывает всю идею и места применения. Текста много, кода чуть меньше, картинок нет. Потребуются общие знания, например, про итераторы. Очевидный код комментировать не буду, а вот сложные для понимания примеры постараюсь объяснить в силу своих знаний.

      UPD1: Изменил расплывчатую формулировку, про которую говорили в комментариях.
      UPD2: Добавил решение с принудительным break.

      И сразу под хабракат
    • Как покрыть мониторингом все слои инфраструктуры

        image

        Как-то я посчитал, что 1 минута простоя hh.ru в будни днем затрагивает около 30 000 пользователей. Мы постоянно решаем задачу снижения количества инцидентов и их длительности. Снизить количество проблем мы можем правильной инфраструктурой, архитектурой приложения — это отдельная тема, ее мы пока не будем брать во внимание. Поговорим лучше о том, как быстро понять, что происходит в нашей инфраструктуре. Тут как раз нам и помогает мониторинг.

        В этой статье на примере hh.ru я расскажу и покажу, как покрыть мониторингом все слои инфраструктуры:
        • client-side метрики
        • метрики с фронтендов (логи nginx)
        • сеть (что можно добыть из TCP)
        • приложение (логи)
        • метрики базы данных (postgresql в нашем случае)
        • операционная система (cpu usage тоже может пригодиться)

        Читать дальше →
      • 400 потрясающих бесплатных сервисов

        • Перевод

        Рад представить дополнение оригинального списка из 300 потрясающих бесплатных сервисов. Автор оригинальной статьи Ali Mese добавил ещё +100 новых сервисов, которые помогут найти все — от источников вдохновения и редакторов фотографий до создания опросов и бесплатных иконок.

        И еще подборку +500 инструментов от 10 марта 2017 г. смотрите здесь.



        A. Бесплатные веб-сайты

        • HTML5 UP: Адаптивные шаблоны HTML5 и CSS3.
        • Bootswatch: Бесплатные темы для Bootstrap.
        • Templated: Коллекция 845 бесплатных шаблонов CSS и HTML5.
        • Wordpress.org | Wordpress.com: Бесплатное создание веб-сайта.
        • Strikingly: Конструктор веб-сайтов.
        • Layers: Создание сайтов на WordPress (new).
        • Bootstrap Zero: Самая большая коллекция бесплатных шаблонов Bootstrap (new).
        • Landing Harbor:  Продвижение мобильного приложения c помощью бесплатного лендинга (new).
        Читать дальше →
      • Rust в деталях: пишем масштабируемый чат с нуля, часть 1

        • Перевод

        Часть 1: Реализуем WebSocket. Введение.


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

        В первой части мы рассмотрим начальную настройку окружения и реализацию простейшего WebSocket-сервера. Чтобы понять технические детали статьи вам не потребуется опыта работы с языком Rust, хотя знание основ системных API (POSIX) и C/C++ лишним не будет. Прежде чем начинать чтение, заготовьте немного времени (и кофе) — статья описывает все максимально подробно и поэтому довольно длинная.

        Читать дальше →
      • Шпаргалка по Redis

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

        Я поставил перед собой цель показать возможности Redis с помощью примеров кода. После публикации приму любые предложения по улучшению материала.

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

        Ключи


        Redis — хранилище данных в формате «ключ-значение». Факты о ключах:
        • Ключи в Redis — бинарно-безопасные (binary safe) строки.
        • Слишком длинные ключи — плохая идея, не только из-за занимаемой памяти, но так же и в связи с увеличением времени поиска определенного ключа в множестве в связи с дорогостоящим сравнением.
        • Хорошая идея — придерживаться схемы при построении ключей: «object-type:id:field».


        Типы данных Redis


        • Строки (strings). Базовый тип данных Redis. Строки в Redis бинарно-безопасны, могут использоваться так же как числа, ограничены размером 512 Мб.
        • Списки (lists). Классические списки строк, упорядоченные в порядке вставки, которая возможна как со стороны головы, так и со стороны хвоста списка. Максимальное количество элементов — 232 — 1.
        • Множества (sets). Множества строк в математическом понимании: не упорядочены, поддерживают операции вставки, проверки вхождения элемента, пересечения и разницы множеств. Максимальное количество элементов — 232 — 1.
        • Хеш-таблицы (hashes). Классические хеш-таблицы или ассоциативные массивы. Максимальное количество пар «ключ-значение» — 232 — 1.
        • Упорядоченные множества (sorted sets). Упорядоченное множество отличается от обычного тем, что его элементы упорядочены по особому параметру «score».

        Про типы данных Redis есть отдельная хорошая статья: «Структуры данных, используемые в Redis».
        Читать дальше →
      • React boilerplate — Rocket React

        image

        Хочу представить вашему вниманию boilerplate (skeleton) на базе React.js + Backbone для быстрого старта разработки приложения любой сложности. Эта связка помогла нашей команде в срок сделать сложное приложение с минимальным количеством проблем а простота позволила быстро подключать новых разработчиков в процесс.
        Читать дальше →
      • Управление разработкой программного продукта на основе рисков

          image
          Эта статья адресована тем, кто имеет отношение к разработке программного продукта. Понимание принципов управление процессом разработки не менее важно, чем фактические знания технологий программирования. Статья не адресована только тем, кто хочет стать или работает руководителем проекта (Project Manager), Понимание принципов управления принесет пользу на любой должности и в любой команде.
          Читать дальше →
        • Интернет магазины доставляют правильно с помощью DaData.ru

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

            Владельцы пяти интернет-магазинов рассказали мне, как как они используют Подсказки DaData.ru чтобы отправлять посылки без возвратов, упрощать формы оформления заказов и сегментировать клиентов.

            Читайте, если вы владелец интернет-магазина или причастны к его разработке
            • +6
            • 11,1k
            • 6
          • Замечания о распределенных системах для начинающих

            • Перевод
            Здравствуйте все!

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

            Мы предположили, что и в сфере изучения алгоритмов для распределенных систем краткость — сестра таланта, поэтому проработка книги Уона Фоккинка «Распределенные алгоритмы. Понятный подход» является перспективным и благодарным делом, пусть даже объем книги — всего 248 страниц.



            Однако, чтобы участвовать в опросе было интереснее, мы для начала приглашаем вас под кат, где находится перевод интереснейшей статьи Джеффа Ходжеса, описывающей самые разнообразные проблемы, связанные с разработкой распределенных систем.
            Читать дальше →
            • +17
            • 25,6k
            • 4
          • Подробно об объектах и классах в PHP

            • Перевод
            Сегодня объекты используются очень активно, хотя это трудно было предположить после выхода PHP 5 в 2005 году. Тогда я ещё мало что знал о возможностях этого языка. Пятую версию PHP сравнивали с предыдущей, четвёртой, и главным преимуществом нового релиза стала новая, очень мощная объектная модель. И сегодня, десять лет спустя, около 90% всего PHP-кода содержит объекты, не изменившиеся со времени PHP 5.0. Это убедительно говорит о том, какую роль сыграло внедрение объектной модели, неоднократно улучшавшейся на протяжении последующих лет. В этом посте я хотел бы рассказать о том, как всё устроено «под капотом». Чтобы люди понимали суть процессов — почему сделано так, а не иначе — и лучше, полнее использовали возможности языка. Также я затрону тему использования памяти объектами, в том числе в сравнении с эквивалентными массивами (когда это возможно).

            Я буду рассказывать на примере версии PHP 5.4, и описываемые мной вещи справедливы для 5.5 и 5.6, потому что устройство объектной модели там почти не претерпело изменений. Обратите внимание, что в версии 5.3 всё не так хорошо с точки зрения возможностей и общей производительности.

            В PHP 7, который пока ещё активно разрабатывается, объектная модель переработана не сильно, были внесены лишь незначительные изменения. Просто потому что всё и так хорошо работает, а лучшее — враг хорошего. Были добавлены возможности, не затрагивающие ядро, но здесь об этом речи не пойдёт.
            Читать дальше →
          • Результаты опроса популярности PHP фреймворков от Sitepoint

              Месяц назад на Sitepoint был опубликирован опрос популярности PHP фреймворков. За это время всего проголосовало 7800 людей, и вот его результаты:

              На работе

              image

              В персональных проектах
              image

              Больше различной статистики на самом сайте

              Из интересного еще замечу, что в России самым популярным остается Yii2, в Украине же победил PHPixie. Также PHPixie стал самым популярным фреймворком в возрастной групе до 18 лет.
            • Если вы решили перейти с PHP на Python, то к чему следует подготовиться

                Думали ли вы когда-нибудь о том, что однажды слишком быстро втянулись в веб-программирование на PHP? И вот уже прошло много лет, у вас хороший опыт, и вы не думаете ни о каких других способах „делать“ веб, кроме как на PHP. Может быть, у вас возникают сомнения в правильности выбора, однако непонятно, как найти способ быстро его проверить. А хочется примеров, хочется знать, как изменятся конкретные аспекты деятельности.

                Сегодня я попробую ответить на вопрос: «А что если вместо PHP писать на Python?».

                Сам я долгое время задавался этим вопросом. Я писал на PHP 11 лет и даже являюсь сертифицированным специалистом. Я научился его «готовить» так, чтобы он работал в точности, как мне надо. И когда я в очередной раз читал на Хабре перевод статьи о том, как всё в PHP плохо, я просто недоумевал. Однако подвернулся случай пересесть на Ruby, а потом и на Python. На последнем я и остановился, и теперь попробую рассказать вам PHP-шникам, как нам питонистам живётся.


                Python с точки зрения PHP-программиста...
              • Сайт с нуля на полном стеке БЭМ-технологий. Методология Яндекса

                • Tutorial
                На прошлой неделе BBC рассказала, что для новой версии главной страницы использовала методологию БЭМ, созданную в Яндексе. По такому случаю мы решили поднять материалы мастер-класса «Разрабатываем сайт с нуля на полном стеке БЭМ-технологий» и рассказать вам, как начать использовать полный стек БЭМ-технологий в своих проектах.

                БЭМ упрощает разработку сайтов, которые нужно быстро создавать и долго поддерживать. Эту технологию используют во фронтенде почти всех сервисов Яндекса, и она уже успела обрасти множеством библиотек и инструментов, которыми мы хотим с вами поделиться.



                В статье мы расскажем, в чём преимущество вёрстки независимыми блоками и что такое уровни переопределения, познакомимся с готовыми библиотеками блоков и инструментами для автоматизации сборки. Покажем, как разные инструменты — например, autoprefixer, css-препроцессор Stylus или модульная система YModules — упрощают жизнь разработчика и создают по-настоящему удобную платформу, если встроить их в процесс разработки по БЭМ.

                На живом примере мы объясним, в чём польза декларативного подхода, когда одни и те же идеи можно использовать как для CSS, так и для JavaScript. Отдельно остановимся на декларативных шаблонах BEMHTML и BEMTREE, которые позволяют преобразовывать данные в БЭМ-дерево, описанное в формате BEMJSON и, затем в HTML. Рассмотрим в деталях, как написать серверную часть приложения по БЭМ-методологии.
                Читать дальше →
              • Именование сложных действий в REST API

                  Во всех руководствах в описаниях REST дают простые примеры, типа вот вам пользователи, они будут ресурсом /users, вот вам один пользователь, он будет /users/[id] и действия с ним добавить\удалить\изменить.

                  А что если действия сложные или комплексные и не вписываются в GET\POST\DELETE?

                  Читать дальше →
                • 300 потрясающих бесплатных сервисов

                  • Перевод


                  Автор оригинальной статьи Ali Mese добавил ещё 100 новых бесплатных сервисов. Все 400 потрясающих сервисов доступны здесь. И еще подборку +500 инструментов от 10 марта 2017 г. смотрите здесь.



                  A. Бесплатные Веб-Сайты + Логотипы + Хостинг + Выставление Счета

                  • HTML5 UP: Адаптивные шаблоны HTML5 и CSS3.
                  • Bootswatch: Бесплатные темы для Bootstrap.
                  • Templated: Коллекция 845 бесплатных шаблонов CSS и HTML5.
                  • Wordpress.org | Wordpress.com: Бесплатное создание веб-сайта.
                  • Strikingly.com Domain: Конструктор веб-сайтов.
                  • Logaster: Онлайн генератор логотипов и элементов фирменного стиля (new).
                  • Withoomph: Мгновенное создание логотипов (англ.).
                  • Hipster Logo Generator: Генератор хипстерских логотипов.
                  • Squarespace Free Logo: Можно скачать бесплатную версию в маленьком разрешении.
                  • Invoice to me: Бесплатный генератор счета.
                  • Free Invoice Generator: Альтернативный бесплатный генератор счета.
                  • Slimvoice: Невероятно простой счет.

                  Читать дальше →
                • 58 признаков хорошего интерфейса

                  • Перевод
                  У хорошего интерфейса пользователя высокая конверсия и его просто использовать. То есть, он хорош и для бизнеса, и для использующих его людей. Вот список опробованных нами идей.

                  1 Один столбец вместо нескольких


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

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