Записался на курсы подводников (scuba diver) На следующей неделе начнутся занятия. Два вечера лекции, два утра ныряние в бассейне - пять погружений и потом четыре погружения на диком водоеме. Если все сдам то получу пожизненную PADI лицензию с которой можно нырять во всем мире. Целью получения лицензии является желание с детства нырять в морских глубинах. А также разнообразие отпуска который обычно выглядит так: пляж, еда, пляж, еда, питье, сон и так рекурсивно.
Friday, May 02, 2008
Ныряльщики - подводники
Tuesday, April 29, 2008
Верю не верю
Не перестаю удивлятся желтости Российских СМИ. Вот недавний пример отсюда. Заголовок: "США перейдут на карточки" В статье написана перепечатка из CNN. Где написанно что две оптовые сети ограничили продажу девяти килограмовых мешков риса по четыре в руки. Дальше идет мнение "специалиста": «Слова о том, что кризиса нет и ограничения не вызваны дефицитом – обычные, и не самые удачные, попытки успокоить американское общество. Слова словами, однако сам факт редукции продаж указывает на критическую ситуацию..." И вывод: "А в качестве одного из самых реальных методов ликвидации кризиса может стать возрождение распределительной системы снабжения – в этом случае мы уже совсем скоро станем свидетелями появления в США и странах Западной Европы продовольственных карточек" ...
Какого ...? Журналист ... хренов поставил знак равно между "США перейдут на карточки" и "может скоро станем свидетелями появления в США продовольственных карточек"
Monday, April 28, 2008
Access violation
На днях довелось чинить одну из программ которую я поддерживаю. Я знал что код падает в определенном модуле с Access violation ошибкой. Очень выборочно падает. Тоесть тостер не мог мне сказать как повторить этот баг. Вместо этого мне дали имя файла где этот код падает и примерное место где. Также дали:
Состояние регистров
EAX: 0 EBX: 0 ECX: 334068 EDX: 334068 ESI: 38ae908 EDI: 32 ESP: 12e65c EBP: 12e6d8 EIP: 684356a8
Код на ассемблере
6843569e 85c0 test eax,eax
684356a0 6a32 push 0x32
684356a2 5f pop edi
684356a3 7510 jnz 684356b5
684356a5 ff7508 push dword ptr [ebp+0x8]
684356a8 8b0b mov ecx,[ebx]
684356aa e871f5ffff call 68434c20
684356af 84c0 test al,al
684356b1 7409 jz 684356bc
684356b3 8bc1 mov eax,ecx
684356b5 e80af5ffff call 68434bc4
684356ba 8bf8 mov edi,eax
684356bc ff7648 push dword ptr [esi+0x48]
А также строчку на ассемблере где падает
684356a8 8b0b mov ecx,[ebx]
Я давно ничего не писал на ассемблере и было приятно вспомнить. Тем более что баг серьезный и было непонятно как его найти так что надо было использовать все что есть.
Я не помню всех команд но по push 0x32 видно что в стэк занесена константа которая в десятиричной системе представляется как 50. Дальше идет сравнение того что в регистре eax с нулем. И если 0 то идет прыжок на адрес 684356b5 потом сохраняется значение локальной переменной и ... мы падаем на mov ecx,[ebx] Эта строчка копирует содержимое по адресу который находится в регистре ebx в регистр ecx. Смотрим что у нас в евх, ага бинго! 0! Теперь ясно. Нулевой указатель. Поэтому и падаем. Процесс решил залезть в чужое адресное пространство. Дальше я нашел это место в С-шном коде. Оно выглядит примерно так:
void foo(X* pX, Y* pY)
{
if(pX)
{
if (pY)
{
use(pY);
}
else
{
int err = 50;
if (pX->error != 0)
{
err = bar(pX->error);
}
else
{
if(boo(pY->error))
{
err = bar(pY->error);
}
}
}
}
}
Ну, господа, программисты на С. Видите где ошибка?
В резюме добавлю что во многих универах на факультетах информатики перестали преподавать не то что ассемблер а даже С и С++. Теперь один сплошной managed code: Java, .NET и тд. Но это одна сторона медали - темная. Другая, это то что у тех кто знает ассемблер и С - неплохая job security. Или как это по русски? Уверенность в рабочем месте?
Wednesday, April 23, 2008
Построение DSL в Boo
Книжку с таким названием я сегодня прикупил. Для тех кто не знает DSL это Domain Specific Language или по русски язык специфический для определенной деятельности. Например есть языки для чатов: "пиши исчо кросавчег". Есть языки на котором разговаривают правильные пацаны, светские львицы а также пьяные матросы. Даже у программиста свой язык от которого его жене хочется зевать и порой - удавиться. DSL это тоже самое но для компьютерных программ. Например как будет выглядеть получение даты через две недели на популярных языках программирования:
С
time() * 1209600;
С#
DateTime.Now.AddDays(14);
Согласитесь что второй вариант читается легче чем первый хотя и он не идеал. Идеал был бы что то вроде: 2.weeks и в этом DSL и является специалистом. Язык написанный для решения спецефической задачи. Я сейчас как раз работаю на проэкте для Xlinesoft который использует целых два DSL. Один язык это макро язык шаблонов который используются для герерации кода или динамической части для вэб приложений который обращается к базе данных и занимается другой логикой в программе и второй smarty для постороения визуальной части тех же самых приложений. Контролов, таблиц и тд. Так что идея использования DSL далеко не нова. Однако писать с нуля компилятор для своей узкой ниши не всегда оправдывало себя пока не появились языки как Ruby или Boo. Boo позволяет обяснять компилятору как компилировать программу определять как должны компилироваться if, foreach и так далее. И все это делается элегантно без залезания в кишки самого компилятора. Я только начал читать и расскажу больше когда прочитаю.
Friday, April 18, 2008
Пятничный этюд
Когда я не высыпаюсь то лучше вообще ничего не делать. Никакое кофе не спасает. Оно помогает держать глаза
безумнооткрытыми и создавать иллюзию для моего босса того что я активно работаю что сказывается в ритмичном стучании по клавиатуре и хорошо что он не знает что головой. Вчера был такой день. Хотелось спать и нехотелось все остальное, особенно работать, особенно в такой прекрасный день, особенно над тем над чем я должен был работать, особенно зная что то, что мне надо сделать скорее всего никому на (бип) не надо...Но бывает и другой день, день когда хорошо выспишься. Когда такой день чувствуешь себя кроликом "Энерджазером". Хочется одеть чёрные очки и барабанить ... если же барабанить нечего
некогото можно попробовать побарабанить по клавиатуре. Это конечно не то же самое но зато за это платят.
Friday, March 14, 2008
Виста сакс
В продолжение моего поста про Висту. Я работал под ней уже несколько месяцев и не доволен. Виста нестабильная. Программы падают и очень часто. При этом это программы написанные Майкрософтом и что еще хуже - под Висту. Программы написанные ранее тоже часто не работают. Например мой Microsoft Money 2007 не работает под ней.
Один раз удалив zip архив Виста вместе с ним удалила весь фолдер в котором он был. В фолдере был результат двухдневной работы и восстановить было никак. Хорошо у меня была запасная копия на USB брелке.
В ней есть много конкретно раздражающих "фич". Например копирование файлов или их удаление. Надо заметить что Виста делает этот процесс максимально болезненным, настолько чтобы в следующий раз крамольная мысль об удалении файлов или их копировании больше не возникала.
Я люблю когда программы работают быстро. Мне не столь важно чтобы они красиво выглядели сколько как бысторо они работают. Деньги = Время, верно? Я не могу хочу сносить Висту и ставить ХР потому что Майкрософт делает некоторые технологии только на Висте или они только на ней имеют смысл и мне с ними надо работать WPF например. Но остальным для повседневного пользования я бы советовал остаться с ХР как можно дольше. Я надеюсь что Виста разделит судьбу Windows ME и будет заменена чем-то более уместным иначе придется пересесть на Линукс.
Самый лучший оптимизатор
Прочитал главу из книжки. По совету Jeff Atwood-а. Книжка старая но она не из серии "С++ за 24 часа" и не устареет никогда. Глава посвящана простой идее что самый лучший оптимизатор находится между ушей того кто дизайнит программу. И какой бы навороченный компилятор он не использовал и на каком бы низкоуровневом языке не писалась программа плохой дизайн не исправишь ничем. Заявление сопровождается примерами вычисления check суммы файла. В книжке много примеров которые на моей машине исполнялись от пол-минуты до очень малых долей секунд при том же входном файле. Шаг за шагом автор объясняет как можно улучшить результат предидущего примера. Верхом оптимизации становиться лучший алгоритм написанный на ассемблере но он лучше всего на доли секунд аналогичного на С и издержки программирования на ассемблере могут быть больше чем преимущества алгоритма, хотя - кто знает? Если надо обработать миллионы файлов то доли секунд станут минутами и это уже может иметь влияние на восприятие программы. Еще одно наблюдение что надо очень хорошо знать платформу и язык на котором работаешь. Причем на лучше всего на самом низком уровне. Я например не знал что чтение байта из файла с помощью read() и getc() совершенно разные. read() читает байт с диска на каждое обращение а getc() кэширует кусок файла в своем буффере и последующее чтение идет из него. Таким образом улучшая производительность. Не зная этих деталей никакой толковой оптимизации не добъешься. Поэтому даже программируя в управляемой среде как Java или .NET надо знать что делает платформа на нижнем уровне, какой API использует.