вторник, мая 30, 2006

IE 7 и заикание

Установил себе 7й. При этом появилось 2 эффекта:
1. Невозможно переключить раскладку клавиатуры иначе как мышью в панели языка
2. При отправке комментариев методом ПОСТ первый съедается с ошибкой. Приходится отвечать повторно, но после второго ответа обнаруживается, что первый ПОСТ всё же прошёл. Не буду дубли удалять.

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

Office 12

Эпопея с Visio 2003 закончилась победой человека. Всё это время я надеялся, что V12 будет написана на .NET (уж если Vista не пишется на нём). Однако нет.

---------------------------
ERROR
---------------------------
error : 'C:\Program Files\Microsoft Office\OFFICE12\VISIO.EXE' has no valid CLR header and cannot be disassembled
---------------------------
OK
---------------------------

По-моему, это совершенно бесславные конец идеи Болмера - .net. Я понимаю, что в Microsoft ещё помнят, как они 5 лет компостировали людям мозг с Windows, но времена те ушли безвозвратно. А если к этому присовокупить ещё и вот это, то возникает вопрос. А нахуа это всё? Получается так, что надо просто заключать с жирными крысами договор на продажу их коробок, а свою бизнес-стратегию пусть хоронят сами. Без нас.

суббота, марта 25, 2006

Visio

У меня сложилось впечатление, что в одной компании не очень-то рады тому, что купили в своё время Visio. Это продукт с наиболее дебильной объектной моделью и такими странными ходами, что становится немного не по себе. Моя задача была обеспечить разбор нарисованного пользователем графа и сообщить пользователю о допустимости либо недопустимости выбранной конфигурации.

Эта работа состоит из большого числа полубессмысленных либо сложных и запутанных шагов и всё потому, что платформой для рисования был(о?) выбрано Visio. Для того, чтобы приступить к обходу графа, необходимо:
1. Построить stencil, определив geometries, custom property sets и прочие behaviors. Эти операции не так очевидны, потому мало иметь под рукой Visio SDK. Надо ещё под носом держать постоянно открытый Shapesheet для уточнения того, что соблаговолили написать в SDK. А кроме этого object inspector из VBA от Visio тоже не помешает: определять, к каким перечислениям и классам относятся странноватые константы вроде visRowXForm1D - откуда-то надо.
2. Внутри своего кода (в моём случае это C# 2.0) потребуется выполнять такие многозначительные операции, как получение точек соединения для фигур и отрезков, соединяющих фигуры. Интересно, что коллекции ConnectionPoints нет как класса, а вместо этого предлагается использовать что-то вроде


x = Shape.get_CellsSRC((short)Visio.VisSectionIndices.visSectionConnectionPts,
a,
(short)Visio.VisCellIndices.visCnnctX).get_Result(Visio.VisMeasurementSystem.visMSMetric);
y = Shape.get_CellsSRC((short)Visio.VisSectionIndices.visSectionConnectionPts,
a,
(short)Visio.VisCellIndices.visCnnctY).get_Result(Visio.VisMeasurementSystem.visMSMetric);


То есть, visio's shape нужно рассматривать как таблицу со строками и полями специального значения. Ну, ладно, бывало и хуже.
3. Оказывается, при повороте вокруг точки вращения Visio не учитывает изменения координат точек соединения. И если я попытаюсь соединить одну фигуру с другой (а признак соединения - совпадение начала или конца отрезка соединения с точкой соединения фигуры) - то мне потребуется самостоятельно выполнять перенос оси координат и поворот. Это, конечно, мелочь, чего там:

double x1 = x*cos - y*sin;
y = x*sin + y*cos;


Почему программисты Visio не стали делать этих вычислений самостоятельно я не могу понять.

В общем, внутренности Visio мне сильно напоминают вид внутренностей козы, которую на закрытии по копытам взял мой товарищ. Маленькая аккуратная дырочка в боку от входа пули и громадный кровавый остропахнущий вывалившийся из противоположного бока козы комок из печени, желудка и кишок. И я думаю, что то, что можно козе - Visio нельзя.

вторник, марта 14, 2006

Книги

Я с удивлением обнаружил, что не могу пользоваться бумажными книгами; только теми, в которых возможен быстрый поиск. Кстати. http://www.poiskknig.ru/

пятница, марта 10, 2006

Microsoft

Несмотря на их BFS, к этой компании я испытываю очень тёплые чувства. Объективно - непонятно, почему. А субъективно - сегодня встречался с ними по делу, такое ощущение, как дома побывал.

воскресенье, февраля 26, 2006

История изменения

Эта тема особенно беспокоит меня в последнее время. Что-то похожее уже было, но сейчас проблема предельно заострилась и формулируется так: требуется обобщённый механизм отката изменений в состоянии хранилищ на произвольное количество шагов. Важно, что в хранилище задаются неизвестные на момент создания механизма зависимости между объектами.

Предусловия.
1. Ничто не попадает в хранилище иначем, чем через адаптер.
2. Допустимо использование контекстов

Тогда.
Всю эту работу можно сделать довольно аккуратно при помощи атрибутов и контекстов.


[AttributeUsage(AttributeTargets.Class)]
public sealed class ReplicationTracingAttribute: ContextAttribute
{
public ReplicationTracingAttribute(): base("ReplicationTracing")
{
}
public override void GetPropertiesForNewContext(IConstructionCallMessage ctorMsg)
{
ctorMsg.ContextProperties.Add(new ReplicationTracingProperty());
}
}

при этом
ReplicationTracingProperty
выглядит так:

public class ReplicationTracingProperty: IContextProperty, IContributeObjectSink
{

Если теперь метод
GetObjectSink
интерфейса
IContributeObjectSink
определить так:
public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink nextSink)
{
return new ReplicationAspect(nextSink, obj);
}
то можно воспользоваться такой удобной вещью, как доступ к свойствам метода до того, как сам этот метод выполняется.

Смысл тут простой. На требуемые методы адаптеров навешиваются атрибуты отслеживания (см. выше), при вызове методов классов, реализующих адаптеры, поток выполнения заходит сначала в приёмник вызова. Этот самый приёмник что-то вроде пазухи, потайного кармана, расположенного между внутренней и наружной частью одежды. Если мы рассматриваем обычную модель работы со стеком, то между вызовом команды CALL процессора и снятием первого аргумента со стека в самой команде ничего нет. Вызвали - сняли со стека аргумент. А здесь, с приёмником, ситуация такая: закинули в стек аргументы, вызвали, а перед вызовом выполняется некий специальный код (это неинтересно объяснять, лучше один раз глянуть в MSDN), заворачивающий вызов метода в спец. оболочку, дающую доступ как к параметрам до вызова, так и к параметрам и возврату после вызова. Это чем-то похоже на генерирование защитного кода для тестирования обращения за пределы стека в Rational Purify, но гораздо более общо.

Ну так вот. Используя контексты вызова, можно протоколировать вызовы команд соответствующего сервера БД. В самом деле. В момент вызова уже известно, каким именно образом код будет сохранять (изменять, удалять данные) и всё, что потребуется - это просто посмотреть, кто именно вызывает методы изменения и с какими аргументами. Очень просто.

public IMessage SyncProcessMessage(IMessage Msg)
{
bool logOperation = Preprocess(Msg);
IMessage ret = m_NextSink.SyncProcessMessage(Msg);

if (logOperation)
PostProcess(Msg, ret);

return ret;
}

Не все операции надо протоколировать (например - можно протоколировать и SELECT, но зачем? Это задача аудита БД, мне нужно только протоколировать изменения и обеспечить откаты[в хорошем смысле]). Но если нужно протоколировать изменения, то метод PostProcess, вызываемый после собственно метода - то самое место, где будет выполняться запись протокола. В методе PostProcess для вызванного метода получаем перечень наших атрибутов, ну а дальше понятно. Единственное, что тут может потребоваться - это пояснить, как применяются и зачем тут атрибуты.

У меня они применяются так:

public interface IDataStorageAdapter
{
[AdapterReplication(SqlAction.Insert)]
long Insert(BaseItem Param);

[AdapterReplication(SqlAction.Update)]
int Update(BaseItem Param);

[AdapterReplication(SqlAction.Delete)]
int Delete(long Param);
...
}

Но это только низший уровень. При помощи контекстов получается строка, записываемая в таблицу истории изменений. Вставка одного объекта приводит к записи одной строки.

Если рассматривать изменение хранилища, как последовательность вставок записей об изменениях, то процедура отката - очевидна. Однако, не всё так просто. Как правило, объекты сложны и сохраняются каскадами, а каждый каскад - внутри транзакции. В то время, как транзакции являются логическими единицами, вставки - являются единицами физическими, отследить по этим вставкам транзакции - не представляется возможным. Поэтому необходимо вводить маркеры, которые собой знаменовали бы начало транзакции. Я пишу это для того, чтобы лучше понять, каким образом должна быть написана спецификация на эту функциональность, не обманывай себя, о случайный читатель. Такими маркерами может быть вставка записи об объекте высокого уровня. Тогда разбиваем весь набор записей на классы по признаку уровень и выполняем откат от одной высокоуровневой записи до другой. Надо подумать, не является ли высокий уровень объекта достаточным условием для констатации отката транзакции полностью...

среда, февраля 22, 2006

Microsoft Battle Flight Simulator 3

Неделю назад наконец-то мне привезли из Америки эту игру. Авиасимуляторы я люблю, решил вот попробовать заморского... Что я могу сказать? Погань. Стоит в моём игровом 9600XT. Это, конечно, не сегодняшний день, но с Ил-2 нет ни малейших проблем. Всё на самом деле летает: быстрая анимация, натуральное сглаживание, тени, видимость, метеоусловия. А эта заморская херня? Сходное ощущение у меня было только однажды, когда я попытался на карте S3 Virge погонять в Carmageddon, году не то в 98м, не то в 99м.

Что тут можно ещё сказать? Я разочарован дважды. В первый раз тем, что вместо гражданских самолётов мне привезли симулятор боёв, во второй раз - убогостью исполнения. Что им нужно? X800? Почему Медоксу это не нужно?...

воскресенье, февраля 19, 2006

Ни о чём

Зашли поужинать в Тратторию. Заказы напоминали эпициклоиду. А последующая поездка домой - кардиоиду.

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

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

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

вторник, февраля 14, 2006

Переделки

У нас начата миграция на .NET 2.0, удачно совпавшая с началом нового проекта. То есть, не то, чтобы он был совсем новым, но нужно так много сделать и столько переделать, что можно считать его новым.

Переделки начались "издаля". Сначала была подвергнута жестокой вивисекции рабочая библиотека, что уже пару лет помогает нам смотреть на объекты через призму ЕСС. Потом начали изменение кода самого приложения, чтобы технологическая сборка (как мы называем то, что делается для удостоверения в синтаксической корректности кода). Это заняло уже 5 дней и ещё займёт дня 3-4. Сегодня, говорят, удалось даже запустить этого гидроцефала и он пару минут работал :-). Хорошо, что есть люди, которые берутся за такую работу...

пятница, февраля 10, 2006

Прикладная нумерология

Только что в Sent Items упало письмо с порядковым номером 8888. Столько писем я отправил 12:20 25го мая 2002года. Теперь я знаю, как вечером развлекусь: закачаю в несчастную громоптицу все письма с 96года.

среда, февраля 08, 2006

Наборы разрешений

Странно, что до сих пор, хотя уже .NET 2.0 шагает по планете, есть масса людей,которые не знают, что такое PermissionSet, как они составляются, как задействуются, как выводятся из Evidences и при чём тут политики безопасности.

Возможно, это потому, что сделано не очень понятно. Я бы сделал проще. Вообще, ситуация мне напоминает год эдак 94й, когда все знали, что есть OLE2, но мало кто мог внятно изложить, что такое связывание, при чём там DDE и зачем нужны ConnectionPoints.

Материала по безопасности вокруг много, но не очень много я вижу связного. Не начать ли систематизировать и публиковать?...

суббота, января 21, 2006

Перешли на круглосуточную работу

Не знаю, на сколько нас хватит. Сплю практически там, где отключаюсь. Утром - душ, кофе, булка и опять.

четверг, января 12, 2006

Если ты выдохся...

Если

  • ты выдохся и чувствуешь, что программировать уже надоело - бросай это дело.
  • перестал понимать, как это важно - ясно выражать свою мысль в коде - бросай программировать.
  • тебе однажды хотя бы показалось, что, в конце-концов, нет разницы между решением проблемы и её нерешением - уходи.
  • ты перестал ощущать стыд от того, что твоя ошибка месяцами висит в FB - освободи место.
  • я сказал это тебе в лицо или ты получил это от меня в письме - не расстраивайся. Есть много другой полезной работы в мире. И раз для программирования ты уже потерян, то не теряй времени - ступай, переквалифицируйся в аналитики, пока орды уставших не заняли твоё место там.
Однажды я услышал: это плохой менеджмент. Если вы, суки, такие умные, то попробуйте для затравки сказать своей старой матери, что она стала безобразной старухой и расскажите потом мне, как это было... Такие же чувства испытываю я к людям, которые, оставаясь моими друзьями, один за одним сходят с дистанции. Этикет и деликатность требуют от меня тратить так много времени на выведение человека из процесса, сколько нужно. Бизнес и текущие проблемы не позволяют мне тратить столько времени. Я бы никому не позавидовал, кому приходится решать такие проблемы.

среда, января 11, 2006

Вчера был в Троицке, МО

Забрал двое binary watches (красные и синие) для друга. Завтра к нему и поеду.

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

понедельник, января 09, 2006

Закончена переделка репликатора

Новостей, собственно, 2.
1. Код переписан почти полностью, но все тесты срабатывают на 100%
2. У нас есть настраиваемый стек обмена произвольной информацией.

Завтра, если и QA не найдёт слабых мест, будем запускать в production. ПоглядимЪ.

пятница, января 06, 2006

Производственное

Двое суток были посвящены разработке модели Репликатора, который позволил бы выполнять произвольные двусторонние преобразования данных, которые берутся из нашей гранд-базы (для выгрузки) и почты/диска/etc. (для загрузки). В процессе создания "бумажного прототипа" было написано 1500 строк кода, изрисовано схемами почти 7 бумажных страниц А4 и 2 страницы текста в Microsoft Word.

Результат мне очень нравится.

  • Все внутренности вроде событий синхронизации аккуратно упрятаны вглубь кода.
  • Интерфейсы взаимодействия почти невесомы и на 100% очевидны и ожидаемы
  • Для приёма и выдачи данных используются контейнеры.
  • Исключено использование БД для хранения промежуточных и конфигурационных данных (а в первой версии это предполагалось)
  • Стек преобразователей настраивается простым копированием в каталог на диске
  • Исключительно простая схема обработки неизвестных данных позволяет разгрузить объект "Координатор" от сложной аналитики
  • Убить мусором преобразователь невозможно
  • Одно из самых главных достоинств: в этой модели действительно можно преобразовывать что угодно во что угодно
Это стоило двух дней напряжённых размышлений. Сейчас вот немного посплю и начну воплощать.

понедельник, января 02, 2006

А ведь Спольский прав

Мне приходится, как говорится, иметь дело с людьми из разных миров. Разговариваю с теми, кто пишет на Java, сам много пишу на C#, пока ещё не забыл, как люди работают в C++.

Одно время меня пугало, что есть такие люди на свете, которые считают себя программистами, но не понимают, что такое указатель и как выглядит атака на стек программы. Я всё как-то пытался понять, как они так живут и не мог.

Потом некоторое время я не касался проблем указателей, размещения памяти и прочих деструкторов и вроде бы даже расслабился. А теперь снобически думаю, что это всё же неправильно: избавлять языки, хотя бы и такие высокоуровневые как та же Java или C# от указателей. Это самый простой и эффективный из известных мне тестов на профпригодность. Можешь объяснить если, где находится буква в строке длинных целых, преобразованной из строки текста - заходи, поговорим. А нет, так ничего не поделаешь: иди картриджи менять.

четверг, ноября 10, 2005

Вассерман

Некто Анат. Вассерман излагает свои соображения относительно Чернобыля: http://awas.ws/HOBBY/TECHNICS/CHERNBYL.HTM

среда, ноября 09, 2005

У МТС установлена новая биллинговая система.

Какая разница и не наплевать ли? Нет. Не наплевать. Минута разговора мне теперь обходится в $35. Уже устал общаться финотделом и возвращать свои деньги. Обидно было бы сменить оператора, которым пользовался 5 лет.

Сегодня (вчера уже) после банки пива мне пришло в голову, что человек произошёл от трансформатора. Когда подопьёт - начинает гудеть.