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

Umbraco 4.5

июля 5, 2010 19:36 by terR0Q

В конце июня вышел релиз 4.5 Umbraco. Релиз нестандартный и весьма интересный: наконец-то появился полноценный редактор для JS, XML и прочих файлов. Производительность админки и самого сайта заметно приросла.

Есть только одна важная мелочь. Для работы теперь необходим .NET 4, а веб-приложение должно работать только в интегрированном режиме ASP.NET 4.

В Umbraco 5 будет переход на модель MVC, и я надеюсь, что разработчики к этому подтянут реальную пользу для разработки и результатов работы с движком.


А в ресторане

мая 14, 2010 19:54 by terR0Q

На обед зашли с коллегами в открытый недавно ресторан Лебедева. В целом хорошо, но по куче деталей пока еще промахи. Вкратце — через месяц или полтора будет отлично. А пока:

  1. Прилавок с выпечкой и сама выпечка — обалденно.
  2. Девушки-официантки очень симпатичные, работают быстро, запоминают все без записи.
  3. Мебель — хорошо по-отдельности, но странно смотрится вместе.
  4. В большом зале стены пока просто чёрные, на них ничего нет. В итоге голяк.
  5. На счет бизнес-блин-ланча. Все блюда супер. Окрошка с настоящим квасом, томатный суп по всем правилам, пюре с хорошим сливочным соусом. Проблема только с мясом. Кому-то попалось хорошее, а мне достался кусок шиномонтажного мусора: сухо, жестко, туго.
  6. Указатель в сторону магазина и туалета — супер.
  7. Нижний этаж узкими проходами напомнил нору гномов. К тому же там до сих пор леса и стремянки стоят в углу.
  8. В туалетах выбран нестандартный для России подход к полотенцам: тканевые, которые нужно после использования скидывать в ящик. Это правильно для отличного французского или итальянского ресторана, но в московские будни про момент «сбросить в коробку» будут явно часто забывать.
  9. В целом как-то вроде бы почти хорошо, но все ещё бестолково и пустовато (не в плане посетителей, хотя их днем тоже явно не хватало). И неуютно.

Итого: через месяц надо попробовать ещё. Если все будет доделано, стоит зайти на нормальное меню. Готовят явно вкусно.


Samsung GT-C3010

апреля 29, 2010 19:32 by terR0Q

Есть у меня дурацкая привычка: запасной мобильник. Раньше это был сонерик K750 — старый, безотказный, простой. К новому году я невольно с ним расстался, а месяц назад решил выбрать замену. С простыми и более менее функциональными трубками за небольшую цену туговато. Или сборка, или функции так себе. В итоге выбрал простой слайдер самсунга. Скажем так, впечатления настолько хорошие, что трубка стала основной, а смартфон отправился в сумку в качестве резерва.

Во-первых, я сразу вспомнил, как хорошо иметь легкую и компактную трубу, которая просто тупо работает, не глючит, не сбоит, не приводит к потере текста и ещё 10 пунктов. Качество софта и клавиш там заметно выше, чем у S500i, при том, что последний обошёлся мне в 3 раза дороже год назад. Речь, конечно, не о визуальном исполнении. Во-вторых, этот скромняга знает синезуб и аутлук. Камера есть, но она и не нужна. Для полного счастья: громкий динамик и при закрытии сразу и всегда блокирует клавиатуру и закрывает все меню.

А смартфон все также под рукой, когда нужен. Хотя нужен он все-таки реже, особенно после покупки нетбука.


PSP Go again

апреля 2, 2010 12:53 by terR0Q

Почти месяц юзаю PSP Go. Играми особенно доволен. Раньше можно было валяться на диване и играть в PS3, а теперь можно валяться на втором диване и пыриться в небольшой экран с Liberty City Stories. Слайдер классный, расположение кнопок удобное, а pos имхо удобнее, чем при старом расположении.

С т.з. плеера. Качество звука как у iPod Touch, хотя с Cowon S9 сравнивать не стал бы. На ходу слушать неудобно, но мне это и не нужно. Минусы: читает id3Tag, но не умеет сортировать с его учетом (в итоге выдает порядок файлов по их имени); звук мог быть громче (здесь максимум, как на айподе 60-70%), батарейка иногда как-то внезапно вылетает при прослушивании на втором дне работы.


Atom

марта 27, 2010 21:58 by terR0Q

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

В поисках конторы, которая бы собирала небольшие скромные машины, получился немалый облом: таких мало, большая компьютеров часть не устраивает габаритами. Покопавшись ещё полчаса, обнаружил ни много ни мало ОАО «Depo Computers». To make the long story short: сделал заказ на корпоративном сайте, получил от их же магазина для физ. лиц модель, которую физикам еще не выставили в каталог.

Это небольшая машинка, рассчитанная на роль медиа-центра: Intel Atom 1.6 ГГц, 1 Гб оперативки, хард на 140 Гб, звук 7.1 и встроенная графика (скромная). Работает очень тихо и шустро. Отлично подходит для выполнения офисных задач и занимает очень мало места. В 9к рублей уложилась сама эта крошка и лицензия Windows XP. Добавил ещё 1к за USB Wi-Fi. Уже третья неделя отличной работы.

До кучи упакован компьютер был в аккуратную коробку с несколькими простыми, но эффективными средствами борьбы со вскрытием; привезли вовремя, косяков вообще ноль. В принципе, работают и с регионами, не только с Неризиновском.


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.