• Анонимные функции в PHP: сеанс чёрной магии с разоблачением



      Начать, наверное, следует с того, что анонимная функция(замыкание) в PHP — это не функция, а объект класса Closure. Собственно, на этом статью можно было бы и закончить, но если кому-то интересны подробности — добро пожаловать под кат.

      Читать дальше →
    • Где ошибка, Билли? Нам нужна ошибка…


        Некоторое время назад мой коллега опубликовал статью про обработку ошибок в Java/Kotlin. И мне стало интересно, а какие вообще в программировании существуют способы передачи ошибок. Если вам тоже интересно, то под катом результат изысканий. Скорее всего, какие-то экзотические методы пропущены, но тут одна надежда на комментарии, которые на Хабре порою бывают интереснее и полезнее самой статьи. :)
        Читать дальше →
        • +25
        • 5.6k
        • 8
      • Я мотоцикл покупал, чтобы ездить, а не чтобы падать



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

          Когда лет 10 назад я купил себе первый мотоцикл, любая встреча двухколесных на дороге была целым событием. Последние же несколько лет ситуация изменилась кардинально — пробка из мототехники в междурядье уже каждодневная обыденность. Размышлять на тему, почему это происходит я не буду, а постараюсь просто поделиться опытом «выживания в большом городе» с теми, кто только купил или пока просто задумывается. Вполне возможно, что некоторые вещи будут полезны и любителям электротранспорта.
          Читать дальше →
        • PHP, почём абстракции для народа?


            Joy: What is going on?
            Sadness: We’re abstracting! There are four stages. This is the first. Non-objective fragmentation!
            Bing Bong: Alright, do not panic. What is important is that we all stay together. [suddenly his abstract arm falls off]
            Joy: Oh! [Sadness and Joy start falling apart too]
            Sadness: We’re in the second stage. We’re deconstructing! [as Bing Bong falls to pieces]
            Bing Bong: I can’t feel my legs! [picks one leg up] Oh, there they are.
            © мультфильм Inside Out


            Все любят писать красивый код. Чтобы абстракции, лямбды, SOLID, DRY, DI и т.д. и т.п. В этой статье я хочу исследовать, во сколько обходится это всё с точки зрения производительности и почему.

            Для этого возьмём простую, оторванную от реальности, задачу и будем постепенно привносить в неё красоту, замеряя производительность и заглядывая под капот.
            Читать дальше →
          • Препарируем PHP. Как устроены while, foreach, array_walk и некоторые другие страшные слова



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

              Исходники от master ветки (это сейчас 7.4 с вкраплениями 8)
              Генератор опкодов от php 7.3.0.
              Замеры производились на 7.3.6.

              Дисклеймер для зануд: упоминание пары наносекунд и тактов процессора – это такой полемический приём под названием «гипербола».

              Может быть, на самом деле, там десятки или сотни наносекунд и тысячи тактов, но это всё равно настолько малые величины, что необходимость экономить на них говорит о том, что что-то в вашем коде не так.
              Читать дальше →
            • Поиск похожих изображений, разбор одного алгоритма



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

                Существующее решение работает на довольно известной библиотеке, написанной на Python, — Image Match, основанной на работе «AN IMAGE SIGNATURE FOR ANY KIND OF IMAGE» за авторством H. Chi Wong, Marshall Bern и David Goldberg.

                По ряду причин было принято решение переписать всё на Kotlin, заодно отказавшись от хранения и поиска в ElasticSearch, который требует заметно больше ресурсов, как железных, так и человеческих на поддержку и администрирование, в пользу поиска в локальном in-memory кэше.

                Для понимания того, как оно работает, пришлось с головой погружаться в «эталонный» код на Python, так как оригинальная работа порой не совсем очевидна, а в паре мест заставляет вспомнить мем «как нарисовать сову». Собственно, результатами этого изучения я и хочу поделиться, заодно рассказав про некоторые оптимизации, как по объёму данных, так и по скорости поиска. Может, кому пригодится.
                Читать дальше →
              • Про подсчёт битов, беззнаковые типы в Kotlin и про ситуации, когда экономия на спичках оправдана


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

                  Немного контекста


                  Приложение iFunny имеет дело с колоссальным объёмом графического и видеоконтента, а нечёткий поиск дубликатов является одной из очень важных задач. Сама по себе это большая тема, заслуживающая отдельной статьи, но сегодня я просто немного расскажу о некоторых подходах к обсчёту очень больших массивов чисел, применительно к этому поиску. Конечно же, у всех разное понимание «очень больших массивов», и тягаться с Адронным коллайдером было бы глупо, но всё же. :)

                  Если совсем коротко про алгоритм, то для каждого изображения создаётся его цифровая подпись (сигнатура) из 968 целых чисел, а сравнение производится путем нахождения «расстояния» между двумя сигнатурами. Учитывая, что объём контента только за два последних месяца составил порядка 10 миллионов изображений, то, как легко прикинет в уме внимательный читатель, — это как раз те самые «элементы в миллиардных объёмах». Кому интересно — добро пожаловать под кат.
                  Читать дальше →
                • PHP. Фееричная расстановка точек над кавычками


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

                    В данной статье будет всего один бенчмарк, куда же без него, а основной упор сделан на разбор того, как же оно устроено внутри.
                    Читать дальше →
                  • Расширение PHP и Kotlin Native. Часть третья, наверное финальная

                      В первой части рассказываются совсем базовые вещи про настройку инструментария и общие концепции.

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

                      В этой статье будет чуть больше хардкора про интероп Си и K/N, много макросов, боли, безысходности и «лучей добра». Конечно же будет глава с рассказом о достижениях (сам себя не похвалишь… и в качестве бонуса рассказ о эпичном факапе.
                      Читать дальше →
                    • Расширение PHP и Kotlin Native. Часть вторая, осознанная

                        Краткое содержание первой части:


                        1. Установка и настройка инструментария.
                        2. Написание функции helloWorld() на Kotlin Native и компиляция ее в shared library.
                        3. Доступ к этой функции из C-кода расширения PHP.


                        В этой статье я буду рассказывать про создание инструментария для написания расширения PHP без необходимости трогать Си, исключительно на K/N.

                        Кому интересно — добро пожаловать под кат.
                        Кому читать не интересно, а просто хочется посмотреть — добро пожаловать на github
                        Читать дальше →
                      • Расширение PHP и Kotlin Native. Часть первая, наивная

                          В этой статье рассматривается самый наивный и простой подход к созданию расширения PHP с использованием Kotlin Native. Обращаю внимание, что не на, а с использованием.

                          Это скорее некий туториал с описанием возникших при скрещивании ужа с ежом проблем и путей их решения. Откровений не будет, но возможно кому-то и пригодится.

                          Итак, если интересно, то добро пожаловать под кат.
                          Читать дальше →
                        • Очень простое объяснение принципов SOLID

                            Disclaimer: Всем можно, ну а я чем хуже?!

                            SOLID — это набор принципов по организации кода. Фактически они декларируют некие правила, которые помогут вам сохранить свои и чужие нервы и время. А могут и не помочь.

                            Попробуем разобраться в этих принципах на пальцах, без примеров кода и СМС.
                            Читать дальше →
                          • Два типа расширений PHP. Zend extension VS PHP module

                              image


                              Какие расширения вообще бывают


                              PHP module – оно же обычное расширение PHP
                              К этому типу относится подавляющее число расширений в PHP. Все то, что подключается в php.ini с помощью инструкции extension=some_library.so — это они и есть.


                              Zend extension
                              Расширений такого типа крайне мало, однако они ничуть не менее востребованы.


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

                              Читать дальше →
                            • И снова о переводе документации PHP



                              Предыстория


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

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

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