If a C programmer asks "do you want to see something cool?", run away.
--John Van Enk

Wednesday, December 31, 2008

Happy New Year!!!

Новый Год уже шагает по планете и я хочу присоединиться к пожеланиям миллионов блоггеров и пожелать всем Вам счастья и удачи в Новом Году ;). Happy New Year и EXIT_SUCCESS из новогодних празднеств ;)

Wednesday, November 26, 2008

Ваш блог заблокирован за спам :(

Вот уж не думал :) зайти и увидеть такое в dashboard

Хорошо что на почту пришло извещение да и операция разблокирования заняла всего-то пару минут. Будем надеяться, что все обойдется :)

Friday, November 21, 2008

Getting Ruby Array.uniq! work for array of objects

Иногда возникает задача удалить дубликаты из массива объектов. В Ruby для решения этой задачи в классе Array есть методы uniq и uniq!. Отличие первого от второго состоит лишь в том, что второй производит in place модификацию массива, а первый возвращает результат в виде массива. Для того, чтобы эти методы работали для custom классов необходимо чтобы у классов были определены методы hash и eql?.

class TestClass

attr_reader :a, :b, :c

#Ctor

def initialize(a,b,c)
@a, @b, @c = a, b, c
end


def hash
"#@a #@b #@c".hash
end

def ==(p)
@a ==p.a and @b == p.b and @c == p.c
end

def eql?(p)
self == p
end

def to_s
"#@a,#@b,#@c"
end
end

a = []
a << TestClass.new(1,2,3)
a << TestClass.new(1,2,3)
a << TestClass.new(3,2,1)
a << TestClass.new(3,2,3)
a << TestClass.new(2,3,3)

a.uniq!

a.each do |elem|
p elem.to_s
end

Т.е. одного eql? не достаточно, как это указано в PickAxe а нужен еще и hash method который должен возвращать целое число. И чтобы я делал, если бы не USENET?

Update 20:10: тут меня коллеги попинали чуток, так что слегка изменил пример ;-). И почему мне сразу в голову не пришла мысль, что String.hash есть?

Update 25/11/2008: в ri Hash собственно нашлось объяснение :) : +Hash+ uses +key.eql?+ to test keys for equality. If you need to use instances of your own classes as keys in a +Hash+, it is recommended that you define both the +eql?+ and +hash+ methods. The +hash+ method must have the property that +a.eql?(b)+ implies +a.hash == b.hash+.

Wednesday, November 19, 2008

Just More videos on C++ from Google Tech Talks

1) C++ Stylistics



2) An Overview of the Coming C++ (C++0x) Standard



3) Elkhound, Elsa and Cqual++: Open-Source Static Analysis for C++



Monday, November 17, 2008

Блоговщина #2

Как-то провтыкал, что в субботу блогу исполнилось 2 года. Чтобы не нарушать традицию сделаю обзор статистики блога за этот период.
Итак
  • в номинации "Самая Популярная Статья" места распределились следующим образом
    1. std::string vs. const char* . Comparison - 1 405 просмотров
    2. С & C++ useful resources - 888 просмотров
    3. "Must Read" C++ Books - 874 просмотра

    Последние две наверное потому, что ссылки на них висят в сайдбаре блога :)

  • в номинации "Самый Популярный Бразуер" победила, как и в прошлый раз, огненная лиса.


  • в номинации "Самый Популярная ОС" снова победила самая популярная ОС.


  • в номинации "Страна Где-Меня-Больше-Всего-Читают" тоже ничего не изменилось



А всего за 2 года блог посетило аж 10 432 уникальных посетителей =), а судя по тому что всего посетителей было 17 600, то можно сделать вывод, что некоторый приходили сюда аж по нескольку раз =). Вот где-то так в общем :)

Спасибо вам большое за то, что вы читаете то, что я пишу :)

Friday, November 14, 2008

Empire strikes back: Steven Dewhurst's response to Linus's criticism against C++

Помните нападки Линуса на С++ о которых я когда-то писал? Когда он в довольно жесткой форме высказался в отношении того, что он думает о С++?

Ну вот Steven Dewhurst ему отвечает:

I think it's only fair to point out that Linus' diatribe is more than a year old, and he has spoken in more measured and printable tones elsewhere about the same subject. Less excusable, however, is that he makes the claim that C++ cannot be used in resource-constrained areas with nothing but anecdotal evidence to support his claim. Linus has done good work and has earned his soap box, but he also has a professional obligation to make sense while he’s holding forth. (For those who follow such things, this is an instance of Gotcha #12, “Adolescent Behavior,” from C++ Gotchas.)

The argument that abstraction and efficiency are mutually-exclusive or that they're mutually exclusive in the context of C++ is demonstrably false. Lately, much of my work involves writing embedded code in C++ with heavy use of inheritance and templates, and the results have been more than promising. The resultant code is typically smaller and faster than the equivalent (well-written) C code provided by the board's manufacturer, and has the significant advantage of being usable by a developer who is not expert in the minutia of the board's design. Unlike Linus, I haven't written a commercial OS, but I have written a policy-based, pre-emptive tasker in C++. It occupies just 3k of RAM and is pretty zippy in addition to being easy to understand, customize, and maintain. Just to annoy people like Linus, I've also used typelist meta-algorithms to generate exception handlers with identical efficiency to hand-coded C. In a number of recent talks given at the Embedded Systems conferences, I've shown that commonly-criticized C++ language features can significantly outperform the C analogs. As an old-school, Bell Labs C hacker I've nothing against C. But C++ provides tools and capabilities that are hard to come by in C, and often make it easier for a competent C++ programmer to produce cleaner and typically smaller and faster code than the C equivalent.

Regarding competence, Linus’s implied argument that C++ attracts bad programmers the way other things attract flies is, in spite of the effective metaphor, both unfair and a little over the top. Inexperienced or incompetent programmers have been lured into writing bad code in other languages as well; I've inherited my share of poorly designed and rendered C. There's no question that C++ is a significantly larger and more complex language than C, and a competent C++ programmer should be familiar with many more design styles (including, among others, that "idiotic 'object model' crap") than a competent C programmer. Wider experience with different design approaches and coding idioms is an advantage if the programmer actually has more than a passing understanding of the techniques. Problems typically arise when teams of competent C programmers are thrown onto a C++ project without adequate preparation simply because C++ syntax looks something like C syntax. The results are usually about the same as you’d get by throwing the same team into a COBOL project. But you’re not going to catch me criticizing COBOL. That’s Linus’s job.

via InformIT: C++ Reference Guide > A Response to Linus Torvalds' C++ Diatribe

Tuesday, November 11, 2008

Concepts: Extending C++ Templates For Generic Programming

По ссылке с Google Open Source Blog обнаружилось интересное видео про новую фичу С++ - concepts.





Это же видео на video.google.com




Friday, October 10, 2008

Gordon “Fyodor” Lyon "Nmap Network Scanning" book Free beta release

Если вдруг кто еще не знает, то Фёдор (хоть убейте но единственные ассоциации которые у меня вызывает это имя - это "Дядя", "Матроскин" и "Простоквашино " =) ) выложил уже довольно давно в онлайн доступ pre-release бета версию своей книги "Nmap Network Scanning", официальный запуск которой планируется в этом месяце. Онлайн версия не полная, однако тот обьем материала, который доступен уже превышает все то, что было опубликовано прежде (не, ну может конечно я и перегнул, но все же ...). Онлайн версия это кончено хорошо, но интернет не всегда есть, да и хорошо было бы иметь локальную копию - так, на всякий случай. За сим:

wget -r -l0 -np -k -p http://nmap.org/book/

-r - рекурсивная загрузка
-l0 - бесконечная вложенность ссылок
-np - no parent, т.е. не загружать файлы выше базового адреса
-k - конвертировать ссылки для удобства оффлайн просмотра
-p - загружать все файлы, которые необходимы для отображения html страниц

и не забываем поставить trailing slash в конце адреса.

После окончания загрузки получаем следующую структуру директорий

`-- nmap.org
|-- book
|   |-- images
|   |   |-- zenmap-icons
|-- book-icons
|-- css
|-- images
`-- zenmap
`-- images

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


parse.rb


input = ARGF.read

# write the contets of head tag with opening html tag
start_pos = input.index /<html>/
end_pos = input.index /<[bB][oO][dD][yY]/
puts input[start_pos..end_pos-1]

# write opening body tag
puts "<body>"

start_pos = input.index /<div class="navheader">/
end_pos = input.index /<div class="navfooter">/
puts input[start_pos..end_pos-1]

# write closing body and html tags
puts "</body></html>"



Второй скрипт на shell, который собственно выполняет предыдущий скрипт для каждого html файла в директории nmap.org/book

process-dir.sh


#!/bin/sh

mv toc.html index.html

file_list=`ls | grep html`

for file in $file_list
do
echo ">>>>>processing file " $file
ruby parse.rb $file > $file"_tmp"
mv $file"_tmp" $file
done


Собственно далее копируем оба скрипта в nmap.org/book и делаем в консоли sh process-dir.sh.

P.S. Если кто вдруг подскажет мне quick&dirty way как сконвертировать все это добро в PDF - буду премного благодарен ;-)

Wednesday, September 17, 2008

Ubuntu 8.04 + ATI + 2 monitors ==♥ღ♥ LOVE♥ღ♥

Ubuntu - это же надо, каким линукс стал. Открываешь страничку в лисе с java апплетом, говорит, что нужно поставить плагин. Ставишь плагин тут же побеспокоятся о том, чтобы был установлен java пакет еще и предлагают на выбор 4 или 5 вариантов. Все работает, конфигов править не нужно. Проблем с видеокартой тоже не оказалось - всплыло преложение поставить проприетарный драйвер, который установился без всяких проблем. К моменту, когда завершилась установка обновлений у меня в голове уже стоял трехэтажный мат - ЛИНУКС НЕ ДОЛЖЕН БЫТЬ ТАКИМ!!! Я так любил, когда что-то не работало и в результате правки конфигов начинало работать так как должно испытываешь такое чувство морального удовлетворения от проделанной работы, что просто словами передать нельзя...

Однако, несмотря на все дружелюбие, второй монитор работал не так как мне хотелось и содержал clonned output. В предвкушении предстоящего сеанса работы в редакторе над xorg.conf я залез в дебри Сети. Долго искать не пришлось (гугл помог)- я нашел вполне актуальный HOWTO по настройке второго монитора.

Итак, что имеем:

commander@commander:~$ lspci
...
01:00.0 VGA compatible controller: ATI Technologies Inc Radeon HD 2400 XT
01:00.1 Audio device: ATI Technologies Inc RV610 audio device [Radeon HD 2400 PRO]
....

xorg.conf редактировать не пришлось (а я так надеялся), конфигуратор ATI сам позаботился о создании новой конфигурации и о бэкапе старой:

# aticonfig --initial=dual-head --dtop=horizontal --screen-layout=right -v

Однако перезапустив иксы увидел, что изменения коснулись только login screen. Лишь только луч надежды забрезжил на горизонте ему суждено было там и остаться, так как банальная установка разрешения экрана 2560х1024 привела оба монитора к тому виду, которого я добивался.

Линукс не должен быть таким, простым что-ли, ведь правда? Или все таки должен?

Friday, September 12, 2008

if (date == "09/12/2008") blog::post << "Happy Programmer's Day" << std::endl;



#include <cstdlib>
#include <iostream>
int main (int argc, char** argv){

std::cout << "I wish you all the best\n"
<< "on this Programmer's Day!\n";
return EXIT_SUCCESS;
}


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

Поздравляю Всех Программистов С Их Профессиональным Праздником - Днем Программиста!

Friday, September 5, 2008

Небольшое обновление на блоге

Почитав этот пост на блоге Записки дебианщика, подумал что наличие нескольких вариантов подписки действительно может кому-то понадобиться.

Поэтому добавил на блог два новых RSS фида (в добавок к тому, который уже существовал) и подписку по e-mail:
Ниже скриншот, демонстрирующий как это все теперь выглядит


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

На этом пока все. Всем удачи ;-)

Tuesday, September 2, 2008

Google Chrome

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


К моему великому сожалению, бета версия нового браузера от Google под названием Google Chrome будет доступна только завтра (то бишь уже сегодня), а сейчас пока готовы многочисленные статьи в блогах и на Википедии и заниметельная comic book.

Прочитав некоторые обзоры, могу сказать, что модель предлагаемая разработчиками Гугла мне определенно нравится. Подход в отношении безопасности заслуживает особого внимания - для каждой вкладки используется отдельный процесс, что позволяет благополучно убить неблагополучную страничку без необходимости проделывать эту процедуру со всем браузером. Кроме того, каждый процесс выполняется в изолированном окружении (не зря же они купили GreenBorder), что в современном мире Click & Go особенно важно, так как обычный пользователь вряд ли будет смотреть куда ведет ссылка по которой он кликает, а современные сервисы маскарадинга ссылок позволяют и эту информацию скрыть. У браузера будет нечто вроде собственного Process Explorer, позволяющего просмотреть сколько памяти и процессорного времени отъедает каждый таб и при необходимости им же можно будет таб убить. Вместе с тем плагины вроде флэш плеера выполняются вне рамок jailed process и поэтому конечный пользователь все еще остается уязвимым. Есть еще режим Incognito, который позволяет отказаться от хранения логов user activity и куков, после окончания сессии (кого этим сейчас удивишь?). Автообновляемые malware and phishing lists позволяют заранее предупреждать пользователя о неблагонадежных урлах, которые он посещает.

Относительно UI разработчики пошли еще дальше - у каждого таба своя строка адреса с автодополнением. Такого behaviour'a мне не хватало, однако подозреваю, что традиционная модель "одна строка адреса - куча табов" в некоторых ситуациях может быть лучше. Определенно стоило оставить возможность быстрого переключения между такими режимами, на мой взгляд (а может и оставили?).

Кроме всего, в новом браузере есть новая виртуальная машина Javascript V8, которая, говорят получше (я достаточно далек от устройства виртуальных машин и javascript машин в частности) и тоже open source (Как? Я еще не сказал, что код браузера открыт?) и аналог Prism. Хотелось бы еще интеграции с сервисами самого Гугла - этот момент думаю разработчики точно не должны были упустить =).

Пока новый браузер еще недоступен для загрузки, но с комиксом ознакомиться определенно стоит.

Friday, July 25, 2008

Sysadmin Books and Sysadmin Day

Символичное чтение у меня получилось. В День Сисадмина читаю книгу для Сисадминов - "DNS и BIND" Пола Альбитца и Крикета Ли издательства О'Рейли. В общем могу всячески рекомендовать, если вдруг у кого возникнет желание разобраться в том, как работает DNS. В ней все это довольно подробно расписано и вполне человеческим языком. Я, если честно, был удивлен, когда узнал, что понятие делегирование домена означает передача ответственности по его администрированию (в том числе и по делегированию субдоменов) третьей стороне, потому как сразу же возникает вопрос - а чем собственно является процедура продления домена у регистраторов?



Ну а всех Системных Администраторов хочу подравить с их профессиональным праздником ;-)


Wednesday, July 2, 2008

Детективы кода

Для читающих на украинском языке рекомендую. Интересный рассказ про Qt, Qt Cryptographic Architecture и шифрование.

Tuesday, July 1, 2008

Yandex Blogosphere Pulse - C++ Ведет Со Значительным Отрывом

Яndex считает, что о C++ в блогах пишут гораздо чаще, чем о java, .NET, python, php, ruby. Интересно чем это обусловлено? Популярностью языка? его сложностью? количеством граблей? складом ума людей, которые отважились на нем писать программы? Как вы считаете?


Upd: как оказалось обусловлено Яndex'ом. Подробнее - см. в камментах ))

Wednesday, June 25, 2008

C and C++ Cheat Sheets




Нашел в сети несколько шпаргалок по C/C++: 1, 2, 3, 4, 5, 6, Unicode-enabling Microsoft C/C++ Source Code, Understanding C++/Quick Reference, C++ Containers Cheat Sheet.

Хотя, надо признаться, что шпаргалки от Amy Hoy по Rails выглядят значительно симпатичнее ))

Monday, June 23, 2008

back|track>> 3 released

20 июня Max Mozer, один из разработчиков linux дистрибутива Backtrack сообщил в своем блоге о выходе релиза 3-й версии этого penetration testing дистрибутива. Скачать его можно здесь. Must Have всем, интересующимся вопросами взлома и защиты. Во всяком случае если не пригодится, то не помешает уж точно =).

Saturday, June 7, 2008

5 программ, с которыми я работаю ежедневно

via Begemot получил вышеназванную эстафету и задумался поскольку таких программ достаточно много и выбрать из них наиболее часто используемые не такая уж и простая задача. Дабы не повторяться лишний раз, то браузер и мессенджер остались теми же )). Помимо них использую в порядке убывания частоты:
  1. Notepad++ - простой, компактный, удобный и быстрый текстовый редактор, поддерживающий плагины, подсветку синтаксиса и множество других полезных и приятных мелочей, да в добавок еще и распространяемый под лицензией GNU GPL. Его я, в основном, использую для написания кода и правки текста.
  2. Remote Desktop Client - использую для доступа к тестовому энвайронменту, который развернут на другой машине.
  3. TortoiseCVS - для чего используется, объяснять думаю не нужно. Хотя возможны вариации: TortoiseSVN, TortoiseHg - иногда хочется посмотреть на исходники какого-нить проекта, а они либо в svn либо в mercurial.
  4. Download Master - менеджер закачек, с тех пор как я для себя его открыл он экономит мне множество времени и нервов (раньше часто приходилось кусать локти, когда закачка обрывалась по той или иной причине)
  5. Adobe Acrobat Reader и WinDjVu - програрммы для чтения электронных книг и документов.
Ну что ж, вот пожалуй и все :-). В свою очередь хотелось бы услышать подобный рассказ от:

Tuesday, June 3, 2008

Задачка на собеседование

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

#include <cstdlib>
#include <iostream>
using namespace std;
int main (int argc, char** argv){
cout<<argv[argc-1]<<endl
<<argc[argv-1]<<endl;
return EXIT_SUCCESS;
}

Ответ ниже белым по белому (да, такой способ я у Эльдара Мусаева подсмотрел) чтоб посмотреть выделяем текст
===отсюда===
На самом деле все просто и вытекает из комутативности операции сложения:

#include <cstdlib>
#include <iostream>
using namespace std;
int main (int argc, char** argv){
cout<<(*argv+(argc-1))<<endl<<((argc-1)+*argv)<<endl;
cout<<*(argv+(argc-1))<<endl<<*((argc-1)+argv)<<endl;
return EXIT_SUCCESS;
}

===досюда===
Отдельное Спасибо White Knight за нахождение ошибки в коде ответа(см. комментарии).

Monday, June 2, 2008

Разгребая закладки - Fighting the Lemmings

Большинство новостей из мира Open Source я получаю через канал новостей сайта OpenNet.ru. Обычно если новость меня чем-то заинтересовала, то она оседает у меня в закладках, а так как я интересуюсь очень многим, то можно представить во что превращается со временем панель закладок огненной лисы. Посему периодически я их разгребаю, попутно просматривая. Так и в этот раз увидел у себя в закладках ссылку на статью Fighting the Lemmings, о разработке переносимого ПО. Мысли, в принципе, практически идентичны этим, что лишний раз подтверждает их правильность.
И еще одно - я чуть ранее писал про мультик Big Buck Bunny, созданный при помощи Blender, так вот, его полную версию уже можно скачать или посмотреть на youtube


Friday, May 23, 2008

О пользе открытого кода в учебном процессе

Прежде чем высказаться по теме, хочу поделиться несколькими ссылками, которые могут пригодиться. Первая - Sitepoint раздают за бесплатно книгу "The Photoshop Anthology: 101 Web Design Tips, Tricks & Techniques", загрузить можно в двух вариантах - print-ready (более высокого качества) и, очевидно, для чтения с монитора. Линк на загрузку присылают на мыло. Вторая - разработчик сетевой библиотеки для С++ Boost.Asio Chris Kohlhoff рассказывает об отличиях между Asio и Boost.Asio.

Ну а теперь по теме. Хоть она и обсуждалась уже почти где только можно, я же хочу рассказать о случае, которые произошел не далее как вчера. Вчера жена делала диплом, основную часть которого составляет куча расчетов газотурбинного двигателя. Эти расчеты производятся при помощи набора консольных приложений, которые изначально писались еще во времена, когда программы хранились на перфокартах, а с приходом DOS были адаптированны под новую платформу (правда я предполагаю, что до этого они были адаптированны еще и под ЕС ЭВМ, а уж потом под DOS). Исходные данные находятся в файлах, выходные данные также записываются в файл. Казалось бы это хорошо для конвеерной обработки данных, однако формат выходных данных одного расчета не соответствует формату входных данных другого расчета.

Но не это самое досадное. Изюминка данного программного комплекса состоит в том, что с некоторой вероятностью он не работает, и на одних и тех же входных данных может рапортовать как "domain error: Math error - sqrt()" так и "Program stopped". И если по поводу первой ошибки у меня еще и возникают некоторые догадки, то относительно второй я могу лишь руками развести. Руководство пользователя крайне краткое и подсказок не дает. А эти программы используются на протяжении всего времени обучения в университете для дипломного и курсового проектирования. "Эхх, был бы исходный код" - подумал я и махнул на это все рукой,- может завтра заработает. Дизасемблировать и выяснять алгоритм у меня не было ни времени не желания.

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

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

Monday, May 19, 2008

Designing and Building Portable Systems in C++. Part II - Solutions

....продожение. Начало.

Как нетрудно было догадаться из предыдущего поста, пожалуй единственным подходящим решением проблем, возникающих при разработке портабельных систем, является абстракция и обобщенное программирование - сильные стороны C++. Описание техник можно поискать в серии книг C++ In Depth, книгах Мейерса и прочих гуру, я же приведу некоторые мысли относительно моментов, на которые следует обратить внимание, если вы используете для разработки сторонние библиотеки/компоненты.

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

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

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

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

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

Пятым фактором является портируемость - то, что вынесено в заголовок данного поста, поэтому по умолчанию подразумевается портируемость библиотеки. Однако тут нужно учесть ряд моментов, как-то: есть ли зависимости от третьих библиотек? насколько все сказанное выше относится к этим библиотекам? Понятно, что в ряде случаев такую оценку провести попросту невозможно, поэтому зачастую просто полагаются на разработчиков и если они говорят, что "portable", - значит
"portable" и все тут.

Шестым фактором является наличие возможности локализации. Можно ли использовать библиотеку/компонент в другой временной/географической зоне? нужны ли изменения?

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

Велкам в камменты, как говориться ;-).

Thursday, May 15, 2008

Designing and Building Portable Systems in C++. Part I - Problems

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

Одной из основных проблем, при написании портируемого кода на С++, являются отличия компиляторов. Несмотря на то, что сам язык описан довольно детально в стандарте, трактовки самого стандарта в станах компиляторостроителей иногда различаются. Кроме того, C++ часто ругают (вполне заслуженно) за сложность, особенно когда дело касается шаблонов. Эта сложность по определению ну никак не может облегчить жизнь как разработчикам компиляторов, так и "обычным" программистам, которые эти компиляторы используют.

Однако не только сложность языка источник проблем. Стандарт - один из этих источников. Описывая поведение большинства (но не всех) элементов языка, он, вместе с тем, оставляет некоторые из них implementation-defined, unspecified или undefined. В тексте документа приводится такой пример:
void f(int a, int b, int c)
{
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
}

int main(int argc, char** argv)
{
int i = 0;
f(i++, i++, i++);
return 0;
}

И оговаривается, что на разных платформах результат выполнения программы будет разным

For example, on Mac OS X, using GCC 3.3, the program fragment yields the following output
a = 0, b = 1, c = 2

This is what one would intuitively expect, assuming left-to-right argument evaluation. Compiled with HP ANSI C++ A.03.57 on HP-UX 11.11, the result is the same. However,when compiled with Compaq C++ 6.5 on HP Tru64 5.1, the program yields:
a = 0, b = 0, c = 0

which may be surprising

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

"Расширения" языка, которыми зачастую грешат разработчики из обоих лагерей (MS и GNU), тоже мешают писать портируемый код. Особенно "грешат" на майкрософтовский компилер, у которого есть опция для отключения подобного рода расширений. Заодно автоматически у вас пропадает возможность использовать Platform SDK, так как его заголовочные файлы используют эти расширения. Меня самого когда-то возмущала необходимость использовать тип BOOL, вместо bool (сейчас уже правда не возмущает) и я до сих пор иногда забываю ставить новую строчку в конце файла, с раздражением наблюдая ворнинги компилятора.

Типы. На разных платформах фундаментальные типы могут иметь разный размер. Поэтому если в вашей программе необходимо 32 битное беззнаковое целое, то проще всего, наверное, определить свой тип в заголовочном файле сразу, чем потом по всему коду выискивать и менять unsigned на myint32_t. В стандарте языка С ISO/IEC 988:1999 к стати есть типы int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, определенные в stdint.h, однако это тот случай, где С++ не обратно совместим с С. Может в следующем стандарте поправят. Там вроде как намечается соласовать стандарты. Про типы с плавающей запятой вообще отдельная сказка, ее лучше почитать в оригинале.

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

Выравнивание данных. На многих архитектурах данные обычно выравниваются на границу слова, что иногда может приводить к проблемам. В частности, приводится следующий пример:
struct Header
{
UInt32 size;
UInt32 checksum;
};
...
void handleData(void* pData)
{
Header* pHeader = reinterpret_cast<Header*>(pData);
for (int i = 0; i < pHeader->size; ++i)
...
}

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

Там где дело касается API операционных систем дела обстоят еще хуже - совсем недавно в одном из блогов наткнулся на замечания по поводу портирования софта linux -> windows (блог к стати мне понравился, жаль ссылку потерял). Для меня, к стати, оказалась сюрпризом информация о том, что Windows NT поддерживала POSIX, а с приходом WindowsXP ее убрали.

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

Tuesday, May 13, 2008

Баги - страшные и ужастные

Рядовой программист при написании программы зачастую не особо задумывается об ошибках, которые волей-неволей, но закрадываются в код. Эти ошибки зачастую совершенно неочевидны и посему приживаются довольно надолго, как например этот 25 летний баг, доставшийся всем BSD системам по наследству от 4.2 BSD.

Еще некоторое время назад я совершенно не понимал зачем нужны все эти обновления, хотфиксы, патчи и пр., если в большинстве случаев ПО работает корректно. Однако информация (особенно ценная), будучи одним из самых востребованных товаров, зачастую страдает от недостатка внимания к ее защите. Вы думаете, что ваш компьютер полностью защищен? Тогда взгляните хотя бы сюда. С тем обилием нелицензионного софта на просторах нашей Родины велик риск поставить себе ОС или софт с уже "предустановленными" программами - троянами, вирусами, различными руткитами )), которые тут же примутся усердно работать, собирая информацию о вас и вашей деятельности и отсылая ее своим "хозяевам". Или же вы станете частью какого-нить ботнета. Перспектив масса, но ни одна из них особо не радует. Выход остается один - выдернуть сетевой кабель из системного блока, так как ни проприетарное ни открытое ПО не защищено от уязвимостей. Зачастую слышно, что для полноценной работы в Linux нужен инет, ну никак без него.... Для других ОС ситуация обстоит так же - все обновления ПО качаются из интернета.

Ну а если уязвима например библиотека? которая используется в сотнях государственных учереждений, университетов, частных и коммерческих организациях национального и международного масштаба? А если где-то до сих пор работает софт, саппорт для которого discontinued, и используется уязвимая версия? А если этот софт управляет вашей АТС или работает в сети сотовой связи и вы не сможете однажды набрать "03"? или управляет АЭС, расположенной неподалеку от вас? или...

В общем к чему я веду -"семь раз проверь, один раз закоммить". (C) Народная программистcкая мудрость.

Thursday, April 24, 2008

Yet Another Cpp Coding StyleGuide and even more...

Набрел на сайте PoCo на два интересных документа: Designing and Building Portable Systems in C++ и C++ Coding Style Guide. В конце первого документа нашлась еще одна очень интересная ссылка на перечень С++ библиотек (как свободных так и закрытых). В PoCo, к стати, недавно добавили поддержку MySQL.

Friday, April 11, 2008

Big Buck Bunny Open Movie Project

После завершения проекта Orange, результатом которого стало создание анимационного фильма Elephants Dream с открытым "исходным кодом", Blender Foundation и Blender Community начали новый проект Peach, целью которого является создание небольшого анимационного фильма.
Как и в прошлый раз, небольшая комманда лучших 3D аниматоров из blender community собралась в Амстердаме для работы над проектом, который длился с Октября 2007 по Апрель 2008. Как и в прошлый раз для работы с изображением и анимацией использовалось открытое ПО (blender, gimp, может что еще... ). Исключением являлась работа со звуком, для которой использовались технологии Dolby Laboratories (по крайней мере для выпуска фильма на кинопленке). В первую неделю комманда занималась preproduction work, с этой целью они организовали Peach Workshop для проработки деталей сценария, по окончании которого был разработан development roadmap и шестимесячный план:

По ходу дела, за неделю до старта проекта у него появились спонсоры: Digitale Pioniers, Maqina Computersystems выступили в качастве спонсоров железа, sound студия wavemage. Чуть позже к спонсорам присоединилась Sun, чей грид network.com использовался для рендеринга. Акция dvd preordering на момент начала проекта принесла 1144 заказа, среди которых 947 были предоплачены.

И закипела работа :-D



Вот еще одно видео, где показано, как персонажи "оживлялись"



Интересно было почитать, как решилась проблема анимаации "толстых" персонажей.

Отдельно стоит сказать о железе и софте, на ктором работали аниматоры. Железо - это пять Maqina C6850DC 3D Blender Workstation’s (Dual Core 3ghz, 4gig ram, GeForce 8800 GTS), две Maqina X5130DC Workstation’s (Quad Core 2ghz, 4gig ram, NVidia Quadro FX 1700), и Maqina X5345QC Workstation (8 Core 2.33ghz, 8gig ram, NVidia Quadro FX 1700). Большинство рабочих мест укомплектовано двумя мониторами (оно и не удивительно)


На все системах установлена 64bit Ubuntu Gutsy Desktop. Каждый пользователь может войти под своим аккаунтом на любой машине - настройки хранятся на сервере. Все это добро соединено в гигабитную сеть. Все используют версию blender из svn, в которой , видимо, присутствуют используемые аниматорами новшества. Что характерно, они у себя отмечают, что Peach это видимо первый серьезный проект использующий blender, скомпилированный как 64-битное приложение (64, так как им необходимо большое колличество оперативки для рендеринга, однако меня несколько смутило упоминание, что на 32х битах можно адресовать 2 Гб).

В конце-концов, фильм получил название Big Buck Bunny:
A little explanation about the title Big Buck Bunny:

‘Big’ because the main character isn’t small.

‘Buck’ is the term for a male rabbit. It’s also the name of a movie character played by an actor we used as a reference.

‘Bunny’ because…. ah, I’m not gonna explain that.

Как уже упоминалось выше, для рендеринга, использовался грид SUN, которая предоставила им 50000 часов машинного времени. Разработчики упоминают, что данная ферма не использовалась ранее для рендеринга подобного масштаба, поэтому этот процесс является хорошим стресс-тестом для их инфраструктуры. Как показала практика, тест оказался эффективным и грид (ну по крайней мере один его узел) упал. Видимо после падения, у них возникли проблемы со шрифтами, и комманда решила, что быстрее будет отрендерить оставшиеся 2000+ фреймов на собственных машинах. Однако снова возникают проблемы разного рода (как всегда перед самим финишем). В частности, трава отрендеренная на ферме и на машинах аниматоров отличалась, причем они пришли к выводу, что виной всему реализация qsort() на Solaris, отличная от реализации в libc. В общем чтение этого поста, заставило меня не раз улыбнуться )).

Вотъ, а вчера было обьявлено о премьере. Трейлер же можно посмотреть ниже ;-D.


Monday, March 17, 2008

C and C++ Secure Coding Standard

По ссылке с OpenNet набрел на готовящийся к выходу неформальный стандарт по безопасному кодированию на С и С++. Довольно приличное колличество информации собрано в одном месте, что, естественно, радует. Стоит прочтения, единственное, что меня раздражало - это жутко неудобная система навигации по разделам. Хотелось бы заполучить это все в plain html или в pdf. Может когда вычитают, сделают. Будем надеяться. В общем рекомендую всем, кому приходится писать на этих языках (впрочем некоторые правила применимы и не только к С с С++). Надо добавить линки в C & C++ useful resources.

Friday, March 14, 2008

Netflix Prize. Just give it a shot...

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

Некоторое время назад блуждая по Википедии в поисках информации по data mining наткнулся на статью (эта же статья на английском) о конкурсе, организованном компанией Netflix - Netflix Prize. А тут недавно и в блогах пробежал пост об этом конкурсе. Решил более подробно ознакомиться. Netflix занимается арендой DVD через интернет. Ну и как многие e-commerce компании у них есть адвизори, т.е. список товаров (или услуг), которые они рекомендуют клиенту, на основании уже совершенных заказов. Для повышения вероятности того, что рекомендуемый фильм понравится клиенту, Netflix был разработан основанный на линейной регрессии алгоритм Cinematch, который дает СКО на тестовом множестве даннах 0,9525. В нетфликсе почухали репу и решили учредить конкурс - тот кто добьется 10% улучшения алгоритма получит 1 млн американских денег. Кроме того, также есть приз "за прогресс" - 50000 денег за улучшение на 1% по сравнению с предыдущим лауреатом конкурса.

Все участники (и вообще все желающие) могут скачать следующие 4 файла:

  • Тренировочные данные (training data set) содержат более 100 млн оценок, которые более 480 тыс. клиентов поставили 17.770 фильмам. Каждая оценка представляет собой квадруплет <номер клиента, номер фильма, дата оценки, оценка>. Номера клиентов и фильмов — целые числа, оценка — целое число от 1 до 5 (низшая оценка 1, высшая 5).Таким образом, в среднем каждый клиент поставил около 200 оценок, а каждый фильм получил около 5000. Однако количество оценок сильно варьирует: так, некоторые фильмы получили всего 3 оценки, а один клиент оценил более 17 тыс. фильмов.
  • Квалификационные данные (qualifying data set) содержат 2,8 млн триплетов <пользователь, фильм, дата оценки>. Оценки известны только жюри и будут опубликованы по окончании соревнования.
  • Названия и годы выхода в прокат всех 17.770 фильмов.
  • Фрагмент тренировочной базы данных, распределённый так же, как квалификационные данные. Этот фрагмент может использоваться, например, для оценки алгоритмов до посылки их на сайт.

Для того чтобы участник не мог использовать СКО для угадывания оценок, квалификационный набор данных разделён надвое. Участникам сообщаются результаты одной из половинок, называемой quiz set, но для получения приза (любого) учитываются результаты другой половинки — test set. Участники не знают, какая из записей к какой половинке относятся.

В общем, судя по LeaderBoard, прогресс есть и довольно приличный. Однако, как замечают некоторые разработчики, в последнее время СКО меняется буквально на сотые, тысячные доли. Трудновато, как оказалось, построить модель человека. Однако Хлопец в Гараже, являясь психологом, быстренько догнал и перегнал многих участников, и теперь входит в первую 10-ку команд. Он дескать взял да предположил, что решение может лежать на стыке математики и психологии...

Ну шо народ? Го Netflix?

Friday, February 29, 2008

5 инструментов

Принимаю эстафету "5 инструментов без которых я не могу работать продуктивно" от Алены С++. Но сначала маленькое предисловие: поскольку речь идет именно о продуктивности, то я не буду описывать все те тулзы, с которыми мне приходится иметь дело при разработке ПО. Постараюсь написать лишь о тех, которые позволяют мне быстро и в сжатые сроки решать какие-либо повседневные задачи.

Итак эти самые 5 инструментов:
  1. Firefox - хороший браузер, к нему написано множество дополнений, которые облегчают работу (ScrapBook, Flashblock, Foxmarks, MinimizeToTray, ImgLikeOpera).
  2. Pidgin - multi-protocol Instant Messaging client, поддерживающий AIM, Bonjour, Gadu-Gadu, Google Talk, Groupwise, ICQ, IRC, MSN, MySpaceIM, QQ, SILC, SIMPLE, Sametime, XMPP, Yahoo!, Zephyr. Простой, есть версии как для Linux так и для Windows.
  3. Far Manager / Yakuake + bash + mc - файловые менеджеры, консоль, командный интепретатор соответственно под Windows и Linux, так как обеими этими системами я пользуюсь в равной мере.
  4. Gmail - почта, прельщает довольно удобный веб-интерфейс, хороший спам-фильтр.
  5. Google - всем известная поисковая система, использую для поиска различной информации.
Вот кажись все.
Передаю эстафету

Tuesday, February 26, 2008

Суждено ли С++ стать платформой?

В виду того, что в последнее время все больше и больше появляется самых различных кроссплатформенных библиотек для С++, у меня все чаще и чаще возникает мысля о том, что и С++ может в конечном итоге стать платформой, как это произошло с Java. Однако все же остаются некоторые сомнения. Ведь насколько я понимаю наличие хороших библиотек еще не все, что нужно для того, чтобы считаться платформой. Одному мне так кажеться?

Saturday, January 19, 2008

Линус критикует C++

Via aruslan узнал об ответе Линуса на вопрос Dmitry Kakurin почему Git написан на С а не на С++. Больше всего понравились цитаты
Quite frankly, even if
the choice of C were to do *nothing* but keep the C++ programmers out,
that in itself would be a huge reason to use C.
Что и говорить, тут трудно не согласиться, поскольку многие программеры на С++ считают себя сильно "мегакрутыми" (коими в действительности не являются) для того чтобы снизойти до чистого С. Это действительно хороший способ :-)
C++ leads to really really bad design choices. You invariably start using
the "nice" library features of the language like STL and Boost and other
total and utter crap, that may "help" you program, but causes:

- infinite amounts of pain when they don't work (and anybody who tells me
that STL and especially Boost are stable and portable is just so full
of BS that it's not even funny)

- inefficient abstracted programming models where two years down the road
you notice that some abstraction wasn't very efficient, but now all
your code depends on all the nice object models around it, and you
cannot fix it without rewriting your app.

In other words, the only way to do good, efficient, and system-level and
portable C++ ends up to limit yourself to all the things that are
basically available in C. And limiting your project to C means that people
don't screw that up, and also means that you get a lot of programmers that
do actually understand low-level issues and don't screw things up with any
idiotic "object model" crap.
Подобные мысли и меня когда-то одолевали. Ну а согласно The Cathedral and the Bazaar успех софтины зависит от других факторов. Ветвь дискуссии по вопросу Дмитрия. Занятное чтиво.

Sunday, January 13, 2008

Сертификация на brainbench

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

C++ Master Brainbench Certificate

Довольный, хоть многие и говорят, что brainbench - не показатель.

Thursday, January 10, 2008

А возможно и не const...

Прочитав недавно в блоге Алёны С++ статью Возможно, самый важный const, губоко задумался нельзя ли все-таки как нибудь обойти запрет на следующее

string&s = string("abc");
int&i = 1;

И совершенно неожиданно вспомнил, что когда-то давным-давно на далеком-далеком форуме (чет меня опять не туда понесло ;-)) прочитал о том, как тимлид учил зеленых программеров: "тыкаем в любое место throw 1; если программа летит - бьем дубиной по голове"

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

try {
throw 1;
}
catch(int&i){
//можем менять i
}
catch(...){}


Проверяем

try {
try {
throw 1;
}
catch(int&i){
cout<<"int& "<<i<<endl;
i=2;
throw;
}
catch(...){}
}
catch(int&i){
cout<<"int& "<<i<<endl;
}
catch(...){}


Факт повторной генерации исключения отмечается отсутствием операнда у throw. Причем повторно сгенерированное исключение является исходным исключением (копией или нет - думаю зависит от реализации, по крайней мере в Стандарте ничего не нашел по этому поводу. Может плохо искал? Пните меня в комментах, если найдете). Хотя по идее оно должно копироваться, так как это все же генерация, хоть и повторная. Однако в реализации gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21), которой я на данный момент пользуюсь, в момент повторной генерации эксепшн не копируется.


#include <iostream>
#include <cstdlib>

//класс исключения
class ex {
public:
ex(const ex&){cout<<"Copy ctor"<<endl;};
ex(){cout<<"ctor"<<endl;};
~ex(){cout<<"dtor"<<endl;}
};
//
int main(int argc, char *argv[])
{
try {
try {
throw ex();
}
catch(ex&){cout<<"Rethrow"<<endl;throw;}
catch(...){throw;}
}
catch(ex&){}
catch(...){}
return EXIT_SUCCESS;
}

Причем, что интересно, на отсутствие copy constructor ругается, если его private или explicit сделать, а в процессе распространения исключения и при генерации его не использует.

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

Update2
15.1.6
A throw-expression with no operand rethrows the exception beeing handled. The exception is reactivated with existing temporary; no new temporary exception object is created.

Так что во время повторной генерации исключения копирования не происходит.


Wednesday, January 9, 2008

gcc. Полное руководство

"GCC: The Complete Reference" однозначно must have для каждого программера под linux , который ценит свое время. Содержание вообще привело меня в неописуемый восторг - мало того что присутствуют разделы по конфигурированию, установке и тестировании компилятора, но также рассказано о сборке кросс-компилятора (чего мне пока с последними версиями gcc проделать на удалось - под ARM собираться не хочет, binutils собираются, bootstrap compiler тоже, а сборка libc - сваливается... или это сборка полноценного компилера? не помню уже... после десятка безуспешных попыток я это дело отложил на неопределенное время. Может книжка эта поможет?), расширениях GNU для С и С++, Objective-C, Java, Fortran и Ada, GDB, смешивание языков, сборка компилятора для ембедед систем тоже не обделены вниманием.

В общем и целом - 600 страниц ОЧЕНЬ ПОЛЕЗНОГО ТЕКСТА.

Monday, January 7, 2008

Сдвиг в индустрии?

В последнее время писать особо времени нет в виду подготовки к защите диплома в феврале. Да что там писать, даже на работу иногда времени нет, благо что она part time (хотя де-факто - в большинстве своем full time). Так вот, бродя по сайтам ведущих харьковских фирм, занимающихся разработкой ПО, наткнулся на сайте компании Program-Ace на вакансию Senior C++/Haskell developer.

Приглашаем к долгосрочному сотрудничеству специалиста профиля Senior C++/Haskell developer – для участия в разработке архитектуры в рамках уже сложившейся команды, которая имеет не только опыт в данной области, но и целый ряд успешно выполненных проектов (прекомпилятор ESQL/C и т.д.). Мы ищем настоящего профессионала, которому свойственны: стремление к решению нетривиальных и сложных задач с использованием самых современных подходов и решений; желание всесторонне планировать и активно разрабатывать архитектуру; высокая степень реализации профессиональных амбиций.

Обязанности:
• Разработка архитектуры.
• Составление плана работ.
• Оперативное и профессиональное решение поставленных задач.


Требования:
• Языки: С++, Haskell.
• Библиотеки общего назначения: STL, boost.
• Знание паттернов и современных подходов к разработке.
• Владение функциональными языками на высоком уровне.

Желательны: знания и опыт в области разработки компиляторов.


Чуть ранее о подобных наблюдениях писал lrrr: здесь и здесь. Может Erlang и Haskell, да и вообще распределенное и функциональное программирование - next big thing in industry? В последнее время наблюдается устойчивый интерес в блогах разработчиков к этим технологиям. Ваше мнение? Если несложно, то отпишитесь в комментах к этому посту.