Пишем код

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

Polymer и NotifyPropertyChanged в JavaScript

without 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

Долгожданный дизайнер для Xamarin.Forms

without comments

Кроссплатформенному UI-фреймворку Xamarin.Forms давно не хватало визуального дизайнера. Ну или хотя бы возможности в реальном времени, без занимающего минуту-две перезапуска приложения, посмотреть на результат своей работы.

И пока Xamarin не хотели выпускать и показывать свои разработки в этом направлении, потихоньку появились альтернативные возможности. Одна из них — это бета-версия Gorilla Player. Раскручен, прост в установке и достаточно неплох в использовании. Однако это всё на демо-проектах.
Когда заходит речь об использовании инструмента в серьезных приложениях, то сразу всплывают ограничения: не работают объявленные в App.xaml стили, сложности с Конвертерами и кастомными контролами.
Решение для Gorilla Player в использовании Gorilla SDK, однако завести всё это с использованием Xamarin.Forms 2.0 оказалось очень сложно (и лично мне не удалось вовсе :)).

Мы рассмотрим другое решение.
Read the rest of this entry »

Written by Shaddix

Июнь 5th, 2016 at 12:53 пп

Posted in xamarin

Включение упавших тестов в 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 .net,TFS

Комфортная Android-like верстка в iOS (XibFree)

without comments

Давайте признаем очевидное. Верстка экранов в iOS ужасна. Сравнивая с html, с WPF, с Android, с WinPhone — везде iOS проигрывает.
Верстка в iOS исторически напоминала WinForms (с аналогом якорей-Anchor’ов в виде AutoresizingMask). Однако WinForms уже давно отошло в прошлое, а iOS всё живет и живет :)
Да, на смену AutoresizingMask пришли Constraints, но работа с ними до жути неудобна, дизайнер ненаглядный, а результат работы — нечитаемый уже через неделю после создания.

А вообще, помимо удобства, наибольшей проблемой, конечно, становится динамическая верстка элементов. Если мы пришли из мира WPF/Android, то скучать по простейшему StackLayout/LinearLayout будем очень-очень сильно.
Возьмем например типичную задача: верстка элементов в строчку, при этом некоторые элементы могут быть спрятаны.

<stacklayout>
    <button></button>
    <button Visibility="Collapsed"></button>
    <button></button>
</stacklayout>

Чтобы задать такую верстку в iOS — придется изрядно помучаться. В случае со «старым» AutoresizingMask — это и вовсе невозможно, и придется разруливать координаты кнопок руками при каждом изменении видимости кнопок.
В случае «нового» и «продвинутого» LayoutConstraints — это, конечно, возможно, но намного сложнее и куда менее очевидно, чем xml-верстка.
Read the rest of this entry »

Written by Shaddix

Май 11th, 2016 at 11:39 дп

Запуск Genymotion и Xamarin Android Player на Windows 10

without comments

Для всех у кого есть проблемы с запуском эмуляторов на Windows 10. Ссылка, которая мне помогла:

https://forums.xamarin.com/discussion/comment/139102/#Comment_139102
Цитата на всякий случай:

Step 1
If you previously installed Xamarin Player and already got the error message uninstall Xamarin Player and Virtual Box, then go to AppData/ and delete the complete XamarinPlayer directory.. At least make sure that under AppData there is NO longer any XamarinPlayer directory anymore available otherwise it won’t work.
Step 2
Download and install Xamarin Player But don’t start it yet after installation
Step 3
Download and install the latest Virtual Box version (5.x) just install it over the existing Virtual Box, it will clean and update automaticly the existing instance.
Step 4
Open Virtual Box and go to File->Preferences->Networking and go to the Virtual Host Only Tab.
Klik on edit for the one existing network adapter (the screwdriver) and make sure the it is set in the following way:

_Adapter;
IPv4 Address: 10.71.34.1
IPv4 Network Mask: 255.255.255.0

DHCP Server;
Enabled
Server Address: 10.71.34.2
Server Mask: 255.255.255.0
Lower Address Bound: 10.71.34.101
Upper Address Bound: 10.71.34.199_

After this save settings and exit Virtual Box
Step 5
Launch Xamarin Android Player and start installing virtual machines available for download.
Now it will find the correctly configured host only network adapter.

Written by Shaddix

Май 8th, 2016 at 1:33 пп

Posted in xamarin

Ускорение Change-Build-Run цикла на iOS (работает и на Android)

without comments

UPD: Чтобы это все работало в Xamarin Studio 6 необходимо установить плагин отсюда: Continuous.Client.MonoDevelop.mpack (собрано из guthub).

В последнее время наш iOS продукт достаточно разросся, и по разным причинам (обоснованным и не очень :)) состоит из ~20 проектов). Все это, вкупе с новыми версиями Xamarin очень негативно сказывается на времени сборки и запуска.
Ну а UI часть, как известно, требует частого перезапуска/пересборки ввиду множества мелких изменений.

Ждать по 1-2 минуты, чтобы проверить, как будет смотреться увеличенный на 1 пиксель отступ, слегка поднадоело, и было решено поискать решения.

Read the rest of this entry »

Written by Shaddix

Февраль 25th, 2016 at 4:07 пп

Posted in xamarin

Xamarin.Forms и сложности интеграции в Android приложения

with 4 comments

UPDATE: код обновлен для работы с Xamarin.Forms 1.3.4+

Говоря о недостатках Xamarin.Forms в предыдущей заметке, я среди прочего упомянул и сложность интеграции в существующие Android-проекты, а именно трудности так называемого «частичного использования» Xamarin.Forms в андроид-приложениях.
«Частичное использование», с моей точки зрения, это возможность с легкостью взять и добавить технологию в уже существующий проект, и реализовать с её помощью функционал какой-то части приложения. В случае Xamarin.Forms — реализовать какую-нибудь часть экрана/компонент с использованием этой UI-библиотеки (без полного переписывания приложения на новой технологии).
Интеграция в iOS, как я писал в предыдущей заметке, проходит достаточно безболезненно (за исключением проблемы с утечкой памяти, о решении которой я так же написал).

Интеграция в Андроид усложняется тем, что метода, аналогичного iOS’овскому .CreateViewController() здесь не существует.
Read the rest of this entry »

Written by Shaddix

Ноябрь 26th, 2014 at 5:19 пп

Posted in Android,xamarin

Интеграция 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 .net,xamarin

Здравствуй, 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 .net,agile,xamarin

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 .net,EF,ravendb