Tuesday, December 09, 2008
Значение цифровой констаны во время компиляции
Monday, November 10, 2008
Как тихо прибить Windows 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
Попытался запусть сегодня вэб сайт на своей локальной машине в IIS 7.0 Выдал мне ошибку суть которой сводилась к тому что на порту 80 уже кто-то сидит. Спасла комманда netstat -ano которая выдала список всех процессов с портами которые они оккупировали. Так я нашел что Skype сидит на 80 и 443 пришлось его прибить.
Tuesday, June 03, 2008
Сертификат подводника
В эти выходные получил заветную ксиву. После двух дней и шести погружений в десяти а в шестое погружение и пяти градусную воду. Самым трудным было выдержать холод в течении двадцати минут пока сдавали зачеты. Ты висишь в невесомости на глубине метров десяти пока другие сдают и мерзнешь. Дна не видно, поверхность тоже не особо - надо голову задирать. Впечатляет в общем. В конце погружались на двадцать метров там где самая холодная вода. На дне лежал затонувший катер но от холода было не до него. Рыб было интересней смотреть чем развалины всякие. Не понимаю я пока прикола в рассматривании затонувшего мусора всякого. Почему то когда он лежит на свалке к нему нет очереди зрителей но если ту же самую ржавую железку затопить она становиться объектом пристального внимания. Её защищают от осквернения и берут деньги за просмотр.
Весь курс занял где-то сорок часов. Надо было посмотреть видео. Ответить на вопросы в книжке. Потом пройти тест на тот-же материал. Затем два дня по четыре часа практики в бассейне где учили как дышать под водой и как вести себя в случае наиболее распостраненных обстоятельств таких как запотевшая маска, потерянная маска, кончившийся воздух и тд. Ну и конечно два дня практики на дикой воде. Где мы делали тоже самое но уже на глубине в холоде в условиях приближенных к реальным. Вот некоторые фотки.
Friday, May 02, 2008
Ныряльщики - подводники
Записался на курсы подводников (scuba diver) На следующей неделе начнутся занятия. Два вечера лекции, два утра ныряние в бассейне - пять погружений и потом четыре погружения на диком водоеме. Если все сдам то получу пожизненную PADI лицензию с которой можно нырять во всем мире. Целью получения лицензии является желание с детства нырять в морских глубинах. А также разнообразие отпуска который обычно выглядит так: пляж, еда, пляж, еда, питье, сон и так рекурсивно.
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 использует.
Thursday, February 07, 2008
Динамический веб хостинг
Весь прошлый год я хостил свой сайт на 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.
В начале третьего курса обучения в ТТУ на факультете программизма и компьютерной грамоты я почувствовал острую нехватку денег и опыта практической работы. На удачу на доске объявления в главном корпусе висело объявление о наборе студентов на работу в молодую компанию как сейчас бы назвали стартап. Компанией руководит доктор физико математических наук. Мужик очень умный и грамотный. Он сразу сказал что денег у молодой компании нет особо а работы хоть отбавляй. Компания занималась проэктированием и разработкой лазерной техники. Например для диагностики загрязнения окружающей среды. Лазерный луч посылался в направлении объекта изучения и отраженный возвращался назад где и диагностировался приборами. По спектру того что возвращалось определялся уровень загрязнения.
Платили по 500 EEK что для бедного студента было достаточно в принципе если родители помогали. Работали когда было время и когда было на чем. В самой компании с компьютерами было плохо. На одном компьютере работало несколько человек по сменам. Мы со Славой и Иваном приходили вечером и если везло то программировали. Первое задание как помню было написать программу под MS DOS которая бы была графической консолью к одному из приборов установленному на кораблях. Слава писал драйвер на ассемблере, Иван графику реального времени и я писал графический интерфейс пользователя наподобие того что было в Windopws 95. Программу написали и хотя стыдно вспомнить невежественный код который по нехватке опыта был написан но график реального времени что Иван написал спасал и пользователь был рад. Летом однако проблема нехватки денег стала острее и мы попрослил больше но президент компании сказал что то что он платит это все что есть и мы решили что останется Иван чтобы он получал за троих но уже работая постоянно а мы со Славой ушли в Dynanet о котором расскажу позже.
Небольшой таймаут
Tuesday, January 22, 2008
Friday, January 18, 2008
Исходники к .NET CLR
Выпустил Майкрософт. Теперь когда дебажишь .NET код можно сделать Step Into CLR кода. Кроме того что это даёт возможность ещё больше винить Билла в всех грехах причем теперь делать это аргументированно также можно посмотреть на коммерческий код высокого качества и поучиться уму разуму а так-же лучшей практике программирования. Писать библиотеки значительно труднее чем клиентов для них. Так что их я думаю писали одни из лучших Майкрософт программеров. О том как залезть по уши в исходники CLR прямо из Вижуальника сказанно на английском здесь. От себя добавлю что работать это стало гладко не сразу. У меня уже был установлен символьный сервер через переменную среды _NT_SYMBOL_PATH. Когда она установленна то Вижуал Студия игнорирует то что находится в опциях. Переменную надо переустановить и перегрузить машину. Мне это помогло.
Wednesday, January 16, 2008
Юта
Вот и закончился долгожданный отпуск в Юте. Неделя бесконечных подъемов и спусков с разноцветных горок при видимости от полной до нулевой.
Нам повезло со снегом. За неделю что мы там были выпало около трёх метров нового снега. Я никогда не катался по свежему, натуральному снегу до этого тем более по такому количеству!
В прошлый отпуск в Колорадо я со страхом влезал на "синие" горки в этот раз уже уверенно лез на "чёрные" покрытые новым снегом. Так что прогресс налицо, по крайней мере в преодолении страха перед высотой и скоростью. О технике молчу. Хорошая техника полируется многократными повторениями о которых можно только мечтать катаясь неделю в году.
Распорядок дня был простым. Утром вставали, одевались и ехали на горки. Катались до вечера. Потом обратно. Готовили ужин и смотрели "Ликвидацию" (Кто же "Академик"?) а когда посмотрели весь то "Диверсанта" (Кто же диверсант?) :)
Фотки здесь. Свои добавлю позже.
Thursday, January 03, 2008
Отпуск
Биржа
Вторая работа была на бирже труда. Должность называлась оператор ЭВМ (что бы это ни значило). Программа на которой я оперировал свою ЭВМ была написана на Fox Pro 2.0. Я вбивал в неё бумажные анкеты безработных и в остальное время рубился в Elite. Иногда я дописывал программу чтоб было легче делать статистику. Эту программу написал программист Володя выпускник Таллинского Политехнического Института куда я позже поступил. Когда программа ломалась он приходил чинить и по ходу рассказывал мне что FoxPro далеко не все что есть в мире программизма. Он дал мне дистрибутив Turbo Pascal 7.0 а я нашел по нему книжку и начал писать на нем программы. Это было прикольно не только потому что Pascal очень быстро компилировался но также позволял встраивать в себя низкоуровневый ассемблерный код. Это решило мою задачу с которой я столкнулся в Эвесте. Мои тексторежимные окошки прорисовывались изящно, быстро и оставляли крутую тень под собой - предмет моей тогдашней гордости. Были и другие прелести знания Паскаля. Это был язык который преподавали студентам и особенно студенткам местного универа которые стали приходить чтобы я помог им написать программы. Так я впервые встретил свою будущую жену. Хотя тогда дальше привет - привет знакомство не пошло. Позже Володя упомянул язык С о котором он говорил с благоговеянием и дал мне дистрибутив Borland С++ 3.1. Я был не в восторге поначалу. Мне казалось что "begin" лучше чем "{" а "end" чем "}" (смешно да? ). Но потом когда я увидел что один вызов memcpy() заменил мне две страницы Pascal + Assembly кода я бросил Pascal без колебаний. Чуть позже я бросил и биржу чтобы поехать посмотреть мир. Я начал с Германии где пожив пару месяцев я вернулся и пошел работать на игровых автоматах. Быстро понял что надо учиться и сидеть в теплом оффисе с приветливыми комьютерами а не в прокуренном зале где собирались опускающиеся граждане которые искренне верили что автоматы можно выиграть. Если бы они спросили меня я бы им просто сказал что начинаю день с нулевой кассой и заканчиваю с далеко не нулевой и так каждый день ... но граждане были очень доверчивые и проиграв со слезами на глазах умоляли дать в долг на что я с каменным лицом отказывал. Поработав до зимы я восстановился в Таллинском Политехническом Университете уже как будущий инженер по вычислительной технике. Начав учится я почувствовал острую нехватку денег и пошел работать в LDI. Но об этом позже ...