Пишем код

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

Archive for the ‘.net’ Category

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 Без рубрики

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 дп

Posted in Без рубрики

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 дп

Posted in Без рубрики

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

without comments

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

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

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

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

Written by Shaddix

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

Posted in Без рубрики

Включение упавших тестов в email-уведомления на TFS 2015 (scripted builds)

without comments

В TFS 2015 появилась новая система конфигурации сборок, которая в заметно лучшую сторону отличается от предыдущей системы, основанной на XAML. Конфигурирование билдов и создание собственных шагов сборки стало намного проще, и для этого больше не нужно обладать космическим набором знаний :)

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

Предыдущая система сборок предоставляла подробные email-оповещения о свалившихся тестах. В этих письмах, в частности, были перечислены упавшие тесты. В случае интеграционного тестирования это очень удобно: тесты зависят от внешних систем и поэтому могут иногда падать, и по списку непрошедших тестов легко диагностировать проблему и решить, нужно ли её исправлять, или это «типичная» проблема внешних систем, которая «пройдет» вместе со следующей сборкой.
Read the rest of this entry »

Written by Shaddix

Май 20th, 2016 at 8:54 пп

Posted in Без рубрики

Интеграция Xamarin.Forms в существующие проекты iOS (и утечки памяти)

without comments

Xamarin.Forms, о котором я недавно писал, отлично подходит для применения в новых приложениях и прототипирования нового функционала. Однако даже и в существующих больших приложениях могут появится новые требования, для реализации которых оптимально воспользоваться Xamarin.Forms.
Так получилось и в нашем случае, и в целом внедрение прошло гладко, кроме одной небольшой проблемы, обнаружившейся на самом последнем этапе. Об этой проблеме я и расскажу :)
Read the rest of this entry »

Written by Shaddix

Ноябрь 18th, 2014 at 11:00 дп

Posted in Без рубрики

Здравствуй, Xamarin.Forms, или пост, запоздавший на 4 месяца

with one comment

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

Меньше месяца назад, в июне 2014-го (да, заметка писалась еще в июле :)) ребята из Xamarin выпустили то самое, что от них ожидалось очень давно. Это — фреймворк для построения кроссплатформенного UI — Xamarin.Forms.
Такое решение — золотая середина между html-подобным интерфейсом, который выглядит ненативно на всех платформах, зато обладает на 100% общим кодом; и изначальным подходом Xamarin — где UI на каждой платформе полностью уникальный, отлично и естественно смотрится на всех устройствах, но требует разработки «с нуля» под каждую платформу.
Идея Xamarin.Forms в том, что многие базовые контролы пользовательского интерфейса так или иначе реализованы во всех системах (поддерживаются iOS/Android/WinPhone). Действительно, кнопки, надписи, поля ввода и переключатели есть везде. Xamarin выделил этот общий набор, собрал воедино все их свойства, и назвал эту абстракцию Xamarin.Forms. Из получившихся платформо-независимых классов можно строить интерфейс, а в результате под каждую платформу будет сгенерирован вполне естественный нативный UI с использованием «родных» компонентов.
Делать обзор функционала Forms через 5 месяцев после релиза слегка глуповато, так что я просто остановлюсь на некоторых плюсах и минусах, с которыми я успел столкнуться в процессе полу-продакшеновой практической эксплуатации Xamarin.Forms.
Read the rest of this entry »

Written by Shaddix

Ноябрь 15th, 2014 at 1:00 пп

Posted in Без рубрики

NoSQL против реляционных СУБД в задаче Entity-Attribute-Value

without comments

Задача хранения в базах данных схемы типа Объект — Множество Атрибутов — Значения атрибутов давно стала «классической».
В рамках реляционных СУБД, простейшее решение выглядит как-то так (anti-pattern detected!):

    public class Product
    {
        public int Id { get; set; }
        public List<propertyvalue> PropertyValues { get; set; }
        public string ProductTitle { get; set; }
        public decimal ProductPrice { get; set; }
    }

    public class Property
    {
        public int Id { get; set; }
        public string Title { get; set; }
    }

    public class PropertyValue
    {
        public int Id { get; set; }
        public Property Property { get; set; }
        public string Value { get; set; }
    }

И это не учитывая потенциальной типизации значений свойств (некоторые могут быть числовыми, другие — датой/временем и т.п.) и полагаясь на ORM для генерации таблицы связи много-ко-многим (Product/PropertyValue).
Read the rest of this entry »

Written by Shaddix

Август 6th, 2014 at 3:06 пп

Posted in Без рубрики

Видеозапись семинара по итогам конференции DevCon-2014 в Rubius

without comments

Мы в Rubius очень давно не проводили семинары (с последнего, кажется, прошло уже 5 месяцев), поэтому решили восполнить пробел и поговорить о перспективах развития технологий и разработки на платформе Майкрософт.
Я кратко презентовал наиболее запомнившиеся мне моменты с конференции DevCon-2014, а потом мы достаточно бурно обсудили, что со всем этим технологическим счастьем делать и как дальше жить :)

Мои извинения за ужасный звук :)

P.S. презентацию выложу по запросу, но особой необходимости в ней я не вижу.

Written by Shaddix

Июль 6th, 2014 at 3:09 пп

Posted in Без рубрики

Universal App — кроссплатформенное счастье с #ifdef’ами и рефакторингом

without comments

Еще на конференции Build 2014 майкрософтовцы рассказали о новом типе проектов — Universal App. Естественно, на прошедшем DevCon 2014 я постарался разузнать побольше об этом типе проектов, и как он может помочь при разработке под iOS/Android.

Microsoft традиционно акцентирует внимание на том, что UniversalApp поможет повторно использовать кода между WinPhone и WinRT приложениями, не слишком афишируя то, что начиная с Xamarin 3.0 этот подход сработает и для iOS и Android приложений.
Давайте попробуем и посмотрим, что же у нас получится :)
Read the rest of this entry »

Written by Shaddix

Июнь 12th, 2014 at 1:09 пп

Posted in Без рубрики