• GCC Profile-guided optimization

      Profile-guided optimization (далее PGO) — техника оптимизации программы компилятором, нацеленная на увеличение производительности выполнения программы. В отличии от традиционных способов оптимизации анализирующих исключительно исходные коды, PGO использует результаты измерений тестовых запусков оптимизируемой программы для генерации оптимального кода.
      Читать дальше →
    • Как программист машину покупал

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

      Как известно, для покупки авто на территории РФ существует несколько крупных авторитетных сайтов (auto.ru, drom.ru, avito.ru), поиску на которых я и отдал предпочтение. Моим требованиям отвечали сотни, а для некоторых моделей и тысячи, автомобилей, с перечисленных выше сайтов. Помимо того, что искать на нескольких ресурсах неудобно, так еще, прежде чем ехать смотреть авто “вживую”, я хотел бы отобрать выгодные (цена которых относительно рынка занижена) предложения по априорной информации которую предоставляет каждый из ресурсов. Я, конечно, очень хотел решить несколько переопределенных систем алгебраических уравнений (возможно и нелинейных) высокой размерности вручную, но пересилил себя, и решил этот процесс автоматизировать.
      image
      Читать дальше →
    • Возражения против принятия Coroutines с await в C++17

      Недавно Россию посетила группа экспертов С++, участвующих в работе комитета по стандартизации. 25 февраля они участвовали в Q&A сессии, организованной Яндексом, а после выступали на конференции С++ Russia 2016. Одним из них был Гор Нишанов, автор предложения о включении C#-подобных сопрограмм (те которые async/await) в стандарт С++17. Ранее Гор выступал на CppCon 2015 с докладом "С++ Сопрограммы — Абстракция с отрицательным оверхедом". Такая возможность структурировать асинхронный код выглядит привлекательно, Гор в докладе убедительно показывает, что количество кода сокращается, а скорость работы возрастает по сравнению с «рукописными» State Machine. Кроме того, это одно из самых больших потенциальных изменений в следующем стандарте и привлекает к себе внимание. Судя по публикациям, proposal получил значительное одобрение и комитет склоняется к включению в стандарт.

      После этого я был весьма удивлен, когда загуглив упомянутый proposal P0057, получил в выдаче встречный документ "Coroutines belong in a TS", который подвергает предлагаемую реализацию сопрограмм жесткой и весьма эмоциональной критике и требует не включать в С++17, а отложить для «обкатки» в Technical Specification. Отмечу, что не являюсь сторонником этих возражений, а приглашаю интересующихся к обсуждению, насколько обоснованны перечисленные претензии и все ли так плохо. Под катом «выжимка» из документа с небольшими комментариями.
      Читать дальше →
    • Pathfinding: До одури простая реализация алгоритма воронки (Funnel Algorithm)

      • Translation
      • Tutorial


      Алгоритм воронки — это простой алгоритм поиска наипростейшего пути, проходящего через «порталы». Наиболее подробное описание можно найти по ссылке Efficient Triangulation-Based Pathfinding (2)
      Здесь же этот алгоритм будет реализован до одури просто. Вместо использования очередей и прочих очешуительных вещей, наша простейшая реализация перезапускает цикл каждый раз, когда обнаруживает очередной угол. Это значит, что некоторые порталы будут опрашиваться таки чаще, чем должны были бы, тем не менее, делая реализацию всяко проще.
      Читать дальше →
    • Неожиданное поведение openssl_random_pseudo_bytes() приводящее к фатальной потере криптостойкости

        Доброго времени суток всем.

        Недавно в одном из проектов мы столкнулись со следующей проблемой — функция openssl_random_pseudo_bytes() выдавала дублирующиеся псевдослучайные последовательности!

        Этого не может быть, потому что этого не может быть никогда! — Скажет любой, кто читал документацию этой функции. И, да, $crypto_strong исправно выдавал TRUE.

        И тем не менее — ошибки уникальности при вставке в базу сыпались пачками и лог подтверждал — 32-байтные последовательности генерировались повторно через разные интервалы, от суток до недели. Расследование заняло целый месяц. Сейчас я на 99% уверен, что причина найдена — но буду благодарен, если Хабражители подтвердят или опровергнут мои выводы.

        Так в чем же было дело?
      • Ностальгия: роемся у «Танчиков» под капотом

          Многие из нас выросли на «Танчиках», «Марио» и прочих нетленных шедеврах времён рассвета игровой индустрии. Приятно порой вспомнить, как днями напролёт резались с друзьями у экранов телевизоров, меняя джойстики как перчатки. Но время не стоит на месте, и одни интересы сменяются другими. Однако, порой любовь к старым-добрым игрушкам не угасает.
          Я отношу себя к людям именно таким, и мой интерес к старым играм пошёл в сторону реверс-инжиниринга, что и привело меня в IT-сферу, где я и осел с концами.

          Я хочу рассказать вам о том, что же под капотом у железных монстров из знаменитой игры Battle City (в простонародье «Танчики») с не менее знаменитой приставки Nintendo Entertainment System (сокращённо NES, в России более известен её китайский клон «Dendy»). Мне в своё время эта информация показалась довольно любопытной — надеюсь, такой же она покажется и вам.
          Читать дальше →
        • [ В закладки ] Алгоритмы и структуры данных в ядре Linux, Chromium и не только

          • Translation
          Многие студенты, впервые сталкиваясь с описанием какой-нибудь хитроумной штуки, вроде алгоритма Кнута – Морриса – Пратта или красно-чёрных деревьев, тут же задаются вопросами: «К чему такие сложности? И это, кроме авторов учебников, кому-нибудь нужно?». Лучший способ доказать пользу алгоритмов – это примеры из жизни. Причём, в идеале – конкретные примеры применения широко известных алгоритмов в современных, повсеместно используемых, программных продуктах.



          Посмотрим, что можно обнаружить в коде ядра Linux, браузера Chromium и ещё в некоторых проектах.
          Читать дальше →
          • +140
          • 80.4k
          • 15
        • Сеть обменной сортировки со слиянием Бэтчера

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

            Читать дальше →
            • +17
            • 16.8k
            • 1
          • Свой шаблон отклика-письма на HeadHunter (и moikrug) без Copy-Paste

              Многим хорош сервис поиска вакансий hh.ru, но ищущий всегда найдёт, что усовершенствовать. К примеру, на сервисе есть поле для заполнения письма — ответа на вакансию, но нет элементарного шаблона оформления письма — заголовок, кратко о себе, ответы на требования по вакансии.

              Если нет — надо сделать. Ведь специалист по JS не будет многократно заниматься Copy-Paste-операциями, когда знает, что их можно автоматизировать, даже не обременяя просьбами службы сайта. Есть такие инструменты, как пользовательские скрипты.

              UPD 12.1.2016: Скрипт расширен на сайты career.ru (клон HH с той же клиентской базой), itmozg.ru, superjob.ru.

              Вначале, конечно, пришлось покопировать, пока не выявились закономерности и не получился юзерскрипт hhFiller. Шаблон отклика, на мой взгляд, должен содержать:
              1. Заголовок-приветствие. После него пойдёт сразу рукописный текст, живой ответ на вакансию в 2-3 или более строчек.

              Читать дальше →
              • +8
              • 17.5k
              • 3
            • «Boost.Asio C++ Network Programming». Глава 1: Приступая к работе с Boost.Asio

              Привет Хабралюди!
              Это мой первый пост, поэтому не судите строго. Я хочу начать вольный перевод книги John Torjo «Boost.Asio C++ Network Programming» вот ссылка на нее.

              Содержание:


              Во-первых разберем что есть Boost.Asio, как его собрать, а так же несколько примеров. Вы узнаете, что Boost.Asio больше, чем сетевая библиотека. Так же вы узнаете о самом важном классе, который находится в самом сердце Boost.Asio — io_service.

              Читать дальше →
            • DIY порошок для посудомойки: разбираем промышленные средства и улучшаем рецепт



                Внимание! В рецепте с отбеливателем обнаружилась опасность коррозии металла! Не рекомендуется в стандартном применении!

                Обзор экспериментов год спустя:
                DIY порошок для посудомойки: как не растворить посуду и не повторить моих ошибок. Год экспериментов

                В прошлой публикации мы создавали дешевый порошок для посудомойки из желудей и спичек кальцинированной соды и стирального порошка. В этой я расскажу о том, как можно его улучшить с помощью кислородного отбеливателя и где можно купить компоненты для более продвинутой версии. Будем делать упор на эффективности мойки, но даже при этом цена не выйдет за 100 рублей/килограмм. А еще будет рецепт ополаскивателя с себестоимостью в районе 1 рубля за литр. Как справедливо заметил amarao, занятие не для всех и многим проще использовать готовые таблетки. Но в подобных экспериментах с бытовой химией есть что-то от детства, первых опытов по смешиванию соды с уксусом и газировки с мятными конфетами. Так что ощутимая экономия здесь все-таки вторична. Будем развлекаться) Если кому-то лень читать весь текст — в конце поста будут подробные рецепты с рекомендациями.
                Читать дальше →
              • 30 лет работы сисадмином

                  Sandra Henry-Stocker (Unix Dweeb, в данный момент работает в компании TeleCommunication Systems, разрабатывающей инновационные технические решения).

                  Оглядываясь в прошлое, спустя более 30 лет работы системным администратором Unix, я могу сказать, что это был долгий и интересный путь. В эти годы я конечно не выполняла одно и тоже. Развитие технологий приводили к невероятным изменениям в моей работе. Это были впечатляющие улучшения в “железе”, которое я обслуживала, и изобретение новых программных инструментов, которые я изучала и применяла на практике. На протяжении многих лет я получала невероятное наслаждение от того, насколько много работы я могла сделать в командной строке для выявления и устранения различных проблем и понимания того, как наилучшим образом обеспечить защиту данных моих работодателей. В течении 30 лет я работала с удивительными людьми, при этом была уволена однажды, а также узнала много нового о том, что работает и не работает, как с технической точки зрения, так и с точки зрения карьерного роста.
                  Профессия и все с ней связанное меняется драматичным образом, но она всегда приносила и будет приносить мне море удовольствия.
                  Вот мои размышления об изменениях, которые я увидела и тех, которые еще увижу.
                  Читать дальше →
                • Об удобной навигации и отладке C++ кода в Vim

                    Компания, где я работаю, разрабатывает программное обеспечение на C++ под Linux. Долгое время мы использовали Qt Creator, с редкими ребятами работающими из Emacs и Vim. Когда я сам попытался пересесть на Vim, я понял, что ситуация с плагинами для разработки на С++ очень не простая. Поработав немного с CTags, я быстро понял, что без напильника работать в Vim будет очень сложно.
                    К сожалению, с ростом опыта работы с Vim редактор в Qt Creator в режиме эмуляции устраивал меня все меньше, и в какой-то момент я решил потратить немного времени и разобраться, как же сделать из Vim нормальную среду.
                    Я очертил для себя четыре вещи, которые я бы хотел от среды разработки, и которых мне бы хватило в Vim, чтобы полностью на него перейти:

                    1. Автодополнение
                    2. Навигация по коду
                    3. Отладка прямо из среды
                    4. Интеграция с Git (в частности Blame прямо в редакторе, и Git Grep)

                    Автодополнение в Vim — это решенная проблема, и название у решения YouCompleteMe. Это очень качественный плагин, который реализует автодополнение для большого количества языков программирования, в частности Python и C++. Ходят слухи, что внутри Google YouCompleteMe решает и вторую проблему с навигацией кода, но использует для этого внутренные инструменты гугла для индексирования.

                    Интеграция с Git в какой-то степени решена с помощью vim-fugitive. Это не такая комплексная интеграция, как бывает у Jet Brains, или в Visual Studio, но сравнимая с тем, что предлагает Qt Creator. Те два сценария, которые нужны были мне: blame и grep — работают хорошо.

                    Отладка и навигация были проблемами, решенными гораздо хуже. В этой статье я расскажу о плагине, который мы написали для навигации по С++ коду. В конце статьи я также расскажу о том, как мы для себя решили проблему с интегрированным отладчиком.
                    Читать дальше →
                  • StableBit DrivePool — дисковый массив с дублированием файлов

                      Я постоянно пытаюсь найти какие-то альтернативы RAID'ам в плане объединения нескольких жестких дисков в единый массив. Пробовал много что, но ни на чем так и не остановился окончательно. RAID не нравится тем, что штука достаточно капризная, негибкая и требовательная до дискового пространства.

                      image

                      Что мне вообще хочется:
                      1. Объединить диски с данными в один массив большого объема, чтобы не приходилось вручную сортировать файлы — что возникает при нескольких дисках (пусть даже при монтировании их в папки).
                      2. Иметь возможность добавлять/удалять/заменять диски в любой момент без развала массива.
                      3. Независимость информации на дисках друг от друга — чтобы смерть одного из них не приводила к недоступности остальных.
                      4. В идеале — какой-то метод хранения одного файла на нескольких дисках. Бэкапы — это хорошо и я их делаю, но лучше, когда к их помощи не приходится прибегать.


                      Читать дальше →
                    • sin 1° на калькуляторе

                        Важное уточнение — калькулятор обычный, без кнопки sin. Как в бухгалтерии или на рынке.

                        Калькулятор Casio

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

                        • Translation
                        Сегодня мы представляем вашему вниманию адаптированную подборку инструментов (в том числе облачных) для разработчиков, которые позволяют создавать по-настоящему качественные проекты. Здесь представлены исключительно SaaS, PaaS и IaaS сервисы, предоставляющие бесплатные пакеты для разработчиков инфраструктурного ПО.

                        Читать дальше →
                      • Шпаргалка по HTTP-библиотекам для С++

                        • Tutorial
                        К сожалению, в стандартной библиотеке языка С++ нет никаких средств для работы с протоколом HTTP. Возможно, в будущем появятся, но на данный момент каждый раз при необходимости дёрнуть какой-нибудь REST-сервис, пропарсить веб-страничку, написать простенького бота или краулера приходится задаваться вопросами «А какую же библиотеку взять, так чтобы побыстрее и попроще?». Иногда проект уже использует какой-то фреймворк (а иногда даже несколько) и тогда приходится вспоминать «А как же сделать HTTP-запрос имеющимися средствами?». Чтобы не путаться я решил написать для себя шпаргалку с примерами HTTP-запросов на С++ с применением разных библиотек. А самое удобное место для хранения подобных шпаргалок — Хабр: и сам не потеряешь, и другим может пригодиться.

                        Будут рассмотрены:
                        • WinInet
                        • WinHttp
                        • Casablanca
                        • Qt
                        • POCO
                        • wxWidgets
                        • Boost.Asio
                        • libcurl
                        • neon
                        • .NET (С++/CLI)
                        • IXMLHTTPRequest
                        • HappyHttp
                        • cpp-netlib


                        Читать дальше →
                      • 6 вещей, который я хотел бы знать перед разработкой своего первого Android-приложения

                        • Translation
                        От переводчика: перевод делался сходу, за один присест, так что в некоторых местах может быть немного топорным. В любом случае, вы знаете, куда писать об ошибках.
                        В комментариях к оригинальной статье есть несколько здравых мыслей, как, например, не использовать библиотеки с мира «большой» джавы, так как они слишком объемные, или использовать всякие Glide-ы вместо Picasso (с чем я, впрочем, согласен). Можете посмотреть, если интересно.
                        И еще, я не придумал, как заставить отображаться сниппеты с гитхаба, так что я просто скопировал код.


                        Мое первое приложение было ужасным. В самом деле, оно было настолько кошмарным, что я удалил его с маркета и больше даже не буду указывать его в своем резюме. То приложение могло быть не настолько ужасным, если бы я знал несколько вещей об Android-разработке перед его написанием.

                        Далее следует список вещей, которые надо понимать во время разработки вашего первого приложения под Android. Эти уроки были извлечены из реальных ошибок, которые я делал в исходном коде моей первой программы, — ошибкок, которые я буду приводить ниже. Понимание этих вещей поможет вам написать приложение, которым вы будете гордиться чуть больше.

                        Конечно, если вы пишете что-то по ходу изучения Android-разработки, скорее всего, позже вы все равно возненавидите свое творение. Как сказал @codestandards:

                        If the code you wrote a year ago doesn't seem bad to you, you're probably not learning enough.— Code Standards ( @codestandards) 21 мая 2015

                        (Если код, который вы написали год назад, не кажется вам плохим, вы, наверное, недостаточно учились)
                        Читать дальше →
                        • +11
                        • 27.2k
                        • 5
                      • Push-уведомления через Telegram



                          25 июня Telegram открыл платформу для ботов. Первая моя мысль была — ведь можно слать через него уведомления! При помощи уведомлений через телеграм можно решить сразу несколько проблем, хотя бы частично:
                          • Поддержка iOS
                          • Поддержка Windows Phone
                          • Получение уведомлений без установки лишних приложений

                          Таким образом, PushAll теперь может отправлять уведомления на устройства Android, Chrome и в Telegram через бота.



                          Под катом небольшая инструкция по настройке и детали разработки. (небольшая инструкция для тех, кто собрался делать такого же бота)
                          Читать дальше →
                        • Рассуждения о Software Defined Storage: что не так с IO?

                            Abstract: О новом тренде — software defined strorge и главной родовой травме блочных устройств — обещании бесконечной надёжности.

                            Лирика


                            На горизонте новый buzzword: Software defined $thing. Мы уже имеем состоявшийся и сформировавшийся круг всего, относящегося к software defined networks (SDN), пришла очередь и storage (SDS). Видимо, дальше у нас будет software defined computing или ещё что-то подобное, потом резко всполошатся и подтянутся HP/VMWare и предложат (private) «software defined enterprise», который будет означать всё тоже, что было, но ещё моднее и актуальнее.

                            Впрочем, рассказ не про баззворды. За каждым таким странным названием (grid, elastic, cloud) стоит дальнейшее развитие технологий — построение дальнейших слоёв взаимодействия компонент (эм… взаимодействия участников взаимодействия, иначе не скажешь), основным мотивом которых является уход от гранулированности компьютерной системы, так, чтобы вся терминология, вся предметная область ушла от «межпроцессного взаимодействия» и стала автономной. В более-менее приличном виде мы это (в виде уже свершившегося факта) мы видим в волшебном мире javascript работе www, когда нас никаким образом не волнуют сервера, на которых крутятся задачи — всё общение происходит на уровне между браузером (с учётом его интимных подробностей DOM, JS и т.д.) и абстракцией, под названием URI, которой не важно — один это сервер или сотни разных.

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

                            Перед рассказом про SDS, посмотрим на уже состоявшееся: SDN (software defined network).
                            Читать дальше →