Показаны сообщения с ярлыком C#. Показать все сообщения
Показаны сообщения с ярлыком C#. Показать все сообщения

26 апреля 2011 г.

Lucene.Net и German Umlaute

При создании полнотекстового поиска по сайту главной задачей, конечно же, является качество поиска. Lucene.Net в этом случае очень хорошая библиотека для поиска, быстрота и главное качество поиска у неё отменное. За время работы с данной библиотекой мне пришлось столкнуться только с одно проблемой, а именно с невозможностью поиска немецких умляутов. Дело в том, что для нормального их поиска нужно использовать анализатор немецкого языка, но информация на сайте в большей степени была представлена на английском, поэтому данный способ не очень подходил. Немного порывшись в интернете в поисках хорошего решения данной задачи и ничего не найдя. Было найдено свое решение, быстрое и в то же время как показывает практика действенное.


Я поступил следующим образом. При индексации информации каждый умляут был заменен на его аналог, т.е. ä = a, ü = u. В конечном итоге вся наша информация представлена одним языком, при поиске мы должны так же если введен умляут заменить его на аналог английского языка.


Был написан метод, который использовался как при поиске, так и при индексации информации.



private string ReplaceUmlauteString(string strSearch)
{
return strSearch.Replace('ü', 'u').Replace('ö', 'o').Replace('ä', 'a');
}

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

15 декабря 2009 г.

Блокирование кнопки после нажатия

Честно говоря, никогда не думал, что пользователи такие паникеры. Дошло уже до того, что пользователи напрочь игнорируют надпись “Пожалуйста, подождите…” и анимацию около этой надписи. Вот и встал вопрос, как же сделать так, чтобы пользователи просто не тискали на эту кнопку как сумасшедшие. Выход был прост. Блокировать кнопку да и все. Как это сделать? Для решения этого вопроса я обратился к своей любимой CMS mojoPortal. И вот какой код нарыл. Метод прост, а его пользу и не передать.

public static void DisableButtonAfterClick(
        WebControl button,
        string disabledText,
        string postbackEventReference)
    {
        if (button == null) return;
        button.Attributes.Add("onclick", "this.value='"
            + disabledText
            + "';this.disabled = true;"
            + postbackEventReference);
    }

А вот как его использовать

DisableButtonAfterClick(
                Button1,
                "Пожалуйста, подождите...",
                Page.ClientScript.GetPostBackEventReference(this.Button1, string.Empty)
                );

9 ноября 2009 г.

mojoPortal: Первые впечатления!

Как-то давно я начал поиски хорошей системы для создания сайтов (даже начал писать свою, кстати, очень ничего получается=)) ), но ничего хорошего я найти не мог. Хотелось, конечно, бесплатное решение с хорошей функциональностью, хорошим кодом, большой расширяемостью, поддержкой большого количества баз данных (или хотя бы возможность написания их поддержки). И самое интересное, что ничего найти не мог. Я перепробовал большое количество OpenSource CMS на ASP.NET, благо на codeplex.com их хватает. И одно меня терзает: “Почему я просто сразу не обратил внимание на проект, который шел самым первым в списке!” Глупо, согласитесь. Моя логика на тот момент была следующая: “CMS на первом месте, значит будет большая, неповоротливая, да и при этом ничего в ней не поймешь пока кипу документации не изучишь”. Я ошибся. И при этом очень сильно.

Все-таки пришел тот момент, когда я взял и установил это детище Joe Audette. Первым делом был маленький шок, так как установка прошла просто и гладко. Для того, чтобы разобраться в функциональности и работе с самой CMS понадобилось чуть меньше часа. Каждый модуль по своей сути является отдельным приложением внутри CMS.

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

Свойства системы:

  • Кросплатформенность
  • Работа с базами данных:  MS SQL Server, MySQL, PostgreSQL, Firebird Sql и SQLite
  • Возможность установки и управления множеством сайтов
  • Множество скинов, возможность установки разных скинов на страницы
  • Возможность выбора редактора контента FCKeditor, TinyMCE или XStandard HTML WYSIWYG
  • Блоги
  • Форумы
  • Галерея изображений
  • RSS
  • Календарь событий
  • Контактная форма
  • Ecommerce
  • Файловый менеджер
  • Общие файлы
  • Google maps
  • Легко настраиваемые пользовательские профили
  • Локализация. По-умолчанию включено 10 языков
  • Конфигурирование хранения паролей
  • Url-rewriting позволяет использовать дружественные адреса
  • Поиск по сайту
  • Протоколирование ошибок
  • Возможность аутентификации на сайте с использованием LDAP, Active Directory, Windows NTLM, OpenID или Windows Live ID
  • Персонализация и web-части
  • Статистика сайта

Многих разработчиков пугает одно, малое количество готовых модулей данной CMS, но это явно не то из-за чего стоит отбрасывать её на задний план, так как если есть руки, которые умеют стучать по клавишам и голова, которая умеет мыслить, то дополнительные модули, которые будут работать с данной системой появятся очень быстро.

Так что, если Вам нужна бесплатная и хорошо расширяемая система, то лучше, чем mojoPortal не найти. Это моё личное ИМХО.

Официальный сайт проекта mojoPortal – http://mojoportal.com

8 июня 2009 г.

PageGlimpse.com и HttpHandler

Итак, что же такое PageGlimpse? PageGlimpse.com – это бесплатный сервис, который предоставляет услуги по созданию скриншотов к сайтам. В действительности сервис очень может пригодиться если у вас есть свой сайт, на котором есть много ссылок на другие ресурсы и вам хочется кроме названия ресурса показать пользователю еще и уменьшенное изображение страницы. Сервис является бесплатным и для его использования нужно просто пройти бесплатную регистрацию по окончании, которой вам выдадут свой персональный ключ на использование данного сервиса.

Вся информация по использованию сервиса расположена на одной странице: http://www.pageglimpse.com/features/api

Для того, чтобы продемонстрировать возможности сервиса пройдите регистрацию и получите свой уникальный ключ. После введите в браузере следующий адрес: http://images.pageglimpse.com/v1/thumbnails?url=http://www.itcommunity.ru/&size=large&devkey=123456789

Нас здесь интересуют следующие значения:

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

size – размер изображения:

small    150x108    ~ 4kb
medium    280x202    ~ 11kb
large    430x310    ~ 25kb

devkey – ключ, который вы получили после регистрации.

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

Как же теперь использовать полученную нами информацию? Я покажу использование данного сервиса на ASP.NET сайте, и для этого напишу и зарегистрирую новый HttpHandler.

В только, что созданный сайт на ASP.NET добавьте новый модуль – PageGlimpseHandler.

public class PageGlimpseHandler:IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.Params["site"] != null)
        {
            string uri = "
http://images.pageglimpse.com/v1/thumbnails?url=";
            string size = "&size=large";
            string devkey = "&devkey=hjk34h342j3h4kj23n42j3h4";
            uri += context.Request.Params["site"] + size + devkey;

            System.Net.WebRequest request = System.Net.WebRequest.Create(uri);
            System.Net.WebResponse response = request.GetResponse();
            BinaryReader reader = new BinaryReader(response.GetResponseStream());
            byte[] buffer = reader.ReadBytes((int)response.ContentLength);

            if (buffer != null)
            {
                context.Response.ContentType = "image/jpeg";
                context.Response.BinaryWrite(buffer);
                context.Response.End();
            }
            context.Response.StatusCode = 404;
        }
    }
}

Созданный нами класс является наследником IHttpHandler и реализует его метод: ProcessRequest, который обрабатывает HTTP запрос и свойство IsReusable.

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

Теперь нам осталось только зарегистрировать наш PageGlimpseHandler в web.config. Для этого найдите раздел httpHandlers и добавьте в него следующую строку

<add verb="GET" path="pageglimpse.aspx" type="PageGlimpseHandler"/>

Вот собственно и все.. Откройте страницу Default.aspx и добавьте на неё вызов изображения какого-либо сайта.

<img src="pageglimpse.aspx?site=http://www.google.com/" />
<img src="pageglimpse.aspx?site=
http://www.microsoft.com/" />

image

Конечно же в реальном приложении все настройки сервиса не должны храниться в коде их лучше перенести в web.config и забирать когда нужно оттуда.

26 февраля 2009 г.

Таблица шансов

Данное приложение предназначено для изучения "Таблицы шансов" для игры в покер.

В программе есть два режима работы: тестирование и обучение.

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

Программа разрабатывалась как WindowsForms приложение под .NET Framework 2.0
Применялись следующие технологии и инструменты разработки: C#, XPath, Microsoft Visual Studio 2008 Express.

15 февраля 2009 г.

Разработка службы Windows на Microsoft Visual Studio 2008 Express

Часто нам приходится писать приложения, в которых нужно написать Windows службу, которая будет следить за какими-то процессами или выполнять какую-то работу в фоновом режиме. Например, при создании сайта, часто возникает такая потребность как подтверждение email адреса только, что зарегистрировавшегося пользователя. В основе своем для реализации данного решения, мы создаем таблицу, в которой прописаны идентификаторы пользователей, их email адреса и коды подтверждения сгенерированные самим сайтом для каждого. Но вот проблема, если пользователь не прошел авторизацию, то в таблице остаются данные о его регистрации, что не очень хорошо, так как, во-первых, база данных хранит много ненужной информации (ведь таких пользователей может быть не один и не два), во-вторых, так как повторения логинов не допустимо, то может оказаться, что вновь регистрирующийся пользователь не сможет зарегистрироваться под своим любимым ником из-за "мертвой души", которой собственно и нет на сайте. Как поступить в этом случае?

Единственный выход, который пришел на ум мне, это создание службы, которая будет проверять прошел ли пользователь авторизацию в течении заданного периода времени или нет. Если нет, то запись о пользователе просто удаляется и все. Таким способом наша БД, содержит только нужную информацию и ничего более.

Но как же быть, если мы пишем сайт с помощью Microsoft Visual Studio 2008 Express в которой нету проекта для создания службы. Покупать другую версию? Не всегда есть на это деньги, да и если нужно написать всего-то одну службу и все, то это не самый лучший выход. Самым лучшим выходом из этого положения будет создать шаблон приложения Windows сервиса и просто всегда им пользоваться. При этом нам не понадобиться ни новой IDE ни установки каких-то дополнений.

Дело в том, что все, что мы пишем под .NET Framework на любом языке содержится в самой среде. Т.е. для написания ЛЮБОГО приложения не понадобиться абсолютно ничего, кроме рук, головы и соответствующих знаний.

И так, для создания нашего шаблона, запустим Visual C# 2008 Express и создадим новый пустой проект.
File-New Project...->Empty Project

Теперь необходимо добавить нужные файлы и сборки.
Первым делом добавьте в созданный нами проект файл, который будет содержать полную информацию о сборке – Assembly Information File. Назовем его AssemblyInfo.cs. Сразу после добавления его в проект, его можно просто закрыть, так как ничего изменять в этом файле мы не будем.
Далее нужно добавить файл, содержащий весь код нашей службы. Для этого добавьте в проект простой класс с именем WindowsService.cs и отредактируйте его как показано в листинге 1.
Листинг 1.
using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsService
{
public class WindowsService : System.ServiceProcess.ServiceBase
{
public WindowsService()
{
InitializeComponent();
}

private void InitializeComponent()
{

}
}
}

Не забудьте добавить в Reference сборку System.ServiceProcess.
Для этого щелкните правой кнопкой мышки по папке Reference и выберите пункт Add Reference.… На вкладке .NET найдите сборку System.ServiceProcess, выделите её и нажмите кнопку OK.
Теперь нам осталось добавить класс для регистрации службы. Для этого также добавим класс с именем ProjectInstaller.cs. Исходный код данного класса приведен в листинге 2.
Листинг 2.
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;

namespace WindowsService
{
[RunInstallerAttribute(true)]
public class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
: base()
{
InitializeComponent();
}

private void InitializeComponent()
{

}
}
}

Не забудьте добавить ссылку в раздел Reference на сборку System.Configuration.Install.
Теперь нам осталось только экспортировать проект как шаблон. Для этого выберите File-Export Template…
Перед нами появляется первое окно мастера экспорта, в котором нам предлагается выбрать одно значение из двух:
1.Project template – шаблон проекта, который нам и нужен
2.Item template – шаблон одного файла. Т.е. это один из тех шаблонов, которые мы видим, выбирая пункт Add New Item, когда работаем с текущим проектом.

Жмем Next и видим новое окно мастера, в котором нам предлагается выбрать:
Template Icon: иконку шаблона (она будет ассоциироваться с этим шаблоном при создании нового проекта). Я оставил по умолчанию.
Template name: Имя шаблона. Желательно указать все же имя, по которому можно понять, шаблон какого проекта мы создаем. В данном случае я указал WindowsService.
Template description: Описание шаблона. Я ничего не указывал.
Output location: Папка, в которой будет храниться шаблон. Это значение изменить нельзя, так что после создания шаблона лучше скопируйте данный шаблон в папку, которая точно останется целой даже после переустановке операционной системы, так как каждый раз создавать один и тот же шаблон, все же не так и весело.
Жмем кнопку Finish и все. Наш шаблон готов. Теперь вы можете писать службы Windows и не задумываться о том, что вам нужно покупать новую версию любимой программы.