понедельник, 29 сентября 2014 г.

Результаты семинара “Поиск SharePoint”

Месяц назад прошел семинар по поиску в SharePoint 2013. В этот раз семинар был на полный день.  Видеозаписи доступны по ссылке http://gandjustas.justclick.ru/order/spsearch/.

В ходе семинара успели рассмотреть следующие темы:

  • Настройка Content By Search Web Part
  • Сценарии выборки данных (замена CAML)
  • Ранжирование результатов поиска
  • Настройки центра поиска и правил запросов

Отзывы некоторых участников:

Добрый день! Отличное мероприятия Стас, очень понравилось! Упорядочил для себя все знания по поиску, узнал парочку новых и интересных вещей. Также решил давно мучавшую меня проблему с необязательным условием и знаком «?» в выражении запроса поиска. С нетерпением жду следующего семинара =)

Борис Журкин, RTLabs

 

Из семинара получили развернутое и подробное (для первичного ознакомления, на мой взгляд, достаточно подробное ) описание возможностей поиска платформы Sharepoint 2013. Рассмотрели примеры использования в различных сценариях. В общем семинар был очень полезен, как вводная часть, для дальнейшей тесной работы с поиском. От семинара получил на 100% что ожидал.

Вахтанг Барбакадзе, РТК

 

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

Однако материал оказался полезным для общего кругозора и понимания возможностей новой версии SP.

Вадим Титов, АВТОМИР

В этот раз с видеозаписью помог Александр Ульмаскулов, любезно предоставив видеокамеру. Записи вебинара теперь включают как экран, так и весь зал с хорошим звуком. Для примера – запись обсуждения на перерыве:

Ссылка на видеозаписи и слайды - http://gandjustas.justclick.ru/order/spsearch/

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

вторник, 23 сентября 2014 г.

Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Доклад с таким длинным и непонятным названием я читал на SQL Server User Group 10 сентября в Москве. Ниже запись доклада:
К сожалению, как обычно я не показал все что хотел, часть материала не попала на видео запись. Но я восполню этот недостаток.
Как вы думаете, можно ли на Linq делать запросы, которые работают быстрее рукопашных? Оказывается да, и очень просто.
Например надо сделать функцию, которая отбирает заказы по дате отгрузки. Если параметр указал, то выбрать заказы за эту дату. А если не указана дата, то выбрать все заказы, у которых дата отгрузки пустая. Обычный разработчик напишет такую процедуру:
CREATE PROCEDURE [dbo].[GetTransactionsByShipDate]
    @shipDate datetime
AS
    SELECT t.Id, t.ProductId, t.TransactionDate 
       from Transactions t
    where
        (@shipDate is not null 
          and t.ShippedDate = @shipDate) 
     or (@shipDate is null 
          and t.ShippedDate is null)

Эта процедура подвержена parameter sniffing problem. Проблема заключается в том, что план процедуры генерируется один раз при первом вызове с учетом фактических параметров при вызове. Если при первом вызове ShipDate был NULL (низкая селективность), то сгенерируется план с Index Scan. Если же первый вызов был с конкретным значением даты, то получится Index Seek, который будет неэффективно работать для значений с низкой селективностью.
Простой тест:
DBCC FREEPROCCACHE
GO

EXEC    [dbo].[GetTransactionsByShipDate] NULL
GO

declare @shipdate datetime = getdate()
EXEC    [dbo].[GetTransactionsByShipDate] @shipdate
GO

DBCC FREEPROCCACHE
GO

declare @shipdate datetime = getdate()
EXEC    [dbo].[GetTransactionsByShipDate] @shipdate
GO

EXEC    [dbo].[GetTransactionsByShipDate] NULL
GO

Результаты:
image
Как видите план оказывается далеко не оптимальным в обоих случаях.
А с помощью Linq можно написать так:
private static IQueryable<Transaction> GetValues(
    IQueryable<Transaction> query, 
    DateTime? dateTime)
{
    if (dateTime.HasValue)
    {
        return query.Where(t => t.ShippedDate == dateTime.Value);
    }
    else
    {
        return query.Where(t => t.ShippedDate == null);
    }
}
Тогда буду сгенерированы два разных запроса, каждый со своим, оптимальным для данного запроса, планом.
Более того, такая оптимизация для null value встроена в провайдер Linq2DB. Там можно непосредственно nullable значения подставлять в linq.
Более того, можно использовать filtered index, когда больше 2% значений по индексируемому полю равны NULL.

вторник, 2 сентября 2014 г.

Записи докладов по Business Intelligence c DevCon 2014

На конференции DevCon, которую ежегодно организует Microsoft, в 2014 году я выступал аж с двумя докладами, оба были на тему Business Intelligence в SharePoint.

Недавно были опубликованы видеозаписи. Выложу их в блоге, чтобы проще было найти.

Первый доклад по Power Pivot в SharePoint 2013 (on-premises), в котором я показываю пример мини-erp решения для управленя отделом, которое можно собрать за несколько часов совершенно без программирования.

Второй доклад посвящен возможностям PowerBI в Office 365. Особое внимание было уделено инструменту Power Query, его использованию в Excel, а также настройке гибридной среды для получения доступа из облака к данным on-premises.

А вы используете в своей работы BI инструменты SharePoint? Напишите в комментах в каких сценариях применяли или почему не применяли.

понедельник, 1 сентября 2014 г.

Выступаю на Russian SQL Server User Group в Москве 10 сентября

Я всегда много писал о SharePoint, но это далеко не единственная область, в которой я разбираюсь.

Сергей Олонцев, MVP по SQL Server, организует встречи SQL Server User Group в Москве. Ближайшая встреча будет 10 сентября и я буду выступать на ней с докладом: Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server, с помощью LINQ.

Краткое описание доклада:
Вы разрабатываете веб-приложения и используете хранимые процедуры? Вы пишите SELECT … WITH(NOLOCK)? Вы считаете, что ORMы снижают быстродействие приложений? Тогда этот доклад для вас!
В докладе будут развенчаны популярные мифы о применении библиотек Object-Relational Mapping (ORM) в ASP.NET при работе с Microsoft SQL Server. Также будут рассмотрены конкретные методики увеличения быстродействия работы с данными в веб-приложениях.
Встреча пройдет в Microsoft Technology Center, м. Белорусская, ул. Лесная д. 9 10 сентября с 17:00 до 19:00.

Ссылка на регистрацию: http://www.eventbrite.com/e/russian-sql-server-user-group-10-2014-tickets-12806290961

 

среда, 30 июля 2014 г.

Семинар "Поиск в SharePoint 2013"

Поиск в SharePoint существует очень давно. Даже когда SharePoint не назывался SharePoint_ом в нем существовал поиск. В SharePoint 2013 поиск стал не просто небольшим дополнением к платформе, а инструментом для решения многих задач, как для разработчиков, так и для дизайнеров, и для продвинутых пользователей. Многие части SharePoint основаны на механизме поиска, но для создания решений поиск до сих пор приvеняется очень редко.

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

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

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

Участвуйте в семинаре, и Вы узнаете много нового:

  • Как использовать существующие возможности поиска SharePoint для решения задач.
  • Приемы построения запросов и настройки ранжирования результатов поиска.
  • Возможности настройки схемы для полнотекстового и атрибутивного поиска, а также уточнений.
  • Архитектуру службы поиска SharePoint, возможности масштабирования и отказоустойчивости.
  • Клиентское и серверное API для поиска.

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

Темы, которые будут рассмотрены на семинаре:

  • Сценарии выборки данных (замена CAML)
  • Ранжирование (как настроить собственное и как управлять)
  • Доступность и быстродействие (чтобы поиск не падал и индекс быстро наполнялся)
  • Масштабирование поиска (как положить на несколько серверов в зависимости от объема данных и выделить нужное место на хранилище)
  • Работа с правами доступа (что отобразится в веб-частях в зависимости от прав)
  • Особенности работы через разные зоны (AAM)
  • Обзор стандартных веб-частей и способов их кастомизации (в том числе и локализация)
  • Интересные сценарии использования (выборки в том месте, где высокие нагрузки и пр.)
  • Обзор объектной модели (со стороны клиента, со стороны сервера)

Материала не просто много, а очень много. Семинар будет проходить с 10 утра до 6 вечера, надеюсь удастся уложиться.

Стоимость - 8,500 рублей с участника, обед и кофе-брейки включены. Зарегистрироваться на событие «Семинар

вторник, 29 июля 2014 г.

Загрузка скриптов в SharePoint

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

Эта, казалось бы, простая задача далеко не тривиально реализуется в SharePoint.

Причины

    1. SharePoint формирует интерфейс динамически. Многие блоки добавляются на страницу по событию body.onload. Это событие возникает позже, чем DOMContentLoaded. Именно это событие перехватывает jQuery.ready. Поэтому использование jQuery часто не приводит к хорошему результату. Подробнее об использовании jQuery в SharePoint.
    2. Minimal Download Strategy (MDS), появившийся в SharePoint 2013, загружает страницу один раз, потом обновляет блоки страницы, поэтому нужно выполнять дополнительные действия, чтобы скрипт выполнился после загрузки страницы под MDS.
    3. Механизм загрузки скриптов, о котором я писал ранее, требует чтобы скрипт самостоятельно оповещал об окончании выполнения.

Для скриптов в виртуальной файловой системе SharePoint

Чаще всего скрипты SharePoint деплоятся как файлы в виртуальной файловой системе. Это прекрасно работает как в on premises, так и в online.

Для размещения скриптов на странице используется контрол ScriptLink, в таком виде:

<SharePoint:ScriptLink Name="autofill.js" runat="server" OnDemand="true" LoadAfterUI="true" Localizable="false" />

или с помощью CustomAction ScriptLink в элементе решения

<CustomAction Location="ScriptLink" ScriptSrc="~site/Extensions/typescripttemplates.js" />

Внутри скрипта нужно выполнить следующие действия:

  1. Оповестить SharePoint об окончании загрузки.
  2. Добавить функцию, которую необходимо вызывать после загрузки страницы, в массив _spBodyOnLoadFunctions.
  3. Добавить зарегистрировать скрипт в системе MDS.

Код:

// IIFE для изоляции
(function () {
    "use strict";

    // Имя скрипта должно совпадать с тем, что указано в ScriptLink
    var scriptLink = "~site/Scripts/myscript.js";

    // Код здесь будет выполняться ДО окончания загрузки страницы


    if (_spBodyOnLoadCalled) {
        // Если событие body.onload уже обработано
        // напрмиер при LoadAfterUI="true" или OnDemand="true"
        // то сразу вызываем функцию init
        init();
    } else {
        // Иначе добавляем функцию в массив
        _spBodyOnLoadFunctions.push(init);
    }

    function init() {
        // заменяем токены "~site" и "~sitecollection" на реальные URL 
        // с помощьюв SPClientRenderer.ReplaceUrlTokens
        // но эта функция доступна после загрузки CSR
        // поэтому нужно выполнить зарузку CSR и дождаться её окончания
        // если CSR уже был загружен, то функция выполнится сразу
        SP.SOD.executeFunc("clientrenderer.js", "SPClientRenderer.ReplaceUrlTokens", function() {            
            // тепрь регистрируем скрипт в MDS
            RegisterModuleInit(SPClientRenderer.ReplaceUrlTokens(scriptLink), init);
        });

        // Код здесь будет выполняться ПОСЛЕ окончания загрузки страницы
    }


    SP.SOD.notifyScriptLoadedAndExecuteWaitingJobs(scriptLink);
})();

Если вы сами деплоите страницу, на которой будет работать ваш скрипт, то можете воспользоваться библиотекой mQuery и функцией m$.ready. Эта функция делает тоже самое, что и блок if\else в коде выше.

Для скриптов в layouts

Если вы размещаете свой скрипт в _layouts, то есть несколько особенностей:

  1. При добавлении скрипта надо указывать только имя файла.
  2. SOD автоматически регистрирует в MDS вызов функции с именем $_global_имя_файла_без_js

Код для файла в _layouts

"use strict";

// эта функция должна быть в глобальном пространстве имен
function $_global_myscript() {
    // Код здесь будет выполняться ПОСЛЕ окончания загрузки страницы
}


if (_spBodyOnLoadCalled) {
    // Если событие body.onload уже обработано
    // напрмиер при LoadAfterUI="true" или OnDemand="true"
    // то сразу вызываем функцию init
    init();
} else {
    // Иначе добавляем функцию в массив
    _spBodyOnLoadFunctions.push(init);
}

// этот вызов автоматически добавит регистрацию в MDS
SP.SOD.notifyScriptLoadedAndExecuteWaitingJobs("myscript.js");

Универсальные скрипты

Если ваши скрипты будут вызываться вне страниц SharePoint, то обращение к “пространству имен” SP вызовет ошибку.  Кроме того есть свой механизм оповещения о загрузке скриптов в MsAjax библиотеке, поэтому в конце скрипта надо использовать такой блок:

// Оповестить MsAjax об окончании загрузки
if (typeof Sys != "undefined" && Sys && Sys.Application) {
    Sys.Application.notifyScriptLoaded();
}

// Оповестить SharePoint об окончании загрузки
if (typeof SP != "undefined" && SP && SP.SOD) {
    SP.SOD.notifyScriptLoadedAndExecuteWaitingJobs("myscript.js");
}

Заключение

Более подробно о загрузке скриптов, TypeScript, особенностях SharePoint и Client Side Rendering можете узнать подробнее, посмотрев записи семинара - http://gandjustas.justclick.ru/order/spclient/

четверг, 3 июля 2014 г.

Семинар “Создание решений SharePoint на JavaScript и TypeScript”

Microsoft постоянно развивает средства клиентской разработки в SharePoint. В предыдущей версии появилась объектная клиентская объектная модель, в текущей версии интерфейс пользователя создан с помощью JavaScript. Но многие разработчики SharePoint не используют эти возможности, создавая интерфейс "по-старинке", теряя возможность быстрой разработки, создавая некачественные решения и блокируя возможность развертывания решений в облаке.

Причины этому две - недостаток документации и использования языка JavaScript. Не секрет, что JavaScript недолюбливают многие программисты C# за динамическую типизацию и неочевидные особенности языка.

Я и сам раньше плохо относился к JavaScript и предпочитал создавать решения в серверном коде. Но недавно Microsoft выпустил типизированную версию языка JavaScript - TypeScript, который дает все преимущества компилируемого языка, сохраняя высокую скорость создания решений для SharePoint.

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

Я решил поделиться с вами накопленным опытом разработки с использованием TypeScript и JavaScript для SharePoint.

17 июля 2014 года пройдет семинар, посетив который вы научитесь:

  • Создавать и разворачивать приложения с клиентскими скриптами.
  • Применять популярные клиентские библиотеки jQuery и AngularJS в решениях для SharePoint.
  • Использовать клиентскую объектную модель для работы с объектами SharePoint на клиенте.
  • Кастомизировать интерфейсы для работы со списками и библиотеками SharePoint.

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

Стоимость участия - 3500 рублей при регистрации до 10 июля и 5500 рублей с 11 июля. Для тех, кто не сможет присутствовать лично - будет веб-трансляция.

Зарегистрироваться на событие «Создание решений SharePoint на JavaScript и TypeScript»

Также с 17 июля повышается стоимость видеозаписи прошлого семинара с 250 рублей до 400 рублей. Кто хочет приобрести видеозапись по старой цене – обращайтесь по ссылке http://gandjustas.justclick.ru/order/spsecurity/discount/