вторник, 28 декабря 2010 г.

моя конфигурация emacs

Опубликовал свою текущую конфигурацию emacs:

https://github.com/ai81/emacs-configuration.

Она представляет собой клон конфигурации

http://eschulte.github.com/emacs-starter-kit/

которая в свою очередь является переработкой в стиле литературного программирования конфигурации

http://github.com/technomancy/emacs-starter-kit/.

Я несколько переработал  оригинал убрав найденные конфликты, добавив свои настройки (например для erlnag) и значительно расширив поддержку C++/C -  в частности интегрирован cedet. Так же много добавлено для git.

Тестировалась на паре linux - на win требует доработки (если будет время, то сделаю). Может кому пригодится.

воскресенье, 28 ноября 2010 г.

Обзор книги "Объектно-ориентированное конструирование программных систем"

Итак это свершилось. Рубеж пройден. Самая лучшая книга по ОО-программированию изучена от корки до корки. Книга старая - автор (Бертран Мейер) писал ее в середине 90-х, а перевели ее на русский поти через 10 лет - в 2005.

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

Освещены все важные темы: АТД, типизация, наследование, исключения, универсализация (шаблоны в С++), управление памятью. Особенное место занимает Проектирование по Контракту -книга считается фундаментальным трудом на эту тему.

Часто когда я читал проскакивала мысль - как же без это штуки я живу в контексте С++?! это просто не возможно! И почему язык Eiffel (который создал Мейер и на котором написано большинство примеров из книги) так и не стал по настоящему популярным? Может быть у него были неудачные реализации? Может быть его синтаксис, напоминающий pascal, является громоздким? Может быть он закрыт? Или может просто он появился не в свое время и эта ниша была уже намертво занята такими монстрами как C++ и Java (которых поддерживали огромные корпорации). Вообще мир не справедлив.

В общем эту книгу поздно я прочитал - надо было в 2005, у лучше в 90-x на английском...

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

p.s.
Поставил среду Eiffel Studio- неплохая IDE, хотя не emacs конечно, и даже под linux x64 отлично работает. Эх, что же помешало этому языку по настоящему зажечь? Вроде же автор делал все правильно...

среда, 20 октября 2010 г.

сравнение clang и g++

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


из плюсов:
- нашел несколько ошибок, пропущенных gcc
- намного приятнее сообщения об ошибках - особенно для шаблонов

минусы:
- упал пару раз. стабильно падает при сборке одного теста (с участием boost::test)
- при линковке ошибся связав деструкторы разных классов с одинаковым именем - в итоге runtime падения
- обещанного повышения скорости компиляции нет :(
для debug сборки (-g2 -O0):

gcc 4.4.4:
real    3m38.647s
user    13m12.810s
sys     0m53.407s

clang:
real    3m42.877s
user    14m3.109s
sys     0m58.220s

качество оптимизации не проверял.
p.s.
а вот и тесты сравнения производительности:
http://www.phoronix.com/scan.php?page=article&item=llvm_gcc_dragonegg28&num=1

воскресенье, 17 октября 2010 г.

Впечатления о книге C++ Template Metaprogramming

После ознакомления с Beyond the C++ Standart Library сразу начал читать C++ Template Metaprogramming. Что хочу сказать: эта книга must read для любого уважающего себя программиста на С++ (жаль что мне она попалась так поздно).

Теперь подробности. В отличии от Beyond the C++ Standart Library книга написана намного более интересным и сложным английским языком. Это естественно можно рассматривать как плюс или минус в зависимости от уровня знания языка :).

Книга описывает метапрограммирование начиная с самых основ (что такое шаблонный метод, шаблонная функция и т.п.) и заканчивая созданием своего собственного DESL  по поддержки state machine в коде C++.

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

Есть очень полезное приложение о программирование препроцессора - есть надежда что большая часть этой черной магии будет не нужна при появлении C++0x.

Метапрограммирование является альфой и омегой библиотеки boost, а mpl - его основной библиотекой, на которой построены многие другие. Может быть mpl и не понадобится сразу в каждодневном программировании (мой случай), но знать как это все устроено и при необходимости уметь применять - просто необходимо, я считаю.

суббота, 28 августа 2010 г.

Beyond the C++ Standart Library

Почитав в очередной раз своего любимого Алекса Отта очень захотелось изучить две книги по С++, которые он рекомендует. Так как наверное всю хорошую литературу по С++ я уже успел почитать, то книги на английском по такой фундаментальной штуке как boost не могут не интересовать. Порывшись немного в интернете так и не смог найти русские варианты этих книг. зато нашел на озоне их английские оригиналы - каждый за вполне кругленькую сумму. Хм, подумалось мне, неужели меня задушит жаба и я их не прочитаю.. Но тут вспомнилось, что в нашей замечательной фирме есть библиотека! И даже эту библиотеку можно пополнять! Написав письмо с аргументами в пользу приобретения данных творений я, к моему большому восторгу, получил одобрение на их покупку. Ждать этих книг от озона пришлось с месяц, но это время было потрачено с толком: в изучении фундаментального труда Меера (и даже оболочки по Eiffel) - об этом я напишу позднее.

Итак наконец книги пришли, и я принялся за изучение первой из них: Beyond the C++ Standart Library An Introduction to Boost. Первое впечатление: простовато, и почти все мне известно. Обзор библиотек boost не добавил ничего нового - это все можно получить из электронной документации. Ладно, почитаем про те 12 библиотек, которые описаны подробно (smart pointers, conversion, utility, operators, regex, any, variant, tuple, bind, lambda, function, signals).

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

  1. Использование shared_ptr для блокировки создания объектов,не хоронящихся в самом shared_ptr - получается очень элегантно - и клиенты класса уже не могут создавать объекты на стеке, по недоразумению, например.
  2. Использование shared_ptr вместе с fclose в качестве деструктора - вот это красиво!
  3. Использование polymorphic_cast - все-таки не хочется проверять на 0 результат dynamic_cast
  4. polymorphic_downcast - оптимизация.. вот это кажется сомнительным
  5. оказывается к unsigned типу можно присвоить любой numeric тип. и не знал, что они являются особым случаем
  6. никогда не встречался и не задумывался над проблемой, которую решает checked_delete - век живи - век учись!
  7. Шаманство с перегрузкой/специализацией функций (классов) и борьба с проблемами с помощью enable_if. Наверное я слишком мало занимался шаблонным програмированием... Ну ничего! Все впереди!
  8. Оказывается отправление названия наследуемого класса в шаблон базового - это есть трюк Бартона-Некмана (Barton-Nackman). Во как.
  9. Разница между Equality и Equivalence. Вроде знаешь, а освежить никогда не лишне.
  10. использование sregex_iterator/sregex_token_iterator для работы с набором значений в строке - это кажется довольно удобным - обязательно надо будет попробовать на практике.
  11. Вывод значений из any с помощью кастомного класса any_out - очень красивый пример связи полиморфизма и шаблонных классов.
  12. Вообще к tuple у меня было несколько предвзятое отношение, так как в одном из наших проектов он использовался в одном месте кривым образом и постоянные обращения через get<3> и т.п. вызывали настоящий ужас. но тут почитав про них я узнал много нового, что даже заставило, в некотором роде, зауважать эту библиотеку: оказывается у них имеется развитая поддержка вывода в поток, большие возможности метапрограммирования и даже аналоги cdr и car из lisp. в общем с этой библиотекой можно неплохо поразвлечься при желании - так что надо найти время и переписать тот ужасный кусок в нашем проекте.
  13. Оказывается в bind можно привязываться к переменным класса. хм - и даже у меня в проекте я наткнулся на такой код. в каком же состоянии я его писал?!
  14. Вложенные bind - тут автор явно перебрал. Код ооочень быстро становится не читаемым. Только не так! Для production такие вещи не нужны.
  15. Использование labmda у меня ограничивалось только небольшими кусками. Те монстры, которые приведены в книге не внушают доверия - кажется часто проще написать функтор. Да к тому же в недрах spirit зародилась библиотека которая вроде как сделала lambda устаревшей. Но все таки окунуться в этот оазис функционального программирования в С++ очень приятно (иногда).
  16. использование function вместе с указателями на функции класса - это для меня что-то новенькое. хотя не думаю, что это используется хоть сколь-нибудь часто.
  17. описание примерной реализации function было довольно интересно

У книжки конечно есть недостатки: зачастую слишком тривиальным вещам уделяется много внимания, примеры часто довольно примитивны, не затрагиваются многие проблемы библиотек - например нет ничего про проблемы в variant при возникновении исключений во время присвоения или про signals в многопоточной среде (signals2 ау!). И конечно описывается уже несколько устаревшая версия, хотя это почти не коснулось описываемых библиотек. Но в итоге книга произвела на меня положительное впечатление: по телу раливается приятное тепло когда вычитываешь из книги что-тоновое и интересное.

вторник, 13 июля 2010 г.

Когда руководителя весь день нет

Недавно мой руководитель по работе ушел в отпуск. И вот что я заметил (уже не в первый раз) - мой КПД на работе резко пошел вверх - уж на 30-40% точно. Думаю это не связанно напрямую с личностью руководителя - человек он хороший и не устраивает постоянный прессинг, который бы совсем выбивал бы из колеи (впорчем тогда бы врят ли я смог бы так работать), но с другой стороны опредленно эффект от отсутствия/присутствия начальника на рабочем месте удивительный (для меня во всяком случае).

У нас офис в стиле open-space и как результат всех всегда видно - думаю это одна из не маловажных причин давления. Вообще будь тут компактные комнаты с небольшими коллективами все было бы намного проще и лучше. Но не судьба.

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

вторник, 29 июня 2010 г.

Знакомство с UP и RUP


Недавно закончил читать Введение в Rational Unified Process Филиппа Кратчена. Я давно интересуюсь agile подходами к разработке, но все никак не доходили руки что бы вплотную заняться ознакомлением.

До этого прочитал книгу Лармана: Применение UML 2.0 и шаблонов проектирования и она произвела на меня действительно большое впечатление: все просто и четко рассказано, отличные примеры и общая живая речь автора. В ней подробно описывается Unified Process и дано много полезных практических советов по его применению на практике. В общем конечно, было бы здорово применить его у себя в отделе, подумалось мне. Некоторые элементы UP у нас используются - например поэтапная передача продуктов на тестирование, новые витки анализа и проектирования при добавлениях новых методов, но конечно до реального UP тут еще как до луны. Но после некоторых размышлений над вопросом внедрения всплыли проблемы (впрочем, это не удивительно):

1. нет ни одного человека, насколько мне известно, в отделе кто бы хорошо был знаком с UP или RUP, а без этого пытаться что-то сделать в реальных коммерческих проектах очень рискованно - можно вообще все провалить. Приглашение эксперта со стороны видится в наших условиях несколько утопично.

2. как мне видится не все наши отделы готовы работать с таким новым подходом, а инициативы одного отдела разработки явно недостаточно.

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

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

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

среда, 23 июня 2010 г.

Сила ядер

Некоторое время назад у меня на работе произошел апгрейд рабочего компьютера. Вместо древнего pentium 4 появился Intel Core i7 920 c 6 Gb быстрой памяти на борту. Установив x64 debian я радостно стал проверять насколько быстро собираются библиотеки и мои программы. Первоначальный результат несколько обескуражил: древний boost 1.34.1 собирался более 10 минут! Моему разочарованию не было предела - ну как так - новейшее железо и все еще не может справиться с этим С++ (пусть и с шаблонами)! И тут я вспомнил, что у меня же теперь есть 4 полновесных ядра, которые надо использовать на полную катушку. HT меня в своем время капитально разочаровал, и теперь мне понятно почему. От моих новеньких ядер я вправе был ждать много большего и воистину не разочаровался:


boost 1.34.1: bjam

real 10m51.390s
user 10m8.870s
sys 0m40.031s

boost 1.34.1: bjam -j2

real 5m31.464s
user 10m12.082s
sys 0m40.831s


boost 1.34.1: bjam -j4

real 2m56.273s
user 10m33.492s
sys 0m43.655s


boost 1.34.1: bjam -j8

real 2m27.608s
user 16m33.466s
sys 1m3.984s




Ускорение почти в 5 раз по сравнению с оригинальным результатом! Воистину, закон Мура еще как-то действует! Вот еще некоторые результаты замеров:

gigabase: make

real 0m36.746s
user 0m33.082s
sys 0m3.884s

gigabase: make -j2

real 0m18.256s
user 0m32.758s
sys 0m3.848s


gigabase: make -j4

real 0m9.786s
user 0m34.278s
sys 0m4.036s

gigabase: make -j8

real 0m10.007s
user 0m48.167s
sys 0m4.488s




boost 1.41.0: bjam -j4

real 1m57.435s
user 7m3.522s
sys 0m24.334s

boost 1.41.0: bjam -j8

real 1m39.749s
user 11m4.794s
sys 0m35.562s



В итоге теперь все программы собираю исключительно с -j8 (и от HT оказался какой-то толк) заодно подправив свои настройки в emacs:

(defun my-compile-file ()
"Save all files and compile"
(interactive)
(save-some-buffers 1)
(let (temp)
(compile "make -k -j8")
)
)
(global-set-key [f7] 'my-compile-file)

вторник, 22 июня 2010 г.

Микеланджело

Недавно прочитал книгу "Муки и радости" Ирвинга Стоуна. Книга действительно огромна, как по объему так и по проведенной автором работы. Читая в отпуске эту книгу, я действительно погрузился в эти стародавние времена, когда рождалось новое искусство. Что меня действительно поразило - жизнь этого великого Художника. Его преданность работе, семье, городу и искусству. По счастливой случайности именно в это время я был в Риме и Флоренции, любуясь тамошними шедеврами. Перед одним только "Давидом" я простоял минут 20 - не меньше - абсолютно потрясающая вещь.

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

Сейчас решил почитать еще и письма и стихи Микеланджело с комментариями - после прочтения романа это действительно интересно.