среда, марта 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 можно сделать почти всё.

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