Saturday, September 20, 2014

Конференция AI Ukraine 2014

25 октября в Харькове будет очень крутое мероприятие – конференция AI Ukraine 2014, которая будет проводиться нашей компанией. Если вкратце, то это первая конференция по практическому применению искусственного интеллекта, машинному обучению и большим данным в Харькове, и одна из первых и крупнейших в Украине. Такое нельзя событие нельзя пропускать.

На конференции выступят как минимум 18 докладчиков (хотя благодаря дополнительным заявкам от спикеров сейчас речь идет об увеличении количества докладчиков до 21-го), которые будут разделены на 3 трека.

Итак, кто же выступит на конференции и чем они нас порадуют.

Прежде всего, на конференцию с докладами приедут представители украинских офисов Microsoft, IBM и ABBYY. Microsoft планирует рассказать о своём новом сервисе Windows Azure Machine Learning, IBM расскажет про своё видение больших данных и работе с ними, а доклад ABBYY будет посвящен описанию ABBYY SDK, позволяющим программистам получить доступ к технологиям распознавания текстов и прикладной лингвистики.

Дмитрий Новицкий расскажет про естественные и искусственные нейронные сети, спайковые нейросети и феномен памяти. Еще в одном докладе Артём Чернодуб из ZZWolf расскажет про глубокие рекуррентные нейронные сети и области их применения.

Из доклада Сергея Шельпука (V.I.Tech, Львов) вы узнаете о проблеме управления и её решении методами искусственного интеллекта на примере датацентров и электрических сетей.

Наш гость из Санкт-Петербурга Сергей Николенко (НИУ ВШЭ), разработавший рекоммендательные алгоритмы SurfingBird, расскажет о том, как строить рекоммендательные системы.

Блок докладов, посвященных Natural Language Processing, составят доклады Марьяны Романышин (Grammarly) об автоматическом синтаксическом анализе, а также Леонида Литвиненко и Дмитрия Кана (авторы сервиса Youscan) об автоматическом определении тональности текста (Sentiment Analysis). Кроме того,Александр Панченко (Digital Society Laboratory, Москва) расскажет об анализе текста в социальных сетях и различных целях подобного анализа.

О применении Machine Learning в банковской сфере расскажут Дмитрий Вороненко (Scorto, Харьков), чей доклад посвящен использованию нейросетей и других алгоритмов для кредитного скоринга, а также Андрей Кислый (iBPM, Киев), который планирует рассказать об анализе данных социального профиля пользователя.

Kristoffer Rolf Deinoff (Itera Consulting, Киев) покажет на практике, как использовать данные фитнес-устройств вместе с календарем и погодными данными для определения расписания тренировок и задания целей и стимулов.

Заведующий кафедрой КНУ Юрий Крак расскажет об анализе и синтезе систем жестовой коммуникации для глухих людей и других перспективах этого направления. А доклад Данилы Дорофеева (Samsung R&D, Киев) будет посвящен бесконтактному детектору пульса с помощью камеры.

Дмитрий Сподарец (RootUA Media, Одесса) расскажет о возможностях платформы FlyElephant для агрегации и проведения высокопроизводительных вычислений.

И, наконец, среди докладчиков будут и члены харьковского клуба ИИ. Николай Павлов (Biomech), который уже выступал с 2 докладами на наших встречах, расскажет о своем новом волонтерском проекте — сенсоре для выявления огневых точек противника, разрабатываемого для украинской армии, а мой доклад будет посвящен тому, как спрогнозировать цены на авиабилеты, используя временные ряды.

Даже если вы не используете алгоритмы ИИ в вашей работе прямо сейчас, я уверен, что многим будет просто интересно послушать доклады. Как-никак, это же искусственный интеллект, а это всегда интересно и круто :)

Узнать больше о расписании конференции, каждом докладе и докладчике, а также зарегистрироваться на конференцию можно на сайте AI Ukraine 2014. Для преподавателей и аспирантов вузов действует специальная скидка, которую вы можете получить, связавшись с организаторами конференции (контактная информация указана на сайте). Все новости конференции публикуются на нашей страничке в Facebook: https://www.facebook.com/events/821937461170253/

Куда приводят мечты

Последний раз я писал в свой блог полтора года назад. За это время много чего произошло, как в личной, так и в профессиональной жизни. Если вкратце, то я ненадолго сходил в топ-менеджмент и вернулся назад, причем в совсем другом качестве. Теперь я занимаюсь тем, о чем мечтал с детства – искусственным интеллектом (а точнее, Machine Learning), а по совместительству возглавляю отдел Data Science в нашей компании, который потихоньку развивается. Другой мой любимый проект, харьковский клуб искусственного интеллекта, более-менее активно проводит встречи и различные другие инициативы.

В какой-то степени моё молчание эти полтора года было связано с тем, что я перестал заниматься программированием, а писать про менеджмент не очень интересно. Было очень много работы, но почти не было вдохновения и того самого зуда, который заставляет тебя сесть и строчить очередной пост, даже если уже давно за полночь. Сейчас я снова программирую, правда, мой стек сильно изменился. Теперь это языки R и Python, а Visual Studio я поменял на RStudio и другие инструменты. Хотя старый опыт всё еще помогает: как раз сейчас я занимаюсь реализацией разработанного нами алгоритма на C# :)

Machine Learning ортогонален обычному промышленному программированию. Прежде всего, это матстатистика и алгоритмы, а уже потом – программирование. Здесь почти нет технологий, нет особенностей мобильного или веб-программирования. Зато здесь есть самые разнообразные данные, куча направлений на любой вкус (от обработки текста до программирования интеллекта роботов), постоянная неопределенность, можно ли решить задачу или нет, куча научных статей, которые нужно читать, десятки и сотни экспериментов, и многое другое. И это очень классно и интересно, это не даёт заскучать.

А еще это очень перспективно и недешево. Зимой, еще работая на менеджерской должности, я написал небольшую статью на DOU, в которой постарался осветить применение искусственного интеллекта в Украине. В ней было приведено всего несколько примеров украинских компаний, которые занимаются ИИ, зато в комментариях к статье накидали еще целую пачку, что меня очень порадовало. Через два месяца мы стартовали новый отдел. Теперь же, немного исследовав существущий рынок и прогнозы крупных аналитических компаний, можно с уверенностью сказать, что задачи по ИИ наконец-то вышли из-под крыла университетов в дикую природу, а бизнес очень активно занимается их внедрением. В нашем маркетинговом исследовании мы нашли несколько десятков компаний по всему миру, которые занимаются предоставлением услуг по Machine Learning и Predictive Analytics, причем многие компании содержат большой штат специалистов и не оказывают услуг по обычной разработке. И это только те компании, которые нам удалось найти на данный момент.

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

А следующий пост я могу анонсировать прямо сейчас – он будет про конференцию AI Ukraine 2014.

Monday, January 14, 2013

Встреча AI Club, посвященная игровому ИИ

Я стараюсь не писать в этом блоге анонсы встреч нашего Kharkov AI Club, но случай особый, поэтому хочется донести его до общественности. В субботу 26 января у нас будет 4-я встреча, целиком посвященная искусственному интеллекту в играх. В докладчиках у нас на этот раз будут гости из Киева: Владимир Кожаев, аспирант Института кибернетики им. В.М.Глушкова, и Дмитрий Ясенев, ведущий программист в компании Vostok Games, сейчас работающий над онлайн шутером Survarium, а до того работавший в небезызвестной GSC Game World над ИИ в игре S.T.A.L.K.E.R.

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

Если вы занимаетесь разработкой любых типов игр, интересуетесь ИИ, любите играть или вам просто интересно узнать больше о внутренностях S.T.A.L.K.E.R. и Survarium непосредственно от разработчика – то приходите, эти доклады именно для вас!

Больше информации о докладах, а также форма регистрации на официальной страничке: http://aikharkov.wordpress.com/2013/01/13/75/

Немного информации для затравки:

Блог Владимира Кожаева: http://gamesdevandmath.blogspot.com/
Досье на Дмитрия Ясенева: http://eposurvarium.ru/dmitriy-neo-yasenev/
Интервью с Дмитрием: http://gsc-fan.com/?option=com_content&view=article&id=411

Tuesday, January 8, 2013

1000 км по австрийским дорогам

1000 км – это много или мало? По меркам России или США это сущий пустяк. По меркам Украины – уже не пустяк, но все еще немного: дорога из Харькова до горнолыжного курорта Буковель в Карпатах – это уже 1200 км, а ведь можно ехать и из Луганска в Ужгород. Но Австрия – небольшая, там можно проехать полстраны и вернуться в точку старта, проехав это расстояние.

Почему именно Восточная Империя (Austria = Österreich (нем.) = Öster + Reigh)? На самом деле, сначала планировалась поездка по Голландии или Германии, но с опытом вождения меньше года мы нашли вариант аренды авто только в Австрии. Второй причиной стали Альпы. В этом году мы так и не попали в поход, поэтому в горы тянуло неимоверно. Просмотр фотоотчетов из австрийских Альп в Интернете быстро доказал нам, что мы на верном пути.

Начиналось все как обычно. Сначала планирование маршрута: полтора дня в Вене, затем арендуем автомобиль и полетели по австрийским автобанам и обычным проселочным дорогам навстречу приключениям. В обязательных планах числились: Зальцбург, Санкт-Вольфганг, Гальштат, Мельк, Штайр. Дальше – как пойдет.

По факту маршрут получился таким:


View Larger Map

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

Далее покупка билетов на самолет, бронирование отелей, пара недель сбора документов о том, что ты не нищий и не террорист, австрийский визовый центр, неделя ожидания – и мы обладатели шенгенской визы. Рассказывать о каждом дне и месте долго, поэтому опишу лишь только самые запомнившиеся места и события поездки.

Вена

По рассказам друзей от Вены ожидали чего-то имперского и захватывающего дух. Имперское имеет место быть, да и город, безусловно, красивый, но дух не захватывает. Вена сбалансирована: центр и условно спальные районы выглядят одинаково хорошо. И там, и там можно получать удовольствие от прогулок, есть что посмотреть. Окраины, как и везде, загажены и исписаны граффити, но туда ведь можно и не ездить. Старый центр окружен Рингом – транспортным кольцом, по которому можно прогуляться пешком, прокатиться на трамвае либо велосипеде. В сувенирах преобладают три человека и их творчество: Моцарт, императрица Сисси и художник Густав Климт. Они буквально везде, начиная от статуэток и заканчивая кофе и конфетами.

Мы жили возле дворцового комплекса Шенбрунн, поэтому часть времени посвятили ему: красивый парк, большой дворец, похож на Екатерининский. К слову, небольшая гостиница, в которой мы жили, очаровала нас винтовой лестницей и старым деревянным лифтом, а хозяева подарили бутылку вина и коробку конфет при выселении.

IMG_8696IMG_9154IMG_9064

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

IMG_1569IMG_8845IMG_8875IMG_8929

Wednesday, December 5, 2012

Realtime ASP.NET with SignalR presentation

Для выступления в Сумах обновил презентацию по SignalR. Если кому интересно, то можно посмотреть здесь:

Sunday, November 18, 2012

Разработка real-time ASP.NET приложений с помощью SignalR

SignalR, на мой взгляд – одна из самых впечатляющих библиотек в ASP.NET, появившихся за последние пару лет. Я бы сказал, настоящее событие, своеобразная веха. И пока команда корпит над готовящимся релизом первой версии, самое время сделать ее небольшое описание. Однако прежде чем начать, стоит немного остановиться на том, зачем вообще кто-то придумывал эту библиотеку и какую проблему она решает.

Real-time веб приложения

Наверняка многие пользовались Facebook, Twitter или другими социальными сервисами и замечали, что когда приходят обновления новостей или статусов, страница обновляется в реальном времени и вы постоянно видите последнюю актуальную информацию. В Google Docs можно совместно редактировать документы, и все обновления синхронизированы и появляются у вас сразу же, как только их сделает другой пользователь. Это примеры сервисов, которые можно назвать real-time веб-приложениями. Основной их отличительной способностью является то, что они “ломают” привычную нам всем модель работы в вебе – запрос-ответ, благодаря чему пользователи видят обновление данных сразу же, как только они появляются на сервере.

Если не знать, насколько далеко вперед шагнули технологии за последние несколько лет, то можно предположить, что все подобные приложения реализованы при помощи периодического опрашивания сервера обычными Ajax-запросами, т.н. polling. Выглядит похоже, но это не так, в чем можно легко убедиться, просмотрев логи запросов из браузера на сервер в Firebug, Fiddler или Chrome developer tools.

Способы реализации

Итак, какие же есть способы реализации подобной функциональности, их достоинства и недостатки.

Техника Описание Преимущества Недостатки
Polling Постоянный опрос сервера Ajax-запросами + простота реализации
+ поддержка во всех современных браузерах
- задержка в результатах
- при уменьшении задержки существенно увеличивается нагрузка на сервер
Long Polling Ajax-запросы, идущие один за другим, но каждый запрос держится открытым в течение нескольких минут + сниженная нагрузка на сервер по сравнению с обычным Polling
+ уменьшенный трафик
+ поддержка во всех современных браузерах
- больше одновременно открытых соединений, т.к. каждый запрос живет дольше
Server-Sent Events Новый стандарт HTML5, работающий поверх HTTP. Позволяет создавать долгоживущее соединение с сервером, чтобы сервер мог отправлять данные на клиент + нет необходимости постоянно пересоединяться с сервером
+ нет изменений на стороне сервера, поэтому работает на всех современных веб-серверах
- не поддерживается в IE (даже в IE10)
- работает только в направлении сервер –> клиент (на сервер можно отправлять обычные Ajax запросы)
WebSockets Новый протокол (ws:// и wss://), работающий поверх TCP на одном уровне с HTTP. Позволяет создавать двустороннее долгоживущее соединение с клиентом + нет необходимости постоянно пересоединяться с сервером
+ работает в двустороннем режиме
- поддерживается не во всех веб-серверах (IIS8)
- поддерживается не во всех браузерах (в IE7-9, Android)

Для большей информации о Server-Sent Events и WebSockets советую посмотреть статью на HTML5 Rocks: http://www.html5rocks.com/en/tutorials/eventsource/basics/

Если посмотреть на достоинства и недостатки, то можно увидеть, что самый эффективный вариант – это WebSockets, но он не поддерживается во всех браузерах и будет поддерживаться лишь на IIS8 и выше. Server-Sent Events работает на более старых версиях IIS, но не поддерживается в IE, поэтому тоже подойдет далеко не всегда. Long Polling работает везде, но при этом далеко не так эффективен.

Идеальным решением было бы совмещение этих техник в разных случаях, но это сложно реализовать и поддерживать. Однако есть хорошая новость – это решение уже реализовано в библиотеке SignalR.

Введение в SignalR

SignalR – это библиотека для создания многопользовательских real-time ASP.NET (и не только) приложений. Она состоит из набора серверных и клиентских библиотек, и представляет собой абстракцию над целым набором транспортов. Все это добро – open source, лежащий на GitHub: https://github.com/SignalR, поэтому вы всегда можете пойти и посмотреть, что там внутри, какие есть баги и т.д. Кроме того, в разделе Wiki есть много информации о SignalR и примеров: https://github.com/SignalR/SignalR/wiki

SignalR был придуман и реализован двумя разработчиками Microsoft: Damian Edwards и David Fowler. В своих твиттерах они часто пишут полезную информацию о SignalR и сообщают о новостях. Также David ведет блог, в котором описывает все изменения в новых версиях. Если вы решите использовать библиотеку, то советую подписаться.

На момент написания этой статьи SignalR находится в предрелизном состоянии (версия 1.0 alpha2). Еще планируются один или несколько RC, после чего продукт будет выпущен в RTM.

Транспорты

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

image

То есть если сервер и клиент поддерживают WebSockets, то будет установлено WebSockets-соединение и все будут счастливы. Если же нет – то далее будет проверка, поддерживает ли клиент SSE, и если да – будет установлено это соединение. В случае IE сразу же будет испробован подход Forever Frame (невидимо висящий iframe устанавливает соединение и получает JS-инструкции с сервера) – это IE-хак, т.к. даже 10-я версия IE не поддерживает SSE. Молодцы, нечего сказать.

И в конце-концов, если клиент не поддерживает ни один из этих способов, или произошла ошибка, то SignalR откатится до самого надежного способа – Long Polling, который работает практически везде.

Архитектура

Архитектура SignalR очень проста. На сервере реализованы 2 вида API: низкоуровневый (PersistentConnection API) и высокоуровневый (Hub API), причем Hub опирается на PersistentConnection. Вы можете использовать любой из них, но в большинстве случаев вам будет достаточно возможностей, предоставляемых Hub API.

image

В альфе официально поддерживаются JavaScript (браузер), .NET 4 и WinRT клиенты. Windows Phone и Silverlight были в предыдущей версии, но в альфу не попали. Их обещают допилить ближе к релизу.

Также в альфу не попала библиотека для self hosting. Вместо нее обещают поддержку http://owin.org/.

Простое SignalR приложение

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

1) Открываем VS и создаем ASP.NET MVC приложение

2) Инсталлируем пакет Microsoft.AspNet.SignalR через NuGet:

Install-Package Microsoft.AspNet.SignalR

Для того, чтобы команда сработала сейчас, до релиза, нужно добавить в конец префикс –pre. Со временем он будет не нужен.

После инсталляции вы увидите несколько изменений в проекте:

  1. В References добавятся библиотеки SignalR
  2. В Scripts добавятся библиотеки jQuery.SignalR
  3. В папке App_Start появится класс RegisterHubs, который занимается регистрацией рута ~/signalr/hubs

3) Создаем класс MoveHub в папке Controllers (может быть и другая папка, например, Hubs, но хабы – тоже своеобразные контроллеры):

using Microsoft.AspNet.SignalR.Hubs;

namespace SignalR_test.Controllers
{
	public class MoveHub : Hub
	{
		public void MoveShape(int x, int y)
		{
			Clients.All.shapeMoved(Context.ConnectionId, x, y);
		}
	}
}

Обращение Clients.All обозначает, что мы хотим отправить сообщение всем клиентам, которые подписались на события, происходящие в хабе. Метод MoveShape будет вызываться с клиента и вызывать метод shapeMoved во всех браузерах, открывших страницу с параметрами x, y (положение квадрата) и Context.ConnectionId (уникальный идентификатор клиента, отправившего запрос на сервер). Объект Clients.All (и другие) – dynamic, поэтому мы можем вызывать любые методы с любыми параметрами без опасения ошибок компиляции. В то же время это обозначает и то, что нам нужно быть предельно внимательными с именами методов и параметров, включая регистр – никакой проверки компиляции здесь нет.

4) Добавляем метод контроллера, который будет отображать нашу страничку Shape.cshtml:

public class HomeController : Controller
{
	...
	
	public ActionResult Shape()
	{
		return View();
	}
}

Здесь все просто, комментировать нечего.

5) Добавляем Shape.cshtml view, в котором ссылаемся на несколько JS файлов.






Сначала подключаем jQuery и jQuery.UI (для реализации draggable), затем библиотеку jQuery.SignalR, и в конце – обращение к JS-файлу с хабами. Это то место, где происходит вся магия SignalR. Файл генерируется на лету инфраструктурой библиотеки на основании всех хабов, которые есть в вашем коде. Если заглянуть в этот файл из браузера, то можно увидеть, как в нем регистрируются объекты и методы, использующиеся впоследствии из JavaScript-кода.

6) Кладем во view кусок JS-кода. В настоящем приложении JS-код лучше вынести в отдельный файл, но для наших целей и такого кода достаточно.


В JavaScript мы делаем следующее:

  1. Регистрируем метод shapeMoved, который будет “вызываться” из серверного кода. В методе двигаем фигуру, если мы сами не являемся источником запроса
  2. Стартуем соединение с сервером
  3. По успешному подключению регистрируем обработчик события draggable у фигуры, который будет вызывать серверный метод moveShape, находящийся в нашем хабе

7) Запускаем приложение, открываем страницу в двух разных браузерах (или на двух разных машинах), и смотрим, как при движении фигуры в одном из браузеров, она автоматически двигается в другом.

Группы

Очень полезной возможностью SignalR является поддержка групп. Группы используются для объединения подключений и последующего их группового использования. Например, когда у вас есть разные объекты (комнаты чатов, аукционы и т.д.) и необходимо, чтобы оповещения получали лишь те пользователи, которые просматривают именно этот объект.

С группами очень просто работать:

// Add connection to group "foo"
Groups.Add(Context.ConnectionId, "foo");

// Call send on everyone in group "foo"
Clients.Group("foo").send(message);

// Call send on everyone else but the caller in group "foo"
Clients.OthersInGroup("foo").send(message);

// Call send on everyone in "foo" excluding the specified connection ids
Clients.Group("foo", Context.ConnectionId).send(message);

Другие возможности SignalR

В целом, SignalR реализует следующие сценарии:

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

В официальной документации можно посмотреть более подробное описание всех API и их возможности, как на сервере, так и на клиентах:

Веб-ферма

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

Разработчики позаботились об этом и на данном этапе предлагают 3 решения:

  1. Поддержка Windows Azure Service Bus (идеально подходит для развертывания в Azure)
  2. Поддержка Service Bus for Windows Server
  3. Поддержка Redis

Если у вас не Azure, то остается два последних варианта. Из них лично я бы посоветовал Redis, т.к. он очень прост в установке и конфигурировании (его почти нет), в то время как Service Bus for Windows Server потребует от вас недюженных усилий.

Redis – это key-value storage, изначально разработанный для Linux, но под Windows существует несколько портов. Официально поддерживающийся порт и его настройка описаны в документации SignalR. Неофициальный, но по всей видимости более взрослый порт можно найти здесь: https://github.com/dmajkic/redis. Решение, как запустить его как Windows Service, описано здесь: https://github.com/kcherenkov/redis-windows-service.

Со временем обещают поддержку и других шин.

Полезные ссылки

Если вы хотите посмотреть пример приложения на SignalR, то вы можете скачать пример приложения, показывающего обновляющиеся биржевые котировки с GitHub (https://github.com/SignalR/SignalR-StockTicker), либо зайти на http://jabbr.net и попробовать вживую пример, реализующий чат. Кстати, на Jabbr в комнате, посвященной SignalR довольно часто бывает David Fowler, и у него можно спросить любой вопрос, который вас интересует.

Спасибо за внимание и успешной разработки!

Tuesday, September 25, 2012

Вторая встреча Kharkov AI Club

Лето наконец-то закончилось и нам удалось организовать вторую встречу Kharkov AI Club. Пройдет она в несколько необычном формате. Мы послушаем один доклад по машинному обучению, а остальное время посвятим питчам гостей.

1) “Машинное обучение. Распознавание рукописных цифр”

Докладчик: Бабий Андрей, преподаватель ХНУВД (Харьковский национальный университет внутренних дел)

Описание: Доклад будет посвящен одному из методов машинного обучения распознаванию цифр. Для примера будет использовано одно из соревнований по интеллектуальному анализу данных сайта Kaggle http://www.kaggle.com/c/digit-recognizer. В докладе будут рассмотрены особенности подготовки данных, метод распознавания и идеи по его улучшению.

2) Серия 5-10 минутных питчей, в которых приглашаются принять участие все желающие. Расскажите всем о своей работе, интересах, проектах в сферах AI, ML, CV, AR, робототехнике и др. с целью найти единомышленников и, возможно, помощников. Формально или неформально, с подготовкой или без – возможны любые варианты.

В заключение мы сможем немного пообщаться о развитии сообщества.

Дата: вторник, 2 октября 2012 г.
Время: 19:00
Место: офис Ciklum, ул. Отакара Яроша 18-Д, ТЦ «Движение», 3-й этаж(там же, где проходила первая встреча)

Пожалуйста, заполните форму регистрации на официальной странице Kharkov AI Club. Там же укажите, будете ли вы участвовать в питче, и если да, на какую тему. Спасибо.

Wednesday, April 25, 2012

Анонс первой встречи харьковского AI Club

Приглашаем вас на первую встречу харьковского AI Club! Целями первой встречи будут знакомство всех неравнодушных к искусственному интеллекту членов IT сообщества, обсуждение организации сообщества, а также прослушивание 2 интересных докладов:

1) Применение SURF для определения маркера дополненной реальности.

Докладчик: Бабий Андрей, преподаватель ХНУВД (Харьковский национальный университет внутренних дел)

Описание: В докладе будет рассмотрен алгоритм SURF. Особенности алгоритма работы, область применения и ограничения. Програмные средства реализации. Проблемы его использования для идентификации объектов в реальной ситуации. Пример реализации алгоритма от автора можно посмотреть ниже:

2) ROS – модульная операционная система для роботов. Проблемы и преимущества.

Докладчик: Вадим Бартко, со-организатор клуба. Работа – программирование под J2EE и Android, Ciklum. Увлечения – ИИ, философия сознания, работа мозга; стартапы.

Описание: Возможности, ограничения и недостатки программной  платформы для создании любительских роботов. Описан опыт использования системы при разработки робота, а также тонкости,  выявленные  при использовании с одноплатными компьютерами и сенсорными системами. Демонстрация работы ROS:

Точная дата и место встречи еще окончательно не известны, т.к. это будет зависеть от количества желающих. Ориентировочная дата и время: 17 мая 19:00. Вход свободный.

Пожалуйста, заполните форму регистрации на официальной странице Kharkov AI Club, чтобы мы знали, сколько будет человек и подобрали правильное помещение. Укажите контактный email, на который мы отправим уведомление о точном месте и времени мероприятия.

Для того, чтобы быть в курсе событий вы можете подписаться на RSS feed, в котором будет оперативно появляться вся информация. Также вы можете зафоловить нас в Twitter, если вам так удобнее.

И не забудьте рассказать о встрече вашим друзьям и коллегам!

Sunday, February 19, 2012

Отзыв о Nokia Lumia 800 (Windows Phone 7.5 Mango)

Прошло 2 недели активного использования смартфона Nokia Lumia 800 на Windows Phone 7.5 Mango. Хочется поделиться первыми впечатлениями и дать советы тем, кто решит купить себе этот или другой смартфон на WP7.

Сразу хочу сказать, что я не хочу сравнивать платформу Windows Phone с другими платформами (iOS, Android, etc.), т.к. у меня нет опыта использования последних. Также я не хочу делать очередной обзор возможностей смартфона – их уже достаточно в Интернете. Я постараюсь упомянуть только те возможности, которые важны для меня, и оставить в стороне все остальное. Если у кого-то будут дополнительные вопросы – задавайте их в комментариях, я постараюсь ответить.

nokia-lumia-800-different-angles1

Аппаратная часть и дизайн

В первую очередь хочется отметить качество сборки смартфона и его внешний вид – сразу чувствуется, что это серьезный аппарат, ничем не уступающий ни iPhone, ни топ-устройствам Android. Крепкий корпус, экран Gorilla Glass, отличный дизайн – все на высоте. Благодаря резиновому чехлу и небольшому размеру экрана (3.7”) аппарат хорошо лежит в руке. В Nokia Lumia 900 экран будет 4.3” – это уже такой себе достаточно увесистый “лапоть”, но помещаться на него больше не будет – разрешение такое же, как и в Lumia 800.

Фото- и видео-камеру я еще не успел нормально протестировать, поэтому пока оставляю за кадром. Отзывы на их качество не блестящи, но в моем случае это не обязательно – у меня есть 2 хороших фотоаппарата для этих целей.

Со звуком все нормально. Динамик обычный, родные наушники тоже ничего особенного из себя не представляют. Более качественные наушники дают звук получше. Есть вопросы к гнезду – одни из домашних наушников при поворачивании штекера в гнезде иногда теряли контакт с одним каналом, при этом с другими наушниками таких проблем замечено не было. Наверно, проблема в штекере, а не в гнезде.

Батарея и время работы

В интернете можно найти некоторые жалобы людей на батарею конкретно этого аппарата. В моем аппарате никаких проблем нет – смартфон работает от 2.5 до 3.5 дней в обычном режиме (звонки, смс, почта), при этом почти круглосуточно подключен к Wi-Fi (дома и на работе). Также еще можно включить Battery saver, который может продлить время работы еще на некоторое время в случае необходимости.

В частности, сейчас аппарат уже больше 2 суток без зарядки и при этом рапортует о том, что еще 45% емкости осталось. Интересно посмотреть, как быстро будет разряжаться батарея при частом прослушивании музыки/подкастов.

Интерфейс

Как и любое оригинальное решение, Metro-интерфейс кому-то нравится, кому-то нет. Я бы сказал, что он минималистичен, а в чем-то даже аскетичен. Нет ярких разноцветных пиктограмм (это тоже юзабилити-“фишка” – отсутствие искусственных элементов интерфейса, работа напрямую с данными), но в то же время очень качественная анимация и быстрая реакция на движения. Дизайн интерфейса “квадратный”, без закругленных углов, уверен, это многим не понравится. Но в целом напоминает минималистичность интерфейса продуктов и сервисов Google – только самое нужное, ничего лишнего и отвлекающего внимание.

Otzyvy_Nokia-Lumia-800

Клавиатура очень удобная, это отмечают многие. Правда, набор русских слов в auto-suggestions не так велик, как хотелось бы.

Есть претензии к списку программ – хотелось бы иметь возможность группировать их в папки или категории для более быстрого доступа. Возможно, появится в следующих обновлениях.

В остальном все отлично, интерфейс продуман хорошо, мне нравится.

Контакты

Как многие уже слышали или читали, Windows Phone объединяет контакты с аккаунтами ваших друзей из различных социальных сетей: Facebook, Twitter, LinkedIn и т.д. То есть он старается найти и связать аккаунты друг с другом, таким образом предоставляя вам полный доступ к профилю человека, и возможность отслеживать всю его активность и общаться с ним любым подходящим способом: звонок, sms, сообщение в социальной сети. Если смартфон не смог сам связать аккаунты, ему всегда можно помочь вручную. Такая возможность связывания есть и в Android, насчет iPhone точно не знаю.

Пару слов о том, как импортировать контакты со старого телефона, т.к. в моем случае это оказалось нетривиальной задачей. В WP7 есть стандартная программа Contacts Transfer, которая может перетащить все контакты с вашего старого аппарата через Bluetooth. В большинстве случаев все работает хорошо, но у меня не получилось подружить мой старенький Sony Ericsson W810i с Lumia, хотя экспорт контактов по Bluetooth в Outlook на ноутбуке прошел без проблем. Итак, что делать, если не получилось:

  1. любым удобным способом экспортировать контакты, календарь и прочее со старого аппарата в Outlook, в моем случае Windows 7 сам обнаружил телефон, и предложил синхронизацию
  2. сделать экспорт данных в csv-файл (важно: пересохранить файл в кодировке UTF8)
  3. импортировать контакты либо в Windows Live, либо в Gmail
  4. контакты сами синхронизируются с телефоном (естесственно, у вас должны быть настроены соответствующие аккаунты в смартфоне)

Вот и все. Единственное – теперь вам нельзя удалять контакты из Live или Gmail, иначе они удалятся и в аппарате. Я предпочел использовать Live.

Почта

Gmail, Hotmail, Yahoo! поддерживаются на уровне отдельных настроек, остальные можно настроить через стандартные POP и IMAP интерфейсы.

Что касается рабочей почты, то также поддерживается Exchange и Office 365. Подключается легко, но процесс не очень интуитивно понятный. Сначала не дает ввести адрес сервера, только логин и пароль. Вводишь их – естесственно говорит, что ничего не нашел, и добавляет еще поле воода домена. После того, как не получается еще раз – добавляет поле сервера. Наверно, какие-то security-заморочки.

Мобильный Outlook поддерживает почти все основные возможности своего старшего брата. включая группировку писем в conversations, приоритеты, задачи и календарь, так что работать очень удобно. Аттачи открываются при помощи соответствующих установленных программ автоматически, например, PDF открывается установленным отдельно Adobe Reader – удобно.

Программы

Программ и игр в Marketplace уже больше 60,000. Я успел лишь немного просмотреть каталог и поставить лишь самые основные и лишь бесплатные или trial-приложения. Текущее впечатление – основные приложения присутствуют, мы даже смотрели с ребятами, есть ли аналоги самых интересных приложений на Android – как ни странно, большинство есть. Количество приложений постоянно растет.

Осталось разобраться еще с покупкой приложений на Marketplace, но насколько я знаю, это не проблема, нужно лишь правильно настроить Live-аккаунт.

Разработка

Отдельным плюсом можно назвать возможность программирования приложений для собственного использования, чем я планирую заняться немного позже. Безусловно, если хочется заработать много денег на своей программе – на данном этапе лучше разрабатывать приложения для рынка iPhone/Android. Но в то же время у рынка Windows Phone приложений есть свои плюсы. Во-первых, не так много конкурентов, во-вторых, приложение, написанное под Windows Phone, вполне возможно можно будет с небольшими изменения портировать на Windows 8. А еще есть ощущение, что и наоборот: WinRT будет встроена в Windows Phone 8, что даст возможность разрабатывать приложения как на XAML/C#, так и на HTML/JS. но время покажет.

Цена

В Украине Lumia 800 можно купить лишь в интернет-магазинах, и обойдется он в 4000-4500, в зависимости от срока гарантии.

Недостатки

И в аппарате, и в платформе есть недостатки. Из тех, с которыми столкнулся я:

  1. Смартфон не поддерживает подсоединение к компьютеру, как флешка, закачивание файлов через Zune. Не такая большая проблема + вроде бы есть решение (http://allnokia.ru/soft/moreinfo-86.htm), но я его еще не пробовал.
  2. Подключение к компьютеру (Zune) только через кабель, через Bluetooth не работает. Возможно, потому что через Bluetooth пока нельзя передавать файлы, он только для трансфера контактов и гарнитуры. Здесь как-то совсем не понятно, даже мой старый Sony Ericsson поддерживал эту возможность на ура. Не всегда удобно.
  3. Ограничение группы контактов в 20 человек. Явно софтверное. Зачем?
  4. Акселерометр не работает в фоновом режиме, что ограничивает некоторые приложения. Хорошо хоть GPS работает в фоновом режиме.
  5. Нельзя поставить любую мелодию на рингтон, для этого нужно сначала ее обрезать и загрузить через Zune особым образом. Не ограничение, скорее, неудобство.

Заключение

Несмотря на некоторые недостатки я очень доволен покупкой. Железо от Nokia очень качественное, да и Mango избавился от проблем первой версии, став намного солиднее. Все мои потребности, заставившие купить смартфон, удовлетворены, интерфейс очень удобен в работе, развлечений тоже хватает.

Так что если вы раздумываете над покупкой смартфона, Windows Phone уже можно смело рассматривать. Уже выпущено около десятка устройств на Mango от HTC, Samsung и Nokia на разный вкус и карман. Кстати, Nokia за пару месяцев продала больше миллиона Lumia 710 и Lumia 800, а на выходе уже маячит новый флагман Lumia 900.

Wednesday, January 4, 2012

Подкаст DotBand #3 - Outsourcing

Поучаствовал в записи третьего подкаста DotBand на тему аутсорсинга. Поговорили о том, как проекты попадают в аутсорсинговые компании, что с ними происходит до момента старта и как обсуждать с клиентом техническую реализацию, какие бывают проекты и как их оценивать на входе, а также о многом другом. Это мой первый опыт, там есть ляпы, но надеюсь, что получилось интересно и информативно :) Если есть, что добавить или с чем поспорить – comments are welcome!

Послушать подкаст можно на официальной странице: http://www.dotband.com/2012/01/3-outsourcing.html.

Большое спасибо Диме, Толику, Антону и Максу за приглашение!

Sunday, January 1, 2012

Лучшие фотографии 2011

В первую очередь хочется поздравить всех с наступившим Новым годом! Желаю в 2012 исполнить все, что вы запланировали и о чем мечтаете, а то мало ли :)

2011 год выдался довольно продуктивным на различные поездки, поэтому неплохих фотографий получилось довольно много. Кроме этого летом приказал долго жить наш старичок Canon A620, служивший верой и правдой 5 лет, и ему пришлось срочно искать замену. В качестве замены был куплен Canon 60D (тушка) и объектив Sigma 17-70mm F2.8-4.0. Не могу сказать, что я уже освоился с этим девайсом, но я потихоньку учусь. В планах на январь купить еще один небольшой фотоаппарат (мыльницу) достаточного качества для того чтобы можно было ее брать с собой туда, куда взять зеркалку либо тяжело, либо жалко: байдарочные походы, горнолыжный отдых, некоторые велопокатушки и соревнования, и т.д.

Фотографии разделены на тематические группы по несколько фотографии в каждой. На главной будет всего 3 фотографии, остальные под катом.

Пейзаж

IMG_3348

Псел, Михайловка

IMG_2531

Spring Mountains, США

IMG_2403

Храм Изиды, Большой Каньон, США


Thursday, December 29, 2011

Аутсорсинг и продуктовая разработка

Очень часто приходится слышать как программисты сравнивают и противопоставляют продуктовую и аутсорсинговую (outsourcing) разработку. И часто при этом говорят, что аутсорсинг - это ерунда и неинтересные проекты, а вот если разрабатывать продукты или начать стартап, то сразу будет счастье. Если быть до конца точными, то все это разделение не совсем корректно, т.к. сравниваются метры с килограммами.

Кстати, само слово “стартап” также часто используется неверно среди IT-шников. Стартап - это любой начинающийся бизнес, не только IT, просто наибольшее распространение он получил именно в нашей сфере в эпоху доткомов.

Сразу хочу извиниться перед теми, для кого эта информация будет сродни откровениям кэпа, но очень хочется внести ясность в этот вопрос.

Итак, компании, так или иначе занимающиеся разработкой ПО, можно условно разделить на 2 группы:

  1. производящие ПО для собственных нужд или с целью самостоятельного распространения (продукты и услуги)
  2. предоставляющие услуги по разработке ПО для сторонних заказчиков

Вторую группу составляют именно те компании, которые обычно называют аутсорсинговыми, но так ли это, что они не разрабатывают продукты? В первую группу входят компании, которые обычно называют продуктовыми, но единственные ли они в этой группе?

С точки зрения рынка разработки ПО, это самое ПО, в свою очередь, также можно разделить на 2 группы:

  1. продукты (в основном настольные, мобильные и embedded, реже - веб), а также веб-решения, предоставляющие пользователям различные услуги, но предназначенные для использования большим количеством сторонних пользователей, а не самой компанией
  2. custom solutions - индивидуальные решения, предназначенные для внутреннего использования одним потребителем, например, внутри компании или организации

Если и другие классификации ПО, но нам они сейчас не очень интересны.

Понятно, что custom solutions могут разрабатываться как внутри самой компании (in-house), так и на заказ у какого-нибудь вендора. Но ведь и продукты со “стартапами” не всегда разрабатываются внутри компании, которая потом эти продукты продает.

Если скрестить это все, то получим следующую картинку:

Custom_vs_products

То есть любая аутсорсинговая компания может производить для своих заказчиков как индивидуальные решения, так и продукты. С точки зрения разработки продуктов их отличие от продуктовых компаний лишь в том, что аутсорсинговые компании, как правило, не принимают решения по продукту (Product Management на стороне заказчика) и не продают эти самые продукты, т.е. почти не рискуют, но и не собирают все сливки.

Поймите меня правильно, я ни в коем случае не хочу сказать, что разработка ПО на заказ (по сути, продажа труда, знаний и времени разработчиков) - лучше, чем разработка и продажа собственных продуктов или услуг на базе собственных решений. Разрабатывать продукты сложнее, потому что лишь 20-30% этого процесса - непосредственно разработка, остальное - анализ рынка и конкурентов, работа с пользователями, и самое главное - продажи. И после всех усилий и вложенных средств еще неизвестно - взлетит или не взлетит. Продавать услуги по разработке ПО в этом отношении намного проще и гораздо менее рискованно. В то же время и возможности заработка в аутсорсинговой модели ограничены рейтами, а разница между доходами и расходами невелика, в то время как в случае успеха продукта или стартапа доход может быть в разы, десятки и сотни раз выше, чем расходы. Но, как известно, кто не рискует, тот не пьет шампанского.

Ну, и напоследок, раз мы разобрались с разработкой продуктов в аутсорсинговых компаниях, то надо упомянуть еще и аутстаффинговые (outstaffing) компании, которые тоже присутствуют на нашем рынке в большом количестве. Чтобы два раза не вставать. Отличие между этими компаниями в том, что аутсорсинговые компании проводят разработку внутри себя, получая на входе различные требования, и отдавая на выходе программный продукт, т.е. продают услуги по разработке. Аутстаффинговые же компании “продают” заказчикам (как правило, техническим компаниям) не результат, а разработчиков или целые команды. При этом разработчики могут даже подписывать индивидуальные контракты с “работодателем”, а компания выступает лишь небольшой инфраструктурной и организационной платформой - предоставляет офис, оборудование, бухгалтерию, развлечения и прочие блага.

Monday, December 26, 2011

Распределенные транзакции (Distributed Transactions) и их настройка

Каждый программист, работающий с данными, сталкивался с обычными транзакциями той или иной базы данных. Основная задача транзакций – обеспечить consistency данных после завершения операции: изменения либо успешно сохраняются от начала и до конца, либо полностью откатываются, если что-то пошло не так. Даже если вы ни разу не писали в SQL коде ключевые слова BEGIN TRAN, COMMIT TRAN или ROLLBACK TRAN или нечто подобное, это еще не значит, что вы их не использовали. Все ORM, реализующие паттерн unit of work (Entity Framework, NHibernate и др.) объединяют операции по изменению данных в транзакцию перед сохранением.

Транзакции хорошо работают в рамках одной базы данных, но если у вас распределенная система, которая требует сохранения данных в разных базах на разных серверах, а иногда и платформах, то нужна более тяжелая артиллерия – распределенные транзакции (distributed transactions, DT).

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

Truly Understanding .NET Transactions and WCF Implementation

Работа вложенных транзакций отлично расписана здесь:

Understanding nested transaction scopes

Также не забывайте про MSDN:

http://msdn.microsoft.com/en-us/library/w97s6fw4(v=VS.90).aspx

Итак, .NET поддерживает распределенные транзакции при помощи класса TransactionScope. Кроме этого, основная технология разработки распределенных приложений, WCF, также поддерживает распределенные транзакции из коробки, предоставляя программисту целый комплекс конфигурационных параметров и атрибутов, которые позволяют с легкостью превратить ваш сервис из обычного в распределенно-транзакционный.

Для того, чтобы запустить ваш сервис в режиме поддержки распределенных транзакций, необходимо выполнить несколько шагов, щедро описанных в книгах, а также статьях и блогах в Интернете:

1) Сконфигурировать WCF для поддержки DT

Распределенные транзакции не поддерживаются в режиме basicHttpBinding, поэтому нам нужно использовать хотя бы на wsHttpBinding, в binding которого нужно прописать атрибут transactionFlow=”true”:

<wshttpbinding>
    <binding name="wsConfig" transactionflow="true">
         <security mode="None" />
    </binding>
</wshttpbinding>

2) Установить специальные атрибуты в интерфейсе сервиса и его методов

Необходимо добавить атрибуты TransactionFlow для метода в контракте и свойства атрибута OperationBehavior TransactionScopeRequired и опционально TransactionAutoComplete в реализации метода:

[ServiceContract] 
public interface IServiceContract 
{ 
    [OperationContract] 
    [TransactionFlow(TransactionFlowOption.Allowed)] 
    string ServiceMethod(string param1, string param2); 
}

public class Service : IServiceContract 
{ 
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
    public string ServiceMethod(string param1, string param2) 
    { 
      // some server-side operations with database 
    } 
}

Атрибут TransactionFlow принимает несколько опций: Allowed обозначает, что метод сервиса может вызываться как из кода, обернутого в TransactionScope, так и из обычного. Mandatory требует наличия TransactionScope, а NotAllowed (по умолчанию) заставит сервис игнорировать транзакции на клиенте вообще.

3) Создать на стороне клиента транзакцию, внутри которой вызвать метод WCF сервиса

Выглядит это приблизительно так:

public static string DoSomethingWithRemoteCall(string param1, string param2) 
{ 
    string result = null; 

    TransactionOptions options = 
        new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TimeSpan.FromSeconds(300) }; 
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options)) 
    { 
        // some client-side database actions 

        using (var ecommerceFactory = new ChannelFactory("Staging")) 
        { 
            ecommerceFactory.Open(); 

            var proxy = ecommerceFactory.CreateChannel(); 
            bool success = false; 

            try 
            { 
                result = proxy.ServiceMethod(param1, param2); 
                success = true; 
            } 
            catch (Exception ex) 
            { 
                // log exception 
                return;

            } 
            finally 
            { 
                if (success) 
                    ecommerceFactory.Close(); 
                else 
                    ecommerceFactory.Abort(); 
            } 
        } 

        // other possible client-side database actions
        scope.Complete(); 
    } 

    return result; 
}

Безусловно, в вашем коде вызов сервиса должен находиться в отдельном классе, это лишь пример.

TransactionOptions позволяет задать некоторые параметры транзакции. В нашем случае это уровень изоляции (значение по умолчанию Serializable не рекомендуется из-за опасности возникновения дедлоков) и таймаут операции (5 минут).

При создании TransactionScope мы указываем параметр TransactionScopeOption.RequiresNew, что не позволит никакому другому коду обернуть наш метод в свою транзакцию. Подробнее вложенные транзакции описаны здесь.

Внутри TransactionScope в случае, если мы действительно хотим закоммитить транзакцию, мы делаем вызов scope.Complete(). Если нам нужно транзакцию откатить (как в случае с catch в примере), мы просто не вызываем Complete(). Вызывать Complete() нужно после всех клиентских операций с базой данных, которые происходят внутри транзакции, иначе у вас случится ошибка, что connection или provider уже закрыт.

Обратите внимание, что в коде сервиса из предыдущего пункта нет никакого намека на TransactionScope, кроме атрибутов TransactionFlow и OperationBehavior. Он там и не нужен, для стандартного сценария атрибутов достаточно. Однако никто вам не мешает создавать свои вложенные транзакции, как с опцией Required (используем родительскую транзакцию), так и с опциями RequiresNew (новая независимая транзакция) и Suppress (код не будет выполнятся в родительской транзакции).

4) Запустить сервис и клиент

И вуаля – все работает. Или не работает? Говорите, полезли странные ошибки выполнения?

Для того, чтобы распределенные транзакции заработали, необходимо сделать еще правильно сконфигурировать клиенты и сервера:

1) Убедиться, что на всех клиентах и серверах (здесь и далее - включая сервера баз данных и веб-сервера) установлена и запущена служба Distribution Transactions Coordinator. Именно эта служба отвечает за координацию ваших распределенных транзакций.

2) Убедиться, что на всех клиентах и серверах включена поддержка распределенных транзакций. Для этого запускаем Control Panel –> Administrative Tools –> Component Services, идем в Computers –> My Computer –> Distributed Transaction Coordinator –> Properties (контекстное меню) и устанавливаем на вкладке Security следующие параметры:

  • Network DTC Access
  • Allow Remote Clients
  • Allow Inbound
  • Allow Outbound

Component_Services

3) Разрешить работу Distributed Transactions Coordinator во всех установленных брандмауэрах, включая Windows Firewall:

Firewall

4) Убедиться, что все ваши клиенты и сервера находятся в одной локальной сети. В большинстве случаев так оно и есть, но есть исключения, и если вы тот самый счастливчик, то вам придется немного попотеть, реализовывая поддержку протокола WS-Atomic Transaction (WS-AT), который упоминается в общей статье. Если вы тот самый счастливчик, которому надо начинать настраивать WS-AT, то вот еще пара полезных статей:

Configuring WS-Atomic Transaction support (MSDN)

Building transactional Web services with WebSphere Application Server and Microsoft .NET using WS-AtomicTransaction

5) Для работы DTC по локальной сети: все машины должны пинговаться по netbios-имени.

6) Важно: Если вы пошли по нашему пути и запустили тестовую конфигурацию на виртуальных машинах, запущенных с одного образа: переустановить DTC. DTC не работает с одинаковыми CID, а переустановка их сбрасывает. Это проблема, с которой мы столкнулись и которую смогли найти лишь запустив утилиту DTCPing.

Больше деталей здесь: Warning: the CID values for both test machines are the same

7) Если ничего не помогло: поставить и запустить DTCPing и посмотреть, что она говорит. Очень хороший способ, когда ничего другое не помогает:

Troubleshooting MSDTC issues with the DTCPing tool

Saturday, December 3, 2011

Paypal: работа с 3rd party merchant accounts

Интеграция с Paypal – вещь не сложная. Paypal поддерживает два типа API: Name-Value pairs (URL-based) и стандартный SOAP, а также несколько сервисов для работы, из которых самые распространенные Website Payments Standard и Website Payments Pro (Express Checkout и Direct Payments). Paypal также предоставлят Sandbox для тестирования и достаточно подробную документацию по каждому продукту и типу интеграции. Это если вкратце.

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

Для того, чтобы ecommerce сайт работал с Paypal, необходимо иметь Paypal merchant аккаунт, на который идет вся оплата за товары и услуги, продаваемые на сайте. Для авторизации на Paypal для аккаунта генерируются т.н. API Credentials: Username, Password и Signature/Certificate (лучше использовать Signature). Как это делается, в деталях рассказывается в документации. То есть механизм простой: веб-приложение передает запросы на Paypal, используя три параметра API Credentials, а Paypal таким образом “знает”, с каким merchant аккаунтом идет работа, грубо говоря, кому перечислять деньги за товары.

Все это замечательно работает, когда у вас в приложении “хостится” один продавец, и так работает наверно 95% всех ecommerce-сайтов, от простейших шаблонных электронных магазинов до более серьезных решений. Но в случае реализации сложной торговой площадки, на которой может работать множество торговцев, вроде Amazon.com, eBay.com или etsy.com, этого становится недостаточно. Есть два способа решения этой задачи.

Первый способ очевидный: пусть каждый merchant сгенерирует себе API Credentials и укажет их в своем профиле торговой площадки. Тогда при работе с выбранным Paypal API нужно будет всего лишь подставлять нужные credentials – и вуаля. Однако если посмотреть на профили того же Amazon или eBay для торговцев, то можно увидеть, что они просят ввести только Merchant account email. И никаких паролей или API credentials! Это и есть второй способ интеграции, не так хорошо задокументированный.

Упоминание об этом способе почему-то достаточно хорошо скрывается в документации к функциям API и фактически встречается лишь в описании работы с Name-Value pairs API и на форумах (кстати, форумы Paypal очень полезны, но гуглом не индексируются, поэтому лучше искать прямо там). Вот оно:

image

То есть можно сгенерировать API Credentials для всего приложения и динамически подменять лишь SUBJECT поле для каждого запроса, таким образом говоря Paypal, с каким merchant сейчас идет работа. И все бы хорошо, да только NOTE там указан не просто так. Paypal API достаточно мощный и дает возможность обращаться к некоторой внутренней информации merchant аккаунта, поэтому необходимо, чтобы merchant дал разрешение на определенные операции. Эти разрешения merchant может задать в Profile –> API Access –> Grant API Permissions. Далее нужно ввести API account username торговой площадки, которой даются разрешения и в появившемся списке выбрать те разрешения, которые нужны. Например, для работы с Express Checkout нужно выбрать как минимум:

  • Use Express Checkout to process payments

Также полезными могут оказаться:

  • Authorize and capture your PayPal transactions – если оплата проходит в 2 этапа: авторизация и захват/списание денег
  • Refund a transaction on your behalf – для возврата денег в случае возврата товара
  • и некоторые другие (полный список есть здесь)

Дальше – больше. Процесс разрешения прав можно упростить для торговцев еще сильнее, если использовать т.н. Paypal Permissions Service. Этот сервис предоставляет возможность интеграции торговой площадки со специальными страницами разрешения прав на Paypal. То есть пользователю-торговцу достаточно лишь кликнуть ссылку или кнопку на сайте торговой площадки, и он будет автоматически переброшен на страницу Paypal с уже выбранным набором прав для разрешения, необходимых вашему приложению. Пользователю останется лишь подтвердить разрешение.

Тестирование этого процесса также заслуживает внимания, так как там притаилась еще одна небольшая засада. Вам необходимо создать 2 (!) различных sandbox-аккаунта, один из которых будет использоваться для создания API Credentials веб-приложения, а второй – для создания тестовых merchant-аккаунтов, которые будут якобы продавать товары. И неважно, что merchant (или seller) аккаунты можно создать и на основном sandbox аккаунте, вам не удастся сконфигурировать нужные права и Paypal будет возвращать непонятные ошибки.

Надеюсь, для кого-то эта информация окажется полезной и сэкономит время.

Saturday, November 19, 2011

Онлайн-курсы от Стэнфорда

Многие программерские ресурсы уже раструбили эту новость, но, может, кто-то еще не слышал. Полтора месяца назад Стэнфордский университет запустил бесплатные онлайн-курсы по Artificial Intelligence и Machine Learning. Эксперимент оказался довольно удачным (хотя отзывы по курсу AI и хуже, чем по ML) и с января по март запускается вторая волна курсов, 8 9 по Computer Science и 2 по Enterpreneurship:

1. Machine Learning — jan2012.ml-class.org
2. Introduction to Computer Science — www.cs101-class.org
3. Natural Language Processing — www.nlp-class.org
4. SaaS and Software Engineering — www.saas-class.org
5. Human-Computer Interaction — www.hci-class.org
6. Game Theory — www.game-theory-class.org
7. Probabilistic Graphical Models — www.pgm-class.org
8. Cryptography — www.crypto-class.org
9. Design and Analysis of Algorithms — http://www.algo-class.org/
10. Technology Entrepreneurship — www.entrepreneur-class.org
11. The Lean Launchpad — www.launchpad-class.org

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

Курсы можно проходить в одном из двух режимов: Basic или Advanced track. В Basic треке вы просматриваете лекции и отвечаете на еженедельные тесты. При этом никто ничего от вас не требует. В Advanced треке в дополнение нужно делать лабораторные работы, которые будут проверяться преподавателями. Работы оцениваются, их нужно сдавать вовремя, за опоздание начисляются штрафные баллы. В конце курса в случае Advanced трека будут подведены итоги, и вы получите письмо от преподавателя с вашими результатами. Никаких сертификатов и прочего – все знания, что успели ухватить – все ваше.

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

Я решил записаться на 3 курса: Machine Learning, Natural Language Processing и Game Theory. По первому очень хорошие отзывы, да и просто любопытно сравнить с тем, чему нас учили, вторым я немного занимался в университете, а третий просто интересно прослушать – на нашей специальности (ПОАС) теории игр не было, но встречаюсь с ней все чаще. Не уверен, что хватит времени пройти все по Advanced треку, но во-первых, всегда можно перейти на Basic или вообще отказаться, а во-вторых, я думаю начать проходить Machine Learning сейчас с первой группой, включая лабораторные работы, чтобы в январе-марте сэкономить себе время на этом курсе.

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

PS. Кстати, кому интересно, до середины декабря проходит AI Challenge. В этом году, к сожалению, совсем нет времени участвовать, а жаль.

PPS. Курсы добавляются как грибы после дождя. Появился еще один курс, на этот раз по дизайну и анализу алгоритмов: http://www.algo-class.org/

Tuesday, June 28, 2011

Будущее Silverlight

Очень странно наблюдать поднявшуюся в последний месяц истерию по поводу того, что Microsoft якобы “разочаровался в WPF/Silverlight” и планирует смену курса в сторону набирающего популярность HTML5. Тема вовсю обсуждается на форумах MSDN, в комментариях серьезных блоггеров, на Хабре и даже в твиттере. Несмотря на явную невозможность нативной разработки под Windows при помощи ыHTML5/JS, у этой истерии, безусловно, есть корни. Осенью прошлого года официальные лица Microsoft уже обронили несколько фраз о переосмыслении стратегии развития Silverlight, а в начале июня подлили масла в огонь, показав Windows 8 с возможностью разработки на HTML5/JS и ни словом не обмолвившись о Silverlight. Если погуглить по фразе “Windows 8 silverlight”, то можно найти кучу криков о смерти Silverlight и плач тысяч разработчиков, которые выбрали Silverlight своей основной платформой для разработки и теперь считают себя брошенными на произвол судьбы. Добил фанов технологии .NET Community Manager Pete Brown, который высказался ясно и в то же время очень неопределенно:

“You all saw a very small technology demo of Windows 8, and a brief press release. We’re all being quiet right now because we can’t comment on this. It’s not because we don’t care, aren’t listening, have given up, or are agreeing or disagreeing with you on something. All I can say for now is to please wait until September. If we say more before then, that will be great, but there are no promises (and I’m not aware of any plans) to say more right now. I’m very sorry that there’s nothing else to share at the moment. I know that answer is terrible, but it’s all that we can say right now. Seriously.”

Сентябрь, о котором идет речь – это конференция Build, на которой ожидается релиз Silverlight 5, Windows Phone 7 Mango, а также первые настоящие презентации Windows 8 с объяснениями дальнейшей стратегии компании.

Безусловно, можно подождать еще 2.5 месяца и узнать, какую роль Microsoft отводит для Silverlight в своей новой концепции. Но ждать еще долго, а некоторые решения нужно принимать уже сейчас. Попробуем разобраться сами.

Итак, что у нас есть из не очень хорошего:

  1. Microsoft, безусловно, немного разочарована скоростью распространения Silverlight и его положением на рынке. И хотя процент установки Silverlight в браузерах уже достаточно высок (на данный момент около 75%, http://www.riastats.com/), но он все равно еще недостаточен и не дает технологии стать по-настоящему популярной.
  2. Другая проблема Silverlight – его неполная кроссплатформенность. Поддержка Windows и Mac – это, конечно, где-то 90-95% рынка десктопов (а, может, и больше, если верить http://gs.statcounter.com/#os-ww-monthly-201005-201105), но с точки зрения разработки широкопользовательских веб-приложений остается непокрытым весь Linux’овый зоопарк. Не добавляет очков и слабая поддержка SEO.
  3. На мобильных платформах подержка Silverlight вообще стремится к нулю. Ни iOS, ни Blackberry, ни Android не поддерживают Silverlight и вряд ли будут стремиться к этому. Единственная платформа, где он поддерживается – это WP7, правда, не в браузере. Но доля WP7 на рынке мобильных устройств (http://itc.ua/news/gartner_android_yavlyaetsya_samoj_populyarnoj_os_dlya_smartfonov_53536) и количество заказов на разработку WP7 приложений пока настолько малы, что серьезно раздумывать о карьере разработчика мобильных приложений пока не получается.

В то же время несмотря на все эти недостатки Silverlight уже занял свою определенную нишу, где он очень силен, в первую очередь благодаря скорости разработки и возможностям, недоступным стандартному HTML/JS клиенту:

  1. Enterprise и LOB RIA приложения (нивелируются проблемы слабой кроссплатформенности и распространенности)
  2. веб-приложения, в которых пользователи готовы установить плагин ради получения доступа к продвинутым возможностям, а не уйти к конкурентам (не e-commerce)
  3. мультимедиа-приложения с красивой и сложной анимацией, поддержкой video streaming
  4. кроме того, Silverlight пока остается основной платформой для разработки под Windows Phone 7

С чем же связано то, что Microsoft, вложившая 4 года и миллионы долларов в разработку и продвижение кроссплатформенной .NET-технологии, потихоньку смотрит в сторону HTML5/JS? И что же все-таки будет с Silverlight дальше?

Во-первых, любой компании, которая производит ОС, важно привлекать как можно большее количество разработчиков на свою сторону. Silverlight и WPF требуют от не .NET-разработчиков изучения слишком многого. А возможность сделать пусть и простое, но все же приложение под Windows 8 на HTML5/JS – это шанс. Тем более, что Windows 8 позиционируется и как операционка для планшетов – а это очень перспективный рынок. Уверен на 99%, что в сентябре на Build будет сказано о полной поддержке WPF (а куда ж он денется?), а также Silverlight как минимум на уровне разработки таких же приложений, которые будут разрабатываться на HTML5/JS.

Во-вторых, есть ощущение, что Microsoft пойдет на еще один непопулярный, но очень важный с точки зрения развития своей мобильной платформы шаг – даст возможность разрабатывать нативные приложения на HTML5/JS в Windows Phone. Думаю, начиная с восьмой версии, чтобы поддержать версионирование, но, может, и в Mango (7.5) добавят. Криков о помощи будет еще больше, но Microsoft нужно догонять убегающие iOS и Android. Разработчики мобильных приложений под iOS и Android не торопятся переносить свои приложения под WP7 в том числе и потому, что это требует совсем других навыков. Если бы у Microsoft было хотя бы 40% рынка, они могли бы закрыть глаза на простоту разработки, но с текущими 6% им некуда деваться.

В-третьих, Silverlight никуда не уйдет из web’а в ближайшие 3-5 лет. Его доля будет по-прежнему неуклонно расти, приложения будут разрабатываться, но вот из своей ниши он вряд ли выйдет. Этому будет мешать развитие HTML5 и рост рынка веб-приложений под мобильные устройства. Конечно, Microsoft может попробовать разработать Silverlight-плагины для мобильных операционных систем и браузеров, но это огромные деньги, а эффекта практически не будет.

В поддержку Silverlight на нативном уровне верится еще меньше. Такое возможно лишь на Android, и то лишь благодаря Mono, который и сам находится в непонятном статусе. Еще возможно продвижение Silverlight на Symbian, благо с Nokia есть договор, но какой смысл? Ведь есть готовый WP7, который можно ставить на устройства. На фоне же прогнозов о росте использования мобильных веб-приложений и снижения нативной разработки (это банально намного проще и дешевле!) смысла вкладываться в эту сферу вообще нет.

Ну, и в-четвертых, отдельно стоит сказать пару слов о Silverlight vs. HTML5, вернее даже plugins (Flash/Silverlight) vs. HTML5 (это отдельная фишка: под угрозой HTML5 сейчас объединяются даже ранее враждовавшие разработчики Flash/Flex и Silverlight :)). На эту тему сломано уже очень много копий (почитайте отдельно, если вам интересно), но ясно одно: HTML5 не покрывает всех возможностей Silverlight и Flash/Flex, поэтому их рано списывать со счетов. Кроме того, как все правильно отмечают, плагины пополняются новой функциональностью быстрее, чем развивается HTML и обновляются версии браузеров. Если же отвечать на вопрос: что лучше использовать в качестве клиента в каждый конкретный момент времени, то советую почитать два отличных поста:

Лично я себя намного комфортнее чувствую в разработке обычных ASP.NET MVC приложений, чем Silverlight, но это не значит, что нет приложений, для которых использование Silverlight будет более выгодным или дешевым. Особенно если мы говорим о портировании WPF-приложений в веб.

А вы что думаете по всему этому поводу?