пятница, 13 июля 2012 г.

Заметки по багфиксу

Во время работы над большим проектом, я усвоил несколько правил для более-менее эффективного багфикса. Собственно небольшой список:
  1. Постарайтесь добиться максимального процента воспроизведения баги. Как правило, проще воспроизвести ошибку в логике, чем ошибку нехватки ресурсов.
  2. Во время поиска причины ошибки, как правило нет смысла в простом трейсе кода, лучше воспользоваться подходящим методом диагностирования для соответсвующего типа ошибки.
  3. Перед попыткой исправить ошибку, всегда следует понять как работает код, в котором она выявлена. Так же не следует делать поспешных выводов на счет причины, лучше хотя бы один раз убедиться, что это именно то, что искали, а не какая-нибудь статистическая погрешность или просто слабо документированный case.
  4. Следите, что бы не было регрессий после фикса.
  5. В больших проектах нельзя одному уследить за потоком изменений. При обсуждении уже существуюшей имплементации гораздо лучше сверяться с кодом, чем доверять чужому мнению. Вас могут ввести в заблуждение.
  6. Нельзя слепо доверять незнакомому коду, постарайтесь проанализировать его, если он как-то может участвовать при удачном воспроизведении баги.
  7. Если столкнулись с нехватой памяти в программе, используеющей JVM или .NET, то есть смысл выгрузить список объектов и попробовать найти там самые тяжелые. Если из этого плоского списка причину не удалось обнаружить, то можно попробовать составить таблицу объектов с отображением их колличества. Таким образом, мне часто удавалось находить memory leaks из-за того, что при нормальной работе приложения, количество некоторых объектов не может превышать некий предел.
  8. Частые старты garbage collector не всегда означают нехватку памяти, он так же может стартовать когда используется слишком много объектов или исчерпывается количетсво доступных хэндлов для использования некоторого ограниченного ресурса, например большое количество открытых файлов.
  9. Если не удается уменьшить количество создаваемых объектов, то можно попробовать их переиспользовать.
  10. При проблемах с производительностью кода, в первую очередь следует смотреть в профайлер и только потом пытаться оптимизировать. Совет конечно очевидный, но некоторые пытаются угадать источник проблемы и тратят время впустую.
  11. Если использование профайлера затруднено, то есть смысл использовать для анализа лог с таймингами. Только не следует забывать, что I\O-операции могут повлиять на время исполнения кода. Если есть возможность, то следует использовать промежуточный буффер или сбрасывать дамп логов только после завершения работы исследуемого кода.
  12. Проблема "состояния гонки" между несколькими потоками следует анализировать в максимально приближенном окружении, в котором баг был найден. На воспроизводимость баги могут влиять как время исполнения отдельных блоков кода, так и разница во времени операиций ввода-вывода. Всегда следует контролировать в контексте какого потока может исполняться код.
  13. Не следует закрывать глаза на не исправленные баги, всегда должен быть способ их регистрации.
  14. В конце проекта всегда остаются самые плохо воспроизводимые и тяжело поддающиеся исправленю баги, не следует забывать об этом. Подобные баги следует начинать выделять уже в начале-середине проекта. Обычно их можно заметить по большим интервалам времени с моментам регистрации и проблемам с их воспроизведением.
  15. Всегда следует учитывать, что проблема может быть не в софте, а в железе.

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

суббота, 5 июня 2010 г.

Microsoft Visual Studio + Mercurial

После недолгого пробного использования TFS я таки в нем разочаровался, ибо уж очень много он пожирает ресурсов, а для меня одного, выхлопа от него мало. После краткого осмотра иных вариантов замены системы контроля версии я остановился на Mercurial. Ибо:
1. Без проблем работает на Windows и NIX;
2. Стабилен;
3. Приличный список возможностей;
4. Множество утилит для интеграции с разнообразными IDE и шеллами;
5. Использует минимум ресурсов;
6. Множество плагинов.

Немного по-рывшись в гугле, нашел плагин к Visual Studio 2010 - VisualHG, судя по описанию, довольно приличный. Осталось ему прокинуть доступ к репозиториям Mercurial'a на другом сервере под Windows 2008. Поскольку VisualHG работает только в связке с TortoiseHG, то пришлось создавать отдельный web-интерфейс к репозитариям, благо IIS на сервере уже стоит.
Начнем с того, что создадим отдельный каталог в дереве сайтов IIS, хотя в принципе можно и отдельный сайт.
Для наглядности пусть будет: localhost/hg/, а физический путь будет соответствовать V:\hg\.
Вместе с дистрибутивом Mercurial'a распространяются и скрипты на Python'e для создания web-страницы репозитариев. Находятся они в архиве library.zip в каталоге дистрибутива, если конечено было указано их извлечь при инсталяции. Этот самый архив распаковывается в какую-нибудь дочернюю директорию от localhost/hg/, например localhost/hg/lib/, как физический путь это будет - V:\hg\lib\.
Для запуска скриптов под IIS'ом из дополнительного ПО понадобится только Python 2.6 x86. Если использовать дистрибутив c бинарниками amd64, то скрипты попросту не будут работать. В чем причина, я так и не разобрался.
Подключение Python'a происходит через панель IIS'a в настройках "Сопоставления обработчиков". Туда необходимо добавить "сопоставление сценария" с следующими параметрами:
Путь запроса: *.cgi
Исполняемый файл: C:\Python26_x86\python.exe -u "%s %s"
Имя: Python

Путь к дистрибутиву Python'a естественно может отличаться.
Для проверки работоспособности можно в создать файл "V:\hg\test.cgi" c содержимым:
print 'Status: 200 OK'
print 'Content-type: text/html'
print ''
print '<html><head><title>Тестовая страница</title></head>'
print '<body>'
print '<h1>Тестовая страница!</h1>'
print '</body></html>'

Если все отобразилось нормально, то можно переходить дальше.
После этого необходимо в папку hg добавить файл hgwebdir.cgi для запуска python-скриптов.
После его редактирования изменения выглядят так:


Так же в эту директорию необходимо добавить файл hgweb.config с таким содержимым:
[paths]
/ = repos/*

[web]
baseurl = /hg
push_ssl = false
allow_push = *

Где repos является каталог репозиториев, полный путь к которому - v:\hg\repos.
Для более удобного и наглядного использования можно ещё прицепить URL Rewrite. Он позводит убрать из строки адреса "hgwebdir.cgi". Для этого необходимо создать правило с подобными параметрами:
Requested URL: Matches and Pattern
Using: Wildcards
Pattern: *
Action type: Rewrite
Rewrite URL: hgwebdir.cgi/{R:1}

Все остальные параметры по-умолчанию.
Для создания репозитория в качестве теста можно использовать консольную команду "hg.exe init v:\hg\repos\test".
Просмотр списка репозиториев:


Теперь для использования репозитория, в качестве минимального требования, будет только наличие TortoiseHG на произвольном компьютере. Для использования репозиториев Mercurial'a из MS VS 2010 достаточно установить плагин VisualHG, создать в директории проекта репозиторий и открыть этот проект в студии. Теперь оттуда будет возможность управлять коммитами, а из TortoiseHG заливать их на сервер.


Используемое ПО:
Mercurial 1.5.4
TortoiseHG 1.0.4
Python 2.6.4 x86
IIS 7.5
MS VS 2010

пятница, 14 августа 2009 г.

Обновление MSDN и WDK.

Microsoft обновили API Code Pack и MSDN Code Gallery

The Windows® API Code Pack for Microsoft® .NET Framework provides a source code library that can be used to access some new Windows 7 features (and some existing features of older versions of Windows operating system) from managed code. These Windows features are not available to developers today in the .NET Framework.

The individual features supported in this version (v1.0) of the library are:
  • Windows 7 Taskbar Jump Lists, Icon Overlay, Progress Bar, Tabbed Thumbnails, and Thumbnail Toolbars.
  • Windows 7 Libraries, Known Folders, non-file system containers.
  • Windows Shell Search API support, a hierarchy of Shell Namespace entities, and Drag and Drop functionality for Shell Objects.
  • Explorer Browser Control.
  • Shell property system.
  • Windows Vista and Windows 7 Common File Dialogs, including custom controls.
  • Windows Vista and Windows 7 Task Dialogs.
  • Direct3D 11.0, Direct3D 10.1/10.0, DXGI 1.0/1.1, Direct2D 1.0, DirectWrite, Windows Imaging Component (WIC) APIs. (DirectWrite and WIC have partial support)
  • Sensor Platform APIs
  • Extended Linguistic Services APIs
  • Power Management APIs
  • Application Restart and Recovery APIs
  • Network List Manager APIs
  • Command Link control and System defined Shell icons.
Заодно появился и WDK с версией 7.0.0

Дырка в sharingmatrix.com

Недавно обнаружил дырявый файловый хостинг, суть баги - отсутствие фильтрации запросов.
При скачивании файла можно игнорировать любые запросы ввода капчи и таймера.
Для этого забираем из страницы link_id и link_name, впрочем последний можно взять и из ссылки.
Посылаем на сервер запрос с URL'ом: "http://sharingmatrix.com/ajax_scripts/_get.php?link_id=link_id&link_name=link_name&dl_id=&password=undefined".
Это даёт нам параметры на имя сервера и хэш для сесси. Что-то вроде этого:
{serv:"http://s6.sharingmatrix.com", hash:"98a9a3a2f2cb852ea5c457146fae631e"}
Финальный URL выглядит как "serv/download/hash/0/".
Всё это легко автоматизируется на высокоуровневых языках. И не забывайте делать хотя бы небольшие паузы между скачиванием файлов =)
В качестве бонуса подборка ссылок на 50Гб зарубежной литературы - http://rapidshare.com/files/267110323/books.rar с этого самого шарингматрикса.