29 December 2011

Итоги 2011: личные и не очень

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

Итак, год 2011-й, как это было, поехали!

#1. Главное событие года -- в сакральном для каждого программиста возрасте 0x20 (одинэсники и пэхапэшники не знают что это) я стал папой
Наверное, не буду писать лишних слов по этому поводу, отмечу только вот что. 
Раньше я очень часто слышал от более опытных товарищей, родителей и всяких других людей какое-то странное многозначительное укорительно-назидательное "ничего! вот когда у тебя у самого будут дети, вот тогда ты всё поймешь!...". Сейчас у меня за плечами относительно небольшой срок отцовства, всего четыре месяца, но могу сказать, что наверное я тупой, потому я так ничего и не понял... То, что ребенок большая ответственность, хлопоты и переживания я абсолютно прекрасно осознавал и до его появления, поэтому все те большие изменения, которые произошли в моей жизни после рождения Виталины, не стали для меня какой-то неожиданностью. 
Не знаю, может если у тебя появляется ребенок в двадцать лет, то это приносит много неожиданностей в твою жизнь, но после тридцати, когда за плечами сильно больше опыта взрослой жизни, смотришь на это несколько иначе.

27 December 2011

"Эффект айпэда"

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


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

26 December 2011

C++11 умные указатели

Сначала было слово. В смысле, сначала был один единственный умный указатель, просочившийся в стандарт 98-го года -- злополучный std::auto_ptr

Сегодня даже дети знают, насколько это неудачное было решение.
Если говорить коротко, то суть проблемы auto_ptr описывается так: для этого типа разрешено копирование, которое несет в себе серьезный побочный side effect.

Если вы не ищете приключений себе на задницу, никогда так не делаете -- если вы разрешаете для какого-то типа копирование (а как показывает практика, таких типов у вас в программе вряд ли будет сильно больше 5% от общего числа типов), то это копирование должно всегда порождать абсолютно эквивалентную копию. Почему? Да просто потому, что копирование может произойти случайно (забыли & добавить) или не совсем явным образом (как для поля в составе другого типа, для которого копирование разрешено).




По мнению гугловского поиска по картинкам -- умный указатель выглядит примерно так

Потом появились умные указатели в boost, где на смену auto_ptr пришло два новых типа -- scoped_ptr и shared_ptr (на самом деле там их больше, но сейчас мы не будет останавливаться на всяких weak_ptr).

Тип scoped_ptr -- это auto_ptr, для которого запрещено копирование. Вот так вот, просто и понятно.

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

Теперь имеем новый стандарт языка, C++11, в который перекочевал shared_ptr, но вот scoped_ptr почему-то заменили на unique_ptr.

Что такое unique_ptr и чем он отличается от scoped_ptr?

Как мы знаем, в новом стандарте языка у типов, наравне с понятием copyable/non-copyable, появилось новое свойство -- movable/non-movable. Т.е. тип можно быть не копируемым, но при этом поддерживать move семантику. Так вот, unique_ptr это scoped_ptr, который стал movable. Т.е. в тех местах, где вы действительно можете безопасно применить разрушающее копирование (пример -- вернуть такой указатель из функции), вы теперь можете это делать. А еще вы наконец-то можете хранить такие указатели в контейнерах, правда, наверное, использовать для этого что-то вроде Boost Pointer Container было бы удобнее.

На этом, наверное, все, сделаю только еще одно замечание насчет shared_ptr. 
Из моего личного опыта, использование этого указателя на практике можно свести к минимуму, т.к. обычно он нужен либо в копируемых типах (которые, как я уже писал выше, встречаются на практике довольно редко), либо в ситуациях со сложным отношениям владения, когда один объект хранится во множестве точек, время жизни которых подчиняется сложным правилам и определяется уже во время выполнения.

Злоупотребление shared_ptr часто вытекает из функций, которые в качестве своего результата возвращают указатель на созданный внутри себя объект, т.е. передают его во владение наружу. Возвращать при этом auto_ptr не хорошо (просто потому, что auto_ptr в принципе нехорошо использовать, а в новом стандарте он вообще стал depricated). Тип scoped_ptr не вернешь, потому что он некопируемый, поэтому остается два варианта -- либо shared_ptr либо голый указатель.

Возвращать shared_ptr плохо, потому что это как раз и приводит к его ненужному расползанию по программе, т.к. очень часто вызывающая сторона с большим удовольствием сохранила бы полученный указатель в scoped_ptr (на стеке или в поле объекта).

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

Вот теперь все. 
Что еще почитать по теме:


Мудозвоны, писавшие стандарт 98-го года не только засунули туда auto_ptr, но и допустили массу других, не менее очевидных косяков и ляпов.
К нем относится и послабление для сложности метода size() для связанного списка. Его рекомендуют (но не обязывают!), делать со сложностью O(1). Ну и, конечно же, нашлись другие мудаки, которые таки да, реализовали его с линейной сложностью через distance(begin(), end()).

Суть проблемы очевидна. Если у вас нет возможность реализовать что-то эффективным образом, то надо сделать так, чтобы пользователь библиотеки случайно не понаписывал кучу плохо работающего кода. Именно поэтому у нас нет метода push_front() для вектора. И нет математических операторов для итераторов без поддержки случайного доступа. Потому что это все грабеля, которые только и ждут своего часа. 

Речь, на самом деле, не идет о том, должен ли быть list::size() O(1) или O(n). Если вы считаете, что эффективный splice() сильно важнее размера контейнера -- ради бога, делайте!... Просто метод определения размера тогда, блядь, должен называться не size(), а count_size(). Ну это же очевидно! 

В новом стандарте, кстати, это момент исправили. Метод size() теперь обязательно должен иметь постоянную сложность. И точка. 

22 December 2011

Журналюга

По наводке вождя и учителя, товарища Вильянова, прочитал книжку "Журналюга" пера Виктора Левашова. Что имею сказать.


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

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

Итого -- оценку 5/10 можно поставить с натяжкой. Очень противоречивая книга, которую, увы, вряд ли смело порекомендуешь прочитать другим.

зы. "Чуму" Камю бросил посредине. Или это какое-то гавно редкой унылости, или просто я дэбил.
Дать последний шанс Пелевину? "t" и "воду" бросил читать посередине...

21 December 2011

Будущее здесь, в 88-м

Посмотрел вчера на ютубе крайне занятное видео -- как Стив Джобс, царство ему небесное, в далеком октябре 1988-го года рассказывал о компьютерах NeXT и их чудесной операционной системе (начало презентации, начало демонстрационной части).


Уже на момент этой презентации у Джобса были очень серьезные проблемы с его грандиозным проектом -- ОС и железо так и не были готовы к продажам, горели все сроки, железки получались запредельно дорогими, заканчивались деньги инвесторов... И вообще, весь проект NeXT это такой "Титаник" от IT, которому просто сильнее повезло, и после столкновения с айсбергом под названием "жестокая реальность" у экипажа оказалось достаточно времени и спасательных шлюпок для того, чтобы догрести до корабля с надписью "Apple" на борту, который, правда, и сам в тот момент был готов вот-вот пойти ко дну... Но речь сейчас не об этом -- хочется поделиться некоторым соображениями от увиденного.

Первое -- звание visionary man Джобс получил совершенно заслуженно. В далеком 88-м он говорил о том, что мир персональных компьютеров пережил две революции -- революции электронных таблиц и текстового процессора (издательство в ПК). Третья революция -- это организация совместной работы и общения посредством Сети.
Слова Internet, HTTP и браузер, конечно, не были произнесены. Но были показаны rich e-mail и веб-сервисы, вроде словаря или библиотеки, с которым происходило общение не через браузер, а через специально написанные клиенты.

С другой стороны, понимание, столь ясное и раннее, того, что Сеть будет главным направлением как минимум в 90-х, увы, не подвигло Джобса на работу в области веб-сервисов, ибо когда Джобс рассказывает в 88-м году о совместной работе у меня, в 2011-м, перед глазами возникает не почта с документами в атаче, а, например, Google Docs... Как мы знаем, Стив крайне нелицеприятно отзывался и об Android, который есть якобы сворованные из iOS идеи, и о множестве сервисов Google, включая тебе же Docs, но давайте посмотрим правде в глаза: нынешнюю эпоху Сети делает Google, с сервисами, вроде поиска, gmail или youtube, а Apple сильно отстает, представив только в этом году iOS 5 с какими-то попытками наверстать упущенное в этой области.

Второе -- Джобс очень часто и много ошибался.
Например, в 88-м он рассказывал о том, что звук это следующая "большая штука", которая пришла в персональные компьютеры, и показывал как удобно, отправляя кому-то по e-mail финансовый отчет, приатачить к нему звуковую запись с рассказом о том, что именно мы видим в полученных циферках. Кто-то сегодня пишет голосом послания и посылает их по e-mail?
Более свежие примеры -- facepalm facetime. Про него сегодня хоть кто-то вообще вспоминает? И Siri, по-моему, пойдет в ту же самую степь.


Кста, на презентации 88-го года нам показывали Interface Builder, как я понимаю, один из первых GUI дизайнеров в мире. С одной стороны, такого рода инструменты, которые прочно вошли в мир разработки и заняли свою нишу, с другой, история развивается по спирали, и значимость такого подхода с годами сильно обесценилась, ибо сегодня ничуть не менее важно иметь возможность эффективно описывать интерфейсы в текстовом виде.

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

19 December 2011

Про сам процесс

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


До момента, пока я получил в свои руки беззеркалку, я был человеком, совершенно равнодушным к фотографии (не, я не про фотографии обнаженных, щедро одаренных природой барышень). Дык, как говорится (правда, несколько по иному поводу) -- когда в руках оказывается молоток, все вокруг начинает казаться гвоздями, так вот, NEX-3 оказался довольно интересным инструментом, который вызвал желание его изучить и начать активно использовать. 
В голове определенно произошел сдвиг, от вчерашнего "$300 за фотик это дорого", до "$300 за объектив? да почти даром!". 
В широком семейном кругу за мой уже закрепилась слава фотографа, и меня начинают зазывать на всякие мероприятия, потому что хотят поиметь фотки...

17 December 2011

Турецкий пословиц

Иллюстрация к древней турецкой пословице: злой моська и жираф на пальма загонит.

15 December 2011

cppcheck

I.

В большом материале про новый стандарт C++ я написал, что самый главный источник всех undefined behaviour в нашем проекте -- непроинициализированное в конструкторе поле класса (обычно типа bool). Суть этой проблемы ясна -- человеку свойственно ошибаться, а разрыв объявления переменной и ее инициализации (зачастую, эти точки вообще находятся в разных файлах) сильно способствует выявлению этого свойства бренного человеческого тела.

Компиляторы, с которыми мы в данный момент работаем, по поводу этой ситуации, тривиально выявляемой машиной, молчат как рыба об лед. Стали копать в сторону статических анализаторов. Сначала я решил попробовать нереально распиаренную на хабре (ваши волосы на ногах станут на 50% шелковистее!) PVS-Studio


Блевотина и гей атрибутика как бэ намекают нам 

Тут все не заладилось с самого начала. При установке триальной версии, софтина каким-то волшебным образом обнаружила фантомную инсталляцию MSVS 2008 (которая была давно полностью деинсталлирована) и попыталась в нее "интегрироваться". Закончилось это все банальным зависоном, а сам инсталлятор пришлось просто прибить.

10 December 2011

В продолжении мысли

Собственно указанные в прошлом материале две цифры -- 25% и 50% полученные чисто математическим путем абсолютно точно коррелируют с реальным положением вещей.

Поддержка ПЖиВ в столице точно такая же, как и Питере, просто там подкручивали сильно меньше.

07 December 2011

Анализируй это

Добрые люди выложили в сеть данные с сайта ЦИК в csv формате (тыц). Я решил тряхнуть стариной, взял в руки питон, и посмотрел на картину поддержки партии жуликов и воров по Москве и Питеру.

Картина получилась следующая:

Москва 

Питер

По горизонтали -- количество процентов, которые получила в свою поддержку ПЖиВ. 
По вертикали, на первом графике -- процент УИК с указанным уровнем поддержки, на втором -- средняя явка на УИК с указанным уровнем поддержки. 

Выводы не будут оригинальными, их уже сто раз озвучивали до меня, и они отлично согласуются с количеством сигналов о фальсификациях в столице России... Ну не может в рамках одного города (пусть даже и такого большого, как Москва) явка так точно коррелировать с количеством проголосовавших за партию власти. Я не верю в такие совпадения. 

Для обоих городов на первых гистограммах видны два пика, в районах ~25% и ~50%. Первый пик -- данные из ЦИК, в которых не было подкруток. Второй пик -- фальсификации. Соответственно, можете оценить, насколько более масштабны были фальсификации в Москве по сравнении с тем же Питером.  

Как-то так. 

Интересная статья на тему "выборы и статистика" -- http://esquire.ru/elections
Один из бесчисленных материалов с анализом -- http://shipilev.livejournal.com/95401.html

06 December 2011

О демократии

У соседей прошли выборы в Думу.

Власть, не моргнув глазом, пририсовала себе где-то в полтора раза больше голосов, чем они получили на самом деле. Честный результат, судя по статистическим выкладкам, где-то порядка 35% -- это все, что жулики и воры смогли выжать, используя админ ресурс и имея абсолютную монополию в области классических СМИ, вроде телевидения.

Цинизм, с которым были нарисованы итоговые 50% очень впечатляет -- цифры из протоколов были тупо проигнорированы и на сайте ЦИК, не сильно парясь, просто показали "нужный результат"; я видел в Сети неоспоримые свидетельства десятков подобных случаев, причем некоторые из них рассказаны людьми, которых я знаю не первый год. О чем тут вообще говорить, если на ТВ показывают ведущих, на фоне явки в 120%?
Каганов вообще рассказал анекдотическую историю, когда человек проголосовал за "Яблоко", полез на сайт ЦИК, а там по его участку за "Яблоко" нет вообще ни одного голоса! Блин, это было бы очень смешно, если б не было так грустно.


Мораль?

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

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

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

В России нет внятной, хорошо организованной оппозиции. И задумайтесь, может быть ее нет просто потому, что на нее нет реального спроса со стороны общества. С нефтью все в порядке, цена хорошая, объемы экспорта греют душу. Народ сытый да обутый, благосостояние из года в год растет. На что жаловаться?... Ну да, власть зажралась, прибрала к рукам весь крупный бизнес, национальное достояние растаскали по личным карманам. Да, воруют. Да, коррупция. Но лично тебе, %username%, разве лично тебе так уж и плохо живется? Зачем тебе нестабильность и смута, если ты сейчас, в принципе, живешь не плохо? Лучше синица в руках, да хата с краю!...

***

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

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

Сегодня я вообще, грешным делом, думаю о том, что в президенты надо было выбирать Ющенко на второй срок. Тигипко совершенно внезапно оказался тем еще Иудой и пидарасом, а больше там и выбрать было не из кого. Ну а пасечнику можно было бы простить его невинные игры в вышиванки да любовь к Мазепе. Главное, что этот человек всегда с уважением относился к законам этой страны и никогда не давил на прессу. Ну а легкая форма украинского национализма головного мозга -- детский лепет на фоне того, что следующие выборы в моей стране, увы, могут пройти по российскому сценарию. 

Skill vs Will II

Пара слов о поединке Котто vs Маргарито II.


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

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

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

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

02 December 2011

Всякая всячина

#1. Многозадачность в iOS драли с Windows Mobile.
И не спешите возмущаться!... По "крестику" приложения не закрывались, а сворачивались. В случае нехватки ресурсов система сама прибивала те приложения, с которыми вы давно не работали. Клик на ярлык приложения перекидывал вас к запущенной программе, если таковая имелась.
Скажу больше, в плане минимализма WM была даже впереди iOS -- очень долгое время там вообще не было диспетчера задач.



#2. Ребятам, которые колдуют сейчас над Qt5, сильно сдвигая фокус от C++ к JavaScript, я советую задуматься. Посмотрите на ренессанс C++ в Microsoft, а ведь эти ребята последнее десятилетие были просто одержимы managed кодом... Как бы и вам потом не пришлось откатывать назад некоторые свои решения.

#3. Проблема помойки и рассадника венерических болезней, под названием Android Market, решается тривиально, причем к обоюдному удовольствию всех трех сторон -- Google, разработчиков и пользователей.
Все, что надо сделать -- ввести программу платной сертификации.
Разработчик платит деньги за волшебную плашку "проверено! вирусов нет! продукт высшего качества". Работники Google проверяют качество софта, их зарплата идет из кармана разработчиков. Ну и пользователи, которые могут в магазине нажать чудо галочку "только сертифицированные" и рыться только среди гарантированно качественного софта.
Все довольны.

#4. Честного свопа, по-моему, в iOS нет.
Он, в принципе, и не сильно нужен. Большую часть памяти занимает графика.
Если за текстурой гарантировано стоит read-only файл на диске, то хэндл этой текстуры может вести себя следующим образом -- память, занимаемую текстурой, всегда можно освободить, а потом вернуть в RAM при первой же попытке доступа к ней.
Судя по всему, нечто подобное в iOS и реализовано.

#5. Тут могла быть ваша реклама.
Просто четыре -- некрасивое число, почти как 13.