• Использование CMake с Qt 5

    • Tutorial
    image

    CMake — это система сборки ПО (точнее генерации файлов управления сборкой), широко используемая с Qt. При создании больших или сложных проектов, выбор CMake будет более предпочтительным, нежели использование qmake. KDE когда-то был переломным моментом в популярности CMake как таковой, после чего свою «лепту» внес Qt 4. В Qt 5 поддержка CMake была значительно улучшена.
    Читать дальше →
    • +13
    • 47,5k
    • 6
  • Подготовка к сдаче экзамена Oracle certified JAVA programmer

      Совершенно случайно заметил что на dzone появился гайд по относительно новому экзамену от Oracle и тоже решил написать.

      Скажу сразу что здесь не будет silver bullet golden hammer для сдачи этого экзамена. Среди Java разработчиков распространена тяга к best practices. Так как многие проблемы уже когда-то и кем то были решены в ходе почти 20ти летного процесса развития языка, то среди программистов считается плохим тоном придумывать свой велосипед. Настоящий Java-гуру мыслит парадигмами из книг Josh Bloch и Bruce Eckel. Меня, пришедшего из других языков, это всегда умиляло. В данном случае прийдется много работать, т.к. идеального источника для подготовки пока нет.
      Далее
      • +16
      • 23,2k
      • 3
    • Применение замыканий в PHP

        Введение в PHP 5.3 замыканий — одно из главных его новшеств и хотя после релиза прошло уже несколько лет, до сих пор не сложилось стандартной практики использования этой возможности языка. В этой статье я попробовал собрать все наиболее интересные возможности по применению замыканий в PHP.
        Читать дальше →
      • Функторы, аппликативные функторы и монады в картинках

        • Перевод
        Вот некое простое значение:


        И мы знаем, как к нему можно применить функцию:


        Элементарно. Так что теперь усложним задание — пусть наше значение имеет контекст. Пока что вы можете думать о контексте просто как о ящике, куда можно положить значение:


        Теперь, когда вы примените функцию к этому значению, результаты вы будете получать разные — в зависимости от контекста. Это основная идея, на которой базируются функторы, аппликативные функторы, монады, стрелки и т.п. Тип данных Maybe определяет два связанных контекста:


        data Maybe a = Nothing | Just a
        

        Позже мы увидим разницу в поведении функции для Just a против Nothing. Но сначала поговорим о функторах!
        Читать дальше →
      • Моя работа — ждать IT-катастрофы



          Лучшее, что может случиться, — это если результаты того, что я делаю, никогда и никому не пригодятся.

          Можно сказать, что я профессиональный параноик: моя задача — разрабатывать планы действий на случай чрезвычайных ситуаций и обучать людей грамотно реагировать в таких случаях. Зачем это нужно? Довольно просто — чтобы в случае непредвиденных ситуаций всегда была страховка.

          Вот, например, знаете что будет, если землетрясение уничтожит основной московский ЦОД?


          1. Сработает автоматика и перебросит часть сервисов на другие ЦОДы. Всё то, что было active-active, продолжит работу (это базовые функции сети, вроде звонков и SMS).
          2. Затем включается базовый сценарий реакции. Сразу после происшествия формируются команды восстановления из специально обученных людей на объекте, имеющих подготовку по всем аспектам работы этого объекта. Например, из инженера на смене, охранника, системного администратора и так далее. Они бросают все свои текущие дела и занимаются только восстановлением.
          3. В течение первых 10 минут «бронзовая» команда восстановления анализирует ситуацию. На 11-й минуте руководитель команды докладывает команде более высокого уровня («серебряной», как правило, не присутствующей на объекте), например, главному инженеру и руководителю подразделения.
          4. «Серебряная» команда принимает решение на своём уровне. В нашем случае проблема явно особенно важная, поэтому команда связывается с «золотой» командой — руководителями самого высокого уровня. На принятие решения о том, что ситуация является чрезвычайной, уходит ещё 10 минут (это очень быстро). В течение ещё 5 минут активируются составленные нами планы аварийного восстановления.
          5. Руководители «бронзовых» команд собирают людей и идут восстанавливать, что могут, на месте. Параллельно собирается кризисный комитет, включающий известных специалистов, описанных в плане на этот случай.
          6. Далее кризисный комитет взаимодействует с HR, PR, безопасниками и другими службами. В частности, совершенно точно PR к этому моменту будет остро нуждаться в информации — абоненты уже полчаса без мобильного интернета, нужно выступить с данными о сроках восстановления.
          7. Разворачивается резервная точка. В течение 20-30 минут восстанавливается инфраструктурный слой. Затем идет восстановление СУБД и там, где надо, восстановление из архива с ленты. Далее — восстановление приложений (от получаса до дня).
          8. Параллельно в течение первого часа проверяется, как всё переехало.
          9. Затем появляются детальные отчёты. План аварийного восстановления заканчивается, и мы снова «засыпаем» до следующей ситуации.
          Читать дальше →
        • Поддержка USB в KolibriOS: что внутри? Часть 2: основы работы с хост-контроллерами

          • Tutorial

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

          Прерывания и потоки


          Хост-контроллеры оповещают софт о происходящих событиях, генерируя прерывания. Прерывание может прийти и оторвать процессор от текущей задачи в любой момент времени; это накладывает жёсткие требования на обработчик прерывания. Обработчик прерывания не может захватывать никакие блокировки — ведь вполне возможно, что прерванный код как раз завладел блокировкой и уже не сможет её освободить. Единственным исключением является вариант спинлока, запрещающий прерывания на время блокировки, но из-за глобальности эффекта спинлок стоит применять пореже и для очень коротких участков кода. На однопроцессорных конфигурациях такой вариант вырождается в пару cli/sti без собственно спинлока, на многопроцессорных внутри cli/sti остаётся обычный спинлок. Кроме того, контроллер прерываний во время обработки одного прерывания блокирует остальные с тем же или более низким приоритетом.

          По этим двум причинам в KolibriOS обработчики прерываний от хост-контроллеров USB передают основную часть работы в выделенный под USB поток ядра, а сами ограничиваются сообщением хост-контроллеру «спасибо, сигнал принят». Сам USB-поток имеет наивысший приоритет, чтобы задумавшиеся пользовательские приложения не мешали обработке. Все функции вышележащих уровней, которые вызываются из уровня поддержки хост-контроллера, работают в контексте потока USB и, как следствие, вполне могут использовать примитивы синхронизации. Приятным побочным эффектом является автоматическая сериализация вызовов: ни обработчик завершения второй передачи из очереди канала, ни функция DeviceDisconnected не будут вызваны, пока не закончит работу обработчик завершения первой передачи из очереди канала, что есть логичное требование к API.

          Поток USB также иногда просыпается для обработки событий, отложенных по времени. Пример, о котором я позже расскажу подробнее: после события подключения устройства нужно выждать 100 миллисекунд перед дальнейшей обработкой. В этом случае поток проснётся при обнаружении подключения устройства и запланирует следующее пробуждение через 100 миллисекунд, уже не связанное с пробуждением из-за прерывания.
          Читать дальше →
        • Потоки, блокировки и условные переменные в C++11 [Часть 1]

          • Tutorial
          В первой части этой статьи основное внимание будет уделено потокам и блокировкам в С++11, условные переменные во всей своей красе будут подробно рассмотрены во второй части
          Читать дальше →
        • Привычный вид для Visual Studio 2012

            Не нравятся новые цветовые темы


            Ставим Visual Studio 2012 Color Theme Editor, видим в меню VS новый пункт «THEME», наслаждаемся.

            Не нравятся новые иконки в Solution Explorer


            Ставим Visual Studio Icon Patcher (VS 2010 должна быть тоже установлена).

            Не нравится CAPS в меню


            Об этом уже писали.

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

              В продолжении статьи о кроссплатформенной и кросс-аппаратной оптимизации, на примере задачи поиска полным проходом по таблице из 5 полей и 10 000 000 строк, и неизбежности этой задачи даже при индексном поиске, я покажу как ускорить такой поиск в 3.5-5.3 раза с использованием C++ независимо от аппаратной платформы.
              В предыдущей статье нам удалось ускорить поиск в 1.3 раза: GitHub.com
              Мы не будем банально описывать конструкции языка, а покажем преимущества C++ при решении одного из этапов реальной задачи.
              Мы по-прежнему пишем кроссплатформенно под MSVC11(MSVS2012) и GCC 4.7.2, и используем в них C и частично реализованный стандарт C++11.
              Для упрощения понимания мы все ещё пишем без индексного поиска, но это решение в дальнейшем будет использоваться при индексном поиске.
              Читать дальше →
            • Возможности оптимизации в языках C и C++

              Существует мнение, что C++ имеет заметные накладные расходы по сравнению с C и поэтому он медленнее. Помимо этого, даже, существуют статьи показывающие преимущества в скорости языков с компиляцией налету (JIT — Just-in-time compilation), таких как Java и C#. Сравнить последние мы оставим тем, кто считает их быстрыми, но мы объясним почему это не так. А C и C++ мы сравним на примере задачи поиска данных.
              Задача поиска данных часто встречается в: веб-сервисах, системах управления баз данных (СУБД), гео-поиске и аналитике.
              Сначала для простоты объяснения поставим задачу поиска элементов полным проходом по массиву из 10 000 000 элементов (структур), содержащих 5 полей с диапазонами значений: amount_of_money(0-1000000), gender(0-1), age(0-100), code(0-1000000), height(0-300). А в следующих статьях добавим в решение индексный поиск.
              Мы будем писать кроссплатформенно под MSVC11(MSVS2012) и GCC 4.7.2, и использовать в них частично реализованный стандарт C++11.
              Читать дальше →
            • WebKit для разработчиков

              • Перевод


              Для многих из нас, разработчиков, WebKit — черный ящик. Мы бросаем в него HTML, CSS, JS и кучу изображений, и WebKit, как-то… магически, выдает нам веб-страницу, которая выглядит и работает хорошо.
              Но на самом деле, как говорит мой коллега Илья Григорик:
              Веб-кит не является черным ящиком. Это — белый ящик. И не просто белый, но и открытый ящик.
              Так-что, давайте попробуем разобраться в некоторых вещах:
            • Дискретная математика для первокурсников: опыт преподавателя

              • Tutorial
              Сегодня у меня необычный текст, совершенно не связанный с машинным обучением (для новых читателей: этот текст – часть блога компании Surfingbird, в котором я в течение последнего года рассказывал о разных аппаратах машинного обучения в приложении к рекомендательным системам). В этом посте математической части практически не будет, а будет описание очень простой программки, которую я написал для своих студентов. Вряд ли кто-то узнает для себя из этого поста много содержательно нового, но мне кажется, что некоторую ценность представляет сама идея – многие люди просто не задумываются о том, что «и так можно». Итак…

              Читать дальше →
            • Состоялся релиз Ruby 2.0.0

                Сегодня, 24 февраля 2013 года, вышла новая версия Ruby 2.0.0-p0.
                Это первый стабильный релиз новой мажорной ветки.
                Давайте посмотрим, что же нового принес нам новый релиз.
                Читать дальше →
              • Паравиртуализация в Xen: без загрузчика никуда

                  Xen mascot PV-GRUB (не путать с заведомо костыльным pygrub) является основанным на GRUB 0.9x загрузчиком для паравиртуальных машин Xen, позволяющим загружать ядро ОС непосредственно из DomU (гостевого) окружения, что добавляет процессу запуска гостевой системы существенной независимости от хост-системы. Одним на наиболее крупных внедрений можно считать облачный хостинг Amazon EC2, также использующий гипервизор Xen и предоставляющий клиентам возможность с помощью PV-GRUB загружать любые кастомизированые ядра (Use your own kernel with Amazon EC2) для паравиртуальных систем.

                  В данном вопросе всё было бы исключительно позитивно, если бы не вполне обычная для свободного ПО проблема: разработка данной ветки GRUB уже как несколько лет полностью остановлена в пользу GRUB2, а сообщество разработчиков Xen, судя по всему, в ближайшие годы основанной на актуальной версии GRUB замены PV загрузчику предоставить не готово. Сам PV-GRUB, несмотря на то, что является, в общем-то, частью официального дистрибутива Xen, в настоящее время уже исключён как минимум из соответствующих пакетов в репозиториях Debian и Ubuntu, а пользователи, привыкшие к удобствам, между тем требуют (Debian bug #588839: Include pv-grub to securely boot guest kernels) и требуют (Ubuntu bug #798583: xen-utils-4.1 does not have pvgrub)… Хотя лично для меня не очень понятна мотивация мейнтейнеров Xen пакетов, ссылающихся на некие невнятные проблемы с зависимостями, в то время как пакеты с GRUB 0.97 всё ещё доступны и работоспособны, да и к существующему функционалу претензий нет.

                  Здесь я постараюсь описать, пожалуй, наиболее приемлемое в настоящий момент решение насущной проблемы — самостоятельную сборку PV-GRUB и необходимую настройку DomU для его использования, благо никаких сверхъестественных усилий для этого не требуется.
                  Читать дальше →
                • Cross-domain «ajax» — простое решение

                    В очередном проекте я столкнулся с необходимостью активно работать с кросс доменными запросами на ajax, тема, как я вижу на хабре особо не поднималась и не освещалась, вот и решил поделиться с читателями свои опытом.
                    Читать статью
                  • Nginx+php-fpm+perl под Debian Squeeze

                    • Tutorial

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

                    В качестве теста решил перевести все свои сайты на nginx, до этого все работало на Apache из состава ZendServerCE. Интересно было пробовать насколько сложно будет полностью переехать на новый для себя веб-сервер, ведь используется несколько CMS (DLE, Wordpress, самописныеCMS).

                    Задачи:
                    • базовая работа web сервера — обработка html;
                    • запуск php скриптов;
                    • корректная работа phpmyadmin для всех сайтов на сервере;
                    • запуск cgi и pl скриптов;
                    • использование кеширования и подбор оптимальных параметров для увеличения производительности.


                    Имеем свежеустановленный сервер Debian 6 в минимальной установке из netinstall. И так поехали.
                    Читать дальше →
                  • Видеокурс по DevTools от Google и Codeschool

                      image

                      Известные нам по гениальным обучающим скринкастам Rails for Zombies, Try Ruby и Try Git — команда Codeschool объединилась с корпорацией добра для создания Try DevTools — подробнейшего обучающего курса из семи глав, который, конечно же, является абсолютно бесплатным.
                      Читать дальше →
                    • 19 команд ffmpeg для любых нужд

                      • Перевод
                      • Tutorial
                      От переводчика:
                      Многие знают, что ffmpeg — это сила, но не все знают, какая именно. Он многогранен и безграничен, а его man объёмен и местами малопонятен, лишь немногие постигли дао профессиональной работы с ним. И тем не менее, этот инструмент может быть полезен почти всем, кто хоть иногда работает с видео и звуком, даже на бытовом уровне. О некоторых полезных консольных командах ffmpeg и пойдёт речь в статье. В некоторых местах я взял на себя смелость вставить ссылки на поясняющие статьи.


                      ffmpeg — это кроссплатформенная open-source библиотека для обработки видео- и аудиофайлов. Я собрал 19 полезных и удивительных команд, покрывающих почти все нужды: конвертация видео, извлечение звуковой дорожки, конвертирование для iPod или PSP, и многое другое.

                      1. Получение информации о видеофайле

                      ffmpeg -i video.avi
                      

                      2. Превратить набор картинок в видео

                      ffmpeg -f image2 -i image%d.jpg video.mpg
                      

                      Эта команда преобразует все картинки из текущей директории (названные image1.jpg, image2.jpg и т.д.) в видеофайл video.mpg

                      (примечание переводчика: мне больше нравится такой формат:
                      ffmpeg -r 12 -y -i "image_%010d.png" output.mpg
                      

                      здесь задаётся frame rate (12) для видео, формат «image_%010d.png» означает, что картинки будут искаться в виде image_0000000001.png, image_0000000002.png и тд, то есть, в формате printf)
                      Читать дальше →
                    • 13 причин не быть управленцем

                      Так уж сложилось, что последние несколько лет я занимал самые разнообразные руководящие должности в полудюжине компаний, занимающихся разработкой программного обеспечения разного рода. Довелось побывать и тимлидом, и менеджером проекта, и группы проектов, руководителем отдела и руководителем технического направления; подопечных бывало от двух до ста пятидесяти человек, да и размеры компании варьировались от трёх до двухсот тысяч работников. Неизменным оставалось только одно: чисто управленческая работа, постепенный и окончательный отход от технических задач.

                      А сейчас, в период между Рождеством и Новым Годом, когда особенно обострена склонность к углублённой рефлексии, приходит понимание того, что, знай я некоторые «инсайдерские» подробности управленческой деятельности заранее – сделал бы совсем другой выбор лет эдак семь назад.

                      Вот поэтому и родился этот немного хаотичный и очень разнокалиберный список моментов, которые очень хотелось бы передать куда-то обратно, примерно в 2005 год – дайте знать, если кто-то вдруг уже научился это делать! А пока, может быть кто-то найдёт некоторые из перечисленных ниже пунктов не до конца очевидными, или даже полезными для себя; было бы приятно осознавать, что удалось помочь кому-то сделать более осознанный выбор профессии – или просто о чём-нибудь важном задуматься.
                      Итак, поехали
                    • Выбор фрилансера, или о гипотезе старого профессора на тему поиска

                      Собственно гипотеза

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

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

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

                      При чем здесь фрилансеры?

                      Есть несколько слоёв при ответе на этот вопрос.
                      Читать дальше →