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 будет возвращать непонятные ошибки.

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