Tuesday, December 09, 2008

Значение цифровой констаны во время компиляции

Сейчас занимаюсь нудной работой. Компилирую старый код под новым компилятором и новым Platform SDK и нахожу много мест где какие-то определения перестали существовать из-за новых заголовочных файлов где эти определения условные и зависят от флагов например версии операционной системы. Нашел хорошее решение как узнать значение флагов во время компиляции:

// для цифровых

#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message( "FLAG= " STRING(FLAG)) 

// для строковых
#pragma message( "FLAG = " FLAG) 

Monday, November 10, 2008

Как тихо прибить Windows Explorer

Взято отсюдаИдите в  Start > Shutdown. Когда появиться диалог, нажмите и держите CTRL+ALT+SHIFT и кликайте Cancel. Explorer по тихому прибит. Если вы пожалели о содеяном - не проблема, откройте Task Manager (CTRL+SHIFT+ESC is one way) идите в  File > New Task и напишите ‘explorer’.

Tuesday, November 04, 2008

Проголосовал


Сегодня я впервые в жизни проголосовал. Последний раз я был на голосовании в далекие советские времена но не голосовал. На удивление голосование в штатах было очень похожим. Регистрируешься. Получаешь форму. Заполняешь и кидаешь в ящик. Разница только в том что ящики раньше были красного цвета и не были похожи на шредер :)

Thursday, September 04, 2008

C++/CLI Чудеса

Если в managed С++ проэкте создать открытый класс и поместить его в *.h файл то этот класс нельзя использовать. Он не будет видимым если его например подключить к C# проэкту. Чтобы сделать его видимым надо подключить *.cpp файл с сылкой на *.h файл где этот класс описан.

Thursday, August 28, 2008

InternetReadFileEx

Возвращает неправильный размер буфера и данные в нем если память под буфер выделена на стэке и если вызовы InternetReadFileEx асинхронные причем между ними буфер освобождается. Исправляется тем что память выделяется на куче (heap) причем она может даже освобождатсья между вызовами и это как ни странно работает. Я в шоке :)

Thursday, August 21, 2008

Полезный netstat

netstat Попытался запусть сегодня вэб сайт на своей локальной машине в IIS 7.0 Выдал мне ошибку суть которой сводилась к тому что на порту 80 уже кто-то сидит. Спасла комманда netstat -ano которая выдала список всех процессов с портами которые они оккупировали. Так я нашел что Skype сидит на 80 и 443 пришлось его прибить.

Tuesday, June 03, 2008

Сертификат подводника

scuba_diving В эти выходные получил заветную ксиву. После двух дней и шести погружений в десяти а в шестое погружение и пяти градусную воду. Самым трудным было выдержать холод в течении двадцати минут пока сдавали зачеты. Ты висишь в невесомости на глубине метров десяти пока другие сдают и мерзнешь. Дна не видно, поверхность тоже не особо - надо голову задирать. Впечатляет в общем. В конце погружались на двадцать метров там где самая холодная вода. На дне лежал затонувший катер но от холода было не до него. Рыб было интересней смотреть чем развалины всякие. Не понимаю я пока прикола в рассматривании затонувшего мусора всякого. Почему то когда он лежит на свалке к нему нет очереди зрителей но если ту же самую ржавую железку затопить она становиться объектом пристального внимания. Её защищают от осквернения и берут деньги за просмотр.

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

Friday, May 02, 2008

Ныряльщики - подводники

scuba Записался на курсы подводников (scuba diver) На следующей неделе начнутся занятия. Два вечера лекции, два утра ныряние в бассейне - пять погружений и потом четыре погружения на диком водоеме. Если все сдам то получу пожизненную PADI лицензию с которой можно нырять во всем мире. Целью получения лицензии является желание с детства нырять в морских глубинах. А также разнообразие отпуска который обычно выглядит так: пляж, еда, пляж, еда, питье, сон и так рекурсивно.

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

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

Friday, March 14, 2008

Виста сакс

vistlipse В продолжение моего поста про Висту. Я работал под ней уже несколько месяцев и не доволен. Виста нестабильная. Программы падают и очень часто. При этом это программы написанные Майкрософтом и что еще хуже - под Висту. Программы написанные ранее тоже часто не работают. Например мой Microsoft Money 2007 не работает под ней.

Один раз удалив zip  архив Виста вместе с ним удалила весь фолдер в котором он был. В фолдере был результат двухдневной работы и восстановить было никак. Хорошо у меня была запасная копия на USB брелке.

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

Я люблю когда программы работают быстро. Мне не столь важно чтобы они красиво выглядели сколько как бысторо они работают. Деньги = Время, верно? Я не могу хочу сносить Висту и ставить ХР потому что Майкрософт делает некоторые технологии только на Висте или они только на ней имеют смысл и мне с ними надо работать WPF например. Но остальным для повседневного пользования я бы советовал остаться с ХР как можно дольше. Я надеюсь что Виста разделит судьбу Windows ME и будет заменена чем-то более уместным иначе придется пересесть на Линукс.

Самый лучший оптимизатор

blackbook Прочитал главу из книжки. По совету Jeff Atwood-а. Книжка старая но она не из серии "С++ за 24 часа" и не устареет никогда. Глава посвящана простой идее что самый лучший оптимизатор находится между ушей того кто дизайнит программу. И какой бы навороченный компилятор он не использовал и на каком бы низкоуровневом языке не писалась программа плохой дизайн не исправишь ничем. Заявление сопровождается примерами вычисления check суммы файла. В книжке много примеров которые на моей машине исполнялись от пол-минуты до очень малых долей секунд при том же входном файле. Шаг за шагом автор объясняет как можно улучшить результат предидущего примера. Верхом оптимизации становиться лучший алгоритм написанный на ассемблере но он лучше всего на доли секунд аналогичного на С и издержки программирования на ассемблере могут быть больше чем преимущества алгоритма, хотя - кто знает? Если надо обработать миллионы файлов то доли секунд станут минутами и это уже может иметь влияние на восприятие программы. Еще одно наблюдение что надо очень хорошо знать платформу и язык на котором работаешь. Причем на лучше всего на самом низком уровне. Я например не знал что чтение байта из файла с помощью read() и getc() совершенно разные. read() читает байт с диска на каждое обращение а getc() кэширует кусок файла в своем буффере и последующее чтение идет из него. Таким образом улучшая производительность. Не зная этих деталей никакой толковой оптимизации не добъешься. Поэтому даже программируя в управляемой среде как Java или .NET надо знать что делает платформа на нижнем уровне, какой API использует.

Thursday, February 07, 2008

Динамический веб хостинг

web-hosting Весь прошлый год я хостил свой сайт на WebHost4Life и был сильно разочарован: down-time был постоянный, сайт работал медленно, control panel был ужасный, насторойка базы данных неудобная ну и т.д. На сайте ничего ужасно бизнес-критического не было а мне было лень искать другой хостинг. В начале этого года подошел срок контракта с хостером и я задумался извечным "Что делать?" Хотелось свой выделенный сервер, куда можно удаленно зайти и поставить туда любую платформу или базу данных и просто иметь полный контроль над тем что бегает на моем сервере. При этом чтобы стоило это баксов двадцать в год ... Это оказалось как ни странно вполне реально! Я превратил свой старый бездействующий комп в веб сервер на котором хоститься мой сайт. Сделал я это так. Я купил аккаунт на No-IP.com за $24.95 в год. Их сервис позволяет регистрировать динамический IP моего интернет провайдера Verizon через небольшую програмку которая стоит на моем сервере и при изменении IP посылает его No-IP.com который таким образом знает мой текущий IP в реальном времени. Затем они обновляют динамически DNS сервера для моего домена с моим новым IP. Тут однако я столкнулся с одной проблемой. Как оказалось мой интернет провайдер не дает в 80 порт никому снаружи и все HTTP запросы на этот порт просто не доходили до моего сервера. Что отражалось ошибкой в броузере типа "Запрос взял слишком много времени" На это у No-IP.com есть решение. Можно указать на какой порт перенаправлять запросы к моему домену что я и сделал. Я указал свободный порт  в который провайдер дает всем и сделал в своем роутере перенаправление с него на порт 80 моего сервера. Пока все прекрасно работает!

Thursday, January 31, 2008

LDI, Inc.

laser В начале третьего курса обучения в ТТУ на факультете программизма и компьютерной грамоты я почувствовал острую нехватку денег и опыта практической работы. На удачу на доске объявления в главном корпусе висело объявление о наборе студентов на работу в молодую компанию как сейчас бы назвали стартап. Компанией руководит доктор физико математических наук. Мужик очень умный и грамотный. Он сразу сказал что денег у молодой компании нет особо а работы хоть отбавляй. Компания занималась проэктированием и разработкой лазерной техники. Например для диагностики загрязнения окружающей среды. Лазерный луч посылался в направлении объекта изучения и отраженный возвращался назад где и диагностировался приборами. По спектру того что возвращалось определялся уровень загрязнения.

Платили по 500 EEK что для бедного студента было достаточно в принципе если родители помогали. Работали когда было время и когда было на чем. В самой компании с компьютерами было плохо. На одном компьютере работало несколько человек по сменам. Мы со Славой и Иваном приходили вечером и если везло то программировали. Первое задание как помню было написать программу под MS DOS которая бы была графической консолью к одному из приборов установленному на кораблях. Слава писал драйвер на ассемблере, Иван графику реального времени и я писал графический интерфейс пользователя наподобие того что было в Windopws 95. Программу написали и хотя стыдно вспомнить невежественный код который по нехватке опыта был написан но график реального времени что Иван написал спасал и пользователь был рад. Летом однако проблема нехватки денег стала острее и мы попрослил больше но президент компании сказал что то что он платит это все что есть и мы решили что останется Иван чтобы он получал за троих но уже работая постоянно а мы со Славой ушли в Dynanet о котором расскажу позже.

Небольшой таймаут

timeout Контракт с веб хостером закончился и я решил его не продлять. Вместо этого я решил оставить в качестве своего сайта только этот блог на гугле. Мой домэйн будет пока тупо перенаправлять сюда. Это все вызвало невозможность зайти на сайт за что извинения.

Tuesday, January 22, 2008

Новые фотки из Юты

Utah2008 Здесь. Эти фотки я делал сам за исключением тех на которых изображен я :)

Friday, January 18, 2008

Исходники к .NET CLR

source_code Выпустил Майкрософт. Теперь когда дебажишь .NET  код можно сделать Step Into CLR кода. Кроме того что это даёт возможность ещё больше винить Билла в всех грехах причем теперь делать это аргументированно также можно посмотреть на коммерческий код высокого качества и поучиться уму разуму а так-же лучшей практике программирования. Писать библиотеки значительно труднее чем клиентов для них. Так что их я думаю писали одни из лучших Майкрософт программеров. О том как залезть по уши в исходники CLR прямо из Вижуальника сказанно на английском здесь. От себя добавлю что работать это стало гладко не сразу. У меня уже был установлен символьный сервер через переменную среды _NT_SYMBOL_PATH. Когда она установленна то Вижуал Студия игнорирует то что находится в опциях. Переменную надо переустановить и перегрузить машину. Мне это помогло.

Wednesday, January 16, 2008

Юта

utahВот и закончился долгожданный отпуск в Юте. Неделя бесконечных подъемов и спусков с разноцветных горок при видимости от полной до нулевой.

Нам повезло со снегом. За неделю что мы там были выпало около трёх метров нового снега. Я никогда не катался по свежему, натуральному снегу до этого тем более по такому количеству!

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

Распорядок дня был простым. Утром вставали, одевались и ехали на горки. Катались до вечера. Потом обратно. Готовили ужин и смотрели "Ликвидацию" (Кто же "Академик"?) а когда посмотрели весь то "Диверсанта" (Кто же диверсант?)  :)

Фотки здесь. Свои добавлю позже.

Thursday, January 03, 2008

Отпуск

skiing Завтра едем кататся на лыжах на целую неделю в горы Юты. Снег уже покрыл самые высокие деревья по самые макушки и солнце скрылось за тучами несущими новый урожай снега. Всех с Наступающим Старым Новым Годом! Отчет об отпуске последует.

Биржа

laboroffice Вторая работа была на бирже труда. Должность называлась оператор ЭВМ (что бы это ни значило). Программа на которой я оперировал свою ЭВМ была написана на Fox Pro 2.0. Я вбивал в неё бумажные анкеты безработных и в остальное время рубился в Elite. Иногда я дописывал программу чтоб было легче делать статистику. Эту программу написал программист Володя выпускник Таллинского Политехнического Института куда я позже поступил. Когда программа ломалась он приходил чинить и по ходу рассказывал мне что FoxPro далеко не все что есть в мире программизма. Он дал мне дистрибутив Turbo Pascal 7.0 а я нашел по нему книжку и начал писать на нем программы. Это было прикольно не только потому что Pascal очень быстро компилировался но  также позволял встраивать в себя низкоуровневый ассемблерный код. Это решило мою задачу с которой я столкнулся в Эвесте. Мои тексторежимные окошки прорисовывались изящно, быстро и оставляли крутую тень под собой - предмет моей тогдашней гордости. Были и другие прелести знания Паскаля.  Это был язык который преподавали студентам и особенно студенткам местного универа которые стали приходить чтобы я помог им написать программы. Так я впервые встретил свою будущую жену. Хотя тогда дальше привет - привет знакомство не пошло. Позже Володя упомянул язык С о котором он говорил с благоговеянием и дал мне дистрибутив Borland С++ 3.1.  Я был не в восторге поначалу. Мне казалось что "begin" лучше чем "{" а "end" чем "}" (смешно да? ). Но потом когда я увидел что один вызов memcpy() заменил мне две страницы Pascal + Assembly кода я бросил Pascal без колебаний. Чуть позже я бросил и биржу чтобы поехать посмотреть мир. Я начал с Германии где пожив пару месяцев я вернулся и пошел работать на игровых автоматах. Быстро понял что надо учиться и сидеть в теплом оффисе с приветливыми комьютерами а не в прокуренном зале где собирались опускающиеся граждане которые искренне верили что автоматы можно выиграть. Если бы они спросили меня я бы им просто сказал что начинаю день с нулевой кассой и заканчиваю с далеко не нулевой и так каждый день ...  но граждане были очень доверчивые и проиграв со слезами на глазах умоляли дать в долг на что я с каменным лицом отказывал. Поработав до зимы я восстановился в Таллинском Политехническом Университете уже как будущий инженер по вычислительной технике. Начав учится я почувствовал острую нехватку денег и пошел работать в LDI. Но об этом позже ...