среда, 30 мая 2012 г.

Реализация паттерна UniqueURLs в SharePoint

На своем докладе на MsDevCon’12 я рассказывал о нескольких паттернах, и в частности — о паттерне Unique URLs. Также, я показывал, как этот паттерн работает на реальном примере – созданном мной Ajax-дашбоарде. Этот паттерн крайне актуален для Ajax-приложений, и строится вокруг следующего утверждения:
У каждого состояния страницы должен быть уникальный адрес
Это означает, что когда вы нажимаете на некой странице на кнопку или ссылку, и состояние (внешний вид) страницы меняется (неважно, был ли это postback или callback) — то у этой страницы должен измениться и адрес (т.е. текст в строке браузера):

image
Если каждый раз адрес менять не получается (например, в случае карт), то нужно предусмотреть кнопку «Получить ссылку» или что-то в этом духе.

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

image
Надеюсь, задача понятна, а теперь давайте рассмотрим реализацию, и некоторые тонкости при реализации этого паттерна в SharePoint.

вторник, 29 мая 2012 г.

PowerShell-скрипт для генерации задач

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

понедельник, 28 мая 2012 г.

Русскоязычные SharePoint-блоггеры

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

Итак, поехали...

воскресенье, 27 мая 2012 г.

Генерация JS из C# с помощью T4

В Ajax-приложениях данные передаются между клиентской и серверной стороной. Естественно, что структуру этих данных необходимо знать и на клиенте, и на сервере. Обычно это означает ведение одних и тех же классов, интерфейсов и перечислений и в виде JS-файлов, и в виде C#-файлов. Это лишняя работа, неудобно и вообще опасно.

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

Чтобы избавиться от такого рода ошибок и от лишней работы, я использую T4-преобразования, и генерирую JS-файлы на основе C#. В этой статье я расскажу, как такие преобразования устроены и работают. В конце статьи выложен код итогового T4-преобразования, которое можно скачать и использовать в ваших собственных проектах без изменений. Итак, поехали!

пятница, 25 мая 2012 г.

Разработка больших JavaScript-решений: 1 файл = 1 класс

В наши дни JavaScript-кода писать приходится все больше и больше. Единственный способ справляться с большим количеством кода – это разбивать его, структурировать, дробить на небольшие и понятные кусочки. Я лично в этом отношении использую два простых правила:
  1. 1 класс = 1 файл
  2. В 1 файле – не более 300 строк
Эти правила отлично работают и для серверного кода, и для клиентского. Но если серверный код автоматически, средствами Visual Studio, компилируется в единственный dll-файл, то JavaScript приходится склеивать в один кусок “вручную”.

В этом посте я хочу рассказать, как это можно сделать.

Впечатления от MsDevCon’12 и пара интересностей о SharePoint

Вернулся с конференции MsDevCon, море впечатлений и эмоций, спешу поделиться!

Я на конференции

Напомню, я участвовал в конференции как докладчик, читал доклад “Разработка Ajax-приложений в SharePoint”. Видео докладов организаторы планируют выложить не раньше чем через неделю, так что если кто-то пропустил, придется ждать :(

image
В любом случае, как я и обещал на докладе, я уже опубликовал два сопутствующих поста к докладу:
  1. Как я реализовал склеивание и минификацию js-файлов
  2. Как реализовать автогенерацию JavaScript-классов модели на основе C#-классов, с помощью T4-преобразований

Место проведения – "Яхонты"

Качество сервиса было на самом деле просто шикарным. Организация тоже в принципе на высоте (единственный наверное недочет, это то что зона экспертов никак не была обозначена – ни на плане, ни указателями, ни вывеской). Ощущение, что съездил не просто на конференцию, но съездил отдохнуть в отпуск, и вдобавок еще и на очень классную конференцию попал :) Природа, свежий воздух, кормежка “на убой”, шикарные условия размещения. Причем, это впечатление не могла испортить даже довольно прохладная погода. И кстати, несмотря на то, что кто-то боялся комаров, комаров было на самом деле не так много, и они были не слишком навязчивыми.


Отдельно про официантов: официанты были просто бесподобны! :) Представьте себе гризли-подобного мужика, с руками толщиной в две обычных, и ростом под два метра. А теперь представьте его одетым в ливрею официанта :) Это было очень забавно! :)

Хансельман

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

Хансельман (Scott Hanselman) – это один из самых выдающихся IT-докладчиков на сегодняшний день. Если вы еще не смотрели ВСЕ его доклады, очень рекомендую! Даже если вы не узнаете ничего нового (что невероятно, потому что Скотт очень любит собирать маленькие фишки о которых никто не знает), всегда стоит посмотреть Хансельмана. Это человек-театр, это зрелище которое просто нельзя пропускать.

Более того, нам удалось пообщаться со Скоттом вживую (!!). На фотографии Стас Выщепан, я и Скотт:


Очень общительный человек, Скотт бродил среди участников и среди экспертов в перерывах между докладами, и с удовольствием вступал в любые дискуссии и отвечал на любые вопросы. Всегда старался помочь, в частности мне удалось обратить его внимание на проблему со Script# в SharePoint.

Наверное хотя бы некоторые из вас знают, что SharePoint Client Object Model написан на Script#? Возможно, кто-то из вас также пробовал писать на Script# самостоятельно, и знают, чего это стоит, написать wrapper для какой-нибудь более-менее серьезной библиотеки? Возникает естественный вопрос, а что мешает Microsoft’у частично открыть исходники SharePoint ClientOM (для создания wrapper’а Script# не требуется реализация, только определения методов/классов/свойств и т.д.), сделав тех, кому нравится Script#, ну ОЧЕНЬ счастливыми? :)

Такой вопрос мы задали Скотту, и после того как он понял проблему, он тут же написал создателю Script#, которого зовут Nikhil Kothari. Я искренне надеюсь, что у этого обращения будут какие-то результаты, потому что те, кто хоть раз использовал Script# – знают, насколько это классный инструмент, и насколько проще с его помощью писать серьезные JavaScript-приложения.

Также, мы говорили со Скоттом о KnockOut. У меня есть некоторый опыт практической работы с KnockOut.js в SharePoint, и недавно я даже делал в Softline внутренний доклад “KnockOutJs в SharePoint”. На докладе я озвучивал проблему с атрибутом data-bind, с которой столкнулся самолично. Этот атрибут, как известно, очень хитрый. Он может содержать простые биндинги, а может целые выражения. Сделать ошибку в этом атрибуте ничего не мешает: значение атрибута является не более чем строкой, и сообщения об ошибках далеко не всегда внятные. Более того, поскольку биндингов очень много разных, и далеко не все из них сразу срабатывают, то мы можем вообще не получить никакого сообщения об ошибке и ошибочный вариант может запросто уйти на продакшен. А когда ошибка просачивается к клиентам, это уж совсем ужасно…

Ответ Скотта состоял из двух пунктов:
  1. Microsoft не собирается делать интеллисенс или пре-компилятор для KnockOutJs или для других OpenSource-проектов, даже несмотря на то, что сейчас KnockOutJs поставляется вместе с ASP.Net MVC 4. Причина проста: это очень дорого и это очень сложно. В этом я со Скоттом полностью согласен: в свое время я писал интеллисенс для LUA, и сложилось впечатление, что это даже сложнее, чем написать с нуля компилятор LUA…
  2. Как вариант решения проблемы, Скотт предложил написать расширение для Visual Studio, которое бы добавляло подсветку внутрь аттрибута data-bind. Причем он показал, что подобные расширения действительно можно написать, в качестве примера приведя Colorizer для Mustache Templating Engine, который был написан вроде как всего за одну ночь создателем этого движка, человеком по имени Mads Kristensen. Более подробно об этом можно почитать у Скотта в блоге. Подсветка Mustache-кода (с помощью vsix-расширения) выглядит вот так (картинка заимствована из блога Скотта):
A nice subtle mustache template
По-моему, решение весьма достойное (как минимум, “it sucks less”, как говорит Скотт :)…), и по наличии времени, я обязательно попробую разобраться, как это делается. Все-таки, в некоторых разрезах, KnockOutJs сделан очень удачно, и существует много ситуаций, когда его применение значительно облегчает жизнь разработчику.

На этом, пожалуй, всё, всем желаю удачных надвигающихся выходных, и да.. MsDevCon’12 был супер!