суббота, 12 декабря 2009 г.

Прекрасная статья о том как упаковывать dll в один exe файл.

Single Assembly Deployment of Managed and Unmanaged Code

В кратце:

Добавляем нужную dll сборку как emebeded resource. Затем в статическом конструкторе класса, где она нужна (у меня это статический класс оборачивающий функции этой dll) прописываем вызов следующего метода:

namespace MyLib
{
public class MyClass
{
static MyClass()
{
ResourceExtractor.ExtractResourceToFile("MyLib.ManagedService.dll", "managedservice.dll");
ResourceExtractor.ExtractResourceToFile("MyLib.UnmanagedService.dll", "unmanagedservice.dll");
}

...

А это собственно реализация экстрактора:

public static class ResourceExtractor
{
public static void ExtractResourceToFile(string resourceName, string filename)
{
if (!System.IO.File.Exists(filename))
using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
{
byte[] b = new byte[s.Length];
s.Read(b, 0, b.Length);
fs.Write(b, 0, b.Length);
}
}
}

воскресенье, 9 августа 2009 г.

Танцы с бубнами.

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

Вот например кусок XAML, который мучал меня почти сутки



Если попытаться записать ему DataContext из CodeBehind, вот так:

MainChart.DataContext = Sale.Data;

то можно поймать совершенно изумительное ВэллНоун исключение:
...................................................
.................................
................

Вот так всегда. Даже попытка повторить его не удалась. Спрашивается, с чем я боролся то сутки? Танцы с бубнами, да и только...

В общем исключение было следующим: "Collection was modified; enumeration operation may not execute". Как я его заборол не понимаю до сих пор. Код, вроде как, тот же. Раньше не работал, теперь работает.

Возможно нужно было убрать установку DataContext из шаблонов в XAML и все. Еще один вариант - необходимо явно указывать Binding на родительские элементы. А те в свою очередь необходимо инициализировать из XAML каким-то начальным значением. Что-то из этого работает.

среда, 29 июля 2009 г.

Странный баг в .Net Silverlight RIA Services

Портируя Silverlight приложение на .Net RIA Services столкнулся с неприятным багом, который сейчас и попробую описать.

Имеется некий метод TotalDueByRegionId который принимает в качестве параметра с именем inputName строку ( раньше принимал число, но баг повторяется независимо от этого ).
И вот необходимо вызвать его из XAML кода контрола, что я и делаю следующим образом, пытаясь передать ему параметр:











Запускаем код и отлавливаем в вызов TotalDueByRegionId в сгенерированом коде:



В этом месте инструкция по адресу 03Bh передает значение в переменную this._value



Следующая инструкция устанавливает эту же переменную в null:



Дизасемблер IL кажет нам следующие:


Что явно не вяжется с тем, что происходит в реальности. Я в тупике. Как жить дальше?

UPD: Запостил на официальный форум Silverlight: http://silverlight.net/forums/p/115386/260071.aspx#260071

UPD 2: Решение: Когда необходимо просто передать параметр в запрос - надо использовать тип parameter вместо controlparameter. Controlparameter позволяет забаиндиться к свойствам других контролов. (Надо меньше тупить... Надо меньше тупить... и чаще отдыхать)

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

У меня программерская проблема. Некоторые вещи очень медленно компиляться. И за время компиляции я успеваю зачитатьс чьим нибудь блогом.

вторник, 28 апреля 2009 г.

Сейчас открою америку. Если не очень долго но упорно и не отдыхая делать одно дело - скучно становиться чрезвычайно быстро. Очень быстро....

пятница, 17 апреля 2009 г.

Javascript функция рекурсивного обхода DOM

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

function resetinputs(node) {
var oNode = node;
if (!oNode.length) {
try {
if (oNode.tagName == "IMG" || oNode.tagName == "MAP" || oNode.tagName == "AREA") { alert(oNode.tagName + "-|-" + oNode.id); };
if (oNode.Id == "ChartArea1") { oNode.style.opacity = ".5"; };
}
catch (dfr) { };
var curch = oNode;
try {
curch.onmouseup = function(evnt) {
var n = 1;
alert(this.tagName + " -|- " + this.id);
var z = 25;
};
} catch (eval) { };
if (oNode.childNodes) {
curch = oNode.childNodes;
for (var n = 0; n < curch.length; n++) resetinputs(curch[n]);
}
}
else {
curch = oNode.childNodes;
for (var i = 0; i < curch.length; i++) { resetinputs(curch[i]) };
}
return 1;
}

События Javascript на прозрачных элементах в IE 7 (Internet Explorer 7)

Мерзкий, гадкий, подлый осёл не дает перехватывать события на элементах страницы для которых стоит свойство background-color:transparent. У меня ушло немеряно времени что-бы отучить его от этого поведения, и заставить поймать мое событие.

Хак:

//Panel - это мой div
//Проверяем, действительно ли это IE7
if((document.all && !window.opera && window.XMLHttpRequest) ? true : false) {
//Делаем его мой див непрозрачным, ибо только непрозрачные контролы ловят события.
Panel.style.backgroundColor = "gray";
//И делаем его прозрачным снова.
Panel.style.filter = "alpha(opacity = 0)";
}


Но у этого решения есть серьезный недостаток. Все вложенные элементы тоже становятся прозрачными!!! Хак приведенный ниже работает без этого недостатка:

/*IE HACK. It takes more than 40 hours for me.*/
if((document.all && !window.opera && window.XMLHttpRequest) ? true : false) {
Panel.style.background = "url(bogus)";
}


Это решение найдено здесь

воскресенье, 5 апреля 2009 г.

Продолжаю скрещивать Semantic Web и ASP.Net MVC...

пятница, 3 апреля 2009 г.

Очень тяжело вникать в суть онтологий.. Мозг клинит. Как надо парсить случайные RDF данные?

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

Programmer: an organism that turns coffee into software

суббота, 21 марта 2009 г.

URL rewritintg а точнее routing в ASP.Net 3.5

Все, что необходимо знать по этой теме прекрасно описано в статье ASP.Net routing... Goodby URL rewriting?  Криса Каванагса (Интересно правильно ли я транскрибировал его фамилию? :) 
И здесь я просто кратко повторю:

Первым делом надо добавить в проект ссылки на сборки System.Web.Routing и System.Web.Abstrations

public class WebFormRouteHandler : IRouteHandler where T : IHttpHandler, new()
{
public string VirtualPath { get; set; }

public WebFormRouteHandler(string virtualPath)
{
this.VirtualPath = virtualPath;
}

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return (VirtualPath != null)
? (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(T))
: new T();
}
}

//Этот клас необходим для работы механизма роутинга в IIS 7
public class RoutingHandler : UrlRoutingHandler
{
protected override void VerifyAndProcessRequest(IHttpHandler httpHandler, HttpContextBase httpContext)
{
}
}
Чтобы роутинг заработал в IIS7 Необходимо выполнить ряд дополнительных действий

  • Вставить в web.config, в раздел system.webServer в теге modules следующую строчку:


  • В сам тег modules добавить атрибут


  • И последнее в том же разделе в тег handlers добавить:



Ну и теперь для счастливой жизни нам не хватает только следующего кода в файле Global.asax

protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
// Note: Change the URL to "{controller}.mvc/{action}/{id}" to enable
// automatic support on IIS6 and IIS7 classic mode

var routeHandler = new WebFormRouteHandler("~/MyPage.aspx");

routes.Add(new Route("{page}", routeHandler));
routes.Add(new Route("AccountServices/{page}", routeHandler));
routes.Add(new Route("Default.aspx", routeHandler));
}
Перед тем как использовать рекомендую так-же прочитать

Using routing with WEbforms
. Дабы спастись от злых хакеров

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

Получаем абсолютный путь к файлу в аттрибуте action тега form в ASP.Net

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

Так и в этот раз. Оказалось, что атрибут action тега form возвращаемый aspx страницей содержит в содержит в себе исключительно относительный путь к странице. И что делать? Могли ведь предусмотреть в webconfig-е параметр, например, AbsoluteURLs = true, который бы заменял в случае необходимости относительные пути на абсолютные? И где он? Может я просто про него не знаю?

Ну а теперь собственно решение.
В папочке App_Browsers создаем файл Form.browser. В этот файл помещаем следующий код:










После этого мы созадем классы FormRewriterControlAdapter и RewriteFormHtmlTextWriter со следующим содержимым:


namespace WebApplication1
{
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
base.Render(new RewriteFormHtmlTextWriter(writer));
}

public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
: base(writer)
{
this.InnerWriter = writer.InnerWriter;
}

public override void WriteAttribute(string name, string value, bool fEncode)
{
if (name == "action")
{
HttpContext Context = HttpContext.Current;

if (Context.Items["ActionAlreadyWritten"] == null)
{
Uri url = Context.Request.Url;

value = ((new StringBuilder()).AppendFormat("http://{0}:{1}{2}", url.Host, url.Port, Context.Request.RawUrl)).ToString();
Context.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}
}
}


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

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

Загрузка XAML во время выполнения

Загружаем элементы Silverlight из стороннего XAML файла.

private Canvas GetControlFromFile()
{
Uri uri = new Uri("Hands.xaml", UriKind.Relative);

System.Windows.Resources.StreamResourceInfo streamInfo = Application.GetResourceStream(uri);
if ((streamInfo != null) && (streamInfo.Stream != null))
{
using (System.IO.StreamReader reader = new StreamReader(streamInfo.Stream))
{
return XamlReader.Load(reader.ReadToEnd()) as Canvas;
}
}
return null;
}


Полученный элемент добавляем к другому элементу

LayoutRoot.Children.Add(GetControlFromFile);

воскресенье, 1 марта 2009 г.

Turn Twitter Into Your Personal Assistant

A few simple conventions, together with RDF and SPARQL, can turn your Twitter feeds into rich information streams, which you can then use for a more productive microblogging experience.


Помоему это интересно..

Ссылки по SW

Аннотация

Stasis Wiki - коротко об аннотации. На сайте кроме этого много другой полезной информации.

Anotea - Анотация от W3C

OnTeA: Semi-automatic Ontology based TextAnnotation Method - Чрезвычайно позновательный документ о методах реализации анотирования.
In this paper we describe a solution for the ontology based text annotation (OnTeA) tool. The tool analyzes a document or text using regular expression patterns and detects equivalent semantic elements according to the defined domain ontology.


Просто ссылки


W3C Semantic Web Activity - Самая ЖЫРНАЯ ссылка

30+ Semantic Web Introductions, References, Guides, and Tutorials - Кладезь. Найден при помощи HeadUp. ;)
"Matrix has you"
Semantic Universe - Очень полезный источник всего и вся.

Redland RDF Libraries - библиотеки для работы c SW на C

Introducing SPARQL: Querying the Semantic Web - Введение в SPARQL: Запросы к Смантическому Веб-у

суббота, 28 февраля 2009 г.

Аннотирование семантических данных

перевод фрагмента статьи Semantic annotation for knowledge management: Requirements and a survey of the state of the art

Требования

Разработка модели Управления Знаниями ориентированная на документы, потребовала от нас формулировки требований к системам аннотации семантических данных. Они совпадают в какой-то степени с требованиями изложенных Handschuh и др.. [15], но существуют также различия. Например, мы не касались таких проблем, как эффективность и правильные ссылки, хотя мы и признаем, что это важно. Вместо этого, мы рассмотрели задачу с четырех точек зрения: онтологий, документов, аннотаций, которые связывают онтологии и документы, а также пользователей системы. Все эти точки зрения предполагают одно или несколько требований, каждое из которых, как правило, объединяет несколько связанных потребностей. Например, с точки зрения онтологий появляется требование поддержки инструментами множества меняющихся онтологий, а с точки зрения документов мы видим необходимость поддержки повторного использования и контроля версий документов.

[Ниже перечислены семь требований к инструментам анотации - прим.пер.]

1. Использование стандартных форматов

Использование стандартных форматов предпочтительнее, где это возможно, поскольку затраты на маркировку ресурсов значительны - стандартизация создаст прочную основу для будущего, так-так новые инструменты, услуги и т.д., которые не были предусмотрены при первоначальной семантической аннотации, смогут легко использовать такие ресурсы. Соответствие стандартам, также освобождает компании от ограничений связанных с использованием лицензионных форматов при выборе программного обеспечения по управлению знаниями Эти преимущества могут быть отнесены к системам в целом.
В системах аннотации, в частности, стандартные форматы могут стать тем связующим механизмом, который позволит обеспечить совместный доступ к распределенным ресурсам, а так же объединит усилия пользователей и организации в предоставлении доступа к аннотациям. Активность W3C в развитии и поощрении международных стандартов в области Семантического Веба, убеждает нас в том, что в области управления знаниями стоит следовать этим путем. Два вида стандартов являются обязательными, стандарты для описания онтологий,
такие как OWL и стандарты аннотации такие как W3C схема аннотации RDF .

2. Ориентированный на пользователя / совместную работу дизайн

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

3. Поддержка онтологий (множества онтологий и их развития)

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

4. Поддержка разнообразных форматов документов

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

5. Отселживание изменений в документ ( связь документа и аннотации )

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

6. Хранение аннотаций

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

7. Автоматизация

Другим аспектом облегчения работы с инструментами аннотации является создание условий для автоматической разметки наборов документов, в целях облегчения аннотации больших собраний документов. Чтобы добиться этого, большое значение имеет интеграция технологий добычи знаний в среду аннотации. Это позволяет автоматически идентифицировать сущности, которые являются экземплярами классов и отношения между классами. Надо отметит, что автоматические инструменты могут помочь эффективно справится с аннотированием даже неподготовленному пользователю, для этого могут использоваться, например методы обработки естественного языка (NLP).

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

Атрибут xmlns

При попытке выполнить следующий код:

XmlWriter output;
output.WriteStartElement("sparql");
output.WriteAttributeString("xmlns", "http://www.w3.org/2005/sparql-results#");

получаем исключение:

System.Xml.XmlException: Префикс "" не может быть переопределен с "" на "http://www.w3.org/2005/sparql-results#" внутри того же начального тега элемента.

Это все потому, что правильно делать вот так:

XmlWriter output;
output.WriteStartElement("sparql", "http://www.w3.org/2005/sparql-results#");

Ошибка была обнаружена в библиотеке SemWeb. Теперь в репозитории лежит уже исправленная версия.

воскресенье, 1 февраля 2009 г.

Вывод результата запроса в SemWeb

Для того чтобы сериализовать результаты выполнения запроса к RDF хранилищу в нужный нам формат в пространстве имен SemWeb.Query библиотеки SemWeb предусмотрен абстрактный класс QueryResultSync, а так же реализованы несколько его наследников:

  1. SparqlXmlQuerySynk, возвращающий результат запроса в виде XML документа содержащего исходный запрос и результат.
  2. HTMLQuerySink, - возвращает результат в виде таблицы HTML
  3. CSVQuerySynk - как нетрудно догадаться возвращает результат в строку разделенную запятыми
  4. QueryResultBuffer - класс который сохраняет результаты в три коллекции Variables, Bindings, и Coments

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


public abstract class QueryResultSink
{
public virtual void Init(Variable[] variables){}
public abstract bool Add(VariableBindings result);
public virtual void Finished() {}
public virtual void AddComments(string comments) {}
}


Примеры реализации лучше всего смотреть в коде самой библиотеки.

Cинглтон и многопоточность

Допустим у нас есть некий синглтон, который сохраняет свои состояния и работает как конечный автомат. И состояний этих у него много. Но допустим нам хотелось бы воспроизвести результаты его поведения в начальном состоянии. А как его в это состояние вернуть непонятно.
В этом случае иногда может выручить многопоточность.

public delegate string GetXmlFromTestedDelegate(Person[] persons);
private string GetXmlFromTested(Params[] params)
{
Singletone.Instance.Import(params);
return Singletone.GetAllInXml();
}

public void GetResultInXml()
{
GetXmlFromTestedDelegate asyncDelegate = GetXmlFromTested;
IAsyncResult result = asyncDelegate.BeginInvoke(Params, null, null);
while (!result.IsCompleted)
{
Thread.Sleep(50);
}
string xml = asyncDelegate.EndInvoke(result);

Assert.That(xml,Is.EqualTo(GetEtalonXML()));
}


А может и не выручить... Это я к чему собственно?? А к тому, что не всякая реализация синглтона действительно синглтон.

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

Как узнать полный путь к файлу в приложении на ASP.Net?

Исчерпывающее руководство по этому вопросу можно найти здесь.

Основное же – это использование метода MapPath(), который прячется в таких классах как Control, Page, Server.

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

Перебираем все свойства класса

Иногда возникает задача перебрать все свойства некоторого класса. Задача очень просто решается при помощи рефлексии: person.GetType().GetProperties();

Этот код возвращает коллекцию PropertyInfo, из которой мы можем достать все необходимое.

А вот пример кода возвращающего значение свойства объекта по имени свойства: person.GetType().GetProperty(property.Name).GetValue(person, null)

Вывод XML в виде форматированного текста

Иногда возникает задача вывести некий Xml документ в строку, а иногда даже в виде текста на HTML страничке. Я нашел два похожих варианта решения.

Вариант с использованием XmlTextWriter

StringBuilder builder = new StringBuilder();
XmlTextWriter wr = new XmlTextWriter(new StringWriter(builder));
wr.Indentation = 2;
wr.IndentChar = '\t';
wr.Formatting = Formatting.Indented;

//Этот запрос заполняет строку builder xml данными форматированными символами "/t и /n"
ExecuteQuery(query, new SparqlXmlQuerySink(wr));


string s = builder.ToString();
//А это нам понадобилось чтобы получить возможность вставить строку в HTML
s.Replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\n", "br")


Вариант с использованием XmlWriter

StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = ("\t");

XmlWriter xmlWriter = XmlWriter.Create(builder, settings);

//Заполняем builder XML кодом и опять получаем строку форматированную символами "/t и /n"
manager.Write(xmlWriter);