среда, 27 декабря 2017 г.

О блоге

Зачем этот блог?
Особого замысла нет. Блог мне нужен для самоорганизации в голове собственных мыслей. Глубже проработать, понять и запомнить материал. Когда объясняшь кому-то, то лучше и сам начинаешь разбираться в вопросе.

Какая тематика?
Буду описывать то, с чем сталкиваюсь по жизни. А это приемущественно работа - программирование. Ну и конечно же будут посты - размышления, да и просто нытье. 

Для кого?
Буду писать для себя, а не для аудитории. Если кому-то будет польза, то можно считать это приятным бонусом. Интроверты ориентированы более на внутренний мир, нежели на мир внешний. Но возможно получиться найти с помощью блога своих единомышленников.

Какие цели?

  1. Выйти из зоны комфорта.
  2. Переключить свой мозг с потребления контента на генерацию контента.
  3. Раскочегариться на активность.

Outlook.com vs export csv - something went wrong

Долго был пользователем windows phone. Но майкрософт забил на его поддержку. Последней каплей стало прекращение поддержки Skype, который кстати тоже принадлежит майкрософт. Купил смартфон на Android. Теперь необходимо перенести список контактов. Погуглил. Нарисовалась следующая схема:
  1. Зайти в учетную запись Outlook.com.
  2. Перейти в раздел "Люди".
  3. Экспортировать список контактов в csv файл.
  4. Открыть учетную запись google.
  5. Импортировать список контактов csv.
Все просто, но на шаге три меня постигла неудача:
Перепробовал все возможные варианты в разных браузерах, но:
Набивать сотню контактов вручную на телефоне мне совсем не хотелось. Гугл пришел на помощь. Они реализовали импорт контактов из outlook напрямую:



вторник, 26 декабря 2017 г.

ASP.NET Core + NPM + Bootstrap 4

Решил попробовать bootstrap 4 в asp.net core web app. Но оказалось не все так просто ((
Создаю новое веб-приложение:
По умолчанию оно создается с bootstrap 3.3.7. Manage bower packages...
Четвертой версии в списке нет. Правильно, она же пока бета. Ставлю галку Include Prerelease:
Появилась в списке. Нажимаю кнопочку Update. Чуда не произошло:
Ничего страшного, уже привычный... Смотрю очередной бред в окне output:
EMALFORMED Failed to read ... Additional error details:
Unexpected token @
В гитхабах читаю, что это типа нормально. Просто bootstrap перестал поддерживать bower. Смирись и живи дальше. А на сайте bower я уже давно заприметил однозначный посыл
...psst! While Bower is maintained, we recommend using Yarn and Webpack for front-end projects read how to migrate!
Погуглил. Умные (наверное) люди советуют переходить на npm. Он говорят жил, жив и будет жить. Хорошо, попробуем...
Удаляю bower и все с ним связанное:

  • удаляю bower.json
  • очищаю папку wwwroot\lib
Создаю в корне проекта package.json:
Прописываю в нем то что нужно для bootstrap 4:
{
    "version": "1.0.0",
    "name": "asp.net",
    "private": true,
    "dependencies": {
        "popper.js": "1.12.9",
        "bootstrap": "4.0.0-beta.2"
    }
}
По аналогии там прописываются все остальные нужные библиотеки типа JQuery и проч.
Дальше происходит закулисная магия и в корне проекта появляется папка node_modules со всеми прописанными библиотеками. В проект эта папка не включена. Да и не нужна она там.

Вылезают два момента:

  1. Все статические файлы скриптов, стилей и т.п. должны лежать в wwwroot. Желательно там же где они и были, т.е. в wwwroot\lib. Там все будут ожидать увидеть вспомогательные сторонние библиотеки, которые пользует веб-приложение. В некоторых статьях советуют подключить к статическим файлам asp.net всю папку node_modules, но...
  2. В папке node_modules лежит куча барахла, типа исходного кода, неминифицированной версии библиотеки, справочной инфы, описания. Все это добро я не хочу видеть ни в репозитории исходного кода ни в своем веб-приложении. 
Погуглил. Умные (наверное) люди советуют для решения этих двух проблем использовать gulp. Grunt говорят устарел. Типа ставишь gulp, настраиваешь его прямыми руками и он тебе будет копировать из node_modules в wwwroot\lib, минифицировать и варить кофе.

Я .net разработчик с десятилетним стажем, изощренный в winforms, webforms и прочих forms не особо вник, что такое есть эти gulp, grunt и зачем мне вообще все это добро. Но надо пощупать...
Вкратце расскажу как было дело. Ставлю gulp. Настраиваю его прямыми руками. Он молодец - все делает - копирует, минифицирует, варит кофе. А главное его поддерживает Visual Studio. В контекстном меню Task Runner Explorer можно запускать все gulp-задачи, когда тебе хочется. Но... 

  • В node_modules появилась куча папок нужных gulp-у библиотек.
  • В gulp нужно разбираться. И мне, не особо изощренному во фронтендах разработчику, оно не особо хорошо зашло. 
  • Моим коллегам тоже придется все это ставить, разбираться, вникать...
  • В gulp надо настраивать копирование каждого скрипта, стиля и проч. Он не умеет сам определять, что важное и нужное скопировать из node_modules. А по сути надо скопировать только минифицированные файлы css и js.
  • Появилось ощущение, что для решения простых задач народ в интернетах советует слишком навороченные штуки.
Задача решается вполне знакомым инструментом из коробки - MSBuild. 

Создаю в корне проекта файл CopyLib.targets:
<Project Sdk="Microsoft.NET.Sdk.Web">
    <Target Name="BeforeBuildCustom" AfterTargets="BeforeBuild">
        <Message Text="Restore npm packages." Importance="high" />
        <Exec WorkingDirectory="$(ProjectDir)" Command="npm install" ContinueOnError="false" />
        <Message Text="Copy files from node_modules to wwwroot\lib." Importance="high" />
        <Copy SkipUnchangedFiles="true" SourceFiles="$(ProjectDir)node_modules\bootstrap\dist\css\bootstrap.min.css" DestinationFolder="wwwroot\lib\bootstrap" />
        <Copy SkipUnchangedFiles="true" SourceFiles="$(ProjectDir)node_modules\bootstrap\dist\js\bootstrap.min.js" DestinationFolder="wwwroot\lib\bootstrap" />
        <Copy SkipUnchangedFiles="true" SourceFiles="$(ProjectDir)node_modules\popper.js\dist\umd\popper.min.js" DestinationFolder="wwwroot\lib\popper.js" />
    </Target>
</Project>
По аналогии добавляется копирование всех остальных библиотек.
В csproj файл веб-приложения подключаю созданный файл:
<import project="$(MSBuildProjectDirectory)\CopyLib.targets" />
Перед сборкой проекта MSBuild:

  • восстановит все npm-пакеты с bootstrap и прочими библиотеками
  • скопирует нужные файлы в wwwroot\libs

Т.о.:

  • Используется знакомый и проверенный инструмент MSBuild
  • Не нужно затаскивать в проект новые инструменты и объяснять коллегам, что такое gulp и зачем он нужен .net разработчику. Черепная коробка не резиновая, все туда не влезет.

ASP.NET Core 2.0 - потеряли bower.json

В очередной раз обновил Visual Studio 2017. Теперь до версии 15.5.2. Создал проект asp.net core 2.0 web app. И не увидел там конфига bower.json. Раньше от точно создавался. Все включенные в проект по умолчанию библиотеки типа Bootstrap и JQuery были протянуты через bower.
При этом в папке lib все по прежнему - типа как из bower:
Решил проверить как оно в asp.net core 1.1. Создал дефолтный проект. В нем bower.json есть:
Неужели забыли добавить в шаблон asp.net core 2.0? Или bower is dead? На главной странице bower.io висит многозначительная фраза:
...psst! While Bower is maintained, we recommend using Yarn and Webpack for front-end projects read how to migrate!





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

Обновление TortoiseSVN

После очередного обновления TortoiseSVN до версии 1.9.7 начала вылетать ошибка "SendRpt.exe not found":


Взял SendRpt.exe из директории установки черепахи у коллеги и скопировал себе. Не помогло.

Решил проблему Repair из инсталятора черепахи:

Наиболее эффективное программирование на C# - Билл Вагнер (2-е издание)

Закончил чтение очередной книги Билла Вагнера - Наиболее эффективное программирование на C#. 50 способов улучшения кода (2-е издани...