Пишем код

Заметки о .net разработке

Using Mini-Profiler with Angular and HttpClient

without comments

Performance is essential for every web app, so profiling is a must. And there’s no better tool to monitor and profile your web app than Mini-Profiler from StackExchange. It’s simple, easily integratable and provides the most important profile metrics such as request duration and SQL queries.

Our typical Web SPA setup in Rubius is based on ASP.Net Core backend and Angular frontend. So we started integrating MiniProfiler into the stack, but it wasn’t that straightforward.

The thing is, MiniProfiler works perfectly with classic pages and jquery ajax calls, but fails to display any information on Angular http requests, which makes it barely usable in SPA.
To overcome it, there is a perfect post from Georg Dangl on how to make Mini-Profiler work with Angular if you’re using HttpModule, so go read Georg’s post and gist, it’s for you :)

However, in 4.3 Angular introduced HttpClientModule as a new way to talk to the backend API (replacing old HttpModule) and once we started to migrate to it we had the same issue again. There were no information about ajax requests.
So, I sat down and ported Georg’s gist to an HttpClient. So if you care about your performance and SQL queries, go grab it!

Written by Shaddix

Февраль 17th, 2018 at 11:33 дп

Posted in .net,angular,web

Семинар по ASP.Net Core в Точке Кипения

without comments

14 декабря вместе с коллегой Антоном Финько выступали в Точке Кипения с семинаром по ASP.Net Core.

y_eKgPHhHbs
Очень понравилась сама площадка — Точка Кипения — это отличное место, просторный зал, огромный экран и все пришедшие 60 человек там отлично разместились (и даже если было бы вдвое больше — всё равно всем было бы удобно :)). Фотографии не передадут всего комфрота и уюта (и кофе-брейка с плюшками), но покажут, насколько было хорошо:
4kZgU9Ke01U

nZQgjVYFvvE

F_UDmu7bIW8

Это было первое IT-мероприятие в Точке, и я считаю, оно прошло отлично! Небольшой 40-минутный доклад про теоретические основы и большой практический опыт, и более чем получасовая дискуссия после. Очень порадовал обмен мнениями и опытом использования от многих присутствовавших.

Ну а тем, кто не пришел — видео и презентация ниже :)

AspnetCore.pptx

ASP.Net Core from ArturDr

До встречи на следующих семинарах!

Written by Shaddix

Февраль 10th, 2018 at 11:58 пп

Доклад по кроссплатформенной мобильной разработке на DevPro Красноярск

without comments

25 ноября выбрался в Красноярск, чтобы посетить местную конференцию D2D DevPro.
Организовывали её наши коллеги и партнеры из Аспирити, и получилось очень неплохо. 300+ человек, 3 параллельных секции — это первая IT конференция такого масштаба в Красноярске!

С удовольствием выступил и рассказал о подходах к кроссплатформенной разработке, про свой любимый Xamarin, про набирающий популярность React Native. Демо-показ возможностей React Native / Xamarin Forms / Xamarin на сходных примерах очень удачно продемонстрировал development experience при использовании кроссплатформенных фреймворков.

С видео наши красноярские друзья, к сожалению, подкачали, поэтому выкладываю видео с «репетиции» доклада, которая прошла в Томске за пару недель до DevPro :) А вот презентация — уже с самого Красноярска, доработанная и улучшенная.

Слайды:
Cross Platform.pptx

Кросс-платформенная мобильная разработка from Artur Drobinskiy

Written by Shaddix

Февраль 5th, 2018 at 12:27 дп

Posted in семинары

Realmius — бесплатная синхронизация данных между Realm и SQL Server

without comments

На ДевПро-2017 я рассказывал про мобильную базу данных Realm и преимуществах её использования в мобильных приложениях.

В докладе мы также говорили о синхронизации данных — это механизм, который пересылает добавленные/измененные объекты между клиентом и сервером, чтобы данные в клиентской и серверной базах совпадали.
Автоматическая синхронизация данных в мобильных приложениях очень удобна — она позволяет абстрагироваться от наличия/отсутствия интернета на устройстве и просто работать с локальной БД, читать и писать напрямую в неё. При этом получение новых данных или отправка данных на сервер отдается на откуп механизму синхронизации.

Realm имеет встроенный механизм синхронизации, однако он недостаточно удобен, в докладе на ДевПро я подробно останавливался на его минусах.

В Рубиусе мы начали активно использовать Realm в начале 2017-го, и, столкнувшись с недостатками встроенной синхронизации, решили этот момент улучшить.

Так появился Realmius — механизм синхронизации между Realm и SQL Server. В своих проектах мы его используем с марта (в том числе и в приложении DevPro), выложили на гитхаб в мае (как раз в преддверии ДевПро), и последние несколько месяцев активно улучшали документацию, чтобы сделать порог вхождения как можно ниже.

Почему стоит использовать Realmius? Всё просто:

  • Данные хранятся в SQL Server. Это значит, что на сервере можно выполнить любой SQL-запрос и получить произвольную аналитику по данным, использовать привычные инструменты для написания бэкэнда, бэкапы и все прочие плюшки проверенной и мощной серверной СУБД.
  • Возможность гибкой настройки прав доступа к данным
  • Автоматическая синхронизация: работайте с Realm на клиенте и EntityFramework на сервере привычным образом, синхронизация не накладывает никаких ограничений. Настройка синхронизации буквально в несколько строк
  • Бесплатность :)

Заинтересовало? Просто скачайте репозиторий и запустите наш простой пример! Когда захочется копнуть глубже в авторизацию и ограничения прав доступа — тут уже пригодится более продвинутый пример.

Realmius доступен через nuget, пара минут — и синхронизация уже интегрирована в ваше приложение! :) Подумайте, какие богатые возможности может добавить синхронизация данных в ваше новое мобильное приложение на Xamarin!
Кстати, Realmius можно использовать и в приложениях для Windows!

P.S. На днях пришло письмо из дружественной Индии — совершенно незнакомая нам компания нашла Realmius и начала его использовать. У них появились некоторые проблемы, которые в переписке мы успешно разрешили. Был очень удивлён, что без какого-либо пиара библиотека уже начинает набирать пользователей :)

Written by Shaddix

Август 11th, 2017 at 5:42 пп

Posted in .net,database

Opensource инициатива Rubius

without comments

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

Ну и решили, как компания, внести свой небольшой вклад в развитие свободного ПО. Поэтому совсем недавно у Рубиус появился аккаунт на гитхабе. Там уже выложены некоторые интересные вещи:

  • Xamarin-контролы: Яндекс-карты, таблицы, MaskEdit, календарь и прочее.
  • Realmius — мощное средство двухсторонней синхронизации БД SQL Server и Realm (убийца SQLite).
  • TFS-task для отправки списка упавших тестов на email

Посмотрите, может быть, вы найдёте что-то новое и интересное для себя.
Надеюсь, со временем проектов в open-source у нас будет всё больше и больше.

Written by Shaddix

Июль 30th, 2017 at 6:44 дп

Entity Framework Core и GroupBy

without comments

В новом проекте ударились во все тяжкие и используем всякие эти ASP.Net Core и Entity Framework Core.
От нового MVC впечатления исключительно положительные, от нового EF — откровенно смешанные :)

Список missing features в EF очень велик, из базового: нет GroupBy, Lazy-loading (хотя может, это и к лучшему :)), а главное, некоторые запросы, которые в EF6 спокойно выполнились бы в SQL имеют обыкновение выполняться в памяти, приводя к классическому SELECT N+1 причем прямо внутри запроса.

Отсутствие GroupBy заставило гуглить альтернативные подходы, и довольно быстро нашелся EFSqlTranslator. Если кратко, он парсит linq, сгенерированный на EF-сущностях, генерирует SQL и отправляет его через Dapper в базу (используя соединение от EF). То есть такой read-only Entity Framework :)
Поддерживает Join, GroupBy, аггрегаты, и много всего такого. При этом на удивление, не поддерживал:

      Несколько запросов подряд через один EF контекст
      Булевские типы и DateTime context.Messages.Where(x => x.IsDeleted)
      Булевские предикаты в .Any(x => x.IsDeleted) и .Count(x => x.IsDeleted)
      Join по агррегатным функциям
      Запросы с использованием переменных var deleted = true; context.Messages.Where(x => x.IsDeleted == deleted)

В общем, проект с на удивление мощным linq-парсером, при этом на удивление сырой :)
За последнюю неделю от меня в него улетело около десятка пулл-реквестов, которые экстремально быстро оказались в мастере. Теперь используем и радуемся :) Как можно EFCore использовать без него — просто не представляю.

Written by Shaddix

Июль 20th, 2017 at 6:04 дп

Доклад о Realm и самописной бесплатной синхронизации данных Realmius

without comments

Выступил на DevPro 2017.
Сделал доклад про новую мобильную БД Realm и как мы написали для неё альтернативный механизм синхронизации с хранением данных в SQL Server.

Всем рекомендую использовать как Realm, так и Realmius :) У нас есть даже документация!

А слайды и видео, как обычно, ниже :)

Убийца SQLite, или Мобильная БД с блек-джеком и синхронизацией from ArturDr

Written by Shaddix

Июль 5th, 2017 at 1:11 пп

DevPro 2017

without comments

Крупнейшая томская конференция для разработчиков DevPro 2017 состоялась :)
Расширились до трех параллельных треков (в прошлом году было два, и «технический» был весьма скомканный).
Видеозаписи всех докладов смотрите на Ютубе!

Мне посчастливилось поучаствовать в конференции не только в качестве докладчика, но и в качестве «программного директора». Это значит, что все претензии по поводу качества докладов нужно адресовать непосредственно мне :)

По моему скромному мнению (а также по оценкам докладов в мобильном приложении) доклады получились очень хорошие, за исключением откровенно неудачных двух «внешних». Иногородние спикеры обошли жесткую систему предварительных прослушиваний и.. получилось, что получилось. Зато были замечательные доклады от Аспирити про управление, Игоря Бычкова про Микросервисы и лучший по зрительскому голосованию доклад о выводе продукта на рынок — Planyway.

Как обычно, наиболее популярными были «лёгкие» доклады, без глубокого погружения в техническую часть. Но в этот раз и «хардкорные» технические темы были отмечены достаточно высокими оценками. Это и доклад про архитектуру и DDD, и вопросы безопасности, и сравнение языков программирования и интересный и сложный доклад про новую для нас область — BigData и MachineLearning.

И доклады, и развлекательная программа в целом создавали очень динамичную и позитивную атмосферу, от которой, уверен, каждый зарядился энергией на новые подвиги в нашей сложной айтишной сфере :) Собрать талантливых людей вместе, чтобы обменяться опытом и еще больше повысить свой уровень — в этом и есть в первую очередь задача конференции!

Была, конечно, и ложка дёгтя в виде откровенно маленького Синего зала, где зрителям откровенно не хватало места. Что ж — это лишний повод расти и в следующем году занимать залы куда большей вместимости. До встречи на ДевПро-2018!

Written by Shaddix

Июль 1st, 2017 at 1:21 пп

Posted in семинары

Доклад о веб-компонентах и Polymer

without comments

Сегодня отметился докладом на томском локальном митапе фронтэнд разработчиков TomskJS.
Рассказывал про веб-компоненты и Polymer. Презентацию смотреть на Слайдшаре

Веб-компоненты в веб-разработке на примере Polymer from ArturDr

или скачивать по ссылке.

Видео:

Written by Shaddix

Сентябрь 3rd, 2016 at 10:51 пп

Posted in javascript,web

Polymer и NotifyPropertyChanged в JavaScript

with 15 comments

Есть замечательный фреймворк построения веб-приложений — Polymer. Это даже скорее не фреймворк, а реализация идеологии WebComponents в современных реалиях веб-браузеров.

Если кратко, то с его помощью можно реализовывать полноценный, удобный и быстрый (как с точки зрения производительности решения, так и скорости разработки) MVVM в JavaScript:

<dom -module id="my-component">
  <template>
    <h4>ToDo list for {{name}}:</h4>
    <ul>
      <template is="dom-repeat" items="{{model.todoitems}}">
        <li>{{item.title}}</li>
      </template>
    </ul>
    <button title="ChangeName" on-tap="ChangeName"></button>
  </template>
</dom>
<script>
Polymer({
  is: 'my-component',
  name: 'Artur',
  model: {
    items: [
      {title: '1'}
    ]
  },
  ChangeName: function() {
    this.model.name = this.name + "_1";
  },
});
</script>

В WPF мы привыкли, что интерфейс перерисовывается автоматически, при изменении значения свойства: this.name = ‘New Name’;. Однако у многих js-mvvm-фреймворков, присвоения приходится производить с помощью магических функций: this.set(‘name’, this.name + «_1»). В Polymer успешно работает первый (удобный :)) вариант, однако при работе с массивами и вложенными объектами эти прелести заканчиваются. Код добавления новых элементов в список ToDo выглядит примерно так:

Add: function() {
  this.push('items', {title: 'another item'});
}

Редактирование же элементов в списке (например, изменение title) будет еще более ужасным:

  this.set('items.1.title', 'new title!');

Read the rest of this entry »

Written by Shaddix

Июль 4th, 2016 at 7:14 дп

Posted in javascript,web