-->

понедельник, 25 января 2016 г.

Пишем простейший плагин для ReSharper

Многие знают, что ReSharper, помимо собственной логики, предоставляет возможности для ее дальнейшего расширения с помощью плагинов. Разработка расширений осуществляется с помощью ReSharper SDK - официального набора инструментов и библиотек от JetBrains. Довелось мне использовать данную технологию, и было это непросто, скажу я вам. Несмотря на высокое качество официальной документации, она все же не в состоянии объять необъятное. API библиотек зачастую неочевиден, а гайдов и мануалов от сторонних исследователей в сети очень мало, да и те устаревают с выходом каждой следующей мажорной версии. Искать нужную информацию на русском языке практически бесполезно, по моему опыту. Плагинов написано немного, и всенародной популярностью вряд ли пользуется хоть один - наверняка не последнюю роль в этом сыграл огромный и самодостаточный набор фич самого ReSharper, да еще и растущий с каждым релизом.

В итоге, когда я решил поделиться накопленными знаниями с общественностью, материала с лихвой хватило для размещения на habrahabr.ru:


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

Краткое содержание:
  1. Настройка среды разработки
  2. Пример №1: простейшее расширение-заглушка
  3. Установка плагина
  4. Отладка, полезные советы
  5. Пример №2: модификация кода с помощью R# API
  6. Функциональное тестирование плагинов средствами R# API
Выстраиваемое ReSharper синтаксическое дерево - уникальная технология, позволяющая творить невероятные вещи с кодом. Желаю этому продукту дальнейшего развития, больше полезных плагинов, и конечно же - больше интересных публикаций! 

пятница, 22 января 2016 г.

Запускаем исполняемые файлы через PowerShell. Боли нет.

Часто ли вам приходится запускать исполняемые файлы с десятком-другим параметров? Например:
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" ^ -source:package='long\way\to\package\foo.zip' ^
-dest:auto,computerName="https://another-app.scm.azurewebsites.net/msdeploy.axd?site=aaa",userName="bbb",password="ccc7",authtype="basic",includeAcls="False" ^
-verb:sync ^
-setParamFile:"long\way\to\package\foo.SetParameters.xml" ^
-AllowUntrusted ^
-setParam:"IIS Web Application Name"=homesweethome ^
-verbose
Если мне предстоит запустить подобного монстра более 2 раз за всю свою жизнь, я пишу скрипт на PowerShell, который сформирует список параметров, соединит список в результирующую строку, выполнит команду, да и еще поделится со со мной полезной отладочной информацией. Будь то шаг развертывания приложения через билд-сервер, запуск какой-либо тестовой утилиты - подобный подход в сочетании с системой управления версиями снижает сложность разработки и поддержки на порядки.

Начнем с того, что PowerShell предлагает различные способы запуска исполняемых файлов, такие как:
  • оператор &
  • Start-Process
  • Invoke-Expression
  • Start-Executable 
Приведу пример вызова Start-Process, т.к. обычно использую этот командлет:

Start-Process $msdeploy_exe -ArgumentList $params -NoNewWindow -Wait

Видите? Всё просто! А если список параметров собрать, используя знакомый любому .NET разработчику класс List<T>, то и код будет понятен любому коллеге (я надеюсь):

$list = New-Object -TypeName "System.Collections.Generic.List[string]"
 
$dest_template = '-dest:auto,computerName="https://{0}.scm.azurewebsites.net/msdeploy.axd?site={0}",userName="aaa",password="bbb",authtype="basic",includeAcls="False"'
 
$list.Add([string]::Format($dest_template, $web_url))
$list.Add([string]::Format("-source:package={0}", $package_path))
$list.Add([string]::Format("-setParamFile:{0}", $setparameters_path))
$list.Add([string]::Format("-setParam:'IIS Web Application Name'={0}", $web_url))
$list.Add("-verbose")
$list.Add("-verb:sync")
$list.Add("-AllowUntrusted")
 
# ensure space between params
$params = [string]::Join(" ", $list)

Да, интеграция со всей платформой .NET Framework - это неоспоримый плюс PowerShell-скриптов! По сравнению с первоначальным вариантом, читабельность и легкость сопровождения повысились в разы! На этом я заканчиваю пятиминутку в стиле Капитана Очевидность, и желаю всем поменьше рутины и побольше интересных задач!


понедельник, 18 января 2016 г.

Visual Studio 2015 и кириллица

Проблема: Visual Studio 2015 некорректно отображает кириллические комментарии в коде, заменяя их на "кракозябры" вида Äæèãóðäà. При этом в Visual Studio 2013 комментарии отображаются нормально. Дискуссия о пользе и вреде кириллицы в комментариях стоит отдельного поста, а сейчас я бы хотел описать способ решения данной проблемы, который сработал для нашей небольшой команды.

Прежде всего, в глаза бросилось то, что "пораженные" файлы с присутствием кириллицы сохранены в кодировке Windows-1251, тогда как вся остальная часть проекта - в UTF-8. А "кракозябры" возникают потому, что Visual Studio читает файл, ранее сохраненный в кодировке Windows-1251 как файл в кодировке Windows-1252 (Western European). Этот баг достаточно просто эмулировать в Notepad++:

  1. Создаем новый файл, пишем кириллический текст;
  2. Устанавливаем кодировку в Windows-1251: Encoding - Character sets - Cyrillic - Windows-1251;
  3. Сохраняем и закрываем файл;
  4. Вновь открываем файл;
  5. Устанавливаем кодировку в Windows-1252: Encoding - Character sets - Western European - Windows-1251;
Вот так привычное русское "Джигурда" превращается в загадочное "Äæèãóðäà". Отсюда вытекает первый способ решения проблемы: ручная или программная конвертация пораженных файлов в UTF-8. Что малопригодно для больших проектов, поэтому сразу перейду к следующим способам:
  • Оказывается, в компиляторе VS2015 есть баг, связанный с кодировкой, для его устранения необходимо установить Visual Studio 2015 Update 1 (доступен в Extentions and Updates). Пруф: https://github.com/dotnet/roslyn/issues/4022
  • Студия по-умолчанию использует настройки ОС для решения проблем с кодировкой. Необходимо настроить Windows: для русскоязычной версии (о ужас) идем «Языки и рег. стандарты - Дополнительно - Изменить язык системы» и устанавливаем русский язык.
Вышеописанных двух действий оказалось достаточно, чтобы полностью устранить проблему с кодировкой внутри команды, при этом на некоторых компьютерах с уже установленным сервис-паком баг не наблюдался вовсе, У нас даже остался неиспользованный туз в рукаве: установка расширения ForceUTF8, позволяющего принудительно сохранять в UTF-8 файлы, редактируемые Visual Studio. К сожалению, в штатном функционале Студии такая настройка отсутствует, да и перед использованием этого расширения пораженные Windows-1251 файлы придется перекодировать самостоятельно.

(Бес)полезная информация:
  • Visual Studio позволяет вручную задать кодировку для сохраняемого файла через Save As - Save with Encoding (жмем на стрелочку возле клавиши Save);
  • Есть настройка Options - Environment - Documents - Save documents in Unicode when data cannot be saved in codepage. Пользы от нее не замечено.
На этом на сегодня всё, да не коснутся вас проблемы с кодировкой!

понедельник, 11 января 2016 г.

Подсветка и форматирование кода на веб-страницах за 5 минут

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

Начну с насущной задачи: в ходе работы над очередным проектом (MVC 6, кстати) потребовалось "красиво" подсветить (highlight) выводимый посредством razor view кусок кода на языках XML/HTML. Как вы оцените трудозатраты на подобное решение? Поиск нужной библиотеки, интеграция, тестирование? На самом деле, работающий прототип можно получить уже через минуту.
Размещаем на странице код (интерпретируемый как текст, естественно) внутри тега <pre class="prettyprint"></pre>, рядом размещаем скрипт:
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
Всё! Несколько строк кода, и подсветка кода работает! google/code-prettify определяет язык автоматически и содержит правила для большинства популярных языков, в том числе C family, SQL, CSS и еще несколько десятков других. Все подробности - в публичном репозитории https://github.com/google/code-prettify.
Конечно же, данная библиотека доступна для скачивания и установки, как в традиционном для Visual Studio ручном режиме, так и через Bower. О втором способе чуть позже, а сейчас я про форматирование расскажу - этим  google/code-prettify не занимается. Для автоматического форматирования выводимого на странице кода использовался vkBeatufy ‑ еще один js скрипт, размещенный на GitHub: https://github.com/vkiryukhin/vkBeautifyУмеет vkBeatufy и обратную операцию - минификацию кода. Поддерживаемых языков куда меньше: XML, JSON, CSS, SQL, но для моей задачи этого хватило вполне. Подключаем скрипт, пользуемся:
vkbeautify.xml(text);
Приведу законченный пример обработки с использованием jQuery. После получения с сервера кодированного в HTML-encoded string текста, последующие раскодирование, форматирование и подсветка могут быть выполнены следующим образом:
var encoded = '&lt;pages&gt; &lt;namespaces&gt; &lt;add namespace=&quot;System.Web.Helpers&quot; /&gt; &lt;add namespace=&quot;System.Web.Mvc&quot; /&gt; &lt;add namespace=&quot;System.Web.Mvc.Ajax&quot; /&gt; &lt;/namespaces&gt; &lt;/pages&gt;';
var decoded = $("<div/>").html(encoded).text();
var formatted = vkbeautify.xml(decoded);
var element = $('pre.prettyprint');
//классом prettyprinted помечаются уже обработанные тэги <pre>
element.removeClass('prettyprinted');
element.text(formatted);
//ручной вызов google/code-prettify
prettyPrint();
Видимый результат на странице:
<pages>
    <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
    </namespaces>
</pages> 
Кстати, в MVC 6 для кодирования HTML-encoded string используется класс HtmlEncoder:
using Microsoft.Extensions.WebEncoders;
HtmlEncoder.Default.HtmlEncode(content);
И пару слов о работе с Bower в Visual Studio. Мне не понравился встроенный менеджер пакетов: установить тот же  google/code-prettify с его помощью мне так и не удалось. Пожелаем Visual Studio дальнейшего развития и больше классных инструментов, а для текущей работы я могу порекомендовать надстройку Package Installer. Бесплатная, поддерживает Bower, npm, JSPM, TSD и NuGet (!), работает быстро и по-моему опыту безотказно. Жаль, что для vkBeatufy вообще не оказалось подходящего Bower-пакета, поэтому пришлось устанавливать по старинке. На этом всё, удачи вам, и поменьше рутины!