April 2011 Blog Posts

Первое мая

28 April 2011 |

Что это за праздник первое мая.

1 мая 1886 года американские рабочие организовали забастовку, выдвинув требование 8-часового рабочего дня. Забастовка и сопутствующая демонстрация закончились кровопролитным столкновением с полицией.

В июле 1889 года Парижский конгресс II Интернационала в память о выступлении рабочих Чикаго принял решение о проведении 1 мая ежегодных демонстраций. Впервые день международной солидарности трудящихся был отмечен в 1890 году в Австро-Венгрии, Бельгии, Германии, Дании, Испании, Италии, США, Норвегии, Франции, Швеции и некоторых других странах.

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

1 мая

День посвящён народному протесту против того, что слишком уж большая часть труда присваивается капиталистами/бизнесменами. Какие бы теории не выдвигали, но и без особого образования очевидно – что сверхбогатсво собственным трудом не зарабатывается.

Но разве это всё заслуживает внимание, другое дело:

В Лондоне проходят последние приготовления к свадьбе принца Уильяма и Кейт Миддлтон, которая состоится в пятницу. Уильям и Кейт провели репетицию церемонии в Вестминстерском аббатстве.

Королевская свадьба

Символичное совпадение событий, наиболее харизматичные представители “паразитов” - монархи, именно в этот день проводят пиар акцию. Стоит заметить, что в самой Британии отношение к этому событию не однозначно Королевские отказники: 1/3 британцев игнорируют свадьбу.

Времена изменились, монархов/королей/графов не так уж много осталось в цивилизованном мире, их место заняли олигархи/бизнесмены и производители так называемого интеллектуального продукта. Если с капиталистами всё понятно, то вот владельцы прав на музыку, фильмы, программное обеспечение – все те кто имеет деньги не за работу, а за то что, что-то запатентовали/зарегистрировали и теперь пожизненно получают деньги – это порождение уже информационного общества – новый класс который теснит классических угнетателей.

Чтобы и как бы не менялось в мире, первое мая вечный праздник, угнетать людей труда никто не перестанет – и с этим ничего не поделаешь, такова уж природа людей, одни не против угнетать, другие не готовы быть вне стада…

Синдром золотой рыбки 2

25 April 2011 |

Как то давно была заметка Синдром золотой рыбки. Тема вечная – почему заказчику не так сильно важно получить хороший продукт и выгоду от него, как то чтобы не переплатить бы… Сделаешь, что либо раньше срока и начинается, а вот здесь ещё бы такую штуку сделать, а вот так бы а вот и это бы ещё добавить… раз, два и начинаешь делать все в срок или с опозданием – раз не деньгами, то берешь временем – вещь в хозяйстве полезная. Особое удивление взывает когда заказчики в курсе дела потому, что специализируются на разработке, и имеют представление об отрасли.

И вот он классический мультфильм про заказчиков (может они не были детьми, может быть они мультфильмов не смотрели):

А поссоришься с купцом и останешься глупцом…

ClickOnce BuildDate

19 April 2011 |

Обычно в диалоге “О Программе” пишут, название программы, версию, производителя, контактные данные и всякие другие общие буковки… Возник вопрос, при частых обновлениях кроме версии ещё интересно было бы видеть дату – как это сделать?

Есть решения различной степени изощренности, в моем случае, когда приложения разворачивается с помощью ClickOnce наиболее симпатичным показался вот такой способ:

private static DateTime RetrieveLinkerTimestamp(string filePath)
{
    const int PeHeaderOffset = 60;
    const int LinkerTimestampOffset = 8;
    byte[] b = new byte[2048];
    Stream s = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    s.Read(b, 0, 2048);
    s.Close();
    int i = BitConverter.ToInt32(b, PeHeaderOffset);
    int SecondsSince1970 = BitConverter.ToInt32(b, (i + LinkerTimestampOffset));
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
    dt = dt.AddSeconds(SecondsSince1970);
    dt = dt + TimeZone.CurrentTimeZone.GetUtcOffset(dt);
    return dt;
}

Determine .NET Assembly Build Date

WCF, Dictionary<string,object>, int[]

18 April 2011 |

Задали вопрос – не передаётся объект типа Dictionary<string,object>, к примеру int[8] – рефлекторно ответил – расставьте для всех типов которые могут передаваться в object атрибуты KnownType и всё заработает.

Не заработало, проблема носит локальный характер, т.е. с List<object> таких трудностей не возникает. Каких-то разумных способов решения не нашел, но к счастью есть хитрый обходной способ решения проблемы: в класс контейнер содержащий свойство типа Dictionary<string,object>(без класса контейнера не обойтись) нужно добавить Fake свойство типа object и тогда прокси будут строится правильно и всё заработает.

[DataContract]
[KnownType(typeof(int[]))]
public class CompositeType
{
	[DataMember]
	public object UsedForKnownTypeSerializationObject;
	[DataMember]
	public string StringValue
	{
		get;
		set;
	}
	[DataMember]
	public Dictionary<string, object> Parameters
	{
		get;
		set;
	}
}

Blog Reloaded

14 April 2011 |

Нет работы – появилось свободное время – обратил внимание на блог, который последний год/два жил сам по себе, своей жизнью… Вышла новая версия движка SubText 2.5.2.0, но оказалось всё кривое и нерабочее. Стал искать на чтобы другое перейти – другое такое же кривое. В итоге, потратил силы/время на правку исходного кода и прочую доводку того что есть, до более менее вменяемого состояния.

Не сказать чтобы сильно доволен, но всё таки лучше чем было до этого…

Разочаровался качеством кода SubText – классический пример когда “погоня за шаблонами” дает отрицательный эффект, писать простой код это искусство – нужно чувствовать.

Возможно обновление, станет стимулом к тому чтобы писать заметки почаще… По статистике большим интересом пользуются технические публикации – постараемся учесть пожелания публики.

WTF: Oracle Function

11 April 2011 |

Думал что такое только в шутках бывает:

function XXX."MIN5"  (x1 in number, x2 in number, x3 in number, x4 in number, x5 in number)
return number
as
begin
if (x1 < x2 and x1 < x3 and x1 < x4 and x1 < x5) then
return x1;
end if;
if (x2 < x1 and x2 < x3 and x2 < x4 and x2 < x5) then
return x2;
end if;
if (x3 < x1 and x3 < x2 and x3 < x4 and x3 < x5) then
return x3;
end if;
if (x4 < x1 and x4 < x2 and x4 < x3 and x4 < x5) then
return x4;
end if;
return x5;
end;

Это пример функции на Oracle, из реальной системы… для крупной уважаемой компании. Она не единственная есть ещё MIN4, MIN3… MAX2… MAX5

PS Не специалист по Oracle может быть это стиль… в конце концов всем известно, что специалисты по Oracle выше ценятся на рыке по сравнению со специалистами по другим СУБД, начинаю понимать почему.

RadioButton: One ViewModel and Few View

09 April 2011 |

- Ничего не поделаешь, - возразил Кот. - Все мы здесь не в своем уме - и ты, и я.
- Важно - неважно... неважно - важно...
(Льюис Кэрролл "Алисы в стране чудес")

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

Видео демонстрация:

И как всегда исходный код, любознательных.

Ливия, миф

09 April 2011 |

Паразиты поражают больных и слабых…

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

Теории заговоров основаны на стереотипе, когда происходит что-то грандиозное, то и объяснение должно быть достаточно сложным. Если посмотреть на происходящее “издалека”, то можно увидеть аналогию с историческими событиями:

  • Восстание Степана Тимофеевича Разина
  • Восстание Емельяна Ивановича Пугачёва
  • Великая французская революция
  • Революция 1917 года в России

Во всех случаях основная причина событий недовольство основной массы людей жизнью, настолько сильное, что люди становятся “неуправляемые” – и из искры разориться пламя. А если копнуть чуть глубже – то во всех случаях имеет место непонимание и нежелание принимать действительность такой какая она есть.

Говорить что в США затеяла события в Ливии настолько же справедливо как говорить, что в революция 1917 года организована Германией. США и Германия были рады и немного удивлены.

Extended WPF Toolkit 1.4.0 Release

08 April 2011 |

Вышел релиз Extended WPF Toolkit 1.4.0 библиотека содержит полезные элементы управления и активно развивается. Разработчиков на WPF должно заинтересовать.

T4 Generate Name For INotifyPropertyChanged

01 April 2011 |

Реализация интерфейса INotifyPropertyChanged требует частого использования имен свойств класса. Зашивать в код строки не хорошо – нет проверки при компиляции, различные другие способы тоже имеют недостатки – ломаются если выполнять рефакторинг переименование.

Появилась идея генерировать код – в котором зашиты текстовые константы. Исходными данными для генерации кода является сам код, значит для получения имен свойств требуется разбирать (parse) текст. Неожиданность – оказывается в framework-е нет соответствующих классов выполняющих разбор C# исходного код, был уверен что в CodeDOM такая возможность есть. Поиске сторонних решений привели к библиотеке ICSharpCode.NRefactory.dll, которая является частью SharpDevelop (бесплатная IDE для разработки под .NET). Для генерации исходного используется T4 (Text Template Transformation Toolkit), ведь задача получить исходных код.

У такого решения есть ряд недостатков. Использование сторонней библиотеки создает риски при переходе на новую версию языка. Нужно не забыть выполнить перегенерацию кода, при изменении имени свойства – проблему можно решить настроив автоматическую перегенерацию при каждому Build что влечет другие проблемы, либо добавив метод который явно использует свойства что не поможет если переименование выполняется через Refactoring.

Может показаться что проблемы возникающие в результате решения больше тех которое оно призвано решать и это так. Но сам подход предоставляет большие возможности. Генерировать реализацию INotifyPropertyChanged, генерировать OnXxxChanged и естественно он применим для решения других задача – проблемы с INotifyPropertyChanged это всего лишь пример.

Исходный код примера