• История оптимизации alpha_composite в Pillow 2.0

      Недавно вышла вторая версия питоновской библиотеки для работы с изображениями Pillow. Как многие знают, это форк хорошо известной библиотеки PIL, которая, несмотря на свой солидный возраст, до недавнего времени оставалась самым вменяемым способом работы с изображениями в Питоне. Авторы Pillow наконец-то решили не только поддерживать старый код, но и добавлять новые возможности. И одной из этих возможностей стала функция alpha_composite().

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

      С тех пор я уже смог написать для своих нужд более оптимальную реализацию, чем приведена в конце той статьи. И оказалось, что эта реализация быстрее alpha_composite() из новой версии Pillow, написанной на Си. Конечно, мне это польстило, но я все-таки решил попытаться улучшить реализацию из Pillow.
      Читать дальше →
    • Декоратор cached_property

        Как часто вы пишете такие конструкции?

        class SomeClass(object):
            @property
            def param(self):
                if not hasattr(self, '_param'):
                    self._param = computing()
                return self._param
        
            @param.setter
            def param(self, value):
                self._param = value
        
            @param.deleter
            def param(self):
                del self._param
        

        Это очень удобно, значение атрибута param при таком подходе не хранится напрямую в объекте, но и не вычисляется каждый раз. Вычисление происходит при первом обращении, и это значение сохраняется в объекте под временным именем _param. Если меняются условия, от которых зависит значение param, его можно удалить, и тогда оно снова вычислится при следующем обращении. Или можно сразу присвоить актуальное значение, если таковое известно.

        У этого кода есть и минусы: у объекта появляется лишний атрибут с именем _param; при каждом обращении к атрибуту вызывается метод param(), который делает проверку hasattr; получившийся код достаточно большой, особенно если таких атрибутов в классе несколько.
        Читать дальше →
        • +39
        • 15.7k
        • 3
      • Проблемы в библиотеке форм Django на примере поля ввода телефонов

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

          Итак, задача. Пользователи очень любят оставлять на сайтах свои телефоны и другую приватную информацию. Причем, делать это они хотят, не задумываясь о том, как правильно её ввести: 8(908)1271669 или, скажем, 908 127 16 69. Посетители сайта очень любят видеть правильные телефоны, желательно единообразно оформленные: (+7 495) 722-16-25, +7 968 127-31-32. Получается, нужно валидировать и хранить номера в нормализованном виде, то есть без оформления. В поле, про которое я буду рассказывать, можно ввести больше одного номера телефона. Формат хранения определим как последовательности из 11 цифр, разделенные пробелом.
          Читать дальше →
        • Предлагаю помощь в подготовке иллюстраций

            Наверное я кого-то просто достал с этой темой, а кого-то нереально достал.

            Я опять хочу сказать про иллюстрации к статьям.

            У меня сердце кровью обливается, когда по соседству со статьями, как правильно сжимать графику, какими утилитами пользоваться и какие есть особенности у каждого формата, люди лепят фотографии в png и скриншоты в jpeg.

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

            Все просто — вы присылаете мне личное сообщение с ссылкой на опубликованную статью, или слепок черновика, сделанный с помошью сервиса peeep.us, если статья еще не опубликована. Я отвечаю вам ссылками на пережатые изображения. Иногда даю советы, что еще можно сделать.

            Срок действия акции пока не ограничивается.

            image — 17 кб. — 7,2 кб.
          • Огромная очередь на открытии Microsoft Store

              20 октября в Сиэтле открылся магазин University Village Microsoft Store. На открытии собралась огромная очередь.



              Человеку с камерой так и не удалось найти людей, которые собираются что-нибудь купить в новом магазине. Очередь стояла за бесплатными билетами на концерт группы Black Keys, которые раздавала Microsoft на открытии магазина.
            • 8123 байта хватит каждому

                Сегодня во время перевода одного сайта с таблиц MyISAM на InnoDB, у последних выяснилась одна интересна особенность. Запрос на изменение движка для двух таблиц возвращал странную ошибку «Got error 139 from storage engine». После поиска информации на эту тему, было выяснено, что данная ошибка возникает тогда, когда какая-либо строка таблицы не вмещается в половину страницы памяти, с которыми работает MySQL. Страницы эти равны 16 Кб, а половина, стало быть, 8 Кб.

                Само по себе ограничение довольно странное, но на первый взгляд кажется трудно достижимым, ведь как известно, MySQL хранят текстовые данные в хранилище, отдельном от табличных строк. Оказалось, что это верно только на половину. На самом деле InnoDB хранит в отдельном хранилище только «излишки», к коим он не относит первые 768 байтов каждого текстового поля. Т.е. любой текст будет отъедать от длины строки столько байт, сколько он содержит, но не больше 768. Несложно подсчитать, что максимальное число текстовых полей длиной от 768 байт, которое можно безопасно хранить в одной таблице — 10. И действительно, если запустить пример, все пройдет гладко. Но стоит увеличить количество полей хотя бы на одно, и мы получим ту же ошибку, что и в начале.
                Читать дальше →
              • Руководство: пишем интерпретатор с JIT на PyPy

                • Translation
                Все исходные коды и примеры из этой статьи доступны здесь.

                Когда я первый раз смотрел проект PyPy, мне потребовалось некоторое время, чтобы выяснить, что он из себя представляет. Он состоит из двух вещей:

                — набор инструментов для написания интерпретаторов языков программирования;
                — реализация Питона с применением этого набора инструментов.

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

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

                Читать дальше →
              • SSD на графике горячая/сумасшедшая

                • Translation
                Являясь сторонником твердотельных дисков …
                The State of Solid State Hard Drives (октябрь 2009, англ.)
                Revisiting Solid State Hard Drives (октябрь 2010, англ.)
                … я чувствую себя этически и морально обязанным посвятить вас в маленький грязный секрет, открытый мной за последние два года использования твердотельных дисков. Твердотельные диски дохнут. В огромных количествах. И не просто дохнут. Я говорю об ужасных поломках «боже мой, что случилось со всеми моими данными». И это нифига не клево.

                Я купил три твердотельных диска Crucial на 128 гигабайт в октябре 2009 для себя и двух других работников Stack Overflow. По состоянию на предыдущий месяц два из них уже сдохли. На днях я беседовал с Джоэлом во врем записи подкаста, и он сказал, что твердотельный диск от Intel в его Thinkpad, купленный примерно в то же время, тоже сдох.
                Читать дальше →
              • Анимированные баннеры на Javascript — это просто*

                  *) На самом деле все равно сложно, но зато проще, чем было раньше.

                  История началась с постановки задачи: нужно сделать анимированный баннер с примерно тридцатью объектами средствами HTML+javascript за один день. За день, конечно, баннер сделан не был, а был сделан за два усилиями трех человекодней. После выполнения задания осталась библиотека пакетной анимации, которую я назвал Scenario. О её доработанной версии я и хочу рассказать.

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

                  Запуск сценария из любого места предельно прост:

                  var newScenario = [...];
                  $.scenario(newScenario, {
                      complete: function(time) {
                          alert('Готово!');
                      }
                  });

                  Осталось только разобраться, что писать вместо трех точек в примере :)
                  Читать дальше →
                • Правила подготовки скриншотов для статей

                    1. Включите сглаживание шрифтов


                    Вы за компьютером с 90-го года, ваша сетчатка деформировалась, и вы выключаете сглаживание шрифтов даже в Windows 7. Но ради бога, прежде чем сделать скриншот, включите сглаживание, .
                    Читать дальше →
                  • Национальные раскладки клавиатур и способы их переключения

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

                      Операционные системы прививают нам привычку переключать раскладки клавиатуры. С русской на английскую, с английской на русскую. А кому-то еще и на украинскую, или другой язык. Кто-то пользуется сочетаниями alt-shift, кто-то ctrl-shift, кто-то еще какими-то. Неудобство испытывают все. Интернет набит вопросами, как повесить переключение раскладок на ненужную клавишу Caps Lock (одна клавиша — не две). Предлагаются различные варианты под различные операционные системы и различные окружения рабочего стола. Непременный атрибут любого рабочего стола любой операционной системы — индикатор текущей раскладки клавиатуры. Люди переключают раскладки, набирают буквы не на том языке, матерятся, переключают снова.

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

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

                        image

                        Да, это функция «double-click to reset dimensions». Она вызывает привыкание, и теперь на любом элементе, который возможно подвигать, я на автомате делаю даблклик в надежде, что он примет либо оптимальное, либо первоначальное положение.
                        Читать дальше →
                      • Простое наложение 2-х изображений

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

                          Итак, у нас 2 картинки в формате RGBA (т.е. 3 цвета + альфаканал):
                          Читать дальше →
                        • Перестаньте вынюхивать, что у меня за браузер

                            С завидной периодичностью в блоге разработчиков браузера Опера появляются сообщения, что Опера не может распарсить ту или иную страницу и пользователь видит примерно такую ошибку:



                            Эффект можно посмотреть по любой из этих ссылок. При этом, в других популярных браузерах страницы отображаются нормально, так же как и в Опере, если попросить распарсить документ как HTML, а не как XML (ссылка «Reparse document as HTML»).
                            Читать дальше →
                          • Еще один прибитый футер. Переменная высота, блочная верстка, JS опционально

                              Задача прибивания футера к низу страницы обмусолена с ног до головы. Она неплохо решается для футера фиксированной высоты. А вот для случая, когда высота футера зависит от его содержимого, методов не так много. Либо это очевидное решение на javascript. Либо подгонка для этого элементов, изначально для того не предназначенных. Я, конечно, о таблицах. Хочу предложить способ, который тоже имеет свои недостатки (обо всем ниже), но недостатки эти другие, и, следовательно, может подойти тем, кому первые два не подходят.
                              Читать дальше →
                            • Bolgenos — операционная система нового поколения

                                Казалось бы, очередной энтузиаст начал делать очередной дистрибутив на основе Linux. Разместил о нем заметку на лоре. Таких историй много. Но дело попало в руки журналистов-профессионалов.



                                Сайт проекта: quadregus.3dn.ru/the_site/main_page.html
                                Теперь автор на хабре: quadregus

                                UPD: Только что появилось второе видео, эпическое:

                              • Пунктирная рамка вокруг ссылок и навигация с клавиатуры

                                  Думаю, все знают, что это такое. Некоторые браузеры, в частности, Фаерфокс и Интернет Эксплорер 8 рисуют однопиксельную пунктирную рамку вокруг ссылок и внутри кнопок, когда пользователь нажимает на них. Если сайт состоит из голого html, скорее всего, дискомфорта они не доставят. Но если все ссылки как-то стилизованны, вам (или вашему дизайнеру), скорее всего захочется избавиться от этого. Тем более, что эта рамка может отобразиться в неподходящем месте:

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