пятница, 27 декабря 2013 г.

[life.photo] Дабы окончательно проснуться :)

Давно не постил фотографий, а тут вот карточка в тему, из совсем-совсем недавнего.

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

четверг, 26 декабря 2013 г.

[prog] Mxx_ru 1.6.2 и одна дикая идея на счет систем сборки С/C++ проектов

На днях сделал релиз Mxx_ru 1.6.2 с поддержкой нового тулсета: vc12 (это компилятор из состава MSVS 2013). Загрузить новую версию можно посредством RubyGems:

Для новой инсталляции:
gem install Mxx_ru

Для обновления уже установленной версии:
gem update Mxx_ru

Либо же можно скачать gem-файл с RubyForge, а затем установить Gem локально:
gem install Mxx_ru-1.6.2.gem

Проект Mxx_ru жив, в смысле постоянно и активно используется. На его развитие, правда, сил уже не остается, все время отнимает SObjectizer.

Но вот размышляя о том, куда можно было бы двигать Mxx_ru будь такая возможность, пришла в голову забавная и дикая идея. Навеяна она новой make-подобной системой сборки Ninja. Ее разработали в Google при работе над Chrome и ее целью является максимальная скорость обработки make-правил. При этом правила для ninja не пишутся вручную, а генерируются автоматом из других, более высокоуровневых систем описания проектов, вроде GYP или CMake.

Так вот моя идея состоит в том, чтобы из описанных в Mxx_ru правил строился C++код для управления компиляцией проекта. Этот C++код компилируется в exe-шник и именно этот exe-шник запускается и затем управляет всем процессом сборки. Выигрыш здесь в том, что если проекты модифицируются не часто (а именно так в большинстве случаев и происходит), то данный exe-шник будет компилироваться лишь эпизодически. А в большинстве случаев будет достигается скорость анализа зависимостей, недостижимая для инструментов вроде Mxx_ru и SCons.

Над реализацией этого дела я пока не думал. Вероятно, тут есть свои подводные камни. Но, если когда-нибудь дело дойдет до Mxx-2.0, нужно будет достать эту идею из запасников :)

среда, 25 декабря 2013 г.

[life.photo.humour] Классный однострочник про фотографов

Ты настоящий фотограф, если прогноз погоды для тебя выглядит как 1/60s f2 ISO200 вместо "дождливо".

Найдено здесь.

[life.cinema] Терпения при просмотре х/ф "Сталинград" хватило на 19 минут 38 секунд

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

При просмотре оказалось, что ранее прочитанные или увиденные мной разгромные рецензии на фильм "Сталинград", слишком добрые и мягкие. Очень удивлен тем, что кто-то смог эту картину досмотреть до конца. Мое терпение лопнуло на 19:38.

Непосредственно последней каплей стала сцена с освобожденным в захваченном доме артиллерийским корректировщиком. Которого командир разведчиков чуть не застрелил без суда и следствия со словами "Да ты переправу просрал!". И застрелил бы, если бы не был урезонен своим подчиненным(!) -- мол, наш радист погиб и рация разбита, а этот живой и рация у него работает. Т.е. рядовой разведчик соображает и ориентируется в ситуации лучше, чем его командир. При этом особенно пикантен гнев командира разведчиков в отношении корректировщика. Ведь разведчикам был дан приказ помешать немцам взорвать нефтехранилище. А они приказ не выполнили и непосредственная вина невыполнения приказа лежит как раз на командире.

При этом интересен диалог корректировщика и командира разведчиков: "А вот ты чего за фрукт?" -- "A говорил уже, корректировщик, офицер". Офицер? Это что за звание? Мне, крайне далекому от армии человеку, не понятно, почему корректировщик не представился как-то так: "Лейтенант Такой-то. Часть такая-то." И почему командир разведчиков не представился в ответ таким же образом. Возможно, потому, что сценарист фильма еще дальше от армии, чем я.

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

Отдельно нужно отметить спецэффекты сцены с атакой горящих красноармейцев на немецкие позиции. Как по мне, так они на уровне абсолютно трешевого фильма "Призрачный гонщик 2". Т.е. ниже плинтуса.

Конечно же, нельзя обойти вниманием персонаж рассказчика всей этой истории. Действия фильма про Сталинград начинаются в 2011-м году в Японии, где российские спасатели помогают справляться с последствиями цунами. Один из них, седой, но явно крепкий и бодрый мужчина, начинает свой рассказ о пяти отцах. Но, похоже, у сценаристов трава была просто улет гуманитарное образование и даже с элементарной арифметикой они не в ладах. Основные события фильма, включая зачатие рассказчика, происходят в ноябре 1942-го. Следовательно, появиться на свет рассказчик должен был в начале осени 1943-м. А в марте 2011-го ему должно было быть 67 лет. Шестьдесят семь, мать его, лет! И он "в поле" руководит действиями небольшой бригады спасателей. Признаться, о российском МЧС я намного лучшего мнения.

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

Это было в Сталинграде, осенью 1942-го года. Русские переправлялись через Волгу.

Русские! Повторю еще раз: русские! И еще раз, поскольку нужно: русские!

Не "Наши". Не "Советские войска". Даже не "Красная армия".

Русские.

Такую фразу мог себе позволить какой-нибудь учитель истории где-нибудь в Австралии или в Сальвадоре, рассказывая ученикам про события Второй Мировой: "С 1941-го по 1945-й русские воевали с немцами. В Сталинграде осенью 1942-го русские переправлялись через Волгу..." Это было бы уместно, т.к. для них мы все русские.

Но чтобы так позволил себе сказать русский человек, живущий в бывшем СССР, чьи отцы, деды и прадеды своей кровь заплатили за его жизнь?!!! Не может нормальный русский так сказать. Воевал тогда Советский Союз. Сражались и умирали люди многих национальностей. Индеец из джунглей Сальвадора может сказать про них "русские". А мы должны говорить "наши". Это наши переправлялись через Волгу. Это наши отстояли Сталинград. Это наши победили в Великой Отечественной!

А эта оговорка Бондарчука все расставляет по своим местам. Поскольку это и не оговорка. Это предательство.

Резюмирую. Данный фильм еще раз напоминает о том, что СССР был побежден в Холодной Войне. И даже через двадцать лет после поражения, здесь хозяйничают победители. Пусть не своими руками, а руками своих прихвостней вроде Федора Бондарчука. И фильм этот, будучи явно антисоветским и антироссийским, еще один плевок победителей в души побежденных. Причем, что самое подлое, сделанный одним из побежденных.

вторник, 24 декабря 2013 г.

[life.photo] Ссылки на англоязычные обзоры Nikon Df

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

Обзор Кена Роквелла. Хвалебный. Впрочем, по-моему, данный товарищ либо скатывается временами в неадекват, либо же просто публикует проплаченные обзоры. Подчеркну, что это мое личное мнение, но сам я поправку "на ветер" в случае Роквелла делаю обязательно.

Большой и всесторонний обзор Зома Хогана (Thom Hogan).

Не такой большой и, в основном, негативный отзыв Минг Зейна (Ming Thien).

Имхо, эти обзоры подтверждают мое собственное впечатление. Nikon мог бы сделать правильный ход, создав новую камеру на базе 16Mpx матрицы от D4. Но он все испортил создав какой-то странный и непонятно на кого расчитанный гибрид олд-скул дизайна и современной начинки. Как по мне, фотолюбители (а камера явно не профессиональная), делятся на простые категории: богатые (которые покупают Leica); небогатые, но с претензиями (которые раскупают Fuji X100/X100S); прагматичные и требовательные (пользователи цифрозеркалок и беззеркалок Nikon/Cannon/Pentax/Olympus/Sony и т.д.); все остальные (которые пользуются цифромыльницами и камерофонами).

Такое впечатление, что Nikon хотела попасть в категорию пользователей "с претензией", но не имеющих денег на Leica. И которым аппарат с внешним видом Nikon Df нужен как солидно и красиво выглядящий аксессуар. А не как камера для активного использования.

Мне же остается пожалеть, что Nikon вместо Df не сделал адекватную замену для D700. Мне не нужен D800E с его 36Mpx. Но вот 16Mpx в том же корпусе с теми же контролами и настройками, да по цене ровно между D610 и D800 -- вот это было бы самое то.

Кроме того, похоже, уже очевидно, что гонка мегапикселей должна закончится. Для большинства пользователей, подозреваю, даже 24Mpx -- уже слишком много. Так что пора производителям переходить к эволюционному развитию своих камер. Например, оставляя внешний вид и базовую функциональность неизменной, но обновляя начинку: устанавливая лучший сенсор, новый, более быстрый процессор, добавляя какие-то средства для первичной обработки и публикации фотографий и т.д.

PS. И таки да, DX формат в ближайшие годы никуда не уйдет :)

[prog.c++] GCC под Windows: удивлен скоростью работы std::mutex/std::condition_variable

В стандартную C++11 входят базовые средства для поддержки многопоточности: std::thread, std::mutex и std::condition_variable (подробнее см.здесь). Но т.к. под Windows я пока пользуюсь MSVS2010, где эти штуки не реализованы, то единственный доступный вариант для работы с std::thread -- GCC, благо в версии 4.8.* это все уже есть (может были и в более ранних, я не исследовал этот вопрос, т.к. имел возможность сразу взять 4.8).

В случае GCC под Linux-ом никаких проблем с использованием thread из C++11 нет. Там все работает с максимальной скоростью. А вот под Windows с использованием GCC все гораздо хуже.

Я использую не родной вариант MinGW, а его порты: TDM-GCC и MinGW-w64. В них реализация std::thread под Windows доступна. При этом для MinGW-w64 есть два варианта: win-thread и posix-thread, так вот std::thread работает только в варианте posix-thread.

Проблемы с производительностью проявились на небольшом синтетическом тесте, который я использовал для своих экспериментов. В начале в тесте использовалась библиотека ACE, но затем захотелось попробовать std::thread.

Исходный текст теста приведен в конце поста под катом. Самое важное, что хоть там и используется очередь сообщений, в которой std::mutex/std::condition_variable задействованны для обеспечения thread safety очереди, но вся работа происходит на одной рабочей нити. Т.е. фактически этот тест показывает накладные расходы на работу внутренностей очереди (и, в том числе, накладные расходы std::mutex).

Так вот под MinGW (как в варианте TDM-GCC, так и MinGW-w64) тест показывает скорость приблизительно в 330K сообщений в секунду. Тогда как вариант с ACE показывал около 6.8M сообщений в секунду. Самое смешное, что тот же тест с использованием std::thread на Linux под управлением виртуалки так же оказывался значительно быстрее: порядка 5.2M сообщений в секунду. Под виртуалкой!

Вероятно, дело в реализации std::thread в libc++, которая идет с этими вариантами GCC. Подозреваю, что она базируется на коде для POSIX Threads, а сами POSIX Threads имитируются через WinAPI. Отсюда и такая низкая производительность. Причем, забавно, тот же тест под Cygwin GCC работает чуть быстрее -- порядка 1.3M msg/sec. Но все равно это далеко от производительности кода, который напрямую использует WinAPI.

В поисках других сборок GCC под Windows нашел еще один интересный дистрибутив: nuwem-mingw. В его основе лежит WinGW-w64, но с win-threads вместо posix-threads. Поэтому в чистом виде мой тест на сборке nuwem-mingw не проверишь. Зато в nuwem-mingw включено еще много чего, в том числе и скомпилированный вариант Boost-1.55. Это дало возможность адаптировать код теста под Boost и проверить его скорость. Результат получился таким же, как и с ACE: около 6.8M msg/sec.

Вот такие дела. Все проверялось на 2-х ядерном Pentium 1.4GHz, 4Gb RAM, Win7 64bit. Версии GCC во всех случаях были 4.8.2, тест собирался в 64-битовом режиме.

Update. Скомпилированный в режиме x86_amd64 компилятором из MSVC2013 Express показывает результат в два раза худший, чем nuwem-mingw с Boost-ом: порядка 3.5M msg/sec.

PS. Кстати, еще один интересный момент. У меня есть два варианта TDM-GCC: основной 64-битовый и точно такой же, но 32-битовый. Так вот 32-х битовый вариант оказался компилировать тест указав, что не знает функцию std::stoul. Хотя точно такой же 64-битовый TDM-GCC собрал код без проблем. На эту же функцию ругнулся и GCC из Cygwin-а. Все остальные варианты, включая GCC на Linux-е, успешно std::stoul проглотили. В общем, C++ скоро четвертый десяток разменяет, а приключения все те же :)

PPS. В Boost-е обнаружились такие нужные мне сейчас вещи, как spin-lock-и и lock-free очереди. Как бы я не превратился со временем в пользователя Boost-а :) Кстати, кто-нибудь проверял масштабируемость таймеров в Boost.Asio? Можно там создавать таймера в количестве тысяч/десятков тысяч штук?

воскресенье, 22 декабря 2013 г.

[blog] Happy Birthday My Blog - 5!

Ну вот и первый маленький юбилей моего блога: пятилетие.

Нельзя сказать, что время прошло незаметно. И что первую запись я писал чуть ли не вчера. Нет. Как будто позавчера :)

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

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

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

Тем приятнее сталкиваться с интересом людей к моей писанине. Например, самыми теплыми впечатлениями от двух последних дартс-турниров были вовсе не достигнутые спортивные результаты. А то, что несколько человек при личной встрече сказали, что с удовольствием читают мои заметки. Интернет, вообще-то, очень анонимная штука. И когда случается такое в реале, то это непривычно. Возникает ощущение ответственности :) Одно дело получать комментарии от неизвестных мне людей под незнакомыми никами. Другое дело встретиться с читателем лицом к лицу. Начинаешь понимать, что марку-то нужно держать, нельзя скатываться в халтуру.

Ну да ладно. Вернусь к пяти годам. Большой срок. Старые читатели могли проследить по блогу важные изменения в моей жизни. Так, серьезно заниматься дартсом и фотографией я начал уже будучи блоггером "со стажем". И, полагаю, мои заметки в хронологическом порядке позволяют отследить прогресс на этих поприщах. Ну или отсутствие такового :)

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

Ну и, конечно, читатели могли наблюдать такой крутой перелом в моей жизни, как вынужденный уход из Интервэйла. Где, да простят мне мое бахвальство, я был одним из тех людей, кто выстраивал компанию с самого-самого начала (особенно, если говорить про Интервэйл-Гомель). До сих пор нахожусь в переходной стадии и в поиске своего места вне Интервэйл. И, судя по всему, это еще не скоро закончится. Впрочем, это так же совсем другая история.

Так что, если оглянуться назад, пять лет -- это очень немалый срок. Я рад, что у меня это получилось. И приятно осознавать, что еще полно сил и желания продолжать ведение блога. Чем собираюсь заниматься и дальше. Так что не переключайтесь! ;)

В завершение хочу искренне поблагодарить всех своих читателей. В особенности тех, кто подписался на блог (через RSS или Google+). И еще больше тех, кто находит время и желание оставлять комментарии к моим заметкам. Честно скажу, без вас я бы давно забросил это занятие. Так что огромное вам всем спасибо!