четверг, 30 октября 2014 г.

Статистика и аналитика для мобильного приложения: используем Flurry в Windows Phone 8


Разработка и продвижение сравнительно серьезных мобильных приложений практически невозможна без анализа того, что делает пользователь в вашем приложении, из какого источника он произвел установку и анализа различных статистических параметров в магазине приложений. На сегодняшний день существует три основных направления в аналитике мобильных приложений:
  • Трекинг источников установок (такие инструменты как Mobile App Tracking, AppsFlyer и ADXtracking, используются, как правило, для продвижения приложений);
  • Аналитика внутри приложения (наиболее известные инструменты – это Flurry, Google Analytics, Яндекс.Метрика и Mixpanel, которые предоставляют возможность наблюдать за поведением пользователей внутри мобильного приложения, что позволяет принять решение о дальнейшем развитии вашего продукта);
  • Сбор статистики из магазинов приложений (самые популярные сервисы – это App Annie и Distimo, позволяют отслеживать позицию в сторе как вашего приложения, так и конкурентов).
Поскольку данная статья предназначена для разработчиков, речь в ней пойдет о том, как внедрить аналитику в приложение Windows Phone. В качестве системы аналитики будет рассмотрена Flurry Analytics.

среда, 7 мая 2014 г.

CLR и Windows Runtime (WinRT)

С выходом Windows 8 разработчикам стала доступна новая библиотека классов - Windows Runtime. Компоненты WinRT могут использоваться в приложениях Windows Store и настольных приложениях; в неуправляемом коде C/C++, в JavaScript, а также в C# и Visual Basic.

Метаданные Windows Runtime

На внутреннем уровне компоненты WinRT представляют собой компоненты COM (Component Object Model), для описания API которых теперь используются метаданные. Эти метаданные хранятся в файлах с расширением *.winmd и представляют собой обновленную версию метаданных .NET, которые кодируются в соответствие с правилами раздела №2 (Metadata Definition and Semantics) стандарта ECMA-335. Поскольку обычные сборки .NET Framework кодируются с помощью этого же стандарта, это говорит о том, что вы можете использовать знакомые средства (такие как ildasm.exe, Object Browser) для просмотра содержимого этих файлов.
По большей части, просмотр WinMD файла с помощью утилиты ildasm.exe очень похож на просмотр стандартной управляемой сборки. Есть несколько различий, которые могут быть видны - в первую очередь то, что WinMD файлы, в общем, не содержат никаких Intermediate Language (IL) инструкций. Вместо этого, эти файлы описывают API, предоставляемые Windows Runtime. Реализация этих интерфейсов может быть полностью отделена от их определения, и по сути, может быть записана в машинном коде. Тем не менее, для разработчиков управляемых приложений, детали реализации WinRT API не имеют значения, потому что управляемый код должен видеть только определения API, которые он вызывает. За кулисами, Common Language Runtime (CLR) и операционная система Windows соединяют для вас определения API и их реализации.
Например, в файле метаданных Windows.Foundation.winmd (находится в каталоге %WinDir%\System32\WinMetadata) вы можете обнаружить следующий тип Windows.Foundation.Collections.PropertySet, конструктор которого не содержит тела, потому что тип реализуется в native code.

Тем не менее, метаданные, которые описывают этот тип позволяют CLR получить экземпляр реализации при вызове конструктора класса.
При просмотре Windows Runtime метаданных можно также заметить, что определения типов и сборок используют новое ключевое слово WindowsRuntime.


Это ключевое слово является контекстно-зависимым и по разному интерпретируется в зависимости от того, где оно применяется. Например, если ключевым словом помечено определение типа (TypeDef), то этот тип подчиняется правилам системы типов Windows Runtime и вызов этого типа следует рассматривать как вызов WinRT API.

воскресенье, 27 октября 2013 г.

Асинхронная загрузка данных с индикацией

Я как-то уже затрагивал тему асинхронной загрузки данных в своей статье TaskExtensions в помощь. Однако, используя такой подход, код со временем начинал обрастать огромным количеством callback'ов и командами. Чтобы оптимизировать данный процесс для своих нужд я сделал класс, которым и хочу поделиться. Ничего нового в нем нет, однако, он позволил сократить огромное количество кода и на мой взгляд является весьма интересным.
Суть класса такова: предоставить пользователю коллекцию динамических данных с выдачей уведомлений при обновлении, а также обеспечить механизм индикации загрузки данных, при этом выбор источника данных предоставить потребителю.
Самый классический сценарий для UI-девелопера: список объектов и кнопка "Обновить". Я решил совместить это в одной коллекции:

public sealed class AsyncObservableCollection<T> : ObservableCollection<T>, ICommand
{
    private readonly Func<Object, Task<IEnumerable<T>>> factory;

    public AsyncObservableCollection(Func<Object, Task<IEnumerable<T>>> factory)
    {
        this.factory = factory;
    }
}

четверг, 26 сентября 2013 г.

Совершенный код



Если бы я прочитал эту книгу года 3-4 назад, мне бы она показалась гораздо интересней...
Автор очень подробно описывает организацию кода (занимает первую половину книги), поэтому для тех, у кого с этим проблемы - это просто кладезь знаний. Вторая часть книги, которая посвящена усовершенствованию кода и конструированию, для меня оказалась более интересной. Поражает такое количество источников, из которых автор черпал материал для своей книги. Во многих главах приводятся результаты различных исследований в области разработки ПО, и хотя некоторые из них устарели, они все равно очень интересны и порой удивляют.

четверг, 29 августа 2013 г.

Атлас Москвы

Приложение "Атлас Москвы" предоставляет легкий и удобный доступ к открытым данным портала правительства Москвы. Эти данные представляют интерес не только для самих государственных органов и не только для целей государственного управления, но и для граждан, бизнес-сообщества, научных, социальных, образовательных институтов, гражданских активистов.





















четверг, 25 июля 2013 г.

Barley-Break Update!

Сегодня обновил дизайн своего первого приложения в Windows Store - Barley-Break. Вроде неплохо получилось! :)


Сохранение настроек приложения в изолированном хранилище

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

Что из себя представляют настройки приложения? Это коллекция пар ключ/значение. То есть это некоторый IDictionary<TKey, TValue>, где в качестве ключа выступает, как правило, строковый параметр, а в качестве значения, в идеале, может быть любой объект. Если внимательно посмотреть на пространство имен System.IO.IsolatedStorage, то можно обнаружить, что класс с таким функционалом уже есть - это IsolatedStorageSettings. Однако он доступен только для Silverlight и Silverlight for Windows Phone. А для настольных приложений доступен только класс IsolatedStorageFile, который представляет область изолированного хранения, содержащую файлы и папки. То есть разработчики настольных приложений здесь несколько обделены функционалом. Собственно этот пробел я и решил заполнить.

Идея до безобразия проста: ключ - это файл в изолированном хранилище, в котором хранится значение этого ключа в виде сериализованных двоичных данных. Однако, если ключ будет состоять из символов, которые не могут содержаться в имени файла (\/:*?"<>|), возникает проблема. Решение, в принципе, такое же простое - хранить значения оригинальных ключей в отдельном служебном файле и каждому такому значению сопоставлять уникальный идентификатор, по имени которого будет создаваться файл для хранения значения оригинального ключа. Если не совсем понятно, то надеюсь рисунок все прояснит:

(info.dat - служебный файл, Key - оригинальный ключ, Guid - уникальный идентификатор)

понедельник, 1 июля 2013 г.

Мифический человеко-месяц


На днях закончил чтение книги Фредерика Брукса "Мифический человеко-месяц". Не смотря на то, что первое издание книги было выпущено в 1975 году, а второе (которое я собственно и читал) - в 1995 году и даже учитывая тот факт, что некоторые главы книги окончательно устарели, тем не менее этот бестселлер просто напичкан фразами, которые актуальны и по сей день. Конечно, эта книга уже давно разошлась на цитаты, но я позволил себе выписать те, которые понравились лично мне.

четверг, 30 мая 2013 г.

Локализованный BooleanToStringConverter.

Для разработчиков пользовательских интерфейсов актуальна задача отображения значения типа Boolean в виде локализованной строки. Т.е. вместо "True" и "False" требуется отобразить "Да" и "Нет" (естественно в зависимости от языка ОС). В связи с этим, хочу предложить интересное решение.
Для начала следует определиться, откуда получить локализованное значение типа Boolean в человеческом виде? Для этого используем библиотеку "User32.dll", которая и вернет нам эти данные.


Как видно на скриншоте, под идентификаторами 805 и 806 имеются строки "&Да" и "&Нет" соответственно. Вот их и будем использовать.

среда, 22 мая 2013 г.

Windows Store. Приложение Fisheye.

Хочу представить свое новое приложение для магазина Windows Store - Fisheye. Оно позволяет просматривать WEB-камеры по всему миру. Также есть возможность добавлять новые камеры на карту.


На текущий момент функционал приложения достаточно простой, но есть много идей по развитию данного направления. Так что, в зависимости от свободного времени, буду развивать и добавлять новый функционал и новые WEB-камеры.

Если есть пожелания - буду очень рад выслушать.
Спасибо!

вторник, 14 мая 2013 г.

Windows Store App. Подключение шрифта.

Несмотря на руководство по шрифтам для приложений магазина Windows, которое рекомендует использовать Segoe UI шрифт для элементов пользовательского интерфейса, иногда может возникнуть потребность подключить дополнительный шрифт. Однако этот шрифт может отсутствовать на клиентском компьютере и соответственно будет использоваться шрифт по умолчанию. Далее я опишу как можно внедрить шрифт в приложение Windows Store  на примере 3D LET.
Для этого скопируем файл шрифта (в данном случае 3dlet.ttf) в папку Assets и добавим его в проект. Установим свойство Build Action = Content и Copy to Output Directory = Do not copy. Тем самым наш новый шрифт будет распространяться вместе с приложением.
Теперь, чтобы использовать этот шрифт, потребуется правильно указать свойство FontFamily объекта TextBlock ( FontFamily = "{TTF File Name}#{Font Name}" ):

MainPage.xaml:
    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Grid.Row="1" Text="3D LET BRK FONT" FontFamily="Assets/3dlet.ttf#3D LET BRK" FontSize="64" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>

При этом текстовый блок примет новый вид:


среда, 24 апреля 2013 г.

Bing Maps. Стилизация Pushpin.

В этой статье я продолжу обзор использования Bing Maps в приложениях Windows Store. Но на этот раз я расскажу как стилизовать Pushpin-объекты на карте для различных типов объектов. Сразу приведу результат программы, чтобы было понятнее о чем идет речь.




Как видно, на карте расположено несколько объектов различного типа (магазины, кинотеатры, POI). Все эти объекты находятся в одной коллекции MapItemsControl объекта Map.

суббота, 13 апреля 2013 г.

Bing Maps в приложениях Windows Store.

Если вы разрабатываете приложение, которое используют геолокацию - без карт вам не обойтись. В данном посте я расскажу как внедрить карты в свое Windows Store приложение на примере Bing Maps.

Первым делом нужно создать Bing Maps Account (можно использовать свою учетную запись Microsoft). Для того, чтобы использовать карты в своем приложении потребуется также создать Bing Map Key (в разделе Create or view keys), который используется для проверки подлинности карты. На данный момент существует три типа ключей:
  • Trial (используется в течение 90-дневного периода, при этом количество транзакций не должно превышать 10 000 за любой 30-дневный срок);
  • Basic (не имеет периода использования, однако количество транзакций не должно превышать 50 000 за 24 часа.);
  • Enterprise (используется для корпоративных учетных записей).
В таблице ниже приведены примеры, когда и какой ключ можно использовать:

Trial key Basic key Enterprise key
Public website + + +
Private website + - +
Mobile + + +
Windows Store app + + +
Business asset managment + - +
Education + + -
Not-for-profit + + -

После того как нужный ключ создан - следует установить Bing Maps SDK for Windows Store apps. Теперь все готово - перейдем непосредственно к приложению.

понедельник, 8 апреля 2013 г.

Azure Mobile Service - Как получить все данные?

Разбираясь с Windows Azure Mobile Service, наткнулся на очень интересный нюанс: при запросе данных с помощью метода IMobileServiceTable<T>.ToListAsync (и других аналогичных методов соответствующего интерфейса) количество возвращаемых записей (по умолчанию) не превышает 50! (Более подробно можно прочитать здесь).

Example:
    var mobileServiceTable = App.MobileService.GetTable<SomeObject>();
    var cloudList = await mobileServiceTable.OrderBy(obj => obj.SomeProperty).ToListAsync();
    var count = 0;
    foreach (var item in cloudList)
    {
        count++;
    }
    Debug.WriteLine(count);
Если кол-во объектов SomeObject > 50, count все равно будет равен 50

То есть для того, чтобы получить 150 записей, нужно использовать метод IMobileServiceTable<T>.Take и непосредственно указывать нужное количество. А если это количество заранее не известно? К примеру, нужно синхронизировать базу данных в облаке с локальной копией.
Чтобы узнать общее количество записей, потребуется интерфейс ITotalCountProvider, используя который можно получить количество всех записей, возвращаемых запросом.

Example:
    var mobileServiceTable = App.MobileService.GetTable<SomeObject>();
    var cloudList = await mobileServiceTable.OrderBy(obj => obj.SomeProperty).IncludeTotalCount().ToListAsync();
    var countProvider = cloudList as ITotalCountProvider;
    Debug.WriteLine(countProvider.TotalCount);
    var count = 0;
    foreach (var item in cloudList)
    {
        count++;
    }
    Debug.WriteLine(count);

Однако, это не решает проблему, так как переменная count будет по прежнему равно 50 (хотя TotalCount = 150).

суббота, 30 марта 2013 г.

Создание мобильной службы в Windows Azure

В продолжение знакомства с Windows Azure я расскажу как можно легко создать мобильную службу в облаке. Чтобы выполнить данный пример потребуется:

  1. Наличие подписки на Windows Azure (можно бесплатное пробное использование);
  2. Установленный пакет Mobile Services SDK.
Процесс создания службы достаточно прост. Для этого, в панели управления Windows Azure , следует зайти в раздел "Мобильные службы" и выбрать пункт "Создать".






Указываем имя мобильной службы (в конечном варианте оно будет следующим: https://{You Name}.azure-mobile.net), экземпляр базы данных, в которой будут хранится данные (если база данных не создана, то ее потребуется создать) и регион, где будет располагаться служба. Важно отметить, что регион сервера базы данных и регион мобильной службы должны совпадать, иначе вы будете платить за лишний трафик.

пятница, 22 марта 2013 г.

Протокол Windows Store (ms-windows-store)

Помимо возможности извне открывать страницу "Отзывы и оценки" приложения в магазине Windows (описание см. в статье Windows Store. Rate and Review), существует ряд других возможностей по работе с протоколом магазина.
К примеру, чтобы вызвать страницу описания приложения достаточно выполнить следующее действие:
ms-windows-store:PDP?PFN=package_family_name, где в качестве параметра принимается - это PackageId.FamilyName.
Так же существует возможность открыть страницу обновления магазина Windows:
Ну и можно выполнить поиск по магазину:
ms-windows-store:Search?query=Bessonov Kirill, где в качестве параметра принимается поисковый запрос.
Для более удобной работы с данным функционалом, объединим это во вспомогательный класс:

вторник, 19 марта 2013 г.

Конкурс «Добавь праздник в Windows Store»



Завершился конкурс приложений для Windows 8, в котором участвовало 54 кандидата. При оценке приложений данные брались из российского Windows Store по TOP FREE/PAID, а также учитывалось количество оценок и средний рейтинг.

В номинации "Самое популярное приложение за время конкурса" победило мое приложение Конвертер валют! :)

Хотел выразить благодарность организаторам конкурса и всем, кто голосовал за мое приложение.
Спасибо!

воскресенье, 17 марта 2013 г.

WIX + SQL Server

Для работы многих приложений требуется база данных. Это не проблема, если база одна на всех и находится на общедоступном сервере. Но как быть если требуется установить базу данных локально? Наилучшим вариантом в этом случае будет создание базы данных во время установки приложения. В этой статье я опишу как, используя WIX, можно во время установки приложения проверить подключение к Sql Server и выполнить скрипт для создания базы данных.

Предварительные условия:

  1. Наличие Visual Studio;
  2. Установленный компонент WIX Toolset.
В качестве шаблона проекта я использую пример из статьи WIX + NET 4.0 Framework + Microsoft Windows Installer 3.1.
Для того, чтобы пользователь смог настроить подключение к серверу баз данных, ему нужно предоставить пользовательский интерфейс, где он сможет ввести нужные учетные данные.