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

Для того, чтобы можно было быстро выполнить эту операцию, необходимо подключить макрос в Visual Studio и привязать ее к какой нибудь комбинации клавищ (у меня это Ctrl-W). Для того чтобы воспользоваться - просто выделяете кусок текста и запускаете макрос - откроется диалог в котором надо ввести тег, например li (не нужно вводить <li>).

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module MaqdevMacros
    Sub WrapSelectionWithTag()
        Dim Tag As String
        Tag = InputBox("Enter TAG to wrap selection")
        If (Tag.Length > 0) Then
            DTE.ActiveDocument.Selection.Cut()
            DTE.ActiveDocument.Selection.Text = "<" + Tag + ">"
            DTE.ActiveDocument.Selection.Paste()
        End If
    End Sub
End Module



Проблема

Если у вас есть серверный контрол, с длинным атрибутом ID, либо он лежит внутри множества других контролов (что приводит к очень длинным ID), то этот ID всегда  выводится в конечный HTML выдаваемый клиенту в неком преобразованном виде. Если у вас на странице много таких контролов, скажем внутри Repeater лежит некий Label, то в итоге объем сгенеренных в HTML коде аттрибутов ID может быть существенным. При этом довольно часто, эти ID на клиентской стороне не нужны вовсе, обычно это касается ссылок, картинок, текста (если вы не производите никакие AJAX манипуляции с этими элементами на клиентской стороне).

Решение

Довольно красивое решение было найдено в блоге salvo

На этапе PreRender, обнуляем значение ID серверного контрола. Что приводит к тому, что в итоге ID не передается клиенту.

Для упрощения этой задачи, создаем универсальный обработчик (например в неком базовом классе страниц и контролов сайта):

public void DeleteID(object sender, EventArgs e)

        {

            if (sender is Control)

            {

                Control c = (Control)sender;

                c.ID = null;

            }

        } 

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

<asp:Label ID="MyLongIDLabelForName" runat="server" Text="Salvo" OnPreRender="DeleteID"></asp:Label> 


Возникла необходимость выбора Open Source CMS для реализации очередного проекта. Вообще надо сказать, что популярные и известные CMS (а также различные open-source форумы, движки и библиотеки) написаны на PHP или Perl. Но подтягиваются и .NET реализации, некоторые из которых выглядят вполне качественными и функциональными.

В данной заметке приведу краткий обзор CMS которые я нашел в сети, в дальнейшем, возможно, приведу более детальное исследование некоторых из них. Критерии выбора были следующие: платформа ASP.NET, бесплатность, открытость исходного кода проекта.

DotNetNuke

Веб сайт: http://www.dotnetnuke.com/
Текущая версия 4.8.1
Платформа: ASP.NET 2.0
СУБД: Microsoft SQL Server (по всей видимости поддерживается 2000 и выше)
Язык программирования: в основном VB.NET (один модуль на C#).
Лицензия: BSD

Наверно, наиболее популярный из CMS реализованных на .NET (на сайте приведена цифра – 400тыс. пользователей). Авторы описывают его как гибкий, дружелюбный и мощный одновременно.

Функциональность:

  • поддержка множества порталов;
  • полностью настраиваемый внешний вид, поддержка стилей и скинов;
  • многоязычный, в том числе поддерживается русский язык;
  • управление файлами, корзина для удаленных, поддержка drag’n’drop;
  • заявлена поддержка следующих стандартных модулей: авторизация и поддержка пользователей, анонсы, баннер, блоги, контакты, дискуссии и форумы, списки документов, списки событий, FAQ, обратная связь,  галерея изображений или мультимедиа, изображения, ссылки, RSS, поиск, XML/XSLT преобразования, вывод пользовательских табличных данных.

Помимо стандартных, на сайте имеется довольно много дополнительных платных модулей.

На первый взгляд выглядит немного тормознутым, особенно поиск по ключевым словам – по самому сайту http://www.dotnetnuke.com/
Документация очень подробная по всем аспектам (как по разработке своих модулей, так и по использованию системы).

Umbraco

Веб сайт: http://umbraco.org/
Текущая версия 3.0.3
Платформа: ASP.NET 2.0, Microsoft ASP.NET 2.0 AJAX Extensions 1.0
СУБД: Microsoft SQL Server 2005
Язык программирования: C#
Лицензия: MIT License

Функциональность определенно не такая объемная, как у DotNetNuke, но есть несколько довольно интересных возможностей, в том числе:

  • интегрированный WYSIWYG редактор, редактор для шаблонов JavaScript файлов и CSS;
  • поддержка редактирования непосредственно из Microsoft Word;
  • версионирование всех изменений;
  • публикация по расписанию;
  • полная поддержка веб-стандартов, шаблонов и стилей;
  • легкая интеграция существующих .NET пользовательских контролов (User and custom controls), легко расширяемая объектная модель;
  • удобный форум;

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

Помимо бесплатной версии предлагаются расширенные платные версии: http://umbraco.org/products/umbraco-pro/feature-matrix

mojoPortal

Веб сайт: http://www.mojoportal.com/
Текущая версия 2.2.4.6-b
Платформа: ASP.NET 2.0 для Windows или Mono (Linux, Mac OS X)
СУБД: MS SQL, MySQL, PostgreSQL, SQLite, FirebirdSql
Язык программирования: C#
Лицензия: CPL

Довольно интересная реализация, которая поддерживает, в том числе Mono и может работать с множеством бесплатных SQL серверов.
Функциональность:

  • поддержка множества сайтов в одной инсталляции;
  • XHTML совместимый менеджер контента;
  • WYSIWYG редактор контента (FCKeditor , TinyMCE, или XStandard);
  • блоги, форумы;
  • календарь событий;
  • галерея изображений;
  • новости с рассылкой;
  • RSS агрегатор;
  • контакты;
  • менеджер файлов;
  • опросы и голосования;
  • интернет магазин (базовая функциональность);
  • поддержка многоязычности, также заявлена поддержка русского языка;
  • авторизация пользователей Active Directory, OpenLDAP, OpenID и Windows Live ID.
  • поиск по ключевым словам;

Rainbow

Веб сайт: http://www.rainbowportal.net/
Текущая версия: Rainbow 2.0.0.1881e
Платформа: ASP.NET 2.0
СУБД: MS SQL 2000
Язык программирования: C#
Лицензия: LGPL

Rainbow первоначально основывался (как и DotNetNuke) на портале IBuySpy который был разработан Microsoft для демонстрации возможностей ASP.NET.
Смущает множество неработающих ссылок на сайте, в частности на текущий момент не открывается ссылка по главной новости о выпуске версии 2.0.0.1881e

Функциональность (более 45 стандартных модулей):

  • поддержка множества сайтов в одной инсталляции;
  • поиск;
  • редактирование контента в режиме WYSIWYG;
  • кастомизация сайта с помощью скинов и стилей;
  • управление пользователями и ролями;
  • анонсы, статьи, блоги, форумы, контакты, списки событий, FAQ, галереи изображений, опросы, etc.

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

AxCMS.net


Веб сайт: http://www.axcms.net/
Текущая версия: 7.0
Платформа: ASP.NET 2.0, AJAX Extension 1.0, Web Service Enhancements 3.0
СУБД: MS SQL 2000/2005
Язык программирования: C#
Лицензия: своя, нельзя декомпилировать части без исходников и распространять изменения

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

Функциональность:

  • модуль для печати;
  • поддержка загрузки файлов на сайт пользователями;
  • опросы;
  • поиск;
  • поддержка Sitemap;
  • RSS агрегатор;
  • регистрация и аутентификация пользователей;
  • новостные рассылки;
  • ротирующиеся картинки;
  • форум;
  • генератор форм и таблиц, без необходимости править HTML;
  • многоязычность (русский поддерживается);
  • интеграция с Explorer (видимо через WebDAV);
  • электронные открытки, хлебные крошки, баннеры, etc.

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

Cuyahoga

Веб сайт: http://www.cuyahoga-project.org/
Текущая версия: 1.5.2
Платформа: ASP.NET 2.0, Mono
СУБД: MS SQL, PostgreSQL, MySQL  (через nhibernate)
Язык программирования: C#
Лицензия: BSD

Как пишут авторы этого труднопроизносимого на русском языке проекта - основная цель ее, это показать разработчикам .NET, что есть другой способ организации .NET приложений, нежели тот который показывается в стандартных примерах. Также авторы противопоставляют DotNetNuke, Rainbow, и Portal Starter Kit (ранее известный как IBuySpy Portal) своей системе, утверждая, что Cuyahoga дает возможность строить веб-сайты с любым дизайном, за счет использования гибкой разметки.

Функциональность:

  • Множество сайтов в одной инсталляции, алиасы для сайтов, иерархическая структура сайта с неограниченной вложенностью;
  • связи между модулями на странице, что позволяет им взаимодействовать между собой;
  • шаблоны с выделенными пользовательскими частями;
  • тонкая настройка кеширования объектов и модулей;
  • поиск;
  • поддержка локализации контента;
  • синдикация RSS; 
  • WYSIWYG редактор;
  • стандартные модули в себя включают: статьи, статический html, раздел downloads, remote content (контент с удаленных источников), регистрация и авторизация пользователей, переключатель языков;

На сайте выложено неплохое руководство по написанию модулей: http://www.cuyahoga-project.org/46/section.aspx/download/19

N2

Веб сайт: http://n2cms.com/
Текущая версия: 1.3.3
Платформа: ASP.NET 2.0
СУБД: MS SQL 2000/2005, MySQL (посредством nhibernate)
Язык программирования: C#
Лицензия: GNU

Описание на сайте производителя  гласит, что, N2 – это легковесная CMS, которая дает простой и мощный интерфейс для редакторов, а для разработчиков – понятный и открытый API. Радует функциональность и простота использования самого сайта, не требуется много времени, чтобы найти какой функционал поддерживается, документацию для разработчика.

Функциональность:

  • Множество сайтов в одной инсталляции, иерархическая структура контента с неограниченной вложенностью;
  • простой в использовании интерфейс редактора, легкость его расширения;
  • сайты разрабатываются в Visual Studio (?);
  • модель БД сохранена в виде исходного кода (nhibernate ?);
  • авторизация с использованием стандартных провайдеров asp.net;
  • есть возможность встроить в существующее приложение;
  • WYSIWYG редактор, файл менеджер, редактирование поддерживается как минимум в IE и Firefox;
  • гибкий дизайн шаблонов;
  • поддержка JQuery, TinyMCE, Microsoft Ajax;
  • версионирование контента;
  • локализация контента;
  • визард по созданию страниц;
  • менеджер пользователей;
  • публикация по расписанию;
  • включены модули: текст, новости, календарь событий, FAQ, галерея картинок, опросы, подписка RSS, поиск, и пр.

XMLNUKE

Веб сайт: http://www.xmlnuke.com/
Текущая версия: 2.0 RC1 (CSharp Edition)
Платформа: любая, доступна также PHP реализация
СУБД: не требуется, XML
Язык программирования: C#, PHP
Лицензия: GNU

CMS основана на преобразованиях XML в HTML при помощи XSLT, что в общем то является стандартной практикой. Не использует никакие БД, что с одной стороны плюс – не нужно за них платить, с другой стороны минус – при множестве операций записи, генерации XML файлов и выполнении XSLT преобразований (достаточно ресурсоемкая операция), производительность такой системы может быть заметно ниже.

Функциональность:

  • Множество сайтов в одной инсталляции;
  • минимальное количество действий по запуску: просто распаковать и залить на сайт;
  • поддержка локализации;
  • сниппеты (упрощенный синтаксис генерации HTML, так как XSLT довольно сложен);
  • генерация site map;
  • темы, печать документов;
  • доступны модули: гостевая книга, поиск по ключевым словам, аутентификация пользователей и профили, раздел download.

Очевидно, что XMLNUKE, это простая система, с базовой функциональностью, подойдет тем, кому нужно быстро запустить простой сайт, при этом не нужно будет думать о том какой SQL сервер использовать.

JMDCMS

Веб сайт: http://www.jmdcms.com/
Текущая версия: 3.0.0.9 Alpha
Платформа: ASP.NET 2.0
СУБД: SQL Server 2000/2005
Язык программирования: C#
Лицензия: Common Public License

Описание с сайта: гибкая автоматическая разметка в 3,2 и 1 колонку. Контроль доступа на уровне страниц и модулей, контроль публикации. Сайт автора, на мой взгляд, перегружен рекламой.

Функциональность:

  • Множество сайтов в одной инсталляции, неограниченная вложенность страниц;
  • разметка, основанная на CSS шаблонах;
  • поддержка модулей;
  • детальная статистика;
  • встроенные модули: меню, управление пользователями, страницами и безопасностью.

На текущий момент довольно слабая функциональность, хотя многое заявлено как планируемое.

NKCMS

Веб сайт: http://nkcms.sourceforge.net/
Текущая версия: ?
Платформа: ASP.NET
СУБД: MS SQL
Язык программирования: C#
Лицензия: BSD

Весьма аскетичный WEB сайт, приводит информация о некоторых возможностях этой системы:
 - использование XSL для шаблонов;
 - поддержка многоязычности;
 - управление доступом пользователей;
 - windows приложение для управления сайтом.

Судя по всему, последняя активность над проектом была в 2005 году, рассматривать его особого смысла не имеет.

Freeleen

Веб сайт: http://www.feeleen.ru/
Текущая версия: ?
Платформа: ASP.NET ?
СУБД: ?
Язык программирования: ?
Лицензия: ?

Из описания на самом сайте понять можно не очень много. Предлагается обращаться на e-mail. Предположительно система не бесплатна, исходного кода тоже не видно – к загрузке предлагается только демоверсия Windows клиента для управления сайтом.

Привожу исключительно в качестве справочной ссылки, к тому же единственная в обзоре CMS, которая создана автором из России.

Заключение

Меня, как разработчика, наиболее заинтересовал из этого списка N2, в частности обещаниями легкой интеграции в существующие приложения. Еще кажутся достойными более пристального изучения mojoPortal, umbraco и Cuyahoga. Конечно, кажется что более функциональный DotNetNuke или, например Rainbow, тоже вполне достойные системы, но на исключительно поверхностный взгляд они выглядят избыточными и сложными в доработке и поддержке.

А у вас был опыт работы с одной из перечисленных CMS?


Семафор - это примитив синхронизации потоков, который позволяет войти в заданный участок кода не более чем n потокам (это определение дал выдающийся ученый  Эдсгер Дейкстра).

Обычно семафор нужен для того, чтобы ограничить доступ к некоторому ресурсу, заданным количеством потоков приложения (ресурсом может быть например внешнее устройство, или некий сетевой ресурс).

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

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

Для решения этой задачи, мною был написан класс FifoSemaphore, который реализует политику FIFO (английское First In First Out - первым пришел, первым ушел) по отношению к ожидающим потокам - поток который вызвал функцию Wait первым, должен получить доступ к ресурсу первым. При необходимости, его можно легко модифицировать так, чтобы он работал по принципу LIFO (Last In First Out).

Краткое описание класса

Интерфейс класса аналогичен стандартному классу, за исключением одного нюанса - он не наследует стандартный класс WaitHandle, и соответственно не реализует его свойства и методы (которые специфичны для Windows). Как следствие этот класс не получится использовать в вызове WaitAny

Конструкторы
FifoSemaphore()
 Создает объект.

FifoSemaphore(int _InitialCount)
 Создает объект и инициализирует начальное значение счетчика ресурсов - N;

int Release(int _ReleaseCount)
 Выходит из семафора заданное количество раз (освобождает заданное количество ресурсов), возвращает предыдущее значение счетчика ресурсов;

int Release()
 Выходит из семафора 1 раз, возвращает предыдущее значение счетчика ресурсов;

bool Wait(int _MillisecondsTimeout)
 Входит в семафор. Ожидает освобождения ресурса заданное время в миллисекундах. Если ресурс не был освобожден в указанный период времение, возвращает значение false, иначе - true.

void Close()
 Закрывает семафор и освобождает ресурсы. После этого вызова использовать семафор более не допустимо.

P.S.

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

Загрузить проект с реализацией и тестом: FifoSemaphore.zip (7,85 kb)


maqdev.com

сообщения с ограниченным временем жизни