Notas del Terrible
Заметки Ужасного Зануды

Sleeptracker

февраля 17, 2010 16:14 by terR0Q

На прошлой неделе обзавёлся «умным» будильником. Вся его хитрость сводится к двум вещам, основанным на наблюдении за подвижностью спящего человека: выбор подходящего момента для подъёма и ведение журнала подвижности во сне. Всё основано на простом предположении, что если человек во сне двигается, то сон неглубокий, мозговая активность повышена, и выход из сна намного легче. С точки зрения высыпания: чем больше ворочаешься, тем хуже спишь.

[фотка слиптрекера]

Девайс является по сути часами, которые одеваются на ночь и засекают движения человека (привет акселометрам). Перед сном ставим время, не позже которого надо встать и период времени, в который можно бы и проснуться (например, в течение получаса). В это окно будильник сработает при первом заметном шевелении. Если человек спит мёртвым сном, то сигнал сработает ровно в означенное время. Большой плюс: есть очень неназойливый вибро-сигнал помимо звука. Я терпеть не могу любой звуковой шум, как причину просыпания, кроме музыки. А тут просто слегка жужжит ненавязчиво на руке, но вполне заметно.

Вторая функция полезна для изучения своего сна. Собственно, она меня в своё время и заинтересовала, когда прочитал запись в блоге vicnaum. За ночь будильник собирает статистику подвижности владельца, которую потом можно перекинуть в поставляемую программу. Там можно делать отметки факторов, влияющих на сон, но самое главное — визуально отображение качества сна в виде простых пометок, когда ты вертелся, и ровной линии крепкого сна.

Пользуюсь устройством неделю, вставать стало проще и легче. А обработка вопроса качества сна — это вообще будет отдельная тема, ради которой и обзавёлся этим сборщиком инфы.


Обновил обзор Umbraco

февраля 12, 2010 15:58 by terR0Q

Дополнил обзор по этому движку парой абзацев (внизу статьи).


CLR via C# 3rd ed.

января 22, 2010 10:28 by terR0Q

Это будет первая книга, которую я заказываю ещё до выхода.


May I?

декабря 29, 2009 18:27 by terR0Q

Сегодня с утра, читая Дракулу, добрался до самого беспощадного места книги (ну ладно, в оставшейся трети может оказаться что-то ещё). Доктор Ван Хельсинг решил, что убить вампира Люси Вестенру просто так недостаточно, и просто необходимо присутствия мужа не-покойной, Артура. Убийство подразумевает отсечение головы, шпигование рта чесноком, размещение головы в ногах, а до кучи — пронзение тела осиновым колом в сердце; всё по традициям бредней борьбы с вампирами 18-го века. Объясняет он это тем, что иначе Артур всю оставшуюся жизнь не сможет понять, почему же самоотверженный Ван Хельсинг не смог спасти Люси от смерти, а потому никогда не простит его. Ну и собственно фрагмент уговоров:

Arthur jumped to his feet.

’Good God’ he cried. ’What do you mean? Has there been any mistake; has she been buried alive?’ He groaned in anguish that not even hope could soften.

’I did not say she was alive, my child; I did not think it. I go no further than to say that she might be un-dead’.

’Un-dead! Not alive! What do you mean? Is this all a nigthmare, or what is it?’

’There are mysteries which men can only guess at, which age by age they may solve only in part. Believe me, we are now on the verge of one. But I have not done. May I cut off the head of dead Miss Lucy?

’Heavens and earth, no!’ cried Arthur in a storm of passion. ’Not for the wide world will I consent to any mutilation of her dead body’ ...

К слову сказать, уговорил посмотреть своими глазами на прогулку андэда.

Update.

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

Самый апогей происходит в переводе бортового журнала корабля, перевезшего Дракулу в Англию. Там реалистичных записей 2-3, это заметки про пересечение границ из пары предложений. А вот потом у капитана явно развивается морская блоггерская болезнь, в результате которой он пишет всё больше и больше, а перед развязкой (и своей гибелью) он уже кажется пишет триллер и рассчитывает получить признание среди своих читателей. Да и вообще, все герои столько пишут, что не понятно, когда они успевают собственно все те события.


Дитя Тьмы

декабря 28, 2009 10:18 by terR0Q

Чуть не забыл. «Дитя Тьмы» впору переименвать в «Вафёлы». Фильмец очень любопытный, но какие же там все вафёлы...


Avatar

декабря 22, 2009 18:03 by terR0Q

Если кратце, то «Аватар» — фильм десятилетия. А больше и говорить не хочу, смотреть надо.


pixlr app

декабря 10, 2009 10:58 by terR0Q

Умельцы Pixlr забахали мини-фотошоп во флеше под веб. Хотя это далеко не фотошоп, но внушает. Основной инструментарий там на уровне Paint .NET.

random img stuff

Riverdance

ноября 15, 2009 19:22 by terR0Q

Riverdance в пятницу порадовал до радостного офигения. Правда, за 15 лет ирландского там осталось только половина.

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

Самая запомнившаяся и бодрая сцена — «Новый Свет». Впервые увидел афроамериканских (ну и слово же, блин) чечёточников, которые обалденнейше изобразили соревнование с ирландцами. Такой подвижности и выразительности от движений тела до выражений лица я не видел ещё (вернее, вживую оно в разы живее и детальнее записи).

Ещё классно поставили «Русского бродягу» — быстрый коктейль из всевозможных русских плясок, смешанных с ирландской джигой и перемешанной музыкой.

В минус только отправляется пара сцен «фламенко» и вокальные партии — скучно, нудно и не завораживает. И вокал ещё понятно к чему, но вот откуда в этом шоу испанский танец в исполнении одинокой дамы уже почти без огонька?

Теперь надо ловить Lord of the Dance, но это явно не скоро — до мая следующего года расписаны гастроли двух трупп, и России там нет. Feet of Flames застать вообще мало шансов.


Zombieland

октября 19, 2009 21:24 by terR0Q

Зомбиленд очень запомнился и будет пересмотрен мной ещё несколько раз. Отличное кино. С «Шоном» нечто общее есть только в плане настроя.

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

Да, и, конечно же, «Они убили Билла Мюррея!». Предсмертное интервью особенно цинично, а вся сцена в доме прошла на ура.

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


Обзор Umbraco 4

октября 18, 2009 00:49 by terR0Q

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


Umbraco полностью отвечает определению CMS — система управления контентом. Вся концепция внутренней кухни строится вокруг документов и операций с ними.

Документы

Костяк системы — документ. Это тип страницы, который может состоять из произвольного числа полей различных типов данных. Для удобства поля могут разбиваться по категориям (или закладкам).

Поля могут быть всего лишь нескольких типов с точки зрения БД (Integer, Data, Ntext, Nvarchar). Как можно добавить что-то ещё — перекомпиляцией одной из компонент самого движка или просто добавлением ещё одной сборки — я не ещё проверял. Сверху накладывается возможность задания стандартных допустимых значений, а также способов рендеринга типа. Стандартных типов данных может хватить на большинство задач, их порядка 20 штук. Добавление же новых типов не требует изменения ядра: достаточно определить тип в админской консоли, а для нестандартных отрисовок необходима подготовка и загрузка небольшой сборки. В такой библиотеке реализуется всего лишь 3 класса, хотя это ещё предстоит самому пощупать.

При создании нового типа документа определяется набор его полей, которые могут быть разбиты по категориям. Такие категории при создании документа будут разбиты на несколько закладок в GUI. Стандартная закладка — Generic Properties, содержит общие для всех типов документов свойства. Дабы облегчить интерфейс в дополнительные закладки добавить какие-то специфические части страницы.

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

Шаблоны — следующая основа системы. С 4-й версии (с ней я и начал своё знакомство) в качестве шаблонов используются стандартные master-pages ASP.NET. При этом админкой поддерживается наглядная иерархия, что позволяет поддерживать порядок в структуре. Более того, админка позволяет добавлять наследуемые и унаследованные блоки содержимого парой щелчков.

В любом шаблоне может быть определен дизайн и подключены несколько типов полезных составляющих страницы: макросы (XSLT, сборки кастомных контролов или наборы пользовательских контролов, а также файлы, написанные на Iron Python), элементы словаря (привет, локализация) и поля страницы.

Как итог, получаем очень важное для легкости работы разделение: данные и отображение отдельно, а функционал вообще в стороне. И это притом, что используется обычный ASP.NET, никаких MVC и MVVM.

Макросы

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

Все задачи, связанные с отображением документов самой системы, решаются через XSLT. Да, можно извернуться, и написать отдельный модуль на C#, но лучше использовать заложенный каркас. Допустим, надо вывести на странице все дочерние узлы определенного типа, причем делать это только для узлов 2-го уровня вложенности. Для этого создаём новый XSLT-файл вместе с макросом (система сама предложит создать макрос до кучи), а в нём пишем такой код:

   1:  <?xml version="1.0" encoding="UTF-8"?>
   2:  <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
   3:  <xsl:stylesheet 
   4:      version="1.0" 
   5:      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   6:      xmlns:msxml="urn:schemas-microsoft-com:xslt"
   7:      xmlns:umbraco.library="urn:umbraco.library"
   8:      exclude-result-prefixes="msxml umbraco.library">
   9:   
  10:   
  11:  <xsl:output method="xml" omit-xml-declaration="yes"/>
  12:   
  13:  <xsl:param name="currentPage"/>
  14:   
  15:  <xsl:template match="/">
  16:   
  17:      <xsl:variable name="rootTextpageNode"
select="$currentPage/ancestor-or-self::node
[@level = 2 and @nodeTypeAlias = 'CWS_Galleries']"
/>
  18:   
  19:      <div class="secondaryNav">
  20:          <h3>
  21:              <xsl:value-of select="$rootTextpageNode/@nodeName"/>
  22:          </h3>
  23:          
  24:          <ul>
  25:              <xsl:for-each select="$rootTextpageNode/node
[@nodeTypeAlias = 'CWS_Galleries']"
>
  26:                  <li>
  27:                      <xsl:if test="$currentPage/ancestor-or-self
::node/@id = current()/@id"
>
  28:                          <xsl:attribute name="class">
  29:                              <xsl:text>selected</xsl:text>
  30:                          </xsl:attribute>
  31:                      </xsl:if>
  32:                      
  33:                      <a href="{umbraco.library:NiceUrl(
current()/@id)}"
>
  34:                          <span>
  35:                              <xsl:value-of select="current()
/@nodeName"
/>
  36:                          </span>
  37:                      </a>
  38:                  </li>
  39:              </xsl:for-each>       
  40:          </ul>
  41:      </div>
  42:   
  43:  </xsl:template>
  44:   
  45:  </xsl:stylesheet>

 

Обработка основана на атрибутах документа. При этом есть системные атрибуты, общие для всех документов, например, nodeName (имя документа), level (уровень вложенности) и id (числовой идентификатор любого документа в ветке сайта, по нему устанавливаются связи документов). Кстати, что удобно, ссылки можно строить с использованием имен документов. Т.е. если на сайте есть узел «стулья», а в нем расположен документ «табуретка обычная», то мы можем использовать следующий URL:

http://сайт/стулья/табуретка-обычная.aspx

Более того, такая задача, равно как и ряд других, уже решены в библиотеке Umbraco. В показанном выше примере это делается следующим образом:

href="{umbraco.library:NiceUrl(current()/@id)}"

До кучи стоит сказать, что в шаблонах мы можем подключить все необходимые стили и скрипты JS, учитывая их в том же XSLT. Конечно, обработка AJAX-обращений к серверу потребует дополнительных усилий, но при этом разработчики не обязывают, использовать ли jQuery или прибегнуть к AJAX ASP.NET.

Использование контролов и вообще дополнительных сборок, т. е. работа в Visual Studio нужна только для реализации какого-то дополнительного функционала, который не укладывается в сам движок и работу с документами. Тому примеры: рассылка писем, обращения к внешним системам.

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

Для этого нужно сделать несколько простых действий. Сначала, объявить сами свойства (для примера небольшая часть кода):

public string EmailTo
{
 get
 {
    return _EmailTo;
 }
 set
 {
    _EmailTo = value;
 }
}

public string EmailSubject
{
 get
 {
    return _EmailSubject;
 }
 set
 {
    _EmailSubject = value;
 }
}

public string EmailBody
{
 get
 {
    return _EmailBody;
 }
 set
 {
    _EmailBody = value;
 }
}


* This source code was highlighted with Source Code Highlighter.

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

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

 

<umbraco:Macro EmailTo="[#emailTo]"
EmailSubject="[#emailSubject]"
EmailBody="[#emailBody]"
EmailReplyFrom="[#emailReplyFrom]"
EmailReplySubject="[#emailReplySubject]"
EmailReplyBody="[#emailReplyBody]"
EnableSSL="[#enableSSL]"
FormHeader="[#headerText]"
FormText="[#formText]"
ThankYouHeaderText="[#thankYouHeaderText]"
ThankYouMessageText="[#thankYouMessageText]"
Alias="CWS_ContactForm" runat="server"></umbraco:Macro>


* This source code was highlighted with Source Code Highlighter.

 

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

Итог

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

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


 

Проблемы

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

Другая проблема в конфиг-файле. Блоки конфигурационных файлов в ASP.NET наследуются от узлов более высокого уровня вложенным узлам. Это легко исправимо для раздела <system.web>: делаем для этого узла обертку location с атрибутом inheritInChildApplications=«false». Но для блока <configSection> лёгкого пути нет. В моём случае проблема возникла со настройка весьма проста.

Back- и Front-Office

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

Creative Website Starter

Знакомство с Umbraco было для меня особенно ускорено изучением и доработкой под свой сайт набора Creative Website Starter (CWS). В процессе раскопок в файлах этого модуля до меня и дошёл непривычный дзен разработки в этой системе. Я особенно упорно пытался найти скрипты для БД прежде, чем до меня дошло, как там надо работать с данными.

Дополнение от 12 февраля 2010

Проработав с Umbraco уже почти полгода, ни чуть не разочаровался. Все делается очень просто.

Для добавления новых элементов админки, создаются простые ascx-файлы с деталями интерфейса и вместе с кодом закидываются в каталог usercontrols/dashboard. Обработка данных внутри может быть какой угодно, но самое главное: надо предусмотреть и связать эту логику с каким-то дополнительным контролом самого сайта. Приведу пример. Пользователь заполняет форму на странице. Контрол, отвечающий за ее сохранение, отправляет все в какую-то дополнительную таблицу в базе сайта, или в общий xml-файл. Чтобы админ смог прочитать обращение пользователя, надо добавить контрол, который по такой же логике прочитает и выведет сохраненное ранее обращение пользователя. Все очень просто и пример можно подсмотреть в том же CWS.

Другой момент — стандартная обработка каких-то документов. Для этого создается обычный cs-файл, в котором прописываются обработчики событий и привязываются к документной модели. Привязка делается в событии Page_Load, а обработчики должны соответствовать определенной сигнатуре. Файл должен быть размещен в каталоге App_Code корневого узла сайта. Одновременно можно держать несколько файлов. Есть простой пример привязки обработчика на сайте Umbraco. Типы событий можно подсмотреть в объектной модели в Visual Studio. В проекте потребуется поставить ссылки на несколько основных библиотек CMS: businesslogic.dll, cms.dll и umbraco.dll. И ещё одно: в настоящее время есть очень неприятный баг умбрако, в результате которого Before-события выполняются всегда после изменения документа, поэтому использовать пока надо только After.


Umbraco rules

октября 13, 2009 01:05 by terR0Q

Сказать, что разрабатывать под Umbraco просто — ничего не сказать. Я с огромным удовольствием сделаю подробный обзор. Но самое главное, здесь максимально большое число действий осуществимо через админку разработчика и лишь определенные детали бизнес-логики (т.е. то, где без кода уже не обойтись) требует реальной разработки.

Вывод информации из того, что есть — максимально укладывается в XSLT и редактирование master-pages. Подключить любой JS-фреймворк: как нечего делать. Добавить какое-то контекстно-зависимое меню: ерунда. Мне даже обидно, что не я эту штуку разработал.

Хотя пара серьезных огрехов, они, в общем-то, меркнут, особенно если соблюдать элементарные правила аккуратности.


CMS Run

октября 11, 2009 23:30 by terR0Q

Провёл пробную установку AxCMS и Umbraco. Когда проведу обзор и оценку разработки под эти CMS, будет готова полная статья и будут соответствующие развёрнутые посты.

А пока вкратце.

AxCMS ориентирована на корпоративные порталы, из чего следует её «тяжелый вес»: несколько приложений, рекомендуемые две базы, многоэтапная установка (хотя для дефолтного развёртывания есть «батники», ускоряющие всё неимоверно) и очень навороченная админка.

Umbraco — очень лёгкая, но и очень умелая платформа. Ставится очень быстро, быстрее даже DotNetNuke. Админка самая удобная из всех, что я когда либо видел (за 5 лет успел много всего пощелкать).


DotNetNuke Installation

октября 8, 2009 11:25 by terR0Q

Продолжая тему DotNetNuke, пара замечаний на счет установки.

Если система ставится на 80-й порт, то всё просто прекрасно и просто: распаковал в виртуальный каталог с запущенным приложением (просто в узел оно лезть почему-то не хочет), подключился браузером, прокликал настройки, вуа-ля! Особенно порадовало то, что в настроечном интерфейсе не забыли возможность хранения базы в локальном файле с подключением к серверу БД для его обработки. Это может быть очень удобно для разработки.

Но вот если порт какой-то ещё, и после установки сделать пару неправильных телодвижений, то скорее всего придется сбрасывать кучу внутренних настроек, а проще говоря — переустанавливать. Чтобы такого не было, надо:

  1. Подключиться к консоли localhost'а
  2. Зайти в раздел настроек системы под учетной записью host
  3. В разделе Portal Aliases добавить все те имена и адреса, по которым будут обращаться к системе с включением имени виртуального каталога (по дефолту прописано только localhost/имя_директории). Это могут быть имя_машины/dnn, имя_машины:порт/dnn, localhost:порт/dnn, ip:порт/dnn и т.п. Причем на случай переноса системы (например, с разработчетского сервера на продуктивный или тестовый) лучше заранее прописать соответствующие имена. Как вариант, можно отредактировать таблицу Port_Alias в базе.
  4. В web.config включить настройку UsePortNumber. Она там заготовлена, надо только раскомментировать.

И до кучи почти классическая ситуация, связанная с установкой модулей. Наткнулся на этот баг ещё при установке. Возможна некорректная обработка установки модуля, в результате вылетает ошибка Thread was being aborted.

Как выяснил некий Эндрю Райер (в этой теме, внизу), проблема в том, что при копировании новых dll в каталог bin, приложение перезагружается (нормальное поведение ASP.NET). Каждому потоку даётся команда на завершение. Существует таймаут, за который потоки должны завершиться, иначе они отрубаются насильно. Получается, что установщик просто не успевал отработать и его гасили. Чтобы ситуацию исправить надо немного скорректировать узел httpRuntime:

<httpRuntime useFullyQualifiedRedirectUrl="true" maxRequestLength="8192" requestLengthDiskThreshold="8192" executionTimeout="6000" shutdownTimeout="300"/>

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


DotNetNuke

октября 7, 2009 17:06 by terR0Q

На работе повезло избежать разработки под Sharepoint (хотя будут использоваться веб-службы внешнего стандартного портала). А чтобы не создавать разрабатываемый сайт с нуля, решил задействовать CMS. Т.к. Umbraco и AxCMS решил изучать в свободное время, выбрал DotNetNuke.

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

Чтобы не возиться с регистрацией на сайте, можно сразу скачать дистрибутив с CodePlex. Там же можно и нужно взять Visual Studio Starter Kit (чуть ниже дистрибутива, в списке Other Downloads) — это шаблон проекта для Visual Studio, создающий заготовку всего сайта, который можно будет сразу залить на внешний веб-сервер. Насколько я понял, для большинства случаев использовать исходники движка нет смысла, это может потребоваться только для очень сильной переделки.

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

Суть в следующем. Используется классическая архитектура: портал — страница — модуль. Движок предоставляет определенную модель взаимодействия компонент и их настройки, а также возможность внутренней логике делать всё, что угодно в рамках ASP.NET. Особенно радует, что не переиначена модель событий, т. е. всё также можно использовать Page_Load и другие события жизненного цикла контрола. Единственное различие в том, что контролы наследуют базовому классу модуля DotNetNuke.Entities.Modules.PortalModuleBase, который расширяет возможности контрола.

Для работы есть два простых варианта: создать проект на основе стартового работа (линк был выше) или открыть веб-сайт из внешнего или локального каталога. Работать можно из VS Web Developer Express, что может оказаться даже удобнее (работает шустрее).

Ну и до кучи остаётся отметить, что есть набор дополнительных модулей на официальном сайте, из разряда полезных мелочей, например: авторизация пользователей через Active Directory или OpenID, работа со списками, вики и пр.


UMI.CMS .NET

октября 5, 2009 03:04 by terR0Q

Дублирую пост, опубликованный ранее в ЖЖ по причине его необходимости.

Опробовал бета-версию UMI.CMS .NET. Резюмируя: даже обновлённая бета не ушла дальше сырой альфы. Далее по порядку.

Сразу скажу, что сначала использовалась версия от 22 июня этого года, в процессе шаманств с установкой получил версию от 17 августа.

Установка

Одно сделано хорошо: установка. Но и то лишь в плане простоты настройки, а время не лучшее. Суммарно ушло 20 минут, из них 10 — установка Web Platform Installer и проверка необходимых компонент. При этом не создавалась отдельная учётная запись в СУБД. Количество шагов очень небольшое. Хотя при более активных телодвижениях тот же Blogengine.NET ставится быстрее.

После установки начались края бубнов. По какой-то причине почти все модули администрирования оказались отключены. Лечение потребовало трёх переустановок. Сначала было простое удаление (оказалось, что при дежурном uninstall файлы остаются на месте, база вроде тоже не трогается), затем оно было дополнено ручной чисткой с удалением файлов и базы. Полная переустановка помогла, но только со второго раза, когда использовал уже обновлённую версию. Появилась полноценная панель управления, заполненная всеми положенными модулями.

Впечатления

Памятуя презентацию на TechDays.ru хочу сказать, что все показанное там верно. Также Наружная страница веб-сайта работает гладко (а это редактирование страниц, как минимум), панель администрирования наверху также в порядке. Но! Совсем другая история с основной админкой.

Простой пример. Захожу в главный раздел, выбираю редактирование страницы «Оплата заказа», попадаю в раздел редактирования, все поля пустые. Ввожу текст в большое поле ввода (контент), нажимаю «Сохранить и посмотреть». Попадаю на страницу, где мало того, что нет введенного контента, так ещё и много заготовленной информации размещено (использовалась демонстрация магазина «Хомяки»). Дальше веселее. Меняю заголовок страницы, и о чудо, страница не найдена. Откат названия не помогает, хотя путь никто не трогал.

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

Система сырая, это должна быть закрытая альфа. Не спорю, в UMI весьма самобытная архитектура, основанная на нескольких хороших идеях индустрии с рядом собственных доработок. Но вот если процесс разработки этой конторы допускает такие бета-версии, то я не хочу работать ни с первым релизом, ни с последующими. Первый шаг к хорошему качеству продукта: процесс, ориентированный на качество с самого начала. Простейший тому барьер заключается в проведении хотя бы базового юнит-тестирования еще на этапе разработки. Написали код ядра — пишем проект теста ядра. Написали веб-модуль, пишем тесты веб-модуля. А эти ребята явно поспешили показать всем шуструю установку, а недра ещё не стабилизировали.

И ещё. Хорошие разработчики пишут хороший код сразу, хотя бы на 60—70%, а не когда каждая вторая функция хромает. Примеры тому есть: Microsoft, Google, Sun, Fog Creek. Оправданий низкому качеству быть не может: любой вклад в качество хотя и делает саму разработку дороже, но очень облегчает поддержку в будущем, чем даёт очень большую выгоду. В ином случае начинается дешёвая политика с целью распиливания бюджетов.


 
MapYourVisitors.COM