четверг, 5 марта 2009 г.
Visual Studio 2005 --> 2008. совместимость
A custom list view control with custom scrollbar control, using WTL
и открываем его в Visual Studio 2008, при запуске происходит конвертация проекта в формат более новой студии.
Запускаем проект на копиляцию, результат - ошибка:
Linking...
CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409
спасибо майкрософту за изменения, которые делают жизнь програмиста веселей :)
что произошло понять просто - в проекте файл манифеста подключается через ресурсы, после конвертации настройки проекта фактически добавляют два манифеста в одну екзешку - оставшийся с предыдущей версии и новый, автоматически сгенерированый. исправить легко, но неприятно что приходиться отвлекаться на такую ерунду.
вторник, 3 февраля 2009 г.
в час ночи кодер в офисе ждет такси...
Wireless Forums from AT&T : Phone & Device Support : Samsung : [Epix] New mail notification doesn't work in standby
там куча возмущения, что "безнес смартфон" уходя в стенбай настолько хорошо экономит энергию, что не считает нужным включать звук когда приходят важные емейлы (ну и как побочный результат независимый софт тоже не проигрывает звуки, когда девайс заснул)
Предыдущие разы наш сапорт на американской стороне отмазался так - "ставьте фикс самсунга". Теперь вылезло что это фикс не очень прямо работает, аутлук на новое мыло может бикние, а вот остальной софт все еще имеет проблемы.
У нас они вылезли в простом и рабочем практически всюду и давно коде:
SetPowerRequirement((PVOID)TEXT("WAV1:"), D1, POWER_NAME | POWER_FORCE, NULL, 0);
PlaySound(.....)
первая строчка - хочу проиграть звук, девайс включи саундбластер,
вторая играет вавку.
Вот только если на всех остальных поддерживаемых девайсах это работает,то на Epix нет. А проверка с помощью GetDevicePower сразу после SetPowerRequirement утверждает что девайс включеный.
Помогает универсальный программистский паттерн Sleep(1000), вот только его успели забакланить еще до того,как баг попал ко мне :), завтра буду объяснять, что по другому не получиться :)
четверг, 8 мая 2008 г.
как не стоит использовать STL + Boost
(заметил на КЫВТ http://rsdn.ru/forum/message/2943714.1.aspx )
Добрый день!
Возникла проблема с производительностью boost::bind в следующем коде:
map<int,set<int>> back;
vector<int> docnums;
int xx = 0;
for (vector<int>::iterator ii = docnums.begin(); ii != docnums.end(); ii++) // первый вариант
xx += back[*ii].size();
// второй вариант
int yy = accumulate(
docnums.begin(),
docnums.end(),
0,
bind(
plus<int>(),
_1,
bind(
&set<int>::size,
bind(
&map<int,set<int>>::operator [],
back,_2)
)
)
);
в массиве 1 элемент, собирается всё как релизная версия, компилятор MSVC. 1-й вариант выполняется примерно 20 микросекунд, что вполне приемлемо. Но второй вариант выполняется 5000000 (!!!) микросекунд (т.е. около 5 секунд) и при этом выдаёт тоже правильный результат. Почему так невообразимо долго?
Павел
мало того что крутой второй вариант на пару парядков медленей, так он еще и не читабельный :) дальше второго вложеного bind желание разбирать его пропало(в оригинале весь второй вариант записан в одну строчку). Стиль написания напомнил анекдот(а может и реальную историю) про програмиста, который после выхода книжки банды четырех сумел заюзать все патерныны из нее в одной програмке, оно даже запустилось :)))
Вопрост, а почему бы не пользоваться первый вариантом, без притягивания за stl algorithms + bind, остаеться актуальным. А ведь так пишут - узнали что сейчас самое "крутое" и пробуют бездумно в любую дырку это засунуть
Десять худших багов в истории компьютеростроения
Проще показать чем объяснить, что такое баг. Берем Excel 2007. В ячейку A1 вводим число 77.1, в B1 – 850. А в С1 пишем "=A1*B1". Калькулятор утверждает: должно получиться 65 535. А Excel 2007 показывает 100 000. Кто прав?
Бывают и более веселые баги. В 2003 году BMW с известным таиландским политиком остановился, двери закрылись, вся электроника выключилась, окна не открывались – ошибка в программе «убила» бортовой компьютер. Несчастного политика охрана достала через ветровое стекло машины.
Случай с политиком курьезный, но проблемы с софтом просто преследуют автомобилистов:
- 2005: Toyota отозвала 75,000 Prius Hybrids. Сбой программы приводил к внезапной остановке бензинового двигателя.
- 2004: Pontiac Grand Prix. Программное обеспечение не умело работать с високосными годами. 2004 был именно таким.
- 2002: BMW отозвала 745i из-за проблем с управляющей программой топливного насоса. Он выключался когда в баке меньше трети топлива.
- 2001: 52,000 внедорожников Jeep вернулись на завод. Баг отключал приборы.
Особенно в этом списке стоит выделить BMW 745i. Чудом интеграции умной электроники и механики управляет водитель и 70 микропроцессоров. Волшебная ручка – iDrive, настраивает больше 200 параметров - от наклона сидений до музыкальной системы. А в середине живет Windows CE. Не удивляйтесь, когда машина начинает сама тормозить, забыв включить сигнал на задних фонарях.
Техника с 1946 года и первого бага найденного(в прямом смысле этого слова – жучок залез в реле и замкнул его) в Гарварде в компьютере Mark II сделала гигантский прыжок вперед. Инциденты с автомобилями приносят убытки только компаниям, неудобство людям. Но на звание самых худших багов уже претендовать не могут. Бывают единичные инциденты, убытки от который существенно выше. В 1996 ракета Arian 5, стоимостью в 500 миллионов долларов(при общей стоимости программы в 10 миллиардов) взорвалась после старта. Причина - управляющая программа неправильно переводила 64 разрядные числа с плавающей точкой в целые 16 разрядные. Ракета заняла пятое место в рейтинге десяти самых худших багов :
- 1946. Жук залез в Mark II. Первый описанный баг. Багрепорт с приколотым к нему виновником торжества до сих пор храниться в музее. Он был первым и его место под номером один.
- 1979. Баг в программном обеспечении для телефонии от AT&T сделал невозможными междугородние телефонные переговоры в Греции.
- Аэропорт Денвера не работал больше года из-за глюков в автоматической системе управления багажом
- Зонд Mariner 1, первенец американской программы изучения Венеры не улетел дальше земной атмосферы. 22 июля 1962 года на 263 секунде полета сошел с траектории и был уничтожен. Сбой в работе навигационного компьютера вызван ошибкой программировании одной из формул, не обратили внимание на значок дефиса.
- 1996 год. Аналогичная ситуация при первом запуске Arian 5. Ошибка в переводе чисел с плавающей точкой в целые привела к взрыву.
- Июль 1981. На заводе в Японии умный робот пробовал отремонтировать другого робота и убил рабочего.
- 1985-1987 -- Therac-25. Аппарат радиационной терапии. Улучшенный вариант уже работающей модели. Считалось, что программное управление защитными заслонками надежнее электромеханического. Но на протяжении двух лет было минимум 6 случаев когда из-за ошибок в программе пациенты получали дозу радиации в сотню раз превосходившую расчетную, трое пациентов погибло.
- 2 Июня 1994 разбился британский вертолет Chinook ZD576, погибло 29 человек. Объяснили катастрофу ошибкой пилота. в 2002 было доказано, что автоматическая систему управления двигателями внезапно поменяла режим их работы, что и привело к потере управления.
- Июль 1991. Катастрофа рейса KAL 901 корейских авиалиний. Погибло 225 пасажиров. Катастрофа вызвана ошибкой в программном обеспечении в системы измерения высоты.
- 1982 год. Самый большой не ядерный взрыв на планете. Взорвался газ на трассибирском газопроводе Мощностью взрыва оценили в три килотонны. По официальной версии вызван ошибками в конструкции газопровода. По не официальной советский союз достал систему управления не совсем лицензионным методом у канадской фирмы. В ней оказался баг (логическая бомба) внедренная ЦРУ. Одноразовое его срабатывание привело к сбою в работе насосов, повышению давления выше предельно допустимых величин. Доказательств нет, но правительство США во главе с Рейганом активно пыталось предотвратить экспорт советского газа в западную Европу.