четверг, 23 апреля 2009 г.

Web-сервисы с сохранением состояния на ASP

При создании web-сервисов сложного поведения, бывает, требуется необходимость в сохранении его состояния от одного запроса к другому. Добиться этого можно двумя способами:
  • Использованием файлов/БД с передачей уникального ключа в каждом запросе;
  • Использованием сессий.
Второй вариант фактически есть упрощение первого, поэтому целесообразно рассматривать его и сразу. Решается этот вопрос аргументом EnableSession атрибута WebMethod:
[WebMethod( EnableSession = true )]
public int Echo( int _Val ) { ... }
При этом мы намекаем, что при вызове web-метода Echo имеет смысл предоставить сервером контексту севриса сессию, уникальную для клиента в определенный промежуток времени. Данный промежуток времени можно указать в web.config атрибутом timeout элемента sessionState. Чтобы сервер был в курсе, какую сессию предоставлять контексту сервиса - новую или одну из существующих - необходимо определить свойство CookieContainer данного web-сервиса:
mService.CookieContainer = new CookieContainer( );
От рассмотренного второго варианта решения вопроса можно перейти к первому. ASP позволяет хранить сессии в БД. Определить эту возможность можно при помощи упомянутого ранее элемента sessionState:
<sessionstate mode="SQLServer" sqlconnectionstring="..." sqlcommandtimeout="..."></sessionstate>
При этом ёмкая сессия будет размещаться в БД, а не в памяти процесса.

среда, 22 апреля 2009 г.

Генерация таблиц в DOM'е

Данная запись посвящена динамическому созданию таблиц на html-странице. С одной стороны решение тривиальное:

var tr = document.createElement("tr");
for (var i = 0; i < 3; ++i) {
var td = document.createElement("td");
td.innerHTML = i;
tr.appendChild(td);
}

var table = document.createElement("table");
table.appendChild(tr);

var obj = document.getElementById("container");
obj.appendChild(table);

Скрипт создает строку таблицы, забивает ее ячейками с информационно-значимым контентом. Далее полученная строка добавляется к таблице - и всё ok? Во всех развитых браузерах, разумеется, этого достаточно.
Но есть один особенный бразуер, занимающий лидирующие на данный момент позиции на рынке, из-за чего качественному web-разработчику его нельзя игнорировать - ie. Создаваемая указанным скриптом таблица в ie7 выглядит следующим образом.
При этом по DOM-у все в порядке - строка и ячейки созданы и располагаются в таблице.
Оказывается, ie ещё помнит старый-добрый тег tbody. И при парсинге всем таблицам его добавляет. Так, вполне грамотная с виду таблица, записанная в виде html

<table>
<tr>
<td>0</td>
<td>1</td>
<td>2</td>
</tr>
</table>

...в DOM-е ie7 будет выглядеть следующим образом:
Посему и при динамическом создании таблиц непосредственно в DOM браузера ie7 следует делать такие поправки:

var tbody = document.createElement("tbody");
tbody.appendChild(tr);
var table = document.createElement("table");
table.appendChild(tbody);

Не будет откровением, что все грамотные браузеры без проблем распознают и указанную выше модификацию.

среда, 25 марта 2009 г.

Комментарий на видеопослание президента РФ о достигнутых результатах

Исходное послание президента.

Коррупция свойственна любому государству, в котором значимость имеют материальные ценности. В "развитых" странах т.н. первого мира она минимально заметна. В нашей стране она присутсвует на всех этапах жизненного цикла гражданина. Самой мерзкой коррупцией является чиновничий произвол, когда ресурсы нашей страны расходуются чиновниками для обеспечения собственного благосостояния, а власть, даруемая российским народом, используется против него самого, обеспечивая безопасность этих "воров в государстве".
Предполагаю, что создание дополнительных контрольных органов в государственном аппарате приведет исключительно к росту коррупци. Т.к. чиновники будут отсчитываться исключительно перед такими же чиновниками и, соответственно, возрастет величина получаемых взяток.
Более качественным инструментом контроля, считаю, является инструмент, основанный на общедоступном и открытом источнике информации - сети интернет. Чиновники, работающие на народ, должны публиковать результаты своей работы в унифицированной форме, в свободном доступе для народа. Тогда любой гражданин сможет объективно оценить эффективность работы каждого конкретного звена государственного аппарата управления. Гражданам будет предоставлена возможность увидеть, сколько чиновник получил средств из государственного бюджета, как и на что он их потратил. Имея данную информацию, инициативные граждане и специалисты своей области, смогут легко проверить, а действительно ли деньги потрачены грамотно. Действительно ли, например, качество и объем положенного во дврое дома асфальта соответсвует объему денег, потраченных на него чиновником. Либо почему муниципалитет потратил на детскую площадку в несколько раз больше средств, чем заявлена ее стоимость в прайс-листах компаний-конкурентов поставщика.
И эта информация должна быть в свободном от бюрократических заборов доступе. Ведь не за бюрократические заборы мы позволяем распоряжаться ресурсами страны.

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

пятница, 20 марта 2009 г.

Определение асинхронного запроса при использовании asp .net ajax

Встречаются ситуации, в которых необходимо разделить поведение управляющего элемента, расположенного на UpdatePanel в зависимости от того, асинхронный запрос приходит на обновление, или нет.
При использовании asp .net ajax ScriptManager клиентской части определяет переменную __ASYNCPOST при обращении к странице значением "true". Таким образом, разделить поведение пользовательского элемента в зависимости от типа запроса можно следующим образом:
public partial class UIControls_MyControl : System.Web.UI.UserControl
{
bool IsAsyncRequest
{
get
{
return ( Page.Request.Params.Get( "__ASYNCPOST" ) != null )
}
}

protected void Page_Load(object sender, EventArgs e)
{
if ( IsAsynRequest )
{
//что-то делаем
}
else
{
//делаем что-то
}
}

}
Примером использования данного решения может быть ситуация, в которой накладно выполнять всю функциональность пользовательского элемента на каждый асинхронный запрос. Что как раз и позволяет автоматизировать UpdatePanel из asp .net ajax.

пятница, 13 марта 2009 г.

Дружим canvas и asp .net ajax под ie7

Известно, что ie7 - особенный браузер со взглядами далекими от общепринятых стандартов. Одним из таких стандартов, незаметных для ie7, является html5. В частности, его элемент canvas.
Одним из решений для поддержки страниц, использвующих тег canvas, в брузере ie7 является библиотека excanvas от Google. Библиотека реализует требуемый стандартом объект CanvasRenderingContext2D использованием Microsoft VML с одной стороны, с другой стороны предоставляя клиентским приложениям интерфейс, описанный стандартом html5.
Указанное решение позволяет вполне комфортно вести разработку страниц с тегом canvas до тех пор, пока не начинают возникать вопросы построения изображений, зависимых от результатов выполнения серверных сценариев, в режиме реального времени.
Если разработка ведется по технологиям, близким LAMP - проблем нет никаких. Рисование осуществляется средствами javascript. Поэтому заменить исходные данные асинхронным http-запросом с последующей перерисовкой - дело не сложное. Подробнее с примером это описано в статье "Canvas, Ajax, and the Supertrain".
Совсем другое дело, если разработка ведется в рамках ASP с использвоанием asp .net ajax. В данной ситуации очень не хочется воротить собственную реализацию ajax, которая при асинхронных запросах обновляла бы только исходные данные для графического отображения. Вполне нормально в рамках ASP желать обновления пользовательского элемента управления прозрачно, использованием UpdatePanel.
На перепутье canvas, asp, ajax и ie7 возникают следующие сложности:
  • После асинхронной перезагрузки элемента canvas на странице, excanvas его не воспринимает;
  • При использовании RegisterStartupScript объекта ClientScriptManager для построения javascript-кода инициализации элемента в обработчике Page_PreRender, код не выполняется по завершении асинхронного запроса.
Решить первую помогает изучение исходного кода библиотеки excanvas. В библиотеке при завершении загрузки страницы (по значению complete свойства document.readyState) осуществляется связывание элементов DOM страницы, подходящих под описание элемента canvas, с VML-реализацией функционала тега canvas из стандарта html5. Занимается этим метод init_ некоторого менеджера - G_vmlCanvasManager. Ниже представлен псевдокод библиотеки:
if (!window.CanvasRenderingContext2D) {
(function () {
Описание vmlCanvasManager
...
G_vmlCanvasManager.init()
...
Описание интерфейса canvas
...
Определение CanvasRenderingContext2D
})();
}

Метод init связывает вызов метода init_ с обработчиком onreadystatechange. Тут и кроется подвох. Ведь document.readyState всегда complete после загрузки страницы, несмотря на асинхронные запросы - onreadystatechange не происходит. Поэтому определить контекст нового элемента документа, приходящего с результатом выполнения асинхронного запроса, необходимо вызовом метода init_ по завершении передачи данных от сервера. Тут мы сталкиваемся со второй проблемой.
А вторая проблема решается путем использования метода RegisterStartupScript класса ScriptManager. Пример представлен ниже:
protected void Page_PreRender ( object sender, EventArgs e )
{
StringBuilder sbStartScript = new StringBuilder( );
sbStartScript.Append( "window.alert('ку-ку');" );
sbStartScript.Append( "G_vmlCanvasManager.init_();" );
ScriptManager.RegisterStartupScript( this, Page.GetType( ), ID + "StartupScript", sbStartScript.ToString( ), true );
}

Более подробное решение второй проблемы описано в заметке "Inline Script inside an ASP.NET AJAX UpdatePanel".

четверг, 12 марта 2009 г.

localhost и Fiddler2

Наверное, многим знаком простой и удобный, а - главное - бесплатный, прокси для web-разработки Fiddler2, позволяющий наблюдать трафик http и https. Одна проблема есть у него - под IE7 он не умеет так просто наблюдать траффик localhost. Решений у данной проблемы два: непонятное и простое.
С непонятным можно ознакомиться по ссылке.
А простое подразумевает под собой написание "localhost.:порт", вместо "localhost:порт". Такая нехитрая конструкция как бы подскажет IE7 о необходимости послать loopback-трафик через указанный в его настройках прокси, а не какими-то секретными путями.

среда, 11 марта 2009 г.

Против навязанной Висты

Дополнение к предыдущему посту по теме.

В настоящее время ФАС РФ проводит проверку по наличию спроса на возврат денег за предустановленную ОС на ноутбуках. Как я понимаю, эту инициативу поддерживает ЦеСТ.

Люди, столкнувшиеся с отказом на запрос о возврате стоимости неиспользуемой предустановленной на ноутбуке ОС, могут заполнить форму, информация из которой, как я понимаю, будет передана в ФАС.

Наверное, можно и самостоятельно написать в ФАС. 12.02.2009 я написал эл. письмо начальнику управления информационных технологий ФАС Владимиру Кудрявцеву, но никакого ответа либо уведомления на данный момент не получал. Согласно данным, cуществует некоторый адрес для письменного заявления. Ниже приведена цитата из этого поста:
Написать краткое заявление в свободной форме на имя г-на Артемьева И.Ю., главы ФАС России, с изложением ситуации и ссылкой на то, что в данном случае нарушается Статья 11 (Запрет на ограничивающие конкуренцию соглашения или согласованные действия хозяйствующих субъектов) Федерального закона Российской Федерации от 26 июля 2006 г. N 135-ФЗ О защите конкуренции. К заявлению необходимо приложить копию кассового чека на приобретение мобильного ПК, копию страницы техпаспорта устройства и свою переписку (пусть и в электронном виде) с вендором. Отправить это все в письме с описью вложения по адресу Садовая Кудринская, 11, Москва, Д-242, ГСП-5, 123995.

Сам я туда письма пока не отправлял, но, скорее всего, составление письменного обращения на имя главы ФАС РФ в данном случае - самый действенный способ защиты собственных прав.

пятница, 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)

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

пятница, 30 января 2009 г.

Производительность операции умножения матриц на процессоре IBM CELL

По результатам исследования, представленном на сайте IBM, указана производительность SPE-ядра процессора CELL на уровне 25 GFl/sec при выполнении умножения матриц. Цифра довольно-таки приличная, поэтому было решено её проверить.
Как оказалось, при типовой реализации операции умножения матриц тройным вложенным циклом производительность получается в районе 400 MFl/sec. Код примерно такой:


for (i = 0; i < _elemCount; ++i)
{
vectRes = (vector float*) (_vectRes[i]);
for (j = 0; j < _elemCount; ++j)
{
vectA = spu_splats(_vectA[i][j]);
vectB = (vector float*) (_vectB[j]);
for (k = 0; k < vectCount; ++k)
{
vectRes[k] = spu_madd(vectA, vectB[k], vectRes[k]);
}
}
}


Коэффициент зависимых инструкций данного кода порядка 64%. Это означает, что конвейер практически не загружается.
Учитывая, что размерность вектора нам, в принципе известна, можно произвести раскрытие третьего вложенного цикла и получить произвоительность на уровне 2GFl/sec. А используя опции оптимизации gcc можно добиться даже 8GFl/sec.
Понять, куда пропали оставшиеся 17GFl/sec можно изучив исходный код умножения матриц, рожденный в кулуарах IBM [5]. Программа эта содержит порядка 1000 строк кода.
Не каждый разработчик решиться реализовывать процедуру умножения матриц 1000 строками кода вместо 10.
Таким образом, в зависимости от того важна эффективность программы либо оптимальность её кода, можно расчитывать на те или иные числа производительности процедуры умножения матриц.

На сайте ГУАП "Неоднородный многоядерный процессор CELL: архитектура и программирование" представлена полная версия научной работы. Научная работа была защищена на Втором Всероссийском форуме студентов, аспирантов и молодых ученых "Наука и инновации в технических университетах".

Использовались источники:
1. Cell Broadband Engine Programming Handbook v1.1
2. Software Development Kit for Multicore Acceleration v.3.0 “Programming Tutorial”
3. C/C++ Language Extensions for Cell Broadband Engine Architecture v2.4
4. Performance Analysis with the IBM Full-System Simulator v3.0
5. Cell Repository. “src/workloads/matrix_mul/spu/block.c”, sw.workloads, sdk_pub 10/11/05 15:29:21
6. Cell Broadband Engine Architecture and its first implementation

вторник, 27 января 2009 г.

Формирование нестандартных графиков с использованием MSChart

24 ноября 2008 года, видимо, в противовес тегу canvas из наступающего стандарта html5, Microsoft выпустила серверный компонент ASP - MS Chart Control (доступен в сборке System.Web.UI.DataVisualization.Charting), посвященный построению графиков. Компонент на стороне сервера генерирует изображение графика и отправляет его клиенту картинкой в форматах BMP, EMF, PNG, JPEG, что очень удобно при удовлетворении требования браузерной совместимости.
Лично меня интересовали возможности компонента по работе с круговыми диаграммами, в частности, построение розы ветров. График такого типа Chart Control не поддерживает. Наиболее похожий - Polar Chart, выводящий данные точками, а не многоугольниками как требуется.
Осуществить модификацию внешнего вида диаграммы к нужному возможно определением собственного обработчика на событие OnPostPaint, обрабатывающего объект Graphics из System.Drawing. Обработчик должен получать два параметра:
  1. object - кто послал;
  2. System.Web.UI.DataVisualization.Charting.ChartPaintEventArgs - с чем послал.
Через object будут доступны исходные данные диаграммы для того, что бы знать, что рисовать на объекте Graphics. Ниже представлен пример получения данных диаграммы и объекта Graphics:
System.Web.UI.DataVisualization.Charting.Chart chart = (System.Web.UI.DataVisualization.Charting.Chart)sender;
System.Web.UI.DataVisualization.Charting.ChartArea area = chart.ChartAreas[0];

Graphics context = e.ChartGraphics.Graphics;
Это просто пример. Если будете его использоать - делайте это осторожно, т.к. график может содержать нуль или несколько пространств (ChartAreas).
Следующий этап работы - связывание исходных данных диаграммы с координатной плоскостью объекта Graphics. Как оказалось, до центра круговой диаграммы добраться довольно-таки сложно:
double xCenter = area.Position.Width / 2 + area.Position.X;
double yCenter = e.ChartGraphics.GetPositionFromAxis(area.Name, System.Web.UI.DataVisualization.Charting.AxisName.Y, area.AxisY.Minimum);
И это центр круговой диаграммы на объекте Graphics... Если положение горизонтального центра ещё можно предсказать, то положение центра вертикали объяснения не находит.
Одного центра для того, что бы комфортно развернуться на пространстве, предоставляемом объектом Graphics, не достаточно. Надо знать и радиус разворота - максимальный радиус окружности диаграммы на графике. Получить его возможно следующим образом:
double xRadius = Math.Abs(xCenter - e.ChartGraphics.GetPositionFromAxis(area.Name, System.Web.UI.DataVisualization.Charting.AxisName.X, 0f));
double yRadius = Math.Abs(yCenter - e.ChartGraphics.GetPositionFromAxis(area.Name, System.Web.UI.DataVisualization.Charting.AxisName.Y, area.AxisY.Maximum));
Через дебаггер не сложно удостовериться, что радиус окружности диаграммы по горизонтали не есть радиус окружности по вертикали. Это означает, что при позиционировании графических примитивов используется разный шаг координат в относительных величинах по осям OX и OY координатной плоскости. Таким образом, вычисление координаты точки, представленной радиальными координатами, на поле Graphics надо производить следующим образом:
double x = xLength * Math.Cos(angle) + xCenter;
double y = yLength * Math.Sin(angle) + yCenter;
, где xLength и yLength есть нормированные с учетом радиуса коордитаты точки в системе осей OX и OY.
Обладая всеми необходимыми данными о координатной плоскости Graphics возможно осуществить уверенное рисование нужных многоугольников
context.FillPolygon(new SolidBrush(s.Color), new PointF[] { center, point1, point2, point3 });
В итоге получаем подобие интересующей розы ветров:
Дальше осталась несложная работа по представлению розы в более привлекательном виде.

Если вас заинтересовал данный компонент, советую посетить коммьюнити.

понедельник, 26 января 2009 г.

Изменения при работе с timestamp в PostgreSQL 8.3

После очередного обновления версий на сервере с PostgreSQL обнаружлось, что старые конструкции для работы с timestamp-полями не срабатывают.
Например, имеем таблицу:

CREATE TABLE logs (
l_id bigint DEFAULT nextval('logs_seq'::regclass) NOT NULL,
l_date timestamp without time zone,
);
Хотим из неё что-то:
select count(l_id) from logs where l_date like '%2009-01-01%'
Получаем ответ в виде:
ERROR: operator does not exist: timestamp without time zone ~~ unknown at character 43
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Из официального источника удалось узнать что c версии 8.3 отсутствует автоматическоге приведение типа timestamp к строке. Решение изложено там же. Хотеть чего-то от таблицы в такой ситуации имеет смысл следующим образом:
select count(l_id) from logs where date_trunc('day', l_date) = '2009-01-01'
Функция date_trunc позволяет представлять данные из поля timestamp с определенной точностью. В данном случае точность указывается до дня. В документации представлен объемный список параметров функции date_trunc для обеспечения метке времени той или иной точности:
  • microseconds
  • milliseconds
  • second
  • minute
  • hour
  • day
  • week
  • month
  • quarter
  • year
  • decade
  • century
  • millennium
Последнее значение из списка особенно актуально...

четверг, 22 января 2009 г.

Получение SPE идентификатора при построении вычислительной системы с использованием ALF на процессоре IBM CELL

Внезапно обнаружил, что используя бибилиотеку ALF как-то невозможно узнать идентификатор ядра, на котором выполняется workblock.
Например, библиотеки libspe или libspe2 предполагают автоматическую передачу идентификатора вычислительного ядра процессора CELL программному коду, выполняющемуся на нем, в то время как ALF ограничивает ресурсы программы, выполняющейся на вычислительном ядре исключительно контекстом рабочего блока и задачи, определяемыми пользователем в управляющем ядре PPE [*].
Таким образом, получается невозможным построение вычилсительной системы с нетривиальными связями между вычислительными ядрами процессора. Например, систолический алгоритм умножения матриц с передачей промежуточных результатов из одного вычислительного ядра в другое реализовать невозможно, сохраняя функциональность ALF.
Интересно, существует ли возможность какого-то совместного использования libspe2 и ALF. Что бы как-нибудь передать-таки идентификатор при создании вычислительной гранулы ALF, аналогично функции spe_create_thread из libspe2?

По материалам из:
1. Accelerated Library Framework for Cell Broadband Engine Programmer’s Guide and API Reference Version 3.0
2. SPE Runtime Management Library Version 1.2
3. SPE Runtime Management Library Version 2.2
4. SPE Runtime Management Library Version 1 to Version 2 Migration Guide

среда, 21 января 2009 г.

Баг в ie7 при работе с функцией Number.toFixed()

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

<html>
<body>
<div>Number.toFixed with 0.094</div>
<div id="val094"></div>

<div>Number.toFixed with 0.095</div>
<div id="val095"></div>

<div>Number.toFixed with 0.194</div>
<div id="val194"></div>

<div>Number.toFixed with 0.195</div>
<div id="val195"></div>

<script>

window.onload = function() {

var val094 = document.getElementById("val094");
val094.innerHTML = new Number(0.094).toFixed(1);

var val095 = document.getElementById("val095");
val095.innerHTML = new Number(0.095).toFixed(1);

var val194 = document.getElementById("val194");
val194.innerHTML = new Number(0.194).toFixed(1);

var val195 = document.getElementById("val195");
val195.innerHTML = new Number(0.195).toFixed(1);
}

</script>
</body>
</html>
Проверив, успокоился, т.к. ff3, opera 9.62, chrome 1.0.154.43 и safari 3.2.1 со мной солидарны... 0.094 при округлении до десятых долей всё-таки должны быть, вопреки мнению ie7, округлены до 0.1.

вторник, 20 января 2009 г.

Семинар "Web-разработка на языке PHP" компании "Эврика"

В минувшую пятницу ходил на рекламный семинар компании "Эврика", посвященный их новым курсам обучения по web-разработке на PHP. Программа мероприятий включала в себя пять докладов:

1. Компания ЭВРИКА - поставщик современных IT решений
2. Совместимость кода и нововведения PHP6 (Развитие интерпретатора PHP и вопросы совместимости кода; PHP6 - новые возможности)
3. Инструментарий web-разработчика (Интегрированные среды разработки; Средства отладки и профилирования; Системы создания документации)
4. Сертификация Zend PHP5 Certification (Текущая статистика по сертификации PHP-программистов; Процедура прохождения сертификации Zend; Знания и навыки, необходимые для успешной сдачи экзамена ZCE)
5. Эффективное использование возможностей PHP5 (Организация взаимодействия с различными СУБД; Обработка и создание XML документов средствами SimpleXML; SOAP и Web-сервисы)

Прослушав первый доклад могу сделать вывод - не впечатляет и не актуально... PHP уже морально стар. PHP6 разрабатывается вяло, в то время как по потребностям, он уже давно должен быть в релизе.

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

Третий доклад мне понравился. Было представлено много решений, заслуживающих внимания:
1. WAMPServer, позволяющий управлять связкой Apache, MySQL, PHP под Windows с различными конфигурациями. Утверждалось, что достаточно установить новый сервер Apache или MySQL и/или интерпретатор PHP для простой интеграции его дескриптора в WAMP с последующей установкой в связку каких угодно версий. Не проверял - использую только Apache 2.0 и 2.2 с PHP5 и MySQL4 и 5;
2. NetBeans 6.5, как IDE для разработки под PHP порадовал своим профайлером. Действительно, вещь нужная. К недостаткам относится только весьма скромные средства рефакторинга - практически никакие, кроме переименования. Кроме того в многомодульном проекте с глобальными переменными это переименование не работает.
Было указано, что развитыми рефакторингами обладает Zend Studio. Не проверил, ввиду платности последнего. Не упомянули мой любимый PhpEd, хотя это довольно-таки развитое и популярное средство, даже обладающее встроенным сервером с PHP4 и 5.
3. Хорошее средство просмотра профилей xDebug - WebGrind. Главное - бесплатное. Хотя мне по духу все-таки профайлер из PhpEd, которого снова не упомянули...
4. Из средств автоматизации документирования phpDocumentor упомянули, Doxygen не забыли, но где великий DocBook?!

В четвертом докладе заметили интересный факт - больше половины сертификатов ZCE в России на данный момент были получены в 2008 году (31 из 56)... пора что-ли сертифицироваться...

В пятом докладе я был приятно порадован рассказом о PDO и SimpleXML библиотеках. Это вещи заслуживающие использования при разработке на PHP.
Но вот долгожданные веб-сервисы обошли стороной - не хватило времени. А я очень хотел послушать что-нибудь вразумительное про эффективность разработки веб-сервисов на PHP. Вопрос остался вопросом...

понедельник, 19 января 2009 г.

Несоответсвия функций NumberPrototype.toFixed (.NET сборка Microsoft.JScript) и Number.toFixed (MS IE JavaScript)

Очень странная штука обнаружилась при работе с функцией Number.toFixed при разработке под IE 7-ку (7.0.5730.13):
new Number(0.095).toFixed(1) это есть "0.1"
в то время как
new Number(0.094).toFixed(1) будет почему-то "0.0"
При этом, например:
new Number(0.195).toFixed(1) есть "0.2"
и
new Number(0.194).toFixed(1) есть "0.2"
Все это ещё интереснее становится, если выяснить, что в классе NumberPrototype сборки Microsoft.JScript фреймворка .NET всё грамотнее:
NumberPrototype.toFixed(0.095, 1) есть "0.1"
NumberPrototype.toFixed(0.094, 1) так же "0.1"
Явная бага с округлением, по которой, разумеется, никакой информации нет. Если кто видел что-нибудь подобное, отзовитесь, пожалуйста.

P.S. За правдой я пошел в MSDN. Может быть её узнаем...
P.P.S. Через сутки после поста на форуме MSDN - нуль реакции. Продолжил вопрошать в коммьюнити.

четверг, 15 января 2009 г.

Немного про кризис

Во время принятия решения по перспективам собственных сбережений наткнулся на довольно-таки доступное изложение сути происходящих в России процессов с возможными вариантами исхода.

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

среда, 14 января 2009 г.

Почему не хочется покупать ноутбуки Samsung

Во время очередного ежегодного апгрейда ноутбука (продажа старого, добавление денюжек и покупка нового) мной был куплен ноутбук Samsung с Windows Vista. Т.к. занимаюсь разработкой ПО, работать на достаточно сырой и недостаточно стабильной ОС на тот момент не представлялось возможным. Установив XP, я попробовал вернуть стоимость Висты (мелочь, а приятно) аналогично одному известному случаю с компанией Benq. Ниже приведена переписка с российским представлительством компании Samsung:

Здравствуйте,

06.09.2008 в магазине Ulmart (Санкт-Петербруг) я приобрёл ноутбук Samsung Q210-FA1.
Дома, при первом включении, я не принял текст лицензионного соглашения на ОС Windows Vista и установил ОС Windows XP, купленную мной ранее.
В тексте лицензионного соглашения указывалась возможность возврата стоимости ОС в случае не принятия лицензионного соглашения и не использования програмного обеспечения.
Поясните, пожалуйста, порядок возврата стоимости ОС Windows Vista.

С уважением,
Алексей.


На что был получен ответ следующего содержания:

Здравствуйте!



Данное программное обеспечение является комплектующим указанной модели ноутбука. В соответствии со ст.478 ГК РФ продавец обязан передать покупателю товар, соответствующий условиям договора купли-продажи о комплектности. Договором розничной купли-продажи предусмотрено, что модель ноутбука Samsung Q210-FA1 продается в комплекте с программным обеспечением EULA Microsoft Windows Vista. Приобретая данный ноутбук, Вы выразили свое согласие на заключение договора розничной купли-продажи ноутбука в комплекте с указанным программным обеспечением. Таким образом, передавая Вам товар в полной комплектации, торгующая организация (продавец) выполнила свою обязанность, предусмотренную договором и законом.

Право на свободный выбор товара гарантирован Законом РФ «О защите прав потребителей» и Гражданским кодексом РФ. Согласно п. 1 ст.10 Закона РФ «О защите прав потребителей» изготовитель (продавец) обязан своевременно предоставлять потребителю необходимую и достоверную информацию о товарах, обеспечивающую возможность их правильного выбора. С целью соблюдения данного положения закона РФ «О защите прав потребителей» компания-изготовитель доводит по потребителя информацию о комплектности товара, в том числе о комплектовании приобретенной Вами модели ноутбука программным обеспечением версии Microsoft Windows Vista. Из содержания Вашего письма следует, что Вы самостоятельно и добровольно выбрали место приобретение ноутбука (продавца), модель ноутбука, комплектность ноутбука. Таким образом, до Вас была доведена полная и достоверная информация о комплектности товара и, соответственно, было обеспечено право на свободный выбор товара.



C уважением,

Растегаев Антон

Информационный центр для потребителей

Самсунг Электроникс Россия


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

Здравствуйте.

Дело в том, что товар выбирался исключительно по соответствию весо-габаритных, аппаратных и стоимостных характеристик предъявляемым требованиям к ноутбуку. Перед приобретением я посетил несколько магазинов, рассматривал разные модели, и не обнаружил ни моделей ноутбуков прочих производителей, аналогичных по указанным параметрам модели Samsung Q210 в поставке без ОС Windows Vista, ни непосредтвенно модели Samsung Q210 в поставке без ОС Windows Vista.

Статья 16 закона РФ «О защите прав потребителей» в части 2 запрещает обуславливать приобретение одного товара обязательным приобретением другого. Ноутбук Samsung Q210 и ОС WV являются разными товарами. Именно поэтому, согласие на использование ОС WV пользователь выражает принятием лицензионного соглашения в соответствии с положениями гражданского кодекса РФ. Соглашение на использование ОС WV, определенное в соответсвии со статьей 1286 ГК РФ п.3 я не заключил и, тем самым, не осуществил приобретение данного программного продукта через договор присоединения. Однако, стоимость данного программного продукта, который я не приобретал, включена в стоимость ноутбука Samsung Q210.

Далее, в лицензионном соглашении EULA Microsoft Windows Vista, жирным шрифтом указана возможность возврата стоимости ОС WV производителем или установщиком ПО в случает отказа от её приобретения и последующего возврата ПО. Дословно текст EULA Microsoft Windows Vista:
"Используя это программное обеспечение, вы тем самым подтверждаете свое согласие соблюдать эти условия. Если вы не согласны, не используйте это программное обеспечение. В этом случае выясните у изготовителя или установщика порядок возврата продукта, получения возмещения его стоимости или зачисления эквивалентной суммы на ваш счет".
Я не согласен с EULA MS WV и не использовал ОС WV.
Объясните, пожалуйста, порядок возврата программного продука и возмещения его стоимости.


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

вторник, 13 января 2009 г.

Комментарий на видеопослание президента РФ об отдыхе

Теперь существует возможность оставлять комментарии к посланиям президента на официальном сайте президента. Активация пользователя для получения возможности оставлять комментарии у меня заняла 4,5 часа. Модерация комментария к видеопосланию в моем случае составила порядка 5-ти минут.

Т.к. тематика послания касалась меня непосредственным образом, нельзя было не выразить свое мнение. Мнение было опубликовано в комментариях 13 января 2009 20:05.

Здравствуйте, Дмитрий Анатольевич.
Как человек, для личностного развития активно занимающийся различными видами физической культуры - бегом, шоссейным и горным велосипедом, беговыми лыжами, хочу выразить частичное несогласие с тем, что условия для занятия спортом по крайней мере в регионе Санкт-Петербурга и области являются достойными.
В частности простое катание в соответсвии с ПДД на велосипеде по городу за последние 3 года ухудшилось настолько, что этот процесс можно сравнивать с лотерей - собьют или нет. В нашем городе площадью ~1500 кв.км. существует только одна велодорожка с ограждением протяженностью всего 5 км. Никакой инфраструктуры для катания на внедорожном велосипеде в парках города (напр. парке "Сосновка", Удельном парке или Парголовском) нет. Велосипедисты вынуждены кататься по одним дорожкам с гуляющими с детьми гражданами, создавая множество травмоопасных ситуаций.
В Ленинградской области ситуация для людей увлекающихся шоссейным спортом ещё хуже - не существует ни одной раздельной с шоссе велосипедной дорожки. Даже хуже - не существует ни одной даже размеченой под велосипедную дорожку полосы на шоссейных дорогах области. С поддержкой внедорожного велоспорта ситуация аналогична. Хозяйствующие субъекты Ленинградской области не предпринимают никаких видимых усилий по созданию трасс для МТБ соревнований и тренировок. Созданием и поддержкой таких трасс занимаются исключительно инициативные граждане за свой счет и в свое свободное время.
С занятием беговыми лыжами ситуация лучше - места, где можно побегать коньком есть. Но мало. Хоть как-то поддерживаются всего три трассы - на базе завода "Прибой", трасса ВИФК и трасса СКА. Для города-миллионника - три трассы - это очень мало.
Кроме указанных проблем сущесвуют и положительные тенденции. Во дворах появляются хорошо оборудованные спортивные площадки с открытым доступом, предназначенные для занятий легкой атлетикой и игровыми видами спорта, за что спасибо правительству города.
Обновление: Появилось продолжение истории

понедельник, 12 января 2009 г.

Opera и Content-Type (решение)

Определение проблемы

Для решения данной проблемы помимо грамотного указания html-заголовка:

<meta equiv="Content-type" content="text/html; charset=utf-8">


необходимо явное определение http-заголовка (в случае php):

header('Content-type: text/html; charset=utf-8');

воскресенье, 11 января 2009 г.

Opera и Content-Type

Почему Opera (Opera 9.6) воспринимает html-тело в кодировке по Conent-Type, указанному в http-загловке, а не в теге meta html-загловка?