Sunday, January 30, 2011

Bing Maps на Windows Phone 7. Часть 1. Введение

Эта статья содержит примеры кода, подсвеченные с помощью JS SyntaxHighlighter, который почему-то не отрабатывает в Google Reader, а возможно и в других RSS ридерах. Чтобы нормально увидеть код, вам придется перейти в блог. Извините за неудобство.

Недавно я делал code session на встрече харьковской UNETA на тему создания картографического приложения для Windows Phone 7. По моим субъективным ощущениям все прошло неплохо, слушатели помогали мне в написании кода, активно задавали вопросы и поправляли меня, когда я где-нибудь лажал :), а также стойко терпели технические проблемы, связанные со взаимной нелюбовью моего ноутбука и местного проектора, за что им отдельное спасибо. Так как тема программирования под Windows Phone сейчас интересна многим людям, хотелось бы также выложить материалы этого code session в блог.

Этой статьей я начинаю серию, посвященную созданию простенького картографического приложения на Silverlight с использованием Bing Maps. В процессе написания приложения я иногда буду уходить в теорию, чтобы пояснить те или иные детали. Итак, приступим.

Требования

Прежде чем начинать писать приложение, необходимо определиться что мы, собственно говоря, хотим написать. Наше приложение будет отображать текущее местонахождение человека, а также показывать положение различных объектов вокруг него: кафе, гостиниц, магазинов, банков, туристических мест, ночных клубов и прочего добра. По идее, оно должно помогать людям ориентироваться в малознакомом или даже родном городе. Если собрать все требования в кучку, то мы получим следующий набор функций приложения:

  1. отображение карты
  2. определение текущего местоположения, центрирование карты
  3. отображение различных объектов вокруг текущего местоположения
  4. отображение деталей объекта при клике на нем
  5. фильтрация объектов по типам

При этом мы попытаемся реализовать приложение в более-менее правильном стиле, с использованием паттерна MVVM.

Начнем с создания проекта и отображения простой карты.

Создание проекта

Перед тем, как начать программировать для Windows Phone 7, вам нужно убедиться, что у вас есть вся инфраструктура:

  • Visual Studio 2010 (есть бесплатная версия VS2010 Express for Windows Phone)
  • Windows Phone Developer Tools (Silverlight for Windows Phone, эмулятор, библиотеки и т.д.)
  • Bing Maps Silverlight control for Windows Phone
  • (опционально) XNA Game Studio 4.0
  • (опционально) Expression Blend (есть бесплатная версия Blend for Windows Phone)

Все это добро бесплатно и его можно скачать с сайта http://create.msdn.com/en-us/home/getting_started. После того, как установите основной пакет, не забудьте также установить October 2010 update to the Windows Phone Developer Tools.

Вообще, конечно, радует, что Microsoft решила сделать все инструменты для разработки WP7 приложений бесплатными. Но это не подарок на Новый год, а простой маркетинг: нужно привлекать программистов на новую платформу, чтобы догнать уходящий поезд, на котором дружно едут iOS и Android.

Немного о платформе разработки

Как вы уже догадались, писать мы будем на Silverlight. Только не на обычном Silverlight 4, а на т.н. Silverlight for Windows Phone. Эта версия SL отличается от своего настольного брата немного урезанными возможностями и оптимизированной производительностью. В общем-то производительность для телефона – это все, потому что по сравнению с native-приложениями у нас и сам .NET довольно прожорливый, и тем более Silverlight.

Кроме программирования бизнес-приложений (и в более редких случаях игр) на SL, у нас также есть возможность программировать игры (и в более редких случаях бизнес-приложения) на XNA. XNA – это платформа и набор инструментов для разработки игр для Windows, Xbox, Zune и вот теперь еще Windows Phone 7.

image

Поддержка XNA в Windows Phone – это очень полезная вещь, т.к. разработчики игр под Xbox теперь могут использовать привычные инструменты и модель разработки для программирования игр под мобильную платформу, а также с меньшими трудозатратами перенести существующие игры на WP7.

Отображение карты

Вернемся к практике. После установки необходимых дополнений в Visual Studio появятся новые типы проектов. Поэтому идем в File -> New -> Project и создаем Windows Phone Application проект.

Начнем мы с отображения карты. Здесь все просто. Сначала добавим в проект reference на сборку Microsoft.Phone.Controls.Maps. Затем добавим namespace для Bing Maps контрола, а также сам контрол в XAML главной страницы приложения, попутно заменив основной Grid на Canvas, чтобы нам было проще позиционировать элементы в будущем:

xmlns:maps="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps"
<!--LayoutRoot is the root grid where all page content is placed-->
<Canvas x:Name="LayoutRoot">
    <Grid Background="Transparent" Height="768" Width="480">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <TextBlock x:Name="ApplicationTitle" Grid.Row="0"  Text="My Places" Style="{StaticResource PhoneTextNormalStyle}"/>

	<maps:Map Grid.Row="1" Name="mapPlace" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
            ScaleVisibility="Visible"
            ZoomBarVisibility="Visible"
            CopyrightVisibility="Collapsed">

            <maps:Map.Mode>
                <maps:AerialMode ShouldDisplayLabels="True" />
            </maps:Map.Mode>

        </maps:Map>

    </Grid>
</Canvas>

Свойства контрола ScaleVisibility, ZoomBarVisibility и CopyrightVisibility определяют видимость соответствующих стандартных элементов карты. Надо отметить, что стандартный Zoom Bar располагается снизу (что не всегда удобно) + выглядит очень плохо, поэтому немного позже мы его улучшим.

Запустим приложение в эмуляторе. Как видите, приложение показывает карту:

image

Если присмотреться, то можно заметить, что посередине экрана белым шрифтом написан следующий текст:

Invalid Credentials. Sign up for for a developer account.

Этот текст обозначает, что нам нужно получить Bing Maps Developer Account и сообщить о нем контролу карты. Для этого идем на http://www.bingmapsportal.com/, логинимся туда при помощи Live ID (или сначала регистрируем его), и затем создаем ключ при помощи пункта меню Create or view keys.

Для того, чтобы карта заработала, достаточно установить свойство CredentialsProvider контрола:

CredentialsProvider="AoYOaLG9nor0LXJzvYrL18U8URccNTyacL-qfGUMBdvFseoLbF384hct4JxGVvI9"

Напомню, что ключ у вас должен быть свой. Это не важно для тестового проекта, но не уверен, что не будет проблем в случае публикации вашего приложения на MarketPlace.

Однако мы же пытаемся все делать правильно, используя паттерн MVVM, не так ли? Поэтому данный способ не совсем для нас. Этот ключ – данные, а данные должны связываться с View (представление, наша страница) через ViewModel (модель представления), специальный объект, содержащий весь набор данных, необходимых View для работы, а также логику представления. Выглядеть это должно где-то так:

image

Дополнительную информацию по паттерну MVVM и его примеры для Silverlight можно прочитать на страничке MSDN и в статье в MSDN Magazine.

Итак, нам нужно сделать ViewModel класс и как-то привязать его к View. Создадим в проекте папку ViewModel, в которой будут лежать все модели представления, а следом класс MapViewModel, который будет связываться с представлением нашей главной страницы). На данном этапе класс будет выглядеть следующим образом:

public class MapViewModel
{
    private const string Id = "AoYOaLG9nor0LXJzvYrL18U8URccNTyacL-qfGUMBdvFseoLbF384hct4JxGVvI9";
    private readonly CredentialsProvider credentialsProvider = new ApplicationIdCredentialsProvider(Id);

    public CredentialsProvider CredentialsProvider
    {
        get { return credentialsProvider; }
    }
}

Как видите, наш ключ для Bing Maps прописан в нем как константа. Конечно, его можно было бы вынести и в какой-нибудь конфигурационный файл, но для нас это сейчас не принципиально.

Далее привязываем MapsViewModel к представлению в XAML файле страницы. Добавляем namespace:

xmlns:model="clr-namespace:WP7Test.ViewModel"

Говорим нашей View, что ее ViewModel будем класс MapsViewModel, установив свойство PhoneApplicationPage.Resources (перед началом тега Canvas):

<phone:PhoneApplicationPage.Resources>
    <model:MapViewModel x:Key="ViewModel" />
</phone:PhoneApplicationPage.Resources>

Устанавливаем свойство DataContext у Canvas:

<Canvas x:Name="LayoutRoot" DataContext="{StaticResource ViewModel}">

Теперь, когда ViewModel привязан к представлению, можно связать установить свойство CredentialsProvider контрола Map через стандартный data binding:

CredentialsProvider="{Binding ViewModel.CredentialsProvider}"

Вот и все. Запускаем, и видим, что наше приложение больше не показывает белую строчку.

В следующей части мы рассмотрим кастомизацию Zoom Bar.

Вся серия:

Часть 1. Введение
Часть 2. Масштабирование карты
Часть 3. Полные исходники

Saturday, January 15, 2011

Создание картографического приложения на Silverlight для Windows Phone 7

В четверг, 20 января, буду делать доклад на встрече харьковской UNETA на вышеприведенную тему. Хотя это будет даже не доклад, а скорее code session с минимумом теории и максимумом программирования. Постараюсь за 40 минут показать, как создать картографическое приложение на Silverlight для Windows Phone 7. Приложение будет брать данные об объектах из Wikimapia по различным категориям и отображать их на карте (Bing Maps). Покажу как работать с geolocation services, обрабатывать различные состояния приложения, и многое другое. Постараюсь, чтобы все было true MVVM. Ну, или около того :) Отвечу на разные вопросы.

Встреча будет проходить в Харьковском национальном университете радиоэлектроники, пр. Ленина, 14 (ст.м. Научная) 334 ауд., 20 января 2011 г. в 18-30. Официальное оповещение: http://dev.net.ua/blogs/leshchinsky/archive/2011/01/14/UNETA2001201SilverlightWindowsPhone7.aspx

Пока не знаю, что получится, будет тестовый прогон нового формата. Надеюсь, будет не очень скучно :) Приходите.

Monday, January 3, 2011

Итоги 2010: лучшие фотографии

Завершают серию заметок с итогами 2010 года лучшие фотографии 2010 года. Как я уже упоминал, в этом году с поездками не сложилось, поэтому и фотографий мало.

Если кому-то хочется иметь ту или иную фотографию у себя на рабочем столе или в распечатанном виде - напишите в комментариях, я вышлю полноформат.

IMG_7657

#1 Большая и Малая Сивули

IMG_7717

#2 Вид на Малую Сивулю

IMG_7888

#3 Лошадки на Перевале Легионов

Причалы. Если отойти по ним вглубь бухты - можно осмотреть набережную со стороны моря

#4 Набережная Балаклавы

IMG_8290

#5 Балаклавская бухта

IMG_8345

#6

IMG_8522

#7 Форосская церковь

IMG_8596

#8 В парке

IMG_8730

#9 Черниговский Детинец

IMG_8757

#10

IMG_8766 

#11 Ильинская церковь

Итоги 2010: статистика блога

Этот блог существует уже 3 года с хвостиком. И хотя в этом году я его немного забросил, хочется все-таки подвести некоторые итоги и поделиться планами на 2011 год.

Итоги 2010 года:

Всего посещений: ~27 тыс. (~39 тыс. просмотров страниц)

Аудитория: ~12 тыс. - Россия, ~10,5 тыс. - Украина, ~2 тыс. - Беларусь, остальное – Штаты, Латвия, Молдова, Израиль, Германия, Казахстан и другие страны.

Самые популярные статьи (по посещениям, все статьи):

  1. NHibernate – где узнать больше?
  2. Entity Framework 4.0: выходим на зрелый уровень
  3. Domain Driven Design: введение
  4. Введение в mock-объекты. Классификация
  5. Методы оптимизации производительности Linq to SQL и Entity Framework.

Самые популярные статьи (по посещениям, статьи 2010 года):

  1. Качественный код и проектирование
  2. Слайдкаст по принципам проектирования
  3. Архитектура по Фаулеру
  4. Железный треугольник
  5. Google AI Challenge

Самые комментируемые статьи:

  1. Летаргический сон украинского .NET-сообщества
  2. Domain Driven Design: введение
  3. IT-образование vs. профессиональный рынок
  4. Должен ли PM быть техническим специалистом?
  5. Качественный код и проектирование

Планы на 2011 год:

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

На данный момент я планирую серию заметок на тему разработки под Windows Phone 7 на базе приложения, разработанного для конкурса Microsoft SWIT. Если все сложится, то скоро вы их увидите.

Остальное будет зависеть от свободного времени и наличия тем на “поделиться”. Если у вас есть какие-то пожелания, welcome!

Итоги 2010, планы на 2011

Подведение итогов ушедшего года и планирование на год наступающий – это не только реализация желания еще раз вспомнить приятные моменты и достижения прошлого, но и постановка новых целей на будущее. А без этого, как говорит Стивен Кови и множество других life-менеджеров – жить не так интересно :) Я практикую этот подход уже не первый год, но впервые сделаю это публично. Хотя, по большому счету, делается это больше для самого себя, просто чтобы сохранилось на будущее.

Перед тем, как начать подводить итоги, хочу поздравить всех с наступившим Новым 2011 годом и наступающим Рождеством! И пожелать всем нам, людям, живущим на красивом голубом шарике, в новом году стать хотя бы немножко лучше, добрее, терпимее, сильнее, свободнее, проще и мудрее. Пусть 2011 год принесет каждому из нас исполнение самых красивых желаний и достижение самых заветных целей!

merry_christmas_1024С Новым годом и Рождеством! 

Для меня 2010 год был достаточно сложным и вследствие этого профессионально малопродуктивным. Также в нем было ощутимо меньше путешествий и отдыха. Но в то же время этот год многое мне дал с точки зрения личностного роста, научил преодолевать трудности и радоваться простым вещам. Надеюсь, 2011 год также будет очень плодотворным с этой точки зрения, но хотелось бы получать не так много “направляющих” тумаков от жизни :)

Итак, итоги 2010 года:

Профессиональный рост: Не так много достижений, как хотелось бы. Из нового изученного можно отметить лишь Silverlight (и то еще в процессе) и программирование под Windows Phone 7. Никаких новых языков или технологий, скорее просто накопление опыта в том, что уже есть. Возможно, стал больше понимать в процессе разработки, менеджменте и сопутствующих вопросах. Жажда изучения новых технологий сменилась желанием создавать готовые продукты и решения, использовать свои знания и навыки для решения проблем людей. Интересно анализировать новые проекты, продумывать архитектуру, организовывать работу команды, видеть готовый работающий результат, приятно слышать благодарность клиентов и пользователей, если все получилось. Программировать также все еще интересно, но в основном что-то действительно сложное и необычное, или как минимум, незнакомое.

Community-деятельность: Также затишье. Один доклад на UNETA и один на внутренних tech talks компании, очень редкие заметки и статьи в блоге. Правда, конец года был активный: съездил на SWIT, где познакомился с интересными людьми.

Работа: За последний год наша компания Altexsoft выросла почти в 2 раза, к нам пришли очень сильные ребята, мы перебралась в новый офис, и надеюсь, стали лучше работать. Приятно осознавать, что мы развиваемся, видеть перспективы, работать в отличном коллективе.

Соревнования: Давно не участвовал ни в каких соревнованиях и уже успел забыть этот ни с чем не сравнимый вкус. В конце октября-ноябре поучаствовал в Google AI Challenge, просто ради интереса и разминания мозгов. В результате занял 413 место в общем рейтинге, 45-е место среди C#-стов (к слову, их было очень мало) и вошел в 20-ку по Украине. А главное – получил море удовольствия от for fun programming. Также поучаствовал в конкурсе Windows Phone 7 приложений от лица нашей компании, где прошел в финал. Правда, особого ROI от дальнейшего участия нет, поэтому мы решили не бороться за призовые места.

Личная жизнь: Сильно распространяться о личной жизни я не буду, это мало кому интересно. Главное достижение ушедшего года для нашей семьи – без сомнения, покупка квартиры. Трехмесячная эпопея поиска и покупки квартиры с драматическим финалом счастливо завершена, теперь нас можно назвать харьковчанами :) Работы все еще непочатый край, но это приятная работа: косметическое завершение ремонта, покупка мебели, обустройство квартиры.

Путешествия: В связи с покупкой квартиры в ушедшем году мы смогли позволить себе лишь три поездки: уже ставший традиционным майский поход в Карпаты, летняя поездка в Севастополь и Балаклаву и зимние выходные в Чернигове. Карпатский поход запомнился дождями, грязью и настоящей майской грозой на высоте 1.5 км. Поездка в Севастополь – полузабытым катанием на волнах в шторм, отвесными скалами Затерянного мира–2 и посещением базы подлодок в Балаклаве. Чернигов удивил красивыми куполами храмов и монастырей, парками в центральной части города и уютными кафешками.

Хобби: В 2010 году у меня появилось новое увлечение – я наконец-то исполнил свою детскую мечту и начал заниматься фехтованием. Меня сначала записали на шпагу, но потом судьба распорядилась так, что я попал на саблю, о чем ни капельки не жалею. По моему мнению сабля гораздо динамичнее, в ней больше вариантов действий, сильно развита тактическая составляющая боя. В фехтовании нужно не только иметь хорошую технику и реакцию, как многие думают, но также нужно много думать, быстро принимать решения, какое действие или комбинацию действий совершить в ответ на действия соперника, стараться его обхитрить. А еще, как выяснилось, фехтование дает очень хорошую физическую нагрузку: первый месяц я буквально приползал с тренировки.

Что мне понравилось в 2010 году:

Книги года: Из прочитанных/прослушанных мною на это звание претендуют две книги (если быть точным, то две серии): “Трилогия желания” Т.Драйзера (Финансист, Титан, Стоик) и “Песнь льда и пламени” Дж.Р.Р. Мартина. Первая серия – это известнейшее классическое произведение, описывающее одновременно жизнь уникального человека, и уклад целой эпохи, вторая – очень качественное фентези, которое понравится многим любителям этого жанра.

Фильмы года: Нет, это не “Аватар”. Для меня это без сомнения “Начало” (Inception) Кристофера Нолана. Отличный фантастический фильм с уклоном в философию и психологию. На втором месте – превосходный российский документальный фильм “Счастливые люди” о жизни людей в сибирском поселке Бахта на берегу Енисея и охотничьем промысле.

Подкасты года: В ушедшем году интерес к профессиональным подкастам немного ушел в сторону, возможно потому, что я нашел записи передач радио “Эхо Москвы”, в частности, исторические передачи “Все так” и “Не так”. За год мы с женой прослушали очень много выпусков, просто включая их в фоне дома на выходных. Рекомендую всем любителям истории. Также рекомендую порыться в списке передач и архиве – там ОЧЕНЬ много интересного.

Блоги года: Без разделения на места самые интересные на мой взгляд блоги: Zenegment, блог Дмитрия Нестерука, Gaperton’s blog, Размышлизмы eao197, Не кинокритик, блог Леонида Волкова, блог Дмитрия Шатрова и блог Сергея Доли.

С итогами разобрались, цели/планы на 2011 год:

Профессиональный рост:

  1. Закончить изучение Silverlight. Поучаствовать хотя бы в одном серьезном проекте, чтобы опробовать технологию
  2. Изучить хотя бы один новый язык программирования. Еще не решил: Ruby, Python или F#. Ruby интересен в разрезе программирования на Ruby-on-Rails, Python – как один из промышленных языков, использующихся Google, F# – как представитель функционального мира, со своими законами и мировоззрением. С чего посоветуете начать?
  3. Прочитать несколько серьезных книг по программированию и менеджменту. Было бы интересно услышать, какие есть классные книги в этом направлении, достойные прочтения.

Community-деятельность:

  1. Посетить несколько серьезных конференций, как по .NET, так и по другим направлениям
  2. Сделать несколько докладов в Харькове, а если повезет, то и за его пределами
  3. Ведение блога. Надеюсь, получится лучше, чем в прошлом году
  4. Ведение твиттер-аккаунта. Я долго не мог понять, зачем он мне нужен, и пробовал использовать его как еще один канал получения новостей и общения с друзьями. Теперь я определился с его форматом. Канал получения новостей остается, а вот личное общение будет сведено к минимуму. Постараюсь шарить через твиттер как можно больше ссылок на статьи, которые мне кажутся полезными и интересными, анонсы событий и т.д., участвовать в их обсуждении

Работа:

  1. Начать и успешно вести крупный проект в роли лида или руководителя проекта. Хочется получить такой опыт

Путешествия:

  1. Так как у нас с Леночкой не было полноценного отпуска в этом году, а усталость накопилась, очень хочется съездить в начале февраля в Карпаты или, как вариант, весной в Европу (хотелось бы в Италию, а там как получится) как минимум на неделю.
  2. Как обычно, майский поход в Карпаты или Крым. Снова хочется окунуться с головой в природу и забыть о городской суете, оставив в голове лишь основные инстинкты.
  3. Остальное – как получится. Никаких других планов пока нет.

В ближайших постах будут итоги и статистика по блогу за 2010 год, а также лучшие фотографии 2010 года.