среда, декабря 26, 2007

Про таланты

Российские программисты - лучшие в мире. Возможно. Не исключено даже, что русские женщины - самые в мире красивые. Но только не для других народов. Более того, русские редко-редко когда выигрывают в конкурсах на всяких там "мисс" и "миссис". Почему? Это вопрос в зал.

Если дать программисту всё, что он только ни пожелает и попросить взамен сделать то, что он хочет - что получится? Каждый станет углублять свои собственные любопытствия. Это нормально и правильно. Ну не нравится мне ковыряться с базами данных, ну так я и буду заниматься параллельными вычислениями. А вон тому Александру - нравится. Зачем нужно его время тратить на пониманием сущности выполнения одновременных вычислений простых чисел на 4х ядрах графического процессора? Нормально и правильно. Специалист подобен флюсу, всё же. А теперь представим себе, что такую свободу дают не в исследовательском центре, не в научном проекте, не просто так на отпуске, а на самой настоящей работе. Что получится? Получится плохо.

На днях, ну, неделю может назад или 2, накупил я кучу программ для навигации. Все они, кроме I-go, редкостное дерьмо, но одна из них, прописавшаяся на домене с расширением su, меня просто убила. Недаром говорят, что лучшие расследователи краж - бывшие воры в прошлом. Крадём Windows, Visual Studio, MSDN, MSSQL, Oracle, Office, TomTom, I-go, Unreal, Call of Duty и т.п., но никак не можем позволить никаким другим подлецам (ха-ха-ха), украсть нашу диковину. Делаем защиту. Но не такую, какую уже много лет делают все моральные люди, типа Microsoft и нас, а такую, чтобы пользователь заебался, натурально, чтоб он, сука, понял, как трудно и героично должно житься на свете. Для этого ребятки поступили так. Для начала наплевали на святое. Инсталлятор они воспринимают чисто как средство для переписывания файлов с диска на КПК. Обновления там через него, взаимодействие с сервером активации - это больно просто, не забывайте, для чего таланты из дерьмо.su всё делают: чтобы пользователь ... и далее по тексту. Впрочем, среди них был один умный, видно и активацию самой программы он всё же сделал на КПК. А вот дальше... Нужно активировать карту. Для активации требуется зайти на сайт, ввести ключ, который уже вводился при установке на КПК, ввести ключ карты, получить файл. Со специальным именем переписать его в каталог с картами на КПК и т.п...

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

Так зачем этому талантливому сумасшедшему менеджер дал волю рук? Или менеджер сам не видел, как активируется I-go или TomTom? В общем, последние месяцы меня только и делают, что разочаровывают в интеллектуальных способностях "лучших в мире программистов".

Про "культ карго"

Не так давно, на прошлой неделе, прикупил по случаю, как обычно, в books.ru книгу. "Факты и заблуждения профессионального программирования". Книга не бесспорная, но речь не об этом. Никакая, в конце концов, не бесспорная. Но пункт №1 - главное в программировании - не методы и средства, а сами программисты - убойной силы. В самом деле. Примерно с месяц назад вернулся я из командировки. Завод, который раньше был нормальным заводом, целью которого являлось - производить металл, стал подразделением управленческой империи "Мусала" (всякие совпадения и намёки - случайны и являются заведомо ложными измышлениями!). Теперь инженеры и мастера стали менеджерами, основной производственный цех - исчез, а о качестве работы всего завода судят по показателям. Ну а там, где есть отрыв от реальности, реальность старается подправить такое дело. Высшие сорта металла это что? Это 9, 8 и 7. 6 - это уже низший сорт. Но зачем показывать низший сорт? Покажем его как 7э и всё будет в порядке. Менеджеры, они народ ушлый, не то что мастера ... цеха. Для чего всё это затевалось? Для прозрачности работы? Ну с чего бы прозрачность, если туман начинается уже на уровне производства. Башенка высотой в 1000 кирпичей не сможет устоять, если первый кирпич лежит криво. Что ещё может служить причиной такого слома процесса и людей заодно? Мне кажется, что ответ тут такой: считается (именно - считается), что поставленный процесс повышает качество работы и отдачу от вложений. Если у нас всё плохо - мы поставим процесс и у нас всё станет хорошо (как опять же считается). А то, что ставиться этот процесс будет по живым людям и по реальным показателям - это не важно. Не важно даже то, что никто не знает, будет ли толк от таких изменений. То есть. При отсутствии чёткого, доказанного, обоснованного на 10000% факта необходимости изменения сложившегося процесса, сверху просто взяли и насадили более прогрессивные средства. В частности - SAP. Внедряют второй раз. Это наплевать, что он уже внедрён. Надо теперь по-новому, как требует новейшая корпоративная политика. К чему я это?

Мы выполнили работы по обследованию весьма интересной задачи, связанной с управлением производством (программисты разбежались, поддерживать и развивать некому, а поддерживать надо - позвали нас). Задача большая, писана, конечно, по диагонали, парни показали всё, что они знали и что пытались узнать. Нам нужно было понять, как именно работает это всё, что там есть внутри, из чего состоит и сколько запросить за дальнейшее развитие. Управились чётко в сроки договора. 8 рабочих дней даже, вместо 10. И уже месяц подписываем акт сдачи-приёмки. Почему? Потому что новая корпоративная политика:

  • не нацелена на приоритетное решение задач производственного сектора (хотя бы он и был важнейшим, что требует, оказывается, доказательств)
  • не поощряет быстрое решение волокитных вопросов
  • не предусматривает экономного отношения ко времени контрагентов (т.е., нас)

Почему? Да потому что так на "успешных заводах". Возникает лишь вопрос, успешен ли этот завод теперь?..

четверг, декабря 13, 2007

Созрели 2 темы

1. Про апофеоз "культа карго"
2. Про таланты нашей земли

Обязательно изложу в ближайших же выпусках

вторник, ноября 13, 2007

Продолжаем

Образовалась пауза, поэтому мы тратим её на самообразование.

А новая версия FogBugz - одна из тех вещей, на которые не жаль тратить деньги.

пятница, августа 24, 2007

Пару слов про развлечения

Сегодня заскочил к нам один заказчик. Говорит: мои показывают договор, а там какая-то сумма непонятная, вроде на что-то похожа, но вспомнить, на что - не могу. А сумма там такая: 314159р 26коп. Пишу ему 3.1415926... говорю: "Ничего не напоминает?" Он улыбается довольный: "шутите, да?" Отвечаю ему в тон: конечно!

У нас при расчёте получилось, что эта работа стоит 307. Я решил накинуть маленько до Пи*100000. Дядька ушёл довольный шуткой.

Думаю, теперь стоит опасаться ответных счетов на е^x и прочие корни из двух

суббота, июля 28, 2007

Нет, не умер

Просто очень много дел. Всяких.

воскресенье, июня 24, 2007

Про высшее образование

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

Забавно, что во главе банды стоит какой-то престарелый баклан (не то профессор, не то доцент), который сходу заявил, что "для того, чтобы программа жила нам надо 5 администраторов и 300'000 рублей в месяц на команду". Мы делали ставки, сколько из них парни на самом деле увидят после делёжки проФФесоромЪ. Проиграли все. Дети гадят заказчикам просто в обмен на зачтение практики.

среда, мая 30, 2007

Без чего нельзя выпускаться

Как это ни банально, но без инсталлятора. Мы попробовали и нам не понравилось. А если инструкция имеет вид той, что на картинке, то, может быть, вообще уйти в дворники?

Сколько бы ни стоило написание инсталлятора, денег на это жалеть не надо. Потому что стоимость выездов и ночных побудок с вопросами типа "доколе"- вообще не в деньгах измеряется.

суббота, мая 26, 2007

ВыдыхаемЪ

Последняя неделя прошла в адских трудах. Но оно того стоило. Мы захватили Москву. Не буду ложно скромничать: да. Москву. Очень жаль, что никому нельзя рассказать о том, чем мы занимаемся.

четверг, мая 24, 2007

Сегодня я не выдержал

И написал клиенту нецензурный ответ на его претензии. Достал, гадина. Я знаю, что так себя ведут только малохольные дураки, но ничего поделать с собой не смог.

вторник, мая 15, 2007

Про "деловые встречи"

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

четверг, мая 10, 2007

Механизм наказания раздолбайства

Как это обычно и бывает, всё началось мгновенно. Отдохнули, так сказать, и хватит. Сегодня я расскажу про одних бедолаг, которые наказали себя на пару неплохих автомобильчиков. Вот, как это было.

После долгих и мучительных переговоров, что тянулись несколько месяцев, мы как будто попали на субподряд к одной крупной организации и теперь наше счастье только в наших руках и больше в ничьих. Или ни в чьих. Первое, что мы делаем в таких случаях, это пишем технико-экономическое обоснование своего решения, в котором начинаем с порога выпрашивать деньги и побольше. Когда-то давно мы были скромные и покладистые. Сейчас из этого осталась только покладистость, в смысле "любого каприза". Имея возможность выбирать, мы стараемся выбирать масштабные проекты. Во-первых, чтобы было интересно самим заниматься, challenging jobs, как пишут в резюме и говорят в Эпаме. Во-вторых, чтобы не было стыдно похвалиться перед другими специалистами; тут есть чем похвалиться. Ну и, в-третьих, "для портфолио". Это вариант второго пункта, но со своей спецификой. Впрочем, это не так важно. Вот, значит, договорились мы на большую жыыырную работу. Все знают, что существует бесконечное решение любых проблем. Мы решили использовать платформу MS SharePoint 2007 + MS Office 2007 + MS SQL Server 2005 + .NET 3.0 + ... Наш заказчик в программировании не особо сечёт, там жёсткие дельцы, им интересно (и это понятно) - поменьше закопать, погарантированней получить прибытокЪ. В общем, нас стали склонять к тому, чтобы предоставить альтернативу нашему решению. Видно, что дело не в том, что они боятся слишком много закопать в инфраструктуру (SPS2007 + MSSQL 2007 даже на 10 человек будут стоить довольно неплохо, а таких человек - 3-4 тысячи и они по всей стране сразу!), а боятся, что мы закопаемся в работе и ничего в срок не сдадим. Короче, перестраховались они и затребовали варианты. Ну, кто платит? Будут варианты.

Сидим, думаем, прорабатываем. Кому-то в голову приходит воспоминание об изделии (номер уж не знаю) организации под название ДиджЫтал Зоун, какое-то реалитэ (с ошибкой во французской орфографии). Зашли на сайт, почитали, что это такое, что может. Показалось, что эта штука закроет одну небольшую задачку из списка потребных. 10 баксов-то не лишние, зачем разрабатывать то, что можно за копейки купить (на 500 человек стоит 120 тыс. руб. или типа такого, а у нас программист получает - это ужас, страшно уже в бухгалтерию заглядывать). Ну вот. Реализация как будто устраивает, оставалось уточнить технические детали, касающиеся возможности интеграции программы с инфраструктурой заказчика; ну, как обычно - а как у вас это, а как у вас то... Обычное дело. Я вот на такие письма отвечаю чуть не каждый день. Отвечаю и отвечаю. За это (в том числе) мне зарплату и платят. Не задумываясь, отправляю письмо следующего содержания:

Добрый день,

мне поручено узнать: какие возможности по интеграции предоставляет Realite'? Поясняю. Допустим, наш заказчик приобретает K лицензий на использование. Если при этом он не хочет зависеть от поставщика (т.е., вас) а желает добавить аналитику или новую требуемую ему функциональность - как он это может сделать? Вероятно, одним из таких вариантов является доступ к БД и работа с ней напрямую (R. туда закидывает данные, ребята нашего заказчика пользуются ими для своих нужд). Что ещё можете предложить и как это скажется на стоимости?
Существует ли какая-то документация для технических специалистов?Описание API (если есть), может быть, успешный опыт вписывания вашего pешения в существующую инфраструктуру (вроде объединения с IBM Tivoli)?

Буду признателен за ответ.
--
Юрий


Знаете, какой ответ я получил? Никакого. Может быть, мальчики и девочки заотмечались праздники, может быть ещё что, но факт есть факт: стоимость работ, которые я намеревался закрыть покупкой, составляла сумму в районе 70 тысяч американских рубликов. Мелочь? Чёрт его знает. Мне так пока что не кажется. Наверное, это не показалось бы и организации, президент которой публично хвастался оборотом (!) за прошлый год в 500000 ам. руб (в то время, как у нас прибыль (прибыль!) на человека - 200000.). Но теперь ничего не поделаешь. Надо всё делать вовремя и с первой попытки.

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

--
* опечатки нет. Кому надо - объясню, как 120 тыс. трансформировались в 70 тыс. ам. руб

вторник, апреля 17, 2007

Пауза

Несмотря на кипучую подготовительную работу, в делах возникла пауза. Хоть и говорят, что всегда есть чем заняться, но:
а) заняться-то есть чем, но какая-то апатия бесконечной ёмкости
б) полный паралич воли, как будто по горбу оглоблей

Давно уж такого не было :((

воскресенье, апреля 08, 2007

Распространение приложений и .NET

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

GAC, копирование собственной версии в собственный же каталог - это всё понятно. Номинально (именно номинально) это закрывает проблему. А на самом деле? Новые средства среды и языка дают и новые возможности что-то сделать не так. Например. Библиотека А и библиотека Б. Обе используют класс, объявленный в библиотеке В. Причё используют его на разделяемой основе: типа, сначала первая что-то сделала полезного, потом другая с тем же экземпляром. Плюс к этому - одна другую грузит, например, динамически. При этом в случае А - В идёт в одном с ней каталоге, а в случае Б - в GAC. Пока библиотеки В одинаковы всё будет хорошо. Но если нет? Заметьте, что какой-нибудь видный деятель может с лёгкостию неимоверной просто не поменять версию В при внесении изменений в неё. Я не завидую тому, кто решит понять, в чём же дело в данном конкретном случае. Есть ли в этом случае упрощение развёртывания? Не сказал бы. Особенно в средах, в которых администратор занимается запуском с колёс: разворачивает все присылаемые ему инсталляции в разные каталоги (на всякий случай) и начинает химичить (у нас было так). Пример из жизни: в позапрошлую пятницу репликация была настроена и запущена. В понедельник с утра дёргают: ничего не работает. Суббота и воскресенье - дни нерабочие. Проблема была в том, что в понедельник с утра администратор получил новую версию основной системы, установил, чем-то там она ему не понравилась (да, имеет такие полномочия!) и он её снёс. А библиотека Икс имела старый номер версии и установилась в GAC поверх старой. Репликатор же для ряда задач использует Reflection. Результатом является ошибка вот такого вида:

Unhandled Exception: System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information. at System.Reflection.Module.GetTypesInternal(StackCrawlMark& stackMark) at System.Reflection.Assembly.GetTypes()

Есть идеи почему так? Вот то-то же. На ровном месте падало, совершенно неожиданно, где просто не могло. А вот поди ж.

Так что нету нигде никакой простоты, в маркетинговых материалах разве что...

суббота, апреля 07, 2007

"А из очкарика мы сделаем человек-оркестр"

Заканчивается реализация гидравлического расчёта. Будем выпускаться.

среда, апреля 04, 2007

Сюрьекция

Звонят. У нас в выгрузке у любого человека пол - женский. Я не поверил. Запросили дамп. В базе всё нормально. Мэ это мэ. Жо это жо. Но после всех преобразований, передачи, повторно преобразования и попадания в целевую систему ясно видно, что мэ это жо (см. на картинке на элемент "Пол").

Интересно, что с момента прошлого обмена данными прошло полгода и тогда никаких жалоб не поступало. Установочные данные (пол, фио и пр.) -измениться не могли. Это база, на которой строится всё остальное. Смотрим в код:

[XmlIgnore]
public string SexToString
{
get {return SubjectInfo.SexToString;}
set {;}
}
Видно, что
[XmlIgnore]
- это раз. Два, которое видно, находилось в xslt:
<Пол>
<xsl:variable name = "sex" select = "SexToString" />
<xsl:choose>
<xsl:when test="$sex = 'Муж'">1</xsl:when>
<xsl:when test="$sex = 'Жен'">2</xsl:when>
<xsl:otherwise>2</xsl:otherwise>
</xsl:choose>
</Пол>
И теперь понятно, почему всегда прёт двойка. Остался сущий пустяк: вместо SexToString использовать Sex путём замены части xslt, отвечающую за пол.
<Пол>
<xsl:variable name = "sex" select = "Sex" />
<xsl:choose>
<xsl:when test="$sex = 'Male'">1</xsl:when>
<xsl:when test="$sex = 'Female'">2</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</Пол>
Male и Female - значения перечисления Sex, ну а 0 - для разнообразия. Если опять где кран сорвёт, будет у них не мэ, не жо, а 0. Кстати, хорошее диагностическое значение.

среда, марта 28, 2007

Читая комментарии в коде

Хоть сейчас комментарии писать и не модно, но писать их надо: очень смешно читать их через несколько лет после того, как...

// Мне очень стыдно, но придумать оптимизацию я тут не могу
// Поэтому использую циклическое повторение вычитания строк
// пока 2 повторных вычитания подряд не вернут признак того,
// что замен не было
Судя по стилю и тупости это ещё как бы и не я написал...

суббота, марта 24, 2007

Переключения контекста

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

Несмотря на то, что спал всего 4 часа, с утра провёл 2 продуктивнейшие встречи. Одна с директорами крупнейшего интегратора СНГ, вторая - тоже с кем надо. Если к этому добавить покупку SportTac, то я - доволен днём. Это бывает редко.

А. Видел, как на Басманной люди в 7 утра мыли светофор. Мелочь, а настроение поднялось.

пятница, марта 23, 2007

Прислал хороший человек

Весь день разговариваю "Собачьим сердцем", троих уже обидел.

- Отнять и поделить (...Энгельса с этим, как его - дьяволом - Каутским!). Это когда нам сказали, что финансирование будет пересмотрено.

- 16 Аршин - это прелестно, но ведь я вас не обязан кормить по этой лягушечьей бумаге. Это когда вместо работы к сроку мне был показан красивый план этой работы.

- Вот что-с: две судимости, алкоголизм, "всё поделить", шапка и два червонца пропали (тут Филипп Филиппович вспомнил юбилейную палку и побагровел) - хам и свинья... Когда мы выяснили, что среди нас полгода работал подлец, сливавший потихоньку ценную информацию конкурентам.

Все трое - отъявленные негодяи, что характерно.

среда, марта 21, 2007

Умер Бэкас

Первое поколение уходит. Fortran, "Форма Бэкуса-Наура" и пр., что рассказывалось в институтах. Интересно, когда какой-нибудь Пачиков, Донской или Пажитнов (дай им всем бох здоровья и долгих лет), вспомнит ли кто-нибудь о них в центральной прессе и даст ли хоть в половину колонки про Бэкаса некролог?

Великий был человек. Инженер и учёный.

Замена оборудования

Раньше у всех нас был только HP. У меня, например, nx7010 (история появления его у меня забавна). Остальные получили такие же, чтобы не ломать голову по поводу поддержки. Мол, если сломается у нескольких, то уже будем знать, что делать и к кому бежать. Однако за те полтора-два года, что HP использовался (использовался нещадно - в пыли, на холоде, в жаре, трясся в машине, на мотоциклах, несколько раз попал против всех правил в авиационный багаж) - ни разу не пришлось обращаться в ремонт (кроме моего, который достался мне уже с нерабочим инвертором). Вот такая надёжность современной техники.

Сейчас решили не загонять всех в казарму - каждый заказал себе такой, какой понравился. Теперь у нас есть даже такие диковинные приборы, как 17" Sony Vaio (так, кажется) с каким-то полуспутниковым телеагрегатом. Я решил, что выделываться не надо и взял себе вполне мне подходящий как внутренне, так и кхм эстетически Acer 8204. В 2 раза быстрее прежнего прибора, в 2 раза больше памяти, всякое такое прочее. Одна беда (была) - при попытке отправить в hibernate получал сообщение "Insufficient system resources to complete API", что вылечилось в итоге вот этим:
http://www.microsoft.com/downloads/details.aspx?familyid=9D20F96A-A8D6-4627-89F7-787CD9B3852C

Других новостей пока что нет, но скоро появятся, ибо брошен, жребий-то.

пятница, марта 16, 2007

четверг, марта 15, 2007

Der heldenhafte und sinnlose Kampf

VS2005 в очередной раз подтвердила свою репутацию полубезумного средства разработки. А именно.

Следите за руками:

private void Terminate(IAsyncPropertySheet Aps)

{

Aps.Event.WaitOne();

}
используется так:
IAsyncPropertySheet aps = propSheet as IAsyncPropertySheet;



if (m_IsLastSheet m_SingleSheet)

if(aps == null)

DialogResult = DialogResult.OK;

else

{

btnNext.Enabled = false;

btnPrev.Enabled = false;



OneParamDelegate terminate = Terminate;

terminate.BeginInvoke(aps, Callback, null);

}
а Callback выглядит проще некуда
private void Callback(IAsyncResult ar)

{

InnerHide();

DialogResult = DialogResult.OK;

}



void InnerHide()

{

if (InvokeRequired)

{

ParameterlessDelegate del = InnerHide;

Invoke(del);

}

else

Hide();

}
Другими словами, форма не будет закрыта, пока событие интерфейса, реализуемого страницей свойств, не будет установлено в signaled: какой-то полезный код работает на странице и когда отработает, установит событие, по которому форма и закроется. Дёшево и сердито. На всякий случай, чтобы не было недосказанностей, вот событие, используемое для закрытия
public ManualResetEvent Event

{

get {return (Exporter as IAsyncExecution).Event;}

}
при этом Exporter, само собой, инициализируется в конструкторе. Класс, реализующий IAsyncExecution, выглядит так:
public class InternalYYYFactory: Notifier, IExport, IExportInitializer, IAsyncExecution
{

private ManualResetEvent m_Event = new ManualResetEvent(false);

...

public ulong ExportPacket(string FullPath, global::XXXX.YYY Yyy)

{

NotifyOwner(this, 1, "Инициализация файла");



using(FileStream fs = new FileStream(FullPath, FileMode.Create, FileAccess.ReadWrite))

{

Request req;

NotifyOwner(this, 50, "Запись пакета");

new XmlSerializer(typeof(Request)).Serialize(fs, req = GetYyy(Yyy));



NotifyOwner(this, 100, "Запись завершена");


if (Abyr(Yyy))

{

m_Callback(m_PacketNumber = req.packetHeader.id);

m_Event.Set();



return m_PacketNumber;

}



m_Event.Set();

}



return 0;

}
Так вот, 949 говорит о том, что на выделенной жирным строке форма просто исчезает. При том, что никаких чудес в рассылке уведомлений нет:
public class Notifier

{

private int m_CurrentPercentage;

public event ExportProgressHandler ExportProgress;



protected void NotifyOwner(IExport This, int Percentage, string Text)

{

if (ExportProgress != null)

ExportProgress(This, new ExportEventArgs(m_CurrentPercentage = Percentage, Text));

}



protected void NotifyOwner(IExport This, Inc Increment, string Text)

{

NotifyOwner(This, m_CurrentPercentage + Increment.Value, Text);

}

}
Нет соображений? Не было их и у меня, особенно, если добавить к №949 №954. Интересно и то, что эффект зависел от того, на каком компьютере это собирается (у нас идёт замена железок, сам чёрт сломит...). Мне пришлось разбираться. Самопроизвольное закрытие формы могло быть только в случае установки события в true, но код явно инициализирует его в false. В общем, добавил в Terminate простую диагностику: вывод в лог. Больше ничего не трогал. Собрали на проблемном компьютере - проблемы ушли. И 949 и 954. Цирк? Цирк! И никому не предъявишь. Сейчас вспомнил, что было похожее в VS2003 в статических классах, когда переменная инициализировалась вне статического конструктора. По стандарту это разрешалось, а фактически - переменная получала значение по умолчанию вне зависимости от того, что было написано в инициализаторе. Вот так то. Лучшее средство разработки для .NET. 12 часов долой. Конечно, у нас же их бессчётно.

вторник, марта 13, 2007

Fucking outsourcers

Надо было самому наступить в/на российских аутсорсеров, чтобы понять, почему получить нормальные заказы под этим флагом - малореально. Ситуация: нужно срочно изготовить документацию. Писатель занят. Писанина передана некой Нимфе, туды её в качель, которая под завывания "у нас гроб -- огурчик" взялась за работу. Ставка - приличная. Работа, повторяю, срочная. И что же? Проходят сроки, Нимфа, похоже, успешно пропивает аванс, предусмотрительно выключив в лавке свет и отключив телефон. На письма не отвечает, вопросы не задаёт, черновики не показывает. Сказать, что моё доверие к звериным полупокерам подорвано - это ничего не сказать. А ведь я был настроен ну оччень лояльно. Могу вообразить, какое бешенство вызывает срыв сроков внешним исполнителем у тех, кто с самого начала "я же говорил!..". Как уже и оповещал по теме - подписываюсь под каждым словом и ещё от себя столько же такого же добавлю, на мурке и с расстановкой.

Теперь готовлю финансовую карательную акцию, как будто делать больше нечего.

воскресенье, марта 11, 2007

суббота, марта 10, 2007

Что считать устаревшей программой

Хорошо известно, что лучше за год сделать хороший продукт, который всем нравится, чем за 3 месяца - паршивенький, который единственно на что годится- "застолбить место". Не менее того известно, что готовность продукта определяется по команде "давай": наступила дата выпуска, значит, продукт готов. Нет необходимости говорить о том, к чему это приводит - всякий хоть раз да встречался с подобным; детали могут отличаться, суть неизменна. Чтобы избежать готовности по свистку, приходится прибегать к целому ряду ухищрений, лишь бы только поднять качество. Тут и жертвование бонусной функциональностью (типа WinFS, которой жертвуют на моей памяти 10 с лишним лет) и выпрашивание лишнего времени у т.н. "сэйлзовЪ" и ещё многое другое. Однако, предположим, что верхней планки времени нет. К тому плюс - есть неограниченное количество ресурсов, которые можно потратить на проект. Меня мучает вопрос: а закончится ли вообще в таком случае разработка? Если не к чему привязываться во времени, то выпуск версии - жест доброй воли. При этом все (!!) кого я знаю, предпочтут добавить ещё функций/поправить неудобства, чем выпихивать то, что не соответствует их представлениям, но зато соответствует сроку выпуска (это и приводит к отъезжанию сроков, кроме случаев некомпетентности разработчиков). Сколько можно добавлять и улучшать без выпуска версии? Год? Два? Четыре? Десять?

Видел как-то документ, описывающий требования по добровольной сертификации программного обеспечения для теплоэнергетики. Дословно: "программа не должна требовать наличия на компьютере пользователя современных операционных систем". После прочтения начертал непечатную резолюцию и задумался: когда же НЦ "КомпАС" начал свою разработку (а именно эта шарага пробила в Центре Энергоэффективности и Энергосбережения текущий вариант требований), что хочет специально отодвинуть в сторонку тех, кто уже не ориентируется на DOS 3.3 и Windows 3.0?

среда, марта 07, 2007

Наблюдение

Сам не заметил, как меня почти окружили люди-недоразумения и люди-разочарования. Значит, по известному принципу, с большой долей вероятности я стал таким же. Ура?

вторник, марта 06, 2007

Большая и маленькая

Сейчас выяснял одну вещь, пришло в голову, что, пожалуй, работать в большой организации типа Microsoft - это проще, чем в маленькой, типа нашей. Там можно годами сидеть и улучшать один и тот же кусочек, а тут, чтобы написать всего с десяток классов для инсталляции - нужно знать настолько много, что иногда я даже сомневаюсь, что код можно дописать (дописывается, конечно, всегда. Несмотря на сомнения).



Казалось бы, такая мелочь, разобраться и понять, где Crypto API хранит ключи. У меня это C:\Documents and Settings\Yuri.NX7010\Application Data\Microsoft\Crypto\RSA\S-1-5-21-117609710-1580818891-1343024091-1003. Внутри 5 сотен файлов с именами вроде 77cb0c374217e92e8dad8694e0d38a9d_cf68c8f3-c114-4ce8-b777-dab14165c604. Полдня пытался я понять, как они туда попадают, пока не достал-таки с полки, себя пересилив, Programming .NET Security.
Свойство KeyContainerName класса CspParameters и св-во PersistKeyInCsp класса RSACryptoServiceProvider именно этим и управляют. А ведь видел! А можно месяцами заниматься своей узкозаточенной функциональностью и даже не догадываться о существовании этих классов и свойств. И это, возможно, главное отличие большой рыбы от не такой большой.

понедельник, марта 05, 2007

О популярности языков

В своё время, когда я ещё учился в институте, был популярным такой типа стишок:

Все, кого ты не спроси,
программируют на Си.
В наш-то век найдёшь едва ли
Тех, кто пишет на Паскале.

Я тогда писал много (у каждаго своя мерка) хорошего кода как раз на Паскале и дискомфорта от того, что мой язык фигурирует в полуобидном стишке - не испытывал. Впрочем, ощущение, что нас всего двое пишет на BP (второй - Миша Стрельников, перебравшийся сейчас в Австралию через Израиль и работающий ведущим инженером в организации, разрабатывающей микропроцессоры) - иногда отмечалось. Но бывают времена, когда лучше быть первым в деревне, бывают, когда лучше быть вторым в Риме. С 94го потихоньку стал переходить на C++ - этого просто требовали задачи да и было мне интересно, чем ещё студенту заниматься, если не изучать? - и примерно к 98му развил на нём полные обороты. Забавно, что к тому времени мне стало казаться, что буквально каждый что-то пытался напрограммировать в Delphi. Даже тот вьюнош, который нараспев читал стишок (см. выше).

Последние несколько лет у меня ощущение, что C++ умирает и им уже никто не пользуется (хотя С.Б. и отмечал 5 лет назад, что С++ и базы данных всегда дадут заработать на хлеб с маслом. Ну, тут ему видней.). Это субъективная реальность - так кажется мне. А вот - гораздо менее субъективная, индекс популярности за прошедший месяц. С++ - на третьем месте, 10.768%. А вот C#, который, как мне кажется, просто прёт вверх, мало того, что занимает позорное 8е место (то есть, в планетарном масштабе на нём никто не пишет), так ещё и потерял одну позицию по сравнению с прошлым годом со своими 3.189%. Впрочем, мне совершенно безразлично, какие там у него проценты. .NET 3.0 - лучшая инфраструктура разработки, включающее многое таких, которых не имеют другие городов. Вместе с решарпером, который 2.5, в Visual Studio можно сделать почти всё.

А потому вопрос: не один ли икс, насколько популярен язык и среда среди других, если я могу сделать всё, что нужно на "непопулярном" языке за то время, пока прочие будут любоваться своим "популярным"? Ку?

среда, февраля 28, 2007

Про тупость и самоуверенность

Должен признаться, что к некоторым людям я крайне нетерпим и не очень креплюсь перед тем, как высказать своё отношение (Саша, ты бы удивился, увидев меня в деле теперь:) ). "Некоторые" - это тупые (иили) самоуверенные. Как известно, машины у меня нет ("бедность, ничего не попишешь"), поэтому для перемещений используются бомбилы, таксисты и метро (вместе с прочим наземным транспортом). В метро Москвы уже сколько-то времени проход возможен как по старым картам с полосой (где бы их взять?), так и по новым с индукционным принципом. Когда это начинало внедряться, шёл разговор о том, как прекрасно новая технология (?) разгрузит турникеты и на них не будут собираться толпы по утрам. Действительно, срабатывание при поднесении происходит немедленно, а если учесть, что карту можно не доставать из бумажника или кармана, то и вовсе - ускорение налицо. Теперь посмотрим, какой ценой.

  1. Узнать баланс поездок, применяя новую карту, невозможно. Представьте себе просто, что узнать сколько осталось поездок - просто невозможно. Вот лежит в бумажнике карта, но то ли она новая, то ли она истекла (когда?), то ли на ней что-то осталось - не судьба узнать.
  2. Если вдруг есть какой-то чудик, не знающий, что такое электромагнитная индукция, то специально для него я рассказываю,
    что это явление, заключающееся в возникновении ЭДС в замкнутом проводнике при изменении характеристик магнитного потока, проходящего через поверхность, ограниченную контуром этого проводника. Благодаря этому явлению будет включаться лампочка в магазине, если какой-то негодяй решит умыкнуть товар, не оплатив его. Так вот, ключевое слово тут: "магнитный поток". Применение ЭМИ для получения тока записи/чтения это остроумное инженерное решение, которому, однако, не место в в моём кошельке. Потому что у меня есть магнито-чувствительные материалы (вроде карточек на наземный транспорт), вроде Виз, Мастеркардов и ещё кое-чего. Всякий раз, поднося бумажник к магнитному пятну, я рискую. Остаться без поездок в ТАТ, без возможности снятия денег в банкоматах, без возможности расплатиться за обед, да мало ли чего.
  3. Скорость чтения повысилась. Но это, по непреложному закону природы означает, что снизилась скорость записи. Где у нас записывают карты? В кассах. Раньше там были очереди по утрам, когда очередная электричка нагоняла пролетариев умственного труда из пригородов, теперь там очереди постоянно. Раньше карта с полоской инициализировалась пару секунд, теперь в районе 10. Что толку людям, стоящим в перестроечного масштаба очередях, секундная экономия на проходе, если покупать карту они будут 20 минут?
  4. Уже если оказались под землёй, то традиционно проверить баланс поездок можно у жёлто-чёрного терминала, рядом с кассами обычно. Их на станциях по количеству выходов. Утром все хотят проверить баланс, поэтому там образуется отдельная очередь. А так как место кассы на входе, а вход и выход отделены друг от друга, то посмотреть вечером (и записать, наверное? карандашиком, по-стариковски) просто так не получится: надо выйти в переход, зайти, проверить и снова выйти против потока. Увлекательно, правда?

Что же в остатке?

  1. Некомпетентность лиц, принявших решение о переводе московского метро на индукционные(и) карты.

  2. Полная неготовность инфраструктуры к использованию и-карт.

  3. Абсолютное пренебрежение человеческой природой: я сижу дома, хочу узнать, сколько у меня есть на завтра поездок. И не могу.

  4. Чрезвычайно низкопроизводительная система инициализации карт.


  5. То, что годится для эксперимента над студентами и лицами, использующими годовой проездной, не годится при использовании карт на 5-10-20 поездок.

    Для меня этого достаточно, чтобы сказать, что в широкое обращение карты ввёл тупой самоуверенный ишак

суббота, февраля 24, 2007

"Код" Петцолда

То ли это переводчики такие уроды, то ли это я ничего не понимаю, но всегда воспринимал Петцолда как занудного дядьку со специализацией в пользовательском интерфейсе Windows. Это продолжалось до той поры, пока я не увидел у брата на полке "Код". Полистал, понял, что это надо иметь, заказал. В четверг "у Казанского вокзала" забрал свой экземляр и прочитал в стационаре уже более внимательно. Сказать можно тут одно: несмотря на объём и формат, это фундаментальный труд, достойный того, чтобы быть учебником (особенно, если провести всё же вычитку, а не публиковать с неверного оригинала). А вот "Лучшие примеры разработки ПО" (якобы Спольский там автор) - это, по большей части, фуфелЪ.

Куда девать уже прочитанные книги - не приложу ума.

Down to the roots

Любопытно сравнить скорость выполнения двух методов C#-класса:

private string BinaryToHex(byte[] Data)
{
string res = "'0x";

for(int a = 0; a < Data.Length; a++)
res += Data[a].ToString("X2");

return String.Format("{0}'", res.Replace("%", ""));
}
и
private string BinaryToHex(byte[] Data)
{
char[] res = new char[Data.Length * 2];

for(int a = 0; a < Data.Length; a++)
{
string str = Data[a].ToString("X2");
res[a * 2] = str[0];
res[a * 2 + 1] = str[1];
}

return String.Format("'0x{0}'", new string(res));
}
.

Второй работает быстрее первого - на порядок, хотя, на первый взгляд, и не должен. Почему? Причина в конкатенации строк. Это настолько медленная операция, что код должен обязательно проверяться на её наличие, особенно в потенциально больших циклах.

вторник, февраля 20, 2007

Столкнулись с пиратством

Мы завершаем разделение направлений. Теперь корзин будет три. Чисто на всякий случай. К государственной кормушке будет прикреплена только одна. Хватит из нас кровь сосать. Последний гвоздь в стену решимости забил один деятель, не будем его называть, ни к чему это, но деятель крупный. Я думаю, что в сотню чиновников нашей прекрасной страны - войдёт легко. Ну так вот. Деятель этот занялся (как они все и делают) активным путанием своей и государственной шерсти. И сделал он это так. Некое ПО было роздано (точнее, продано. типа.) неопределённому количеству лиц, каждое из которых представляет собой самостоятельное юридическое лицо и должно внести пожертвование в сумме X0000 рублей на наш счёт. Разумеется, никакие деньги никуда не пошли (пока что, по крайней мере). Тем не менее, мониторинг активностей показывает, что количество дорвавшихся до кормушки - плодится как минимум в арифметической прогрессии. Мы сочли, что это безобразие и решили действовать. Действия включают в себя внесение таких изменений в процедуру инсталляции, чтобы было невозможно передать пакет с данными, не получив на нашем сервере предварительной авторизации для такого безобразия. Делается это так:

Они самые.

При установке


Алгоритм установки:
  1. 1. Пользователь вводит при установке ключ
  2. 2. Программа установки формирует RSA-ключ, связывая его с пользователем, устанавливая в некое хранилище

  3. Программа установки связывается с сервером, передавая:


    • Ключ, указанный пользователем

    • Public-часть ключа, сформированного на шаге 2

    • Подписанные хэши следующих ключей реестра Windows:
    • i. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LicenseInfo
      ii. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallDate
      iii. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId

  4. Сервер проверяет ключ. Если переданный ключ ещё не был активирован и является действительным, происходит активация приложения. Активация включает в себя следующие шаги:
    • Выдача программе установки на клиенте последовательного номера установки, подписанного для клиента ключом
    • Сохранение на сервере ключей установки клиента (public-часть ключа RSA клиента, хэши ключей реестра, привязывающие ключ RSA к инсталляции)

При формировании пакета

  1. Формирование пакета для обмена, который должен оплачиваться, выполняется в точности так же, как и для бесплатныхЪ, но в заголовок пакета вносятся следующие изменения:
    • Передаётся идентификатор установки
    • Передаются хэши из п.3с предыдущего подраздела
    • Кроме этого, весь пакет подписывается ключом, выданным классом инсталлятора при установке клиенту для исключения фальсификации или случайных искажений при передаче.

При обработке пакета

Следующие действия должны быть выполнены:
  1. Проверена подпись и извлечён объект данных

  2. Проведена проверка аутентичности пакета (проверены ключи установки и ID Windows из пакета)

Если первый и второй пункты выполняются, то выполняется загрузка пакета.


Забавно, что нас волнует вопрос о том, насколько этично отправлять на наш сервер для привязки LicenseInfo и ProductId. Если мы когда-то проиграем, то только потому, что слишком много внимания уделяем такому по сути абстрактному или даже метафизическому понятию, как совесть, в то время как прочие - даже не знают, как это слово пишется.

пятница, февраля 16, 2007

Камлания

Когда суровый февральский ветер доносит до меня обрывки, в которых улавливаются слова: "уникальный", "не имеет аналогов", "не только не уступает,.." - я немедленно проверяю кошелёк. Обманут, подлецы, глазом не успеешь.

Всё, что наши умельцы называют уникальным и не имеющим аналогов - либо украдено на Западе (в этом случае тоже - уникальностью и не пахнет), либо никакими признаками уникальности не обладает.

Пора бы вам, граждане рекламисты, менять пластинку!

вторник, февраля 13, 2007

"Под маской овцы..."

Мой комментарий к тексту.

Был во Внуково целый цирк с этой съёмкой. Такие дураки там в САБе тогда были - это что-то.Итак, если осилить не удалось, то текст про то, что Windows - это ужасный ужас и потому его надо срочно менять, а то государство попадёт в зависимость и протчая, и протчая, и протчая. Всякая возня, особенно в мире денег, тем более, в мире больших денег, каковые и крутятся там, никогда не происходит просто так. Посмотрим внимательнее на персонажей, что голосуют против Windows:
  • какой-то Андрей Ловягин, считающий, что "с другой [стороны]— попадаем в полную зависимость от корпорации Билла Гейтса.". Наверное, Ловягин думает, что попасть в зависимость от беспринципного Доброва, Гондаренко - приятнее или почётнее? О, да!...

  • Директор Linux-центра Павел Фролов, который "убежден, что ПО с закрытым кодом по своей сути не может гарантировать безопасность в случае его применения в государственных учреждениях". Ах, он убеждён! А на чём базируется его убеждённость? "Нет, я жду!" Может быть, на том, что мегапроект срамной корпорации Атлас, печальной памяти Atlix, построенный на сверхнадёжной и мегазащищённой операционной системе подох прямо на демонстрационном стенде прошлым летом? Или на том, что, что из всего хлама, упорно выдающего себя за истинное благо, только Windows имеет сертификаты ФCБ? Не купленные, не украденные, а полученные несмотря на скотский, дикарский, совершенно беспрецедентный нажим на 8й отдел конторы глубокого бурения со стороны некоторых деятелей т.н. "айти-бизнеса". Вам, Паша, есть о чём подумать на досуге.

  • "Рано или поздно осознание необходимости иметь свое ПО наступит", — уверен Олег Садов, технический директор компании Linux Inc. Непременно наступит, господи Садов! Даже не сомневайтесь. Но только не с Вашим участием. Дело в том, что от Вашей идеи "написать собственную операционку" (а на меньшее Вы, не сомневаюсь, не согласны!) как бы это... разит. Казнокрадством. "Все полимеры просрали", а всё туда же. Что Вам мешало 15 лет писать "своё ПО"? За это время Microsoft выпустил, дай бох памяти: Windows 3.1, 3.11, 3.5, 3.51, 95, 4.0, 98, Me, 2000, XP, 2003, Vista. Не говоря о CE, Mobile, service packs (некоторые из которых - не больше и не меньше, как новые версии операционки, напр., NT 4.0 SP3 или XP SP2). А что сделал Linux Inc. за отчётный период? Не подскажете?

  • Филипп Торчинский из компании Sun Microsystems. Тот самый, с чудной логикой: из того, что "в стране есть люди, понимающие важность использования открытого ПО", делается вывод: "Windows останется для мультимедиа, а Linux будет находить все большее применение в государственных учреждениях и сфере образования". Филипп, я Вас прошу: получите, наконец, сертификат Патрушева на свой Solaris, а то Ваша организация крайне жалко выглядит. Уже все чакры, то есть, э-э-э код открыли, а рыбы всё нет и нет. Обидно, я понимаю.

  • Галина Кожанина, преподаватель Санкт-Петербургского технического колледжа управления и коммерции. «мы начинаем проводить виртуальные уроки на базе открытого ПО, совсем недавно состоялось первое занятие, в котором приняли участие педагог из Петербурга и три ученика — из Алма-Аты, Хабаровска и Новосибирска». Ну что, и авторитет в отрасли, и размах (1+3=4, да?) - всё играет на увеличение веса слов госпожи Кожаниной.

Но это, так сказать, шутки. А вот что я хочу сказать серьёзно. Кто эти люди в целом? Чего это они так возбуждаются на Windows? Банальные продавцы услуг. Они раздают даже железо почти за так, что там ПО. И всё равно раз за разом умудряются на поддержке, консалтинге и обучении работе со своей косокривью зарабатывать не просто на хлеб, но с икрой!

Бабушка, дай воды, а то так есть хочется, что аж переночевать негде!

Отродье славной семьи настольных баз данных

Я уже распространялся про странные проблемы с Microsoft Access. То, с чем пришлось столкнуться на прошлой неделе, превосходит всё бывшее. А именно.

1. Начать транзакцию
2. Вставить запись в таблицу А
3. Вставить запись в таблицу Б
4. Попытаться вставить запись в таблицу Б снова
5. Закрыть транзакцию

Вроде бы - куда проще? Но нет. Выполнение 4го шага приводит к появлению ошибки исключительной ясности: "The changes you requested to the table were not successful because they would create duplicate values". Разумеется, никакого дублирования не было и близко: только совсем уж пропащий бедолага может сказать, что ключи 1172088985 и 1263693392 имеют большое сходство и тем более - совпадают. Но у Access имеет свои понятия: would create и всё тут.

Так и не понял, как это можно исправить по-умному и сгоряча даже написал запрос в поддержку дядькам из Города Дождей (надо же как-то оплаченные часы тратить; в прошлом году все пропали - ни одного инцидента мы им не подкинули). В итоге "исправил" по-глупому: исключил шаги 1 и, соответственно, 5. Теперь всё записывается как и надо, но если вдруг случится недосмотр в UI и в базу пойдут кривые данные ... Буду ждать, чё там ответят.

Раньше я думал, что самое странное, чем владеет Microsoft - это Visio, а теперь я думаю, что у Visio появился достойный конкурент. Когда уж он отомрёт!

воскресенье, января 28, 2007

Пора в путь-дорогу

На прошлой неделе я проехал и пролетел в совокупности ок. 3500 км. На следующей проеду ещё 4000. Если будет так продолжаться, то за год 2/3 расстояния до Луны будет покрыто.

Сегодня занимался интересным: завершающие штрихи к портрету одного из компонентов нашего проекта государственной важности требуют слегка попользовать Microsoft Excel. Ничего особенного, всё как у всех: настроить элементы отображения на теневые ячейки, в ячейки поместить значения и вперёд. Однако, шаблон, с которым надо работать, использует очень длинные последовательности ячеек, например: A2-AZW2. Если бы было можно написать так:

for(string a = "A"; a <= "AZW"; a++)

... но так написать нельзя. Поэтому целый час потратил на написание итератора по индексам и тесты к нему.
Теперь доступен такой синтаксис:

StringLoop loop = new StringLoop("A", "AZW");
foreach(string colName in loop)
{
SetCellValue(string.Format("{0}{1}", colName, 2), MyVal);
}

По основаниям 2^N и 10^M я навычислялся уже до посинения, а вот система в которой 26 цифр - это всё ж свежо. Дело за малым, перевести работу в опытную эксплуатацию и смотреть, как захватывается бывшая одна шестая

вторник, января 23, 2007

Вспомнилось

В "Top Gear" как-то рассказывали про спортивный Mercedes, у которого было не то 400, не то 700 лошадей под капотом. Был поставлен интересный эксперимент: команда Англии по регби с канатом - с одной стороны, мерс - с другой. Раз-два-три-старт и начинается: водитель пытается утащить за собой беззубых дерзких парней, а ребятки - утянуть белого монстра в свой гараж.

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

Мораль мне вполне ясна.

понедельник, января 22, 2007

"В двенадцать часов по ночам"

Принял на неделе с хорошим человекомЪ по триста капель. Слушал рассказы про всякое. Завидовал и продолжаю. Особенно завидовал длительности рабочего дня. Уже которую ночь, сидя над чертежами и кодом, приходит в голову старый студенческий анекдот: "Спишь, сука? А мы учим!"

Кстати, про ученье. Есть Hashtable, с котором обращаются следующим образом

DataTable dt = new DataTableBuilder().ExecuteCommand("select * from v_Profession", CommandType.StoredProcedure, null);
foreach (DataRow row in dt.Rows)
{
object name = row["Name"];

if (!m_NamedIndices.ContainsKey(name))
m_NamedIndices.Add(name, Convert.ToInt64(row["Id"]));
else
continue;

AddToAutoCompleteList((string)name);
}

и есть другой Hashtable
DataTable dt = new DataTableBuilder().ExecuteCommand("select * from v_Profession", CommandType.StoredProcedure, null);
foreach (DataRow row in dt.Rows)
{
object name = row["Name"];

if (!m_NamedIndices.ContainsKey(name))
m_NamedIndices.Add(name, row["Id"]);
else
continue;

AddToAutoCompleteList((string)name);
}
Так вот, boxing продолжает играть свои шутки и поэтому даже если в первом случае
m_NamedIndices.ContainsValue(X)
вернёт true, во втором - на тех же самых строках тот же самый
m_NamedIndices.ContainsValue(X)
вернёт false. "Собак ножами режете! А это - бандитизьм."

понедельник, января 15, 2007

Журналы "про это"

В кодексе инженера написано (и я с этим согласен), что инженеры не должны скрывать информацию. Само собой они не должны её присваивать и использовать чужую без ссылок на неё. Эта тема снова всплыла в разговоре с матёрым человечищей с 30-ти летним опытом разработки цифровой электроники во время последней командировки. Под разговоры о дешифраторах, инверторах, тонкостях разводки плат и RISC-процессорах компании Atmel незаметно прошли 2 вечера. Из них я узнал, как молодое мудачьё крадёт результаты исследований этого инженера и выдаёт их за свои, не делая даже ссылок на исследования, хотя он и вовсе не против рассказать то, что накопал. Но на паритетных условиях. Я пришёл к выводу, что такая ситуация возможна только в случае отсутствия обмена информацией между инженерами внутри сообщества. Ну а в рассматриваемом случае - и вовсе при отсутствии сообщества как такового. Обмен, видимо, наиболее целесообразно проводить в форме статья-отклик. Например, в журнале или специализированных web-конференциях. При условии, что журнал содержит материал, интересный читателям; т.е., содержит информацию по актуальным вопросам. Надо сказать, что давно уже отраслевые журналы на русском стали мне неинтересны. По нескольким причинам:

  • Там пишут неинтересную мне чушь.
  • Там пишут про интересное мне неинтересным языком
  • Там углубляются в детали и/или вместо объяснения и раскрытия темы дают множественные ссылки на "сайт производителя".

Это пакетик чая, вчера выдали в самолёте Ютэйра. Мне так понравилась концепция бета-чая, что я решил не выбрасывать упаковку. Вот только не понимаю, как будут его отлаживать. Поэтому не стал пить.Поэтому я подписан на совсем другие: Developer Network Jounal, Dr. Dobb's Journal. Например. Ещё на пару, но дело не в этом. А в том, что на русском я ничего не читал. И очень долго. То есть, в руки мне время от времени попадают в гостях материалы, но чтобы сам покупал - нет, этого нет. Решил исправить и проверить, не появилось ли чего нового-актуального. Купил RSDN, 220 рублей, что ли он стоит. Однако, нескромно - на фоне DDJ, например - отметилось про себя.. Номер не помню какой, что-то там было про bugtracking. Внимательнейшим образом пролистал. Все три перечисленных пункта присутствовали. Чтобы не быть голословным, перечислю названия статей и краткие аннотации.


Моделирование программно-аппаратных "реактивных" систем раскрашенными сетями Петри.Про моделирование (??), ниасилил. Наукообразный птичий язык. Или кусок кандидатской, или просто продукт потребления псилоцибов.

Встраиваем net send.Про то, как использовать функцию ShellExecute из кода. Очень ценно. Особенно для лабораторных на первом курсе.


Начало работы с Erlang. Про новый язык программирования. Его нет в двадцатке, наверное, что-то дико эзотерическое, на чём чирикают ровно 16 с осьмушкой человек на планете. Впрочем, вот только что в предисловии к статье именно это и вычитал. 11.5 журнальных разворотов, т.е., 23 (больше, чем четверть журнала!!) страницы того, что представляет узкоакадемический интерес. Для никого.


Borland: снова Turbo. Любопытно, но так, на уровне элемента на ленте новостей, давать в ежемесячный или какой он там, ежеквартальный? журнал, да ещё рейтинговать, ставя уровень сложности (для новости?) ажно в цельную звезду - это мне непонятно.

Развитие шаблонов дизайна сайтов. Верифицируемые шаблоны. Интересная тема, но написано безобразно, с кучей ссылок на msdn2. Ни разу не могу вспомнить, чтобы я из журнала что-то вбивал в address bar. Чем тратить 23 страницы на никому не нужный Эрланг, можно было бы дать краткие описания компонентов, которые, судя по сцылам, я должен искать сам, чтобы понять, о чём речь в статье.

Секреты разработки CSP для Windows. Ну это вообще ни в какие ворота. Аффтар не смог разобраться, как работать на документированных функциях и стал давать советы: "дядя, не будь лох! меняй системные DLLs, смело записывай в них свои собственные функции". Я могу вообразить, что мне скажут, если я проделаю этакое дело и приду сертифицироваться в контору глубокого бурения. Товарищ, видимо, не представляет. Впрочем, это, может быть, просто результат некоего исследования, которым ему не терпится поделиться. Практическая ценность: ноль.

Управление ошибками на практике. Рассказывается о собственном (забегая - судя по статье -- смехотворном) опыте управления ошибками. Цитата: "первоначальный опыт показал, что не стоит использовать MS Project Server в качестве подобной системы". Да, пожалуй, гггг. Чушь какая-то. И это в то время, когда есть масса по-настоящему актуальных задач управления ошибками. Переназначение приоритетов при вале новых инцидентов, управление сроками, планирование длительностей и т.п. А что вместо этого? Хотел написать - "беспомощное блеянье", но не буду.

Введение в ADO.NET 2.0 на примере OLE DB- провайдера для Firebird. Добросовестное Оборотная сторона упаковки того же бета-чаяпострочное пересказывание MSDN и связанного с ним. Ни проблеска оригинальности. Только автор начал рассказывать про MARS, как, без единого примера, через 4 абзаца мысль потерялась и пошла бадяга про транзакции. Зачем упоминал про MARS? И так - 9 разворотов. 18 страниц. Ещё пятая часть площади журнала освоена. Издатель заполнил площадь, автор срубил за знаки. Все довольны. Кроме меня, который эту шнягу оплатил.

S.M.A.R.T. + Delphi. Если отбросить Delphi, то интересная плотная (в смысле текста и языка) статья.

Паттерн "Посетитель". Что он делает в журнале, если google по запросу Pattern Visitor даёт это: "Результаты 1 - 10 из примерно 1 190 000 для Pattern Visitor. (0,06 секунд)". И значит ли это, что все двести тридцать паттернов будут публиковаться каждые три месяца и через 57.5 лет эпопея с паттернами в том виде и количестве, как мы сейчас знаем - закончится? По прочтении заголовка стал много, сокрушённо думать.

Property Grid FAQ. Интересно. Для тех, кто не знает. Проблема, однако же, в том, что работающий с WinForms UI не может не знать про этот компонент или не знать, где про него почитать. А в прочих случаях он - не пришей.

Итого. 1 полезная статья, 2 условно-полезных, если принять у.-п. за 0.5., то получаем, что стоимость полезной статьи составляет 220 / 2 или 110 рублей. Столько я платить не готов. Почти $5 за информацию, которую я получу по цене трафика ( <<< $5) - это неприемлемо.

В целом впечатление от этого RSDN.Mag одно: авторы само-собой не видели лучших мировых образцов печатных изданий по этому профилю, а вот почему редактор, которого я знаю лично, занимается такой халтурой, собирая под одной крышей и чашки, тьфу, сети Петри, и S.M.A.R.T., и "богатый опыт управления ошибками". Кто потребитель этой солянки? Я таких не знаю.

Был журнал "Монитор". Чёрно-белый с цветной обложкой. Вот он читался, поднимал актуальные проблемы, вызывал споры в коллективах, а нынешняя специализированная пресса (а мне сказали, что RSDN.Mag - это её флагман)?.. Может, времена не те. А может - "наверно, место такое". Если издатели "Монитора" решат реанимировать издание и продолжат выдерживать линию, которую они гнули в своё время, всем этим этим эрэсдээнам придёт конец - быстро и без мучения. Ну а я, восстановив иммунитет к центральным изданиям, ещё лет 5 не буду смотреть в сторону этой мути.

четверг, января 11, 2007

Про журналы

Вернусь из командировки - напишу что я думаю про нынешние русскоязычные журналы по профилю. В понедельник.

Четыре зарубки

Это блок какого-то чушка. Мой был в идеальном состоянии, хоть я его и мучал года 2 или 3 подряд сутками. Даже телевизор родителям сжёг Точно не помню в каком, то ли в 10м, то ли в 11м классе, я участвовал в районной олимпиаде по, как это тогда называлось, информатике. Поскольку во всех районах были одни и те же задания, а мы все были более или менее знакомы друг с другом, то некоторые из заданий просочились "в прессу". Уклон всех задач был алгоритмическим, как, наверное, и надо. Одна из задач формулировалась так: посчитать количество счастливых билетов в диапазоне 500000-600000. Счастливым признавался билет, в котором 1я, 3я и 5я цифра в сумме давали то же число, что сумма 2й, 4й и 6й цифры. В то время я был юный монстр бейсика для Вектор-06ц и ассемблера для x86. Как жулик, узнав о задача накануне, я, после созвона с товарищами по команде стал думать, как это сделать. В голове крутились мысли одна другой краше, самая запавшая в голову и вот уже 16 лет там сидящая - вот (дело прошлое, сейчас уже не так стыдно): сформировать строку-эквивалент числа, Yamaha MSX-1разбирать его разрядам, проводить суммирование полученных цифр и пр. Трудоёмкость оценить не берусь, но как минимум она далека от требовавшейся (практически надо реализовывать это дело на Ямахах MSX-1, кто помнит).


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

Говоря честно, я сидел и предавался как Догилева в "Блондинке за углом" псисимизму - нет смысла связываться с такой реализацией, как вдруг... Мы же складываем цифры! Самоё число не интересует вообще. Нужно получить только 5 цифр для суммирования и вердикта. А это значит
for I = 0 to 9

for J = 0 to 9

for K = 0 to 9

for L = 0 to 9

for M = 0 to 9

if 5 + J + L = I + K + M ...
В момент, когда это сверкнуло, мне подумалось, что не может быть, чтобы так просто всё решалось. Это была, как говорил Анатолий Маркуша в своих "Чудесах на колёсах" (Царствие Небесное, великий был человек), первая зарубка.

Спустя несколько лет в той самой организации, в которой херачил на саксофоне аналитик-экономист в адских расцветок галстуке и завывал чёртов буддист-битломан, я присутствовал во время прохождения одной из первых мультимедийных игр "Седьмой гость". Сколько-то там было дисков много, не то 2, не то даже 3, это поражало воображение само по себе, плюс "там такая графика!". Я уж не помню, что там была за ерунда, но какая-то она была полулогическая, что ли. Типа, призраков валишь, а когда всех наказал, то для перехода дальше надо решить логическую задачу за ограниченное время. Запомнил только одну: сколько способов расстановки 8ми ферзей есть на стандартной шахматной доске? Бедняга, который играл, начал водить пальцем по экрану. По мне же так задача сама просилась на реализацию программкой. Как я её написал не помню. Помню, что там была рекурсия (аналогичная обходу дерева каталогов на диске), руки писали код сами и через 2 или 3 минуты запуск дал "96". 94й или 95й год, с интернетом некоторый туган (в нём я появился только в 97м), ответ проверить гуглом было нельзя, но игра приняла ответ и пустила дальше. Это была вторая зарубка.

Третью я получил во время написания программы к диссертации. Программа была дико сложная, Borland C++ 5.02 который, отказывался работать с таким количеством шаблонов и выпадал через компиляцию стабильно. Он так меня измучал, что вместо работы я сидел и часами пил кофе и всё думал, как бы довести работу до запуска. Объективно работы там было немного, но мне казалось, что не закончится никогда. Выкурив сигарету, решил всё же глянуть, что же надо сделать. Вся работа заняла 20 минут, BC++ схавал всё, что ему было предложено и выдал аккуратный каталог с библиотеками и исполняемым бинарём.

Последняя же, наверное, изменила мою жизнь больше всего прочего. Осень 97го, до сдачи проекта по программным средствам дистанционного образования оставалось около недели. По отдельности все компоненты работали. Работали ActiveX controls, браузер заданий, рабочее место препода. Работал даже самостоятельно реализованный на сокетах обмен данными в сетке, всё как положено: приоритеты, очереди, обработка ошибок. А вместе - не работало.

Надо сказать, что ничто меня не выматывает сильнее, чем проблемы на пустом месте, когда логическим путём дойти до их сути не можешь.
Терялись ответы и всё тут. Сокеты работали как часы, товарищ В.Ч. на них даже игру какую-то многопользовательскую сбацал. Не то Го, не то Реверси. Факт, что работало. Уверенность насчёт прочего была не меньшая. Что делать? Не сдавать нельзя. Что исправлять - непонятно. И я запаниковал. Внёс предложение переписать пару сомнительных с моей точки зрения фрагментов и проверить. Переписать и проверить. Был готов сделать это единолично и самостоятельно. Но более хладнокровные товарищи, товарищ, точнее, отказался: у нас всё работает. Мы не будем переписывать, пойдём сейчас поиграем в настольный теннис, а когда вернёмся, просмотрим весь код от начала до конца. ...Ошибка была в закладывании в буфер: закладывалось на 1 байт меньше, чем нужно, из-за этого пришедший на сервер пакет не распознавался как правильный, но он не был и неправильным с точки зрения передачи по сети. Сдались мы вовремя, всё было нормально. Уже больше 9ти лет я не кидаюсь переписывать то, что не работает и бью по рукам тех, кто лезет чинить то, что не ломалось и исправлять то, что не содержит никакого дефекта. Это был самый комплексный урок, наверное: не бояться, не паниковать, даже на пике общей суматохи не отступать от плана.
P.S. Оказывается, Анатолий Маркуша умер только в 2005 году и у меня были все шансы с ним познакомиться лично. Его "Чудеса на колёсах", 70го года издания, были у нас дома ещё до моего рождения и мне почему-то казалось, что к тому времени его уже не было. По-моему, это великая книга. Всё, о чём написал Брукс, о чём с нарастающей свирепостью пишет Макконнелл, - Анатолий Маркович написал до них. И куда как лучше. И куда как доступнее. Для детей и юношества. Чтобы парни и девчонки не терялись в жизни. Вот я благодаря Анатолию Марковичу - не потерялся. Если вы его в детстве не читали, мне вас очень жаль. Правда.

пятница, января 05, 2007

Странные ошибки

В Winforms 2.0 появилось семейство свойств AutoComplete у таких элементов управления, как TextBox, ComboBox и пр.
protected override void SetupAutoCompleteFeatures()
{
CountryTextBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
CountryTextBox.AutoCompleteCustomSource = AutoCompleteData;
CountryTextBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
}
Удобно для длинных списков, которые по соображениям человеколюбия не станешь засовывать в ComboBox.Items; а так - пару букв набрал, тебе в списке вывели варианты, типа как на картинке.

Однако, не всё так хорошо. Списки, которые приходится грузить, довольно длинны, а размер файла с базой MS Access (200МБ) не позволяет драйверу получать наши десятки тысяч записей быстро. Поэтому загрузка производится в потоках: форма начинает загружаться, запускается поток, в потоке заполняется коллекция для AutoCompleteCustomSource. В методе асинхронного завершения вызывается установка считанной коллекции в качестве источника. Прекрасно прокатывает с TextBox, а ComboBox - нет. С ошибкой: "Current thread must be set to single thread apartment (STA) mode before OLE calls can be made". Особо времени разбираться не было, поэтому, выяснив, что с TextBox такого не происходит никогда, просто заменил ComboBox -> TextBox на формах и проблема ушла. На досугах погляжу, что это на самом деле означает.