воскресенье, января 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 на формах и проблема ушла. На досугах погляжу, что это на самом деле означает.