• Бенчмарки в Go

    • Translation

    Бенчмарки


    Бенчмарки это тесты для производительности. Довольно полезно иметь их в проекте и сравнивать их результаты от коммита к коммиту. В Go есть очень хороший инструментарий для написания и запуска бенчмарков. В этой статье я покажу, как использовать пакет testing для написания бенчмарков.
    Читать дальше →
    • +24
    • 30.4k
    • 2
  • Фурье-вычисления для сравнения изображений

      Традиционная техника “начального уровня”, сравнения текущего изображения с эталоном основывается на рассмотрении изображений как двумерных функций яркости (дискретных двумерных матриц интенсивности). При этом измеряется либо расстояние между изображениями, либо мера их близости.

      Как правило, для вычисления расстояний между изображениями используется формула, являющаяся суммой модулей или квадратов разностей интенсивности:
      d(X,Y) = SUM ( X[i,j] — Y[i,j] )^2

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

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

      Наличие большого числа библиотек, реализующих Фурье преобразований (во всевозможных вариантах быстрых версий), делает реализацию алгоритмов сравнения изображений не очень сложной задачей для программирования.
      Читать дальше →
    • Фурье-обработка цифровых изображений

      Предисловие


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

      Формула таких алгоритмов будет выглядеть следующим образом:
      1. Z=FFT(X) – прямое двухмерное преобразование Фурье
      2. Z′=T(Z) – применение функции или транспаранта к Фурье-образу изображения
      3. Y=BFT(Z′) – обратное двухмерное преобразование Фурье

      Для вычисления преобразований Фурье используются алгоритмы быстрого дискретного преобразования Фурье. Хотя оптическая система линз осуществляет преобразование Фурье на непрерывном диапазоне аргумента и для непрерывного спектра, но при переходе к цифровой обработке данных формулы преобразования Фурье могут быть заменены на формулы дискретного преобразования Фурье.

      Примеры реализации


      • Алгоритм размытия изображения
      • Алгоритм повышения резкости изображения
      • Алгоритм масштабирования изображения

      Реализованные алгоритмы являются частью библиотеки с открытым исходным кодом FFTTools. Интернет-адрес: github.com/dprotopopov/FFTTools
      Читать дальше →
    • 36 млн запросов в час, 10000+ постоянно работающих клиентов, на одном сервере, nginx+mysql

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

      Первое, что я заметил — множество советов как все настроить под большую нагрузку. Читайте их внимательно, обычно в тексте найдете, что речь про «высокую нагрузку» в 15-20 тысяч клиентов в сутки. У нас клиентов примерно миллион, активных, ежедневных.

      У нас нет денег и мы все делаем за свой счет, поэтому экономим. Итог — весь миллион клиентов обслуживается на одном сервере, вот на таком — EX-60 на hetzner.
      Читать дальше →
    • Безумный PHP. Фьюри код


        Сборник PHP ненормальностей или что надо знать чтобы не сойти с ума и не прострелить себе что-нибудь


        Прочитал статью mnv: "Приведение типов в PHP == табурет о двух ножках?" и захотелось в комментариях добавить немного дополнений, но… Но потом увидел комментарий и понял, что лучше дополню статью тем, про что мало кто пишет и мало где это имеется в централизованном виде. Вроде бы всем известная тема, а все же кому-то в новинку. Это не совсем про приведение типов, но они тоже есть. Это про особенности, зная которые можно делать меньше ошибок. Если интересно, го под кат, я создал!
        Читать дальше →
      • Как определить дубликаты картинок с помощью PHP

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



          Потому рано или поздно встает вопрос автоматизации процесса поиска повторов, и тут мы рассмотрим основные, а также попробуем в деле.
          Читать дальше →
        • Расширяя полотно картины Ван Гога “Звездная ночь” с помощью языка Wolfram Language (Mathematica)

          • Translation

          Перевод поста Piotr Wendykier "Extending Van Gogh's Starry Night with Inpainting"
          Скачать перевод в виде документа Mathematica, который содержит весь код использованный в статье, можно здесь (архив, ~8 МБ).


          Могут ли компьютеры научиться рисовать, как Ван Гог? Определенно да, до некоторой степени! Для этого, подобно художникам-копиистам, алгоритму сначало потребуется взять некоторое оригинальное произведение, а затем он сможет на их основе создать что-то сам. Насколько хорошо он сможет с этим справиться? Пожалуйста, судите сами.

          ExtendingVanGoghStarryNightInpainting_1.gif
          Вторая премия на фотоконкурсе ZEISS
          Читать дальше →
        • GUI для xdebug trace файлов

            Приходилось ли вам разбираться в запутанном коде без внятной документации? Например, что происходит при создании страницы в какой-нибудь CMS, или почему и откуда именно чужой код посылает email, или делает что-то еще?

            Есть множество приемов для погружения в чужой код. Можно использовать var_dump(), для чего вам придется запускать один и тот же сценарий множество раз. Можно настроить отладчик, но тогда вам придется заходить (Step Into) во множество функций которые не относятся к тому что вы ищете, а если вы пропустите (Step Over) какой-то важный вызов, вам придется начинать все сначала. Современные IDE предоставляют хорошие средства статического анализа кода, но и с их поддержкой бывает сложно понять, что происходит во время выполнения.

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

            Читать дальше →
          • Экономим на GPRS-трафике с помощью Opera Mini Proxy

              Не так давно мне предстояло путешествие по рабочим делам в соседний регион. И, так как рабочие дела требовали постоянного использования интернета, пришлось задуматься о том, как можно сэкономить на недешевом роуминговом GPRS-трафике (UPD: способ также пригоден для скачивания прона без ведома родителей обхода ограничений корпоративных firewall).
              Читать дальше →
            • Определяем количество срабатываний затвора на Canon 400D или сколько наснимал фотоаппарат

                В сети существует огромнейшее количество программ, которые обещают показать количество срабатываний затвора на фотоаппарате. Часть из них не работают вообще, часть из них работают просто не корректно, показывая, что фотоаппарат за 4 года сделал 9 снимков. Итог один — Canon 400D не пронять ни одной из найденных утилит.

                Однако выход все же нашелся. Спустя 2 часа поисков и попыток, старичок Canon сдался, и показал свой главный секрет!

                image


                Читать дальше →
              • Как самому нарисовать гравюру

                image

                Как нарисовать гравюру.


                В этой статье я хотел бы познакомить Вас с программой Strokes Maker, предназначенной для создания штриховых векторных гравюр, показать некоторые возможности и нарисовать портрет, например — Билла Гейтса (векторных — потому что получаемый результат экспортируется в векторный формат в виде набора замкнутых линий).
                Читать дальше →
              • Chatroulette своими руками — 50 строк кода

                  image
                  Пару месяцев назад я приглашал всех на веб-семинар о p2p во Flash, но сделал это слишком поздно, поэтому наверняка большое количество желающих на него не попало. Самое ценное, что я извлек из этого семинара — то, что peer-to-peer приложения во Flash делать очень легко. Правда у самого руки очень долго до этого не доходили.

                  Но буквально вчера руки очень сильно зачесались, и посидев ночку я разобрался в том, как работает технология p2p во Flash. Соединить видеопотоки двух flash-клиентов мне показалось мало, поэтому решил сделать что-то более интересное:
                  1. Пользователь открывает страничку
                  2. Выбирает тему для разговора (один из постов на главной хабры)
                  3. Разговаривает со всеми, кто выбрал эту же тему

                  Сделал. Тут мой пример видеоконференции, исходники клиента и сервера можно скачать отсюда. Минимальные требования для примера — наличие Flash Player 10 и вэб-камеры.

                  UPD: Все это добро хостится на AppEngine, могут закончиться бесплатные квоты и все перестанет работать. Перекинул клиента на narod.ru. Если работать не будет — заходите сюда
                • Как не стать спамером со своей уютной рассылочкой

                    image
                    Пользователь когда-то подписался на рассылку, но уже забыл когда, и главное зачем. Теперь ежедневно к нему падает спам, а по собственному опыту он знает, для того чтобы отписаться нужно зайти по ссылке свой профиль, найти и снять там какую-то галку а главное, помнить свой логин и пароль на давно забытом им сайте.
                    Его действия? «В спам!»

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

                    И вот, с десяток таких «отписок» и гугл будет удобно отсортировывать ваши рассылки в папочку Спам (584), у ВСЕХ ваших подписчиков.

                    Однако многие из нас уже успели заметить: некоторые письма в Gmail при попытке отметить их «В спам!» САМИ предлагают отписаться от рассылки в один клик.

                    Эта фича была введена google более года назад, но лишь единицы рассылок научились ей пользоваться. И не удивительно. В рекомендациях по осуществлению массовых рассылок, лишь косвенно упоминается о том, что Вам нужно сделать.
                    А сделать нужно не многое.
                    Читать дальше →
                  • Gmail Show M. Later

                      Некоторое время назад, я сделал одну очень удобную штуку для Gmail

                      image

                      Если кратко, то этот google script позволяет создать в вашем ящике ярлыки (папки), положив письмо в которые, оно будет лежать пока не пройдет нужный срок, а потом оно снова переместится в inbox и станет не прочитанным. Мне такой штуки очень давно не хватало, т.к. часто приходят письма, на которые нужно отреагировать, но в данный момент реагировать на них возможности нету.

                      Есть более древние варианты в галерее скриптов, Gmail Snooze например, но они позволяют работать только с дневными интервалами и устроены таким образом, что письмо добавленное в 23:00, в 01:00 снова окажется в инбоксе. Поэтому я сначала модифицировал, а потом полностью переписал. В моей реализации, письма живут более правильной жизнью.
                      Читать дальше →
                    • Ускорение загрузки Windows for fun and profit

                        image Пожалуй, начну с того, что если перегружаться 15 раз в год, то любой «тюнинг» процесса загрузки отнимает больше времени, чем будет выиграно на перезагрузках за все время жизни системы. Однако, спортивный интерес берет свое, тем более, что люди интересуется процессом оптимизации быстродействия. А загрузка оказалась самым очевидным кандидатом в примеры того, как на мой взгляд должен выглядеть этот самый процесс. Сразу скажу, что грузиться будем с 5400 rpm винта, грузиться будем в «рабочую» систему: помимо недобитой вендорской крапвари там стоит еще куча всякого типа вижуал студии, антивируса, скайпа, стима, гуглапдейтера и пр…

                        Про то, почему отключение pagefile-а скорее вредно, чем полезно — как нибудь в другой раз, а пока…
                        Под катом много однообразных картинок и немножко унылого текста
                      • Знакомство с Koa или coroutine в nodejs

                        Предисловие


                        Меня уже очень давно привлекает javascript в качестве единого языка для веб-разработки, но до недавнего времени все мои изыскания оканчивались чтением документации nodejs и статей о том, что это callback`овый ад, что разработка на нем приносит лишь боль и страдания. Пока не обнаружил, что в harmony появился оператор yield, после чего я наткнулся на koa, и пошло поехало.
                        Читать дальше →
                      • Пара полезных команд, которые могут пригодиться при DDoS и не только

                          В моем случае, в качестве frontend сервера, стоит nginx и формат access-лога имеет вид:

                          log_format main '$remote_addr — $remote_user [$time_local] "$host" "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" -> $upstream_response_time';

                          Что на выходе дает что-то вроде такой строки:

                          188.142.8.61 — - [14/Sep/2014:22:51:03 +0400] «www.mysite.ru» «GET / HTTP/1.1» 200 519 «6wwro6rq35muk.ru» «Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.191602; .NET CLR 3.5.191602; .NET CLR 3.0.191602» "-" -> 0.003

                          1. tail -f /var/log/nginx/nginx.access.log | cut -d ' ' -f 1 | logtop

                          Позволяет получить общую картину: распределение уникальных IP, с которых идут запросы, кол-во запросов с одного IP и т.д.
                          Самое ценное — что все это работает в режиме реального времени и можно мониторить ситуацию, внося какие-либо изменения в конфигурацию (например просто забанить ТОП 20 самых активных IP через iptables или временно ограничить географию запросов в nginx через GeoIP http://nginx.org/ru/docs/http/ngx_http_geoip_module.html).
                          Читать дальше →
                        • Сервер онлайн-вещаний на базе nginx

                            Введение


                            Привет всем! Несколько месяцев назад на Хабре была опубликована статья «Вещание онлайн-видео с помощью nginx» , в которой Aecktann рассказал о своем опыте внедрения разрабатываемого мной модуля к nginx для вещания видео — nginx-rtmp-module. С тех пор продукт активно развивался и в этой статье я более подробно расскажу о нем.

                            Вещатель нужен для передачи видео-потока клиенту. Речь идет либо о живом потоке, либо о вещании записанного видео (VOD, Video-on-demand). Существует большое количество технологий вещания видео. Среди них можно выделить традиционные протоколы, такие как RTMP или MPEG-TS, а также появившиеся в последнее время технологии адаптивного вещания поверх HTTP. К последним относятся HLS (Apple), HDS (Adobe), Smooth Streaming (Microsoft), MPEG-DASH. При выборе технологии основным фактором является ее поддержка на клиентской стороне. Именно поэтому вещание в формате RTMP на текущий момент является одним из самых распространенных. Протокол HLS поддерживается устройствами компании Apple, а также некоторыми версиями Android.
                            Читать дальше →
                          • Легальный Clickjacking ВКонтакте

                              Поговорим о виджете для авторизации.

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

                              Также, нам говорят, что:
                              В результате авторизации виджет возвращает следующие поля: uid, first_name, last_name, photo, photo_rec, hash.

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