пятница, 27 февраля 2009 г.

Формирование графиков с использованием XML\SWF Charts

Недавно я писал про возможность формирования графиков с использованием компонента MSChart от компании Microsoft. Следует отметить, что компонент хоть и позволяет осуществлять собственную пользовательскую доработку, на данный момент сыроват. Если есть желание использовать сразу что-то красивое и удобное - вариант есть. Это flash-приложение XML\SWF Charts.
Библиотека предоставляет приличное множество графиков. Параметризирование получаемого графика производится с использованием XML. Например, такого:
<chart>

<!-- Chart style -->
<chart_rect x='90' y='20' width='430' height='170' />
<chart_transition type='slide_down' order='series' />

<legend_rect x='100' y='10' width='450' height='30' />
<legend_label layout="horizontal" bullet="line" size='10' bold="true" />
<legend_transition type='slide_up' delay='1' duration='1' />


<!-- Axis styles -->
<axis_category min='0' max='120' size='10' skip='4' />

<axis_value prefix='$' size='10' separator=',' />
<chart_grid_h thickness="2" color='000000' type='solid' />


<!-- Series styles -->
<chart_type>
<string>line</string>
<string>line</string>
<string>column</string>
</chart_type>

<chart_pref line_thickness='2' point_shape='none' />
<chart_pref line_thickness='2' point_shape='none' />

<series_color>
<color>66FF33</color>
<color>B200FF</color>
<color>F88800</color>
</series_color>


<!-- Chart data -->
<chart_data>
</chart_data>

</chart>

XML-файл, содержащий описание требуемого графика передается flash-приложению через GET-параметр xml_source. Примерный ASP-код формирование интересующего графика представлен ниже. Разумеется, ASP тут ни при чем. Аналогично можно использовать любую другую технологию web-разработки.
buffer.Append( "<param name='movie' value='flash/charts.swf?library_path=flash/charts_library&xml_source=Chart.aspx' >" );

Заготовка файла Chart.aspx.cs может иметь, например, следующий вид:
protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
Response.ContentType = "text/xml";
Response.Expires = -1;
Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
Response.AddHeader("Cache-Control", "no-cache");

string fileName = Server.MapPath("~/sample.xml");
XmlDocument doc = new XmlDocument();
try
{
doc.Load(fileName);
XmlNode node = doc.SelectSingleNode("chart/chart_data");

//Код формирования данных в ноде chart_data

Response.Write(doc.InnerXml);
}
catch (Exception ex)
{
Response.Write("<chart></chart>");
}
Response.End();
}

Таким образом на свою скромную страничку можно добавить красивые графики с элементами интерактива, особенно не запариваясь с использованием MSChart или тега canvas стандарта html5.

пятница, 20 февраля 2009 г.

Неужели обратная связть работает?!

Чуть больше месяца назад было опубликовано послание президента кастаельно возможность активного отдыха в нешей стране. На данное заявление мной и ещё несколькими людьми в комментариях были оставлены пожелания об обеспечении безопасности дорожного движения для велосипедистов.
Судя по сообщению на уважаемом велоресурсе Петербурга, дело таки сдвинулось с мертвой точки, на которой находилось несколько последних лет. Цитата дословно:
В года минувшие, недавние, "велосипедная общественность" города тоже поднимала вопрос о строительстве велосипедных дорожек. Мы проводили "круглые столы", на которых присутствовали депутаты ЗАКСа, комитетов Смольного. Но честно говоря, "велосипедная общественность" не слишком веря в возможность реального строительства, не слишком и перенапрегалась в деле "борьбы" за светлое велосипедное будущее. И вдруг, администрация города, честно говоря, сама, без какого-то нашего нажима, решает, что велодорожкам - быть.
То ли совпадение, то ли действительно обещанная обратная связь от общества к президенту в обход вертикали власти функционирует корректно. Ниже приведен перечень обещанных в 2009 году велосипедных дорожек, фигурирующих в представленном документе. В конце велосипедного сезона можно будет проверить выполнение планов вице-губернатора А.И.Полукеева.
  • Садовая ул. – пл. Репина – Старо-Петергофский пр. (от наб. р. Фонтанки до пл. Стачек)
  • Рузовская ул. (от Загородного пр. до наб. Обводного кан.)
  • ул. Нахимова (от ул. Наличной до ул. Кораблестроителей)
  • ул. Кораблестроителей (от моста Кораблестроителей до Уральской ул.)
  • Наличная ул. – Большой пр. В.О. – 21-я линия В.О. – наб. Лейтенанта Шмидта – Университетская наб. – 1-я линия В.О. (от ул. Нахимова до Тучкова моста)
  • пр. Энгельса – Выборгское шоссе (от Светлановской пл. до Кольцевой Автомобильной Дороги)
  • пр. Культуры – Тихорецкий пр. – Политехническая ул.- Полюстровский пр. (от Шоссейной ул. до Пискаревского пр.)
  • Светлановский пр. (от Тихорецкого пр. до Богатырского пр.)
  • пр. Тореза (от Светлановского пр. до Выборгского шоссе)
  • ул. Есенина (от пр. Тореза до Северного пр. (четная сторона)
  • Северный пр. (от пр. Энгельса до пр. Культуры (нечетная сторона)
  • пр. Просвещения (от пр. Культуры до Выборгского шоссе)
  • Светлановский пр. ( от Светлановской пл. до Суздальского пр.)
  • пр. Луначарского (от Выборгского шоссе до ул. Руставели)
  • пр. Культуры - Тихорецкий пр. - Политехническая ул.- Полюстровский пр. – пр. Маршала Блюхера
  • Свердловская наб. - Арсенальная наб. ( от пл. Ленина до Пискаревского пр.)
  • пр. Просвещения (от ул. Руставели до пр. Культуры)

четверг, 12 февраля 2009 г.

Пользовательское использование параметров __doPostBack

Иногда возникает необходимость выходить за документированные рамки технологии ASP при реализации той или иной функциональности. Например, при создании собственных управляющих элементов (user control), обладающих функциональностью AutoPostBack.
При использовании AutoPostBack в базовых управляющих элементах на странице генерируется следующий код:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}

Использование вызова __doPostBack(null, null) позволяет сделать из клиентской составляющей пользовательского управляющего элемента отсылку данных серверной составляющей. Если же одной PostBack отсылки не достаточно, целесообразно использовать аргументы функции:
  1. eventTarget- клиентский идентификатор инициализатора события в виде строки;
  2. eventArgument - какие-то параметры в виде строки.
Получить доступ из серверной составляющей к параметрам вызова __doPostBack возможно следующим способом:
  1. Page.Request.Params.Get( "__EVENTTARGET" ) - идентификатор инициализатора;
  2. Page.Request.Params.Get( "__EVENTARGUMENT" ) - параметры вызова.
Использование описанного механизма вкупе с сериализацией данных на стороне клиента и десериализацией на стороне сервера предоставляет разработчику аппарат создания собственных управляющих элементов довольно-таки гибкого поведения.

вторник, 10 февраля 2009 г.

Шифрование настроек в web.config

Одной из приятных особенностей использования ASP является возможность шифрования содержимого web.config стандарными средствами. Называется это стандартное средство Protected Configuration. Диаграмма вариантов использования провайдера представлена на рисунке 1.

Рис.1. Диаграмма вариантов использования средства шифрования конфигурационных файлов

Осуществлять шифрование конфигурационного файла целесообразнее утилитой aspnet_regiis.exe, входящей в комплект ASP.NET 2.0. В результате шифрования получается ключ дешифрации, спрятанный, например, в %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA. Утилита aspnet_regiis.exe, предназначенная для администрирования, позволяет производить ряд операций по шифрованию, наиболее важными из которых по данной теме являются:
  • pe - шифрование определенной секции определенного конфигурационного файла определенным провайдером
  • pd - дешифрация секции конфигурационного файла заданным провайдером
  • pa - предоставить досуп к ключу дешифрации для заданного пользователя
  • pr - убрать доступ к ключу дешифрации для заданного пользователя
Имя ключа шифрования для последних двух операций в данном случае хранится в атрибуте keyContainerName нити configProtectedData\providers\add[@name="RsaProtectedConfigurationProvider"] файла machine.config

пятница, 6 февраля 2009 г.

Комментарий на видеопослание президента РФ об обучении в ВУЗ'ах

Исходное послание президента
Статья, посвященная давлению на руководства ВУЗ'ов

Обсуждая проблемы в образовании, прошу вас обратить внимание на законность давления, осуществленного первым заместителем начальника ГУВД Москвы в отношении руководства некоторых московских ВУЗ'ов. Подробности данного давления изложены в статье "Образумьте там своих!", опубликованной 28-го января 2009 года в издании "Ежедневный Журнал" (электронная версия статьи - http://www.ej.ru/?a=note&id=8781)
Считаете ли вы подобное вмешательство ГУВД в образовательный процесс некорректным? Если считаете, каким образом это отразится на лицах, осуществляющих подобное давление на руководство ВУЗ'ов?

P.S. Данный комментарий по неизвестным причинам не прошел модерацию и не был опубликован в блоге.

четверг, 5 февраля 2009 г.

Проблемы осуществления Border + Crop в JAI

Часто возникает необходимость последовательного расширения изображения с последующим обрезанием расширенных границ. Например, при проведении медианной или фурье-фильтрации для избежания информационных потерь по границе изображения.
Если использовать библиотеку JAI из JMF v.2.1.1e, данную операцию можно провести последовательным применением операторов Border и Crop.
И здесь возникает проблема смещения указателей на начало изображения. Схематически, представленая на рис.1


Рис.1. Представление проблемы осуществления border-crop операции

В дебагере это можно определить через свойства PlanarImage.tileX и PlanarImage.tileY. При отображении изображения через, например, DisplayJAI, производится вывод с позиции (0,0) - т.е. изображение целиком не выводится. А осущетвление попиксельных операций уже выдает исключение выхода за область памяти. Таким образом, проведение операции border-crop над изображением неустойчиво и делает последнее непригодным к какому-либо использованию.
Как было выяснено из одной книги, проблема известная и её предлагается решать операторами Format или Translate. Но они не работают. Format просто не работает. Translate срабатывает по прямому назначению, но не решает проблемы в целом.
Несколько корявым, но работоспособным явлется процедура переоткрытия графического файла. Например, такая:
JAI.create("filestore", cropImage, "temp.bmp", "BMP");
cropImage = JAI.create("fileload", "temp.bmp");
Возможно, существуют иные варианты решения?

вторник, 3 февраля 2009 г.

Краткое описание алгоритма ресамплинга Seam Curving

Весьма интересный алгоритм осуществления ресамплинга цифровых изображений был предложен господами Shai Avidan и Ariel Shamir в октябре 2007 года.
Презентация способностей технологии в видеоформате представлена на сайте Seam Carving for Content-Aware Image Resizing.
Имеется более-менее подробное математическое описание алгоритма на английском языке.

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

Используя понятие энергии пиксела, можно реализовать т.н. контентно-зависимый ресамплинг изображения по следующим схемам:
  1. Удаление/добавление строк или стоблбцов изображения содержащие элементы с минимальной/максимальной энергией (рис.1.а);
  2. Удаление/добавление элементов в строке или столбце с минимальной/максимальной энергией (рис.1.б);
  3. Удаление/добавление элементов с минимальной/максимальной энергией по всему изображению (рис.1.в);
  4. Интеллектуальное удаление/добавление элементов (тот самый Seam Carving).
Рис.1. Примеры контентно-зависимого ресамплинга

Как видно из рисунка 1, конентно-зависимый ресамплинг, если он не интеллектуальный, не очень-то и применим. Основным отличием алгоритма интеллектуального от прочих контентно-зависимых методов ресамплинга является способ определения удаляемых/добавляемых пикселов. В алгоритме Seam Carving определяется понятие "шва" - цепочки пикселов с минимально-значимой энергией. "Шов" может быть вертикальным и горизонтальным и представляет собой некоторый вектор S, определяемый вертикально (3) или горизонтально (4).(3)
(4)

Энергия "шва" определяется суммой энергий элементов его составляющих.
(5)

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