понедельник, сентября 29, 2008

Boost на русском


Я уже писал как сложно найти русскую документацию по библиотекам boost для c++. Для удобства я решил собрать всё краткие введения в различные библиотеки этого пакета на русском, найденные в рунете, которые показались мне более-менее полезными, чтобы получить общее представление о конкретной библиотеке. Дальнейшее изучение возможностей этих библиотек всё равно требует чтения документации на английском.
Итак:


  • Boost Smart pointers. Умные указатели, Boost::Shared_ptr, Boost::Weak_ptr, Boost::Intrusive_ptr.
  • Boost::Multi_index - улучшенный вариант контейнеров STL.
  • Boost::Spirit - библиотека для создания парсеров. Пример использования Spirit 2.
  • Boost::Regex - использование регулярных выражений в С++. Ещё одно введение в библиотеку - Boost это просто. Часть 1. Boost.Regex на хабре.
  • Boost::Xpressive - альтернатива Boost::Regex. Также работа с регулярными выражениями. Это описание и 4 предыдущих найдены на блоге Alno’s Blog: C++, Java и Rails
  • Boost::any - обобщенный контейнер, позволяющий хранить разнородные данные в одном и том же объекте.
  • Boost::Asio - для создания кроссплатформенного кода для работы с сетью. Это из блога Alex Ott’а. Еще нашёл перевод туториала по boost::asio
  • Boost::threads - библиотека для работы с потоками. Это перевод статьи первого автора этой библиотеки Уильяма Кемпфа в виде PDF. Статья старая, 2002 г, с тех пор библиотека была почти полностью переписана, хотя внешние интерфейсы изменились не сильно, так что общее представление из статьи получить всё ещё можно. 
  • Boost.DateTime - Библиотека по работе со временем.
  • На сайте sources.ru выложена кое-какая документация по библиотекам: smart_ptr, bind (работа с функторами и предикатами в алгоритмах), function (работа с указателями на функции), signal (для реализации паттернов «Команда» или «Действие» из книги банды четырёх), lexical_cast(преобразование любых типов в строки и из строк в любой тип).
  • Ещё несколько достаточно кривых введений в библиотеки boost есть на сайте solarix.ru. В частности кое-что про lexical_cast, format (форматирование строк, замена printf), regex(регулярные выражения), tokenizer (разбор строк на лексемы), и еще несколько. Но перевод ужасный. Правда есть примеры, из которых кое-что можно понять.
  • В википедии есть примеры по библиотекам uBLAS (линейная алгебра для матриц и векоров),random (генерация псевдослучайных чисел), Spirit (про него выше уже есть ссылка, в которой всё расписано более подробно), Regex, Graph (алгоритмы на графах).
  • И наконец мой собственный перевод документации Boost::test для юнит тестирования .
Вот пока всё, что я нашёл. Найду ещё что-то, добавлю.

среда, сентября 24, 2008

Программы для ведения рабочих заметок.


В ходе обычной программистской работы всегда бывает необходимость делать какие-то краткие заметки, рисунки, схемы, названия функций. Можно их рисовать в обычном блокноте (о сколько их я покрыл никому включая меня не понятными закорючками…). Можно использовать различные программы - иногда это более оправдано, в виду возможностей поиска и какой-никакой, а структуризации.
Чтение http://stackoverflow.com/ вдохновило меня как-то структуризовать возможные решения:
  • Программы для рисования Mind maps - я в последний год пользуюсь FreeMind’ом и не жалею, очень удобно разбираться в какой-то проблеме, рисуя всё более разрастающееся дерево, причём ненужные в данный момент ветви просто скрываются, а когда появляется в них нужда - раскрываются обратно.
  • OneNote - тоже весьма полезная вещь. Найденные статьи по какой-либо теме засовываются туда, причём поскольку OneNote сам добавляет ссылку на источник, всегда можно понять откуда что взялось. Да и маленькие схемки от руки там удобно рисовать.
  • Google Notebook - если нужны записи, которыми можно воспользоваться отовсюду, где есть интернет.
  • EverNote - альтернатива OneNote с возможностью синхронизовать записи на разных устройствах с помощью интернета.
  • TreePad - программа для ведения записей. Минус - её платность.
  • Всё же использовать бумажный блокнот, но структуризовать информацию в нём, например так: для одного проекта - один блокнот, на каждой странице - дата начала записей на этой странице и номер страницы. Если через несколько дней что-то ещё на неё добавляется - отчёркивается линия и пишется сегодняшняя дата. Если на странице осуществлялось что-то типа записей мозгового штурма с вариантами решения какой-то задачи, а затем было выбрано одно из них, то оно каким-то образом выделяется (галочкой, маркером, подчёркиванием), и ставится ссылка на страницу, на которой пишется, почему именно эта альтернатива была выбрана. Для отсылок на другие записи пишется что-то типа “См. стр. 13″, или если это находится в другом блокноте - “См. стр. 23, проект Альфа”.
  • Начать блог. Например вести записи по проекту в приватном режиме в ЖЖ. Вариант - wiki. К примеру http://www.tiddlywiki.com/ Можно даже сделать себе блокнот в стиле wiki на локальной машине без установки сервера - см. ScrewTurn Wiki - Desktop Edition
  • Emacs Org-Mode. Не разбирался, но похоже тоже система для ведения записей обо всём, To-Do lists, GTD, и т.п.
  • Дерево папок с текстовыми файлами. Корень - проект, дальше - какие-то задачи, листья - файлы. По мне так не слишком удобно. Типа:
    admin\
    important-stuff.doc
    development-log.doc
    development\
    projects\
    proj1\
    overview.doc

    proj2
    reference\
    some-topic.doc
  • Какая-нибудь система на основе google docs - всё ж таки расшаренные документы иногда очень полезны. Вариант - писать заметки в gmail’е и отправлять их себе же. Поскольку там есть поиск и можно присвоить разные таги - иногда тоже сгодится.
P.S. Подсказали ещё один сервис - npj.ru - блог и wiki в одном флаконе c возможностью хранить версии своих документов. Судя по описанию на сайте - тоже должно быть интересно. Можно пользоваться либо их сайтом, либо скачать у них дистибутив и установить на собственный сайт.

P.P.S. На сегодняшний день (март 2010) я реально использую персональную online wiki (Google sites), evernote (туда скидываются найденные статьи), FreeMind. Иногда на работе OneNote.

среда, сентября 17, 2008

Интересный сервис вопросов и ответов для программистов


Обнаружил недавно новый англоязычный стартап - сервис вопросов и ответов для программистов StackOverflow. Напоминает по структуре какой-нибудь digg или reddit, только создан исключительно для программистов. Сервис продвигают несколько западных top-IT блогов, таких как Joel on Software и Coding Horror, у каждого из которых количество подписчиков в районе десятков тысяч. Так что быстрый старт стартапу я думаю обеспечен.

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



Примеры вопросов и ответов:

среда, сентября 10, 2008

Хорошо быть программистом


Автор сайта Inside C++ проводил исследования юмора в ИТ-компаниях. Послал в 14 компаний резюме на "албанском". Самое интересное, что 4 компании ответили более-менее адекватно, предложив побеседовать поподробнее. Так что для мира всё ещё остаётся надежда… Мало для какой другой специальности такое бы проканало, IMHO. А тут у HR-ов видимо всё же есть надежда заполучить гениального фрика, как в кино.
Подробнее вся история тут: http://insidecpp.ru/art/31/
Само резюме:


Ф.И.О. Задруйко Федор Сиргейевич (можно просто Кросавчег)
Майо мыло тут была почта
Йезыги программированийа Превед++ 
C++ (харашо знайу бузд!) 
Шарп типа 
ВэБэ 
Дэлфи (ацтой, но тоже знаю)
Прочайа хрень WinAPI 
WTL 
MFC (фууу!) 
DirectX 10 
OpenGL 2.0 
Oracle 
MSSQL 
MySQL 
.NET Framework 1.1 / 2.0 / 3.0 
ASP.NET 
Многа девелопел в kernel-mode 
Всякая там вебовская херня, пхп там, перл, хтмл, ну и таг далейе
Инастранныйе йезыги Олбанский на уравни наситиля
А сибе Сирьезен, испалнителен, умен, талантлиф. Адним словам — мужчина хоть куда, фполнам расцвети сил
Савсем забыл! Опыт работы:
Работал в Sun Microsystems — уволилсо, нипанравилась парамушта там никто низнаит C++ :-(
Патом долга работал в Микрософте, но оттуда тоже уволился, патамушта просто надоело. Хочеццо чиво-нибудь свежынькава. Собсна паэтаму и исчу работу.
Жду вашева атвета — пешыте на майо мыло. 

пятница, сентября 05, 2008

Использование библиотек из Boost Libraries в своих проектах


В прошлом посте про юнит тестирование на С++ я упомянул про фреймворк boost::test. Сейчас активно с ним играюсь, пытаюсь найти всю возможную информацию про него и вообще про boost в целом. Как оказалось, информации на русском в сети очень мало - какие-то обрывки переводов документации здесь и это почти всё. Хуже того, и в офлайне с книгами тоже всё плохо. Есть книжка про Boost Graph Library из серии “Библиотека программиста”. Но это всего лишь об одной библиотеке из почти сотни. Наверное, есть главы с кратким описанием библиотеки в толстых книгах про шаблоны С++, хотя не уверен. Так что без чтения документации на английском видимо никак не обойтись.

На английском есть книга Beyond the C++ Standard Library: An Introduction to Boost. Я точно знаю, что где-то есть её электронные копии, но пока их не нашёл. Так что пока основной источник знаний для меня - документация с сайта www.boost.org, благо она достаточно неплохая, её по крайней мере в отличие от MSDN читать можно. Я скачал последнюю версию boost’а - 1.36.0, весит правда немало - zip файл порядка 55 Мб.

Чтобы построить бинарные файлы из исходников нужно ещё отдельно скачать утилиту Boost Jam оттуда же с сайта. В принципе для очень многих библиотек никаких бинарных файлов и вовсе не нужно - чтобы их использовать достаточно вставить  в свой проект строчку типа

#include <boost/SOME_LIB.hpp>


и всё. Но некоторые библиотеки, например boost::regex для встраивания перлообразных регулярных выражений в C++ код всё же требуют бинарных .lib файлов. Кроме того, в поставку boost’а входят исходники несколько утилит, которые компилируются также при помощи Boost Jam (bjam.exe).


В частности есть весьма полезная утилитка bcp. Если не хочется включать в проект все исходники Boost’а для всех возможных библиотек (а их ОЧЕНЬ много), с помощью этой утилиты можно выдрать только необходимые. Я наткнулся на неё благодаря этой статье в блоге Alex Ott’а.


То есть если нужны, к примеру, только unit test’ы, то при помощи команды:


> bcp boost/test/unit_test.hpp c:\tmp\boost_test


мы получим в каталоге c:\tmp\boost_test всё, что нужно для фреймворка для юнит тестирования. Остаётся включить полученное в свой проект и можно вовсю “экстремально программировать” :)


Что почитать ещё:
P.S. Подсказали, где в сети лежит Beyond the C++ Standard Library: An Introduction to Boost.

четверг, сентября 04, 2008

Unit testing для языка програмирования C++


Новые браузеры и web 2.0 сервисы - это конечно хорошо, но что то давно я не писал чего-нибудь жостко программистского… А между тем зря, поскольку, как известно, учить кого-то чему-то - это лучший способ научиться этому самому.

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

Подход этот получил распространение в рамках методики "экстремального программирования" (одна из основных вещей для этой методики - как раз test driven development, "разработка через тестирование"). Согласно этому подходу разработчики перед тем как написать или изменить какую-либо функцию в программе должны написать новые тесты или исправить существующие для этой функциональности. Весь набор тестов выполняется каждый раз, когда в программе что-то изменилось. В этом случае все будут уверены, что при  внесении изменений ничего не сломают, а если сломают, то сразу же будет видно что и почему. За счёт этого экономится куча времени (отладка занимает гораздо меньше времени и сил).
Можно, разумеется, реализовывать такое тестирование вручную для каждого нового проекта. Но гораздо лучше пользоваться существующими библиотеками. Почти для каждого языка программирования существуют несколько библиотек (фреймворков) для выполнения unit test’ов. В частности, для C++ самыми популярными являются следующие:
  • CPPUnit - клон JUnit, фреймворка для юнит тестирования на java. Вкратце ознакомится с этим фреймворком можно например тут (на английском, скриншоты и примеры использования) или тут(русский язык!).
  • Boost::testBoost - это вообще-то коллекция независимых библиотек (их несколько десятков) для самых разных вещей - многопоточности, регулярных выражений, умных указателей, работы с графами и прочее и прочее и прочее. Многое из этой библиотеки должно войти в следующий стандарт C++ (известный как c++0x или с++09). Пишется она разными продвинутыми в c++ чуваками, многие из которых принимали участие в разработке STL (стандартной библиотеки шаблонов). Boost::test соответственно библиотека с фреймворком для unit tests. Примеры использования - например здесь.
  • TUT - маленький но ужасно гордый портабельный фреймворк для unit test’ов.  Состоит из одного заголовочного файла.
Существует ещё много подобных библиотек, с более полным списком можно ознакомиться например в википедии.

среда, сентября 03, 2008

Первые впечатления о Google Chrome


Скачал вчера вечером, успел немного потестировать. Первые впечатления - всё супер, понравилось, что он импортировал из firefox’а всё что можно, не только букмарки, но и историю посещений, пароли, настройки прокси, так что можно продолжать серфить по знакомым местам без всяких дополнительных движений.
Ну и красиво, всё таки сделано.
chrome
Ещё фишка - можно превратить некоторые часто используемые сайты, например gmail или google reader в подобие обычных desktop приложений(без дополнительных элементов интерфейса типа строки URL), и запускать их, например, из панели быстрого запуска:
googlereader
Скриншоты других возможностей Chrome и более подробный  анализ можно найти на хабре.

вторник, сентября 02, 2008

Новый браузер Google Chrome



chrome-logo
Google сегодня вечером обещает выложить свой новый браузер Chrome для скачивания. А пока они выложили комиксы про его возможности, а также технологию его разработки и архитектуру. Видимо, в Google работают любители японской манги. Надо сказать, мне такой подход нравится, всё гораздо нагляднее, чем если бы это было описано в длинном тексте.
chrome-ui
Обещают, что он будет стабильным, быстрым, безопасным, с простым интерфейсом, с открытими исходниками. Скорость, насколько я понял, будет обеспечена за счёт того, что браузер все задачи будет распараллеливать не просто в отдельных thread’ах, у каждой задачи будет свой собственный процесс. Из-за этого же обещано, что если при отрисовке страницы возникает unhandled exception (в смысле неустранимая ошибка приложения), то гибнет не весь браузер, а только одна вкладка в нём - firefox, допустим, весь закрывается в таких случаях, со всеми открытыми страницами.
chrome-multiprocess
Как в операционной системе, в Chrome будет собственный task manager, можно посмотреть какой сайт или плагин сжирает ресурсы процессора и если что прибить его.
Ещё обещано скоростное выполнение javascript’овских программ за счёт переписанной с нуля виртуальной машины со скоростной сборкой мусора.
Что касается пользовательского интерфейса, каждая вкладка будет иметь свой собственный. Еще полезная фишка - относительно приватности. Для отдельной вкладки можно включить режим инкогнито -тогда всё, что в ней происходит не будет записано в логи браузера, все куки после закрытия страницы также будут удалены.
chrome-ui2
P.S. Русский перевод комикса - часть 1часть 2. А скачать браузер можно отсюда -http://www.google.com/chrome