December 20, 2006

Последовательные порты и параллельное исполнение

Так уж вышло, что текущая работа связала меня одновременно с Microsoft .Net Framework и последовательными портами (COM-порты в простонародии). И вот с ними я заимел много-много хлопот в последнее время. Но, обо всём по-порядку.

Сначала была библиотека, писаная давным давно на C++. Эта библиотека обеспечивала требуемую функциональность, но найти, а тем более исправить в ней ошибки, которые периодически возникали, было делом непростым. Я не утверждаю, что она была написана плохо, прото она написана не мной, а человеком, который уже давно сменил место работы, и, по всей видимости, писалась долго, так что нагромождения кода разобрать было сложновато. Взаимодействие с этой библиотекой происходило через PInvoke.

Окунёмся ещё глубже в историю. Год назад вышел .Net Framework 2.0, в котором наконец-то появились инструменты для работы с последовательными портами. И с самого начала работы над текущим проектом я намеревался упросить-таки начальство переписать описанную выше библиотеку на C#. Как оказалось доигрался...

Решение было принято. Библиотеку переписали. Всё стало по-новому. Только вот появилась одна неприятная ошибочка, отловить которую никак не удавалось. Где только можно были поставлены try-catch блоки. Все ошибки логировались. Но приложение всё равно падало. Чтобы этого добиться достаточно было удалить из системы COM-порт в момент отправки на него чего-либо. Исключение вываливалось прямо из внутреннего потока исполнения и обрабатывалось нигде. А потом наш тестер Тестер ввёл текст ошибки в Google, или не знаю уж куда, вобщем в поисковик и нашёл вот это. Если вкратце, то разработчики из Microsoft (которые, как известно, самые обиженные люди, потому что им пенять не на кого), реализовывавшие SerialPort и сопутствующие классы, решили, что последовательные порты в системе - понятие статичное и появляться, а уж тем более исчезать, не могут. Слегка странное решение, если учесть, что сейчас каждый второй (если не первый) телефон снабжён модемом и подключается через USB, не говоря уже про всякие Bluetooth модемы.

Шок от этой новости был ещё тот. Через 4 дня релиз, а тут одна из ключевых фич не работает. Я, как предложивший использовать .Net для всего, вообще хотел забиться в дальний угол (shame on me). Выручил снова молодец Тестер. Тем же своим поисковиком он нашёл возможные решения. Пришлось в срочном порядке подменять стандартную .Net реализацию SerialPort'а самописной. Что интересно -- заработало.

Мораль сей басни такова: если ошибку не удалось отловить быстро - ищи в интернете. Ну и ещё на память заметочка: проверять возможность реализации чего-бы то ни было прежде чем браться за реализацию :-)


Цуи ыуфкср (или web search по-русски)

Не знаю кто как, а я постоянно ищу в Google что-нибудь типа "уьфсы ащк цштвщцы". И что странно, никогда не нахожу. Вчера мне это надоело и я решил написать о том, как было бынеплохо внедрить перевод раскладки в качестве подсказки в результатах поиска. Провёл серию тестов (искал фразы "gjcbr d bynthytnt" и "цуи ыуфкср") и выяснил, что:

Вот вроде бы мелочь, а как было бы удобно вместо того, чтобы вручную каждый раз переделывать запрос, просто нажать на предложенную ссылочку.

ЗЫ: Про PuntoSwitcher я слышал и активно его использую, но только не в автоматическом режиме, иначе просто невозможно писать код.


December 12, 2006

Это вам не математика

"От перестановки мест слагаемых сумма не меняется"
переместительный закон для сложения

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

Дело было так. Задача - обеспечить поиск работающих экземпляров приложения в локальной сети. Решение очевидно: на стороне искомого - Listener, ожидающий запросов из сети и отвечающий на них, на стороне ищущего - Screamer (ну он действительно крикун, что я сделаю :-)), посылающий широковещательный запрос в сеть и ожидающий ответов от всех Listener'ов. Всё предельно просто. Было написано, оттестировано и работало. Работало на Microsoft .Net v1.1.

Потом проект мигрировали под .Net v2.0, который много что объявил obsolete, что-то было переписано, но это совсем другая история. Внезапно оказалось, что описанное выше решение работает через раз. То есть, иногда оно видит работающие приложения, иногда нет, и даже если видит, то необязательно все. Признаться, я долгое время грешил на возможно новую реализацию всего этого механизма в .Net, а когда взялся за проблему всерьёз, понял, что был неправ.

Основная проблема скрывалась внутри Listener'а. Его ThreadProc крутился пока не выполнялось некое условие, а именно, не выставлялся флаг об остановке. Только вот при инициализации Listener'a сначала создавался и запускался тред, и только потом выставлялся флаг. Получается, что в один и тот же код в версии 2.0 работает быстрее чем в версии 1.1.

Ну и конечно, всё решилось перестановкой двух строчек, запуска треда и выставления флага. И кто бы мог подумать с такими симптомами...

Когда я поделился решением с коллегами, они, конечно, смеялись, но простили мне оплошность с невовремя установленным флагом. И вскоре я взялся за решение другой проблемы. В этот раз почему-то не всегда срабатывало получение данных из последовательного порта.  Если отправлять команду, требующую работы устройства, всё работает стопроцентно, а если посылать подряд, скажем, 1000 команд ATZ, ответ рано или поздно не приходит. Тут уж я не стал, как водится, ругаться на программистов Microsoft, а начал искать ошибку в своём коде обмена данными с портом. Логика там непростая, поэтому пришлось потратить какое-то время и огромное количество Debug.WriteLine. И что в итоге, спросите вы! Да то же самое. Я сначала посылал команду в порт и только спустя пару строчек кода подписывался на событие DataReceived. И снова всё решилось перестановкой двух "слагаемых".

Вот такая вот математика.


December 5, 2006

Зло 2.0 или почему я не пойду работать в Google

В Большой театр нас не взяли. В Малый - сами не пошли. (с)утерян

Когда-то давным давно, а именно, год-два назад, я просто мечтал о том, чтобы пойти работать в эту Великую (Да! Именно с большой буквы "В") компанию. Я не хотел идти работать в Microsoft, ибо "Suxx". Я грезил только Гуглем. Что уж там говорить, моё знакомство с Python, а потом и Ruby, началось с того, что я где-то прочитал высказывание Peter Norvig об использовании Python в разработках Google.

Мне всегда нравились, и продолжают нравиться их разработки. Всё, что я слышал о принципах организации труда разработчиков, мне тоже нравится. Ну правда! Как может не понравиться организованное прямо под боком кафе, массажные кабинеты, хардверное обеспечение рабочего места, 20% проекты и прочее и прочее и прочее...

Итак, почему, же я всё-таки не хочу там работать. Точнее сказать, я хочу, но не пойду. Ну во-первых, конечно, потому что меня туда не позовут (хотя этот вопрос требует отдельного разговора :-)). А во-вторых есть некоторые вещи, которые меня настораживают. Например: официальные блоги Google. По содержанию - просто пропагандистская трибуна. Ничего толком, одни пресс релизы и описания того, "как там жить хорошо". (Заманиловка?) Зачем тогда всё это оборачивать в форму блогов? (Только что идея пришла: может быть потому, что у них нет своего своего корпоративного сайта, где бы лежали все новости. Может быть.) И зачем всё это писать от имени разных людей? Кроме того, не далее как позавчера я посмотрел видео, где Robert Scoble ходит по оффису Google в Kirkland. Всё здорово. Снова показывают красивую жизнь, даже беседуют с местным поваром. Всё замечательно. Я смотрел смотрел, всё мне нравилось, только вот на заднем плане, за двумя гуглерами, с которыми собственно и было интервью, постоянно маячили в непринуждённых позах два типа с бейджами. К чему бы это? Неужели цензоры? Это всё вместе заставило меня задуматься. А есть ли у работников Google, окно во внешний мир? Вот, Microsoft, например, который все уже по привычке ругают по поводу и без, имеет огромный ресурс MSDN Blogs, где можно зачастую найти информацию, которой нет в официальных документах, есть ещё Technet, и наверняка ещё много чего. А кто-нибудь слышал о блогах разработчиков Google, где они бы описывали задачи, с которыми сталкиваются? Я нет. (Если кто слышал - возразите мне и поделитесь ссылкой :-)). Мне попадались, правда, какие-то презентации про MapReduce, но не более того. А презентации это совсем не блог.

Ладно блоги, но у Microsoft есть ещё Channel9. Люди с видеокамерами ходят по офису(ам) и общаются с простыми и не очень разработчиками. А что Google? Скоббла и того провели только по пустым коридорам, показали разукрашенные стены, snack bar и шеф-повара, и при этом не дали вблизи посмотреть на рядовыхз программистов. Нет, они определённо что-то скрывают! Не иначе - планируют захват власти. В наш век, как известно, кто владеет информацией - тот правит миром, а у Google в его хранилищах столько информации, что нам с вами и не снилось.

Вобщем, мне кажется, что на данный момент Microsoft является куда более "интересной" и открытой компанией чем Google. И "почётное" звание "мирового зла", или даже "мирового зла 2.0", можно смело присуждать последнему.


This page is powered by Blogger. Isn't yours?