Tuesday, April 29, 2008

Верю не верю

jasminerice Не перестаю удивлятся желтости Российских СМИ. Вот недавний пример отсюда. Заголовок: "США перейдут на карточки" В статье написана перепечатка из 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

rahien_cover150 Книжку с таким названием я сегодня прикупил. Для тех кто не знает 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

Пятничный этюд

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

Но бывает и другой день, день когда хорошо выспишься. Когда такой день чувствуешь себя кроликом "Энерджазером". Хочется одеть чёрные очки и барабанить ... если же барабанить нечего некого то можно попробовать побарабанить по клавиатуре. Это конечно не то же самое но зато за это платят.