Разработчики Patterns & Practices выпустили новую версию документа Mobile Architecture Pocket Guide, который описывает наиболее удачные практики построения архитектуры мобильных приложений на платформе .NET.

PS: Уже начал читать. Хотя в документе довольно много материала, относящегося к прописным истинам и к “само-собой-разумеещееся”, но на самом деле очень удобно, когда все разложено по полочкам.

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

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

Leave a Reply

Your email address will not be published. Required fields are marked *

Р.

Работа с SOAP Web-сервисами в Android-приложениях

Всем время от времени хочется странного. Вот мне тоже захотелось такого. А именно – подружить Android-приложение с .NET Web-сервисом – такие сервисы и писать быстрее и доступ к ним потом можно получить из Windows Mobile и Windows Phone 7 без проблем – тоесть одним махом можно решить проблему работы с сервисом для различных мобильных платформ. И вот в этот раз я расскажу о том, как сделать чтобы все это заработало.

Подготовительный этап – Создание Web-сервиса

Для начала создадим простой .NET Web-сервис:
ISampleService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace SampleService
{
    [ServiceContract]
    public interface ISampleService
    {
        [OperationContract]
        double Add(double a, double b, String c);
    }
}

SampleService.asmx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebService
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class SampleService : System.Web.Services.WebService
    {
        [WebMethod]
        public double Add(double a, double b, String c)
        {
            return a + b;
        }
    }
}

Затем установим его на Web-сервер (для примера я создал виртуальный каталог на локальном IIS сервисе и установил туда сервис прямо из Visual Studio. После этого URL сервиса у меня получился вот такой:

http://192.168.1.32/SampleService/SampleService.asmx

kSOAP2 – Библиотека для доступа к SOAP-сервисам под Android

Процесс создания Android-приложения описывать не буду. Скажу только ,что после создания приложения необходимо в него добавить библиоеку kSOAP2-Android, которую можно скачать здесь.

После того, как скачали дистрибутив, JAR файл библиотеки нужнно положить в подкаталог lib в каталоге с исходными кодами проекта, а затем в окне свойств проекта в разделе Java Build Path на вкладке Libraries с помощью кнопки Add JARs… добавить его в список используемых библиотек.

Библиотеку добавили, теперь можно начинать кодинг.

Кодинг

kSOAP2 для работы с сервисом необходимы 4 параметра:

  • URL сервиса
  • Имя пространства имен
  • Имя SOAP-операции
  • Имя метода

URL Web-сервиса мы знаем – это адрес ASMX файла

Имя пространства имен можно узнать если открыть в браузере URL Web-сервиса:

Дальше нам надо узнать имя SOAP-операции, а также имя метода. Их можно узнать из WSDL схемы:

Итак, с параметрами подключения разобрались. Поулчаем что-то вроде этого:

private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://192.168.1.32/SampleService/SampleService.asmx";
private static final String SOAP_ACTION = "http://tempuri.org/Add";
private static final String METHOD_NAME = "Add";

Теперь надо как-то наш метод вызывать из приложения и передавать туда параметры.
Добавим на activity два текстовых поля, кнопку и поле для вывода результата:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:focusable="true" android:focusableInTouchMode="true">

<EditText android:layout_height="wrap_content"
			android:layout_width="fill_parent"
			android:layout_margin="5dip"
			android:id="@+id/Num1EditText"
			android:inputType="number"
			android:text="2"></EditText>
<EditText android:layout_height="wrap_content"
			android:layout_width="fill_parent"
			android:layout_marginBottom="5dip"
			android:layout_marginLeft="5dip"
			android:layout_marginRight="5dip"
			android:id="@+id/Num2EditText"
			android:inputType="number"
			android:text="3"></EditText>
<Button android:text="="
			android:layout_height="wrap_content"
			android:layout_width="fill_parent"
			android:layout_marginLeft="5dip"
			android:layout_marginRight="5dip"
			android:id="@+id/CallServiceButton"></Button>
<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textSize="24dip"
			android:textStyle="bold"
			android:layout_marginLeft="7dip"
			android:layout_marginRight="7dip"
			android:gravity="fill_vertical|fill_horizontal"
			android:id="@+id/ResultTextView"></TextView>
</LinearLayout>

Ну вот, теперь пишем обработчик для кнопки, в котором вызываем Web-сервис.

	OnClickListener mCallServiceButtonListener = new OnClickListener() {

		@Override
		public void onClick(View v) {
			try
			{
				double a = Double.parseDouble(mNum1EditText.getText().toString());
				double b = Double.parseDouble(mNum2EditText.getText().toString());
				double result = callService(a, b);
				mResultTextView.setText(String.valueOf(result));
			}
			catch(Exception e) {
				e.printStackTrace();
				mResultTextView.setText(SOAPTest.this.getString(R.string.message_error));
			}
		}
	};

	double callService(double a, double b) throws Exception {
		double result = 0;
		do
		{
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

			PropertyInfo pa = new PropertyInfo();
			pa.setName("a");
			pa.setValue(new Double(a).toString());

			PropertyInfo pb = new PropertyInfo();
			pb.setName("b");
			pb.setValue(new Double(b).toString());

			PropertyInfo pc = new PropertyInfo();
			pc.setName("c");
			pc.setValue("test");

			request.addProperty(pa);
			request.addProperty(pb);
			request.addProperty(pc);

			SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			envelope.dotNet = true;

			envelope.setOutputSoapObject(request);
			HttpTransportSE androidHttpTransport = new AndroidHttpTransport(URL);
			androidHttpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

			androidHttpTransport.call(SOAP_ACTION, envelope);
			SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
			result = Double.parseDouble(resultsRequestSOAP.getProperty("AddResult").toString());
		}
		while(false);
		return result;
	}

Не забываем обратить внимание на магический флаг envelope.dotNet – без него к .NET сервису подключиться не получится.
Также есть проблемы с подключением к WCF-сервисам. У меня так и не получилось вызвать метод из WCF-сервиса (судя по тикетам проекта ksoap2-android, у многих та же проблема, но говорят что все-таки как-то можно…)

Еще есть проблема с численными параметрами. У меня упорно не хотело сериализировать параметры типа double, пришлось передавать их в виде строки (судя по примерам, все так делаю, видимо так и надо).

Скачать исходный код примера.

Т.

Таможня дает Zlo. История вторая о покупке дешевых ноутбуков в Китае

Вступление

Умные люди учатся на чужих ошибках, глупые – на своих, есть люди, которые ничему не учатся (таких мало). Но бывают ситуации, когда для того чтобы сделать что-то умное, приходится совершать довольно странные, и порой нелогичные поступки. И, в общем, о чем это я. Какое-то время назад я уже писал о покупке дешевых ноутбуков в Китае и о том, чем это все обернулось для меня. В этот раз я расскажу тоже о покупке ноутбуков, но уже немного другого класса и у другого производителя и о том, «как это было». Китайцы, они разные Как я уже говорил ранее, прежде чем работать с китайцами, надо бы хорошо подумать, т.к. без личного вашего присутствия при отправке, сам могут подсунуть все что угодно и вообще шанс получить то, что вы покупали, довольно невысок. Но китайцы, …. они разные. С кем-то можно делать бизнес, а с кем-то нет. Проверить это можно только опытным путем. И вот такой опытный путь выбрал я в этот раз. Надо быть авантюристом (или оптимистом) до мозга костей чтобы заказать большую партию оборудования в Китае у незнакомого производителя и не будучи уверенным, что заказанное вами оборудование будет именно того качества, которого вы ожидаете. Так, при покупке партии ноутбуков лучше для начала (если вы все-таки решились на это) заказать образец (sample). Вот и я, блуждая по бизнес-порталу Alibaba.com, набрел на довольно интересный экземпляр субноутбука, который мне показался интересным с коммерческой точки зрения и как обычному пользователю. Выглядело все это добро как-то так:

  • Процессор: Mobile Diamondville-SC(Intel Atom N270 1.6GHz)
  • Чипсет: Intel 945GSE+82801GBM(ICH7)
  • Монитор: 10″TFT LCD panel 1024*600 &1024*576 Backlight unit:LED
  • HDD: 2.5″, 9.5mm SATA 5400/7200rpm 160GB
  • Wi-Fi: Intel WLAN abg 802.11 b/g
  • Сеть: 10/100Mbps Ethernet
  • 3G: (Опционально)
  • Web-камера: 1.30M Pixels (Опционально)
  • Порты
    • 1 x Mic in
    • 1 x Headphone out
    • 1 x RJ-11
    • 1 x RJ-45
    • 1 x Mini USB 2.0 Port
    • 3 x USB 2.0 Ports
    • 1 x DC-in
    • 1 x VGA (15Pin)

Ну, вот как-то так. И все это добро за… 275 американских зеленых президентов. Для наших широт это вполне-таки неплохая цена. Даже очень, учитывая встроенный 3G, который, как видно из спецификации, доставляется по желанию. 3G-модуль удорожает зверушку на 7 президентов, что, в общем-то, сносно. Когда писал письмо производителю, особо на ответ не рассчитывал, помня свое общение с производителями нетбуков NPX-9000, да и вообще далеко не все производители будут с вами разговаривать, если вы не собираетесь заказывать стопицод экземпляров их товара. На удивление, в этот раз отписали быстро. Буквально на следующий день. Ответы на все последующие письма приходили тоже довольно быстро. Складывалось впечатление что эти граждане действительно хотят работать. Так за неделю я узнал, сколько будет стоить вставить 3G-модуль ($7), сколько будет стоить доставка (стоимость отправки EMS’ом – $100, DHL’ом – 150). Но EMS отказалась от пересылки ноутбука (непонятно почему, хотя в прошлый раз тоже отказалась, но ладно – значит они не хотят денег). Предложили отправку UPS’ом, т.к. у них с ними какой-то контракт и поэтому отправка будет стоить немного дешевле, чем в DHL – $130. Тоже неплохо – двадцать баксов скидка. ОК, договорились о конфигурации и стоимости, я получил инвойс. Общая сумма в инвойсе – $440 (из них $20 – комиссия банка, $130 – стоимость отправки). Теперь нужно было выполнить перевод денег в Китай. Что касается зарубежных переводов, то выбор у нас не особо большой. Я обычно пользуюсь услугами ПриватБанка. Они хоть и очень неправы в плане качества обслуживания, но на безрыбье, как говорится… особо и не повыбираешь. С приватбанком, в этот раз, проблем не было… Очень и очень странно 😉 прямо-таки небывалый случай. Хотя это не значит что цирка не было. Перевод они осуществили быстро (не забыв при этом взять 126 гривен комиссионных, это ~$15.75. Пока общался с сотрудницей банка, услышал от нее, что SWIFT-переводы как бы собираются отменять в пользу Western Union. Бред, вообще полный бред, не представляю каким образом банк будет себя лишать неплохого источника дохода, к тому же SWIFT-переводами пользуется весь мир и Western Union вообще левая компания. В общем, я ей не поверил и, думаю, правильно. В общем, что-то неладное творится в датском королевстве. Но это уже не мои заботы. Деньги ушли, до Китая дошли через 8 дней и, как оказалось не вся сумма. Вместо $440 получилось $420. И тут, как это ни странно, китайцы решили все равно отправить мне ноутбук даже без этих $20, хотя я и предлагал переслать им недостающую сумму, например PayPal’ом. До сих пор не пойму, почему я о PayPal сразу не подумал, а пошел в банк. Это было бы быстрее, я думаю, хотя может в Китае, как и у нас, PayPal не работает на прием, а только на отправку средств. И вот, через три или четыре дня посылка была отправлена. Приблизительно две недели ушло на доставку. На самом деле, многовато, с DHL кажется было быстрее. Когда ждать мне надоело, а трекинг на сайте UPS работает довольно коряво, информация в английской и украинской версии трекинговой системы сайта очень сильно отличается, позвонил в офис UPS самостоятельно. Сказали что посылка через два дня приедет. Через два дня заехал к ним офис и таки-да, посылка пришла, но все самое интересное только должно было начаться, т.к. после прихода посылки ее необходимо растаможить.

Учимся делать финт ушами

Если вдруг вам посчастливилось хоть что-нибудь получать с помощью курьерских фирм в Украине, поздравляю – вы стали участником незабываемого действа, в котором роль главного клоуна принадлежит вам и только вам. Если вы человек впечатлительный или у вас проблемы с нервами – просто откажитесь от этой глупой затеи, пользуйтесь EMS’ом или просите друзей чтобы получили посылку в другой стране вместо вас и переотправили обычной почтой. В случае если роль клоуна вас устраивает, можете пообщаться с таможенниками. Level up вам гарантирован. Первым делом, когда посылка уже пришла, необходимо пройти пройти радиологический контроль и санэпидемстанцию. Для этого нужна ОБЯЗАТЕЛЬНО копия авианакладной, переведенная на русский или украинский язык. Просто перевести мало, надо чтобы на этом переводе стоял штамп организации, уполномоченной делать официальные переводы. Если вам не повезло – за перевод прийдется платить деньги, например в агентстве переводов. В этот раз перевод названия товара мне сделала сотрудница компании UPS и поставила штампик. Этого штампика мне вполне хватило чтобы пройти контроль в санэпидемстанции, за что компании UPS большое человеческое спасибо. Поставить штампик радиологического контроля оказалось сложнее, чем в предыдущие разы. Теперь для прохождения контроля необходимо:

  • Заполнить заявление на прохождение контроля
  • Зарегистрировать это заявление
  • Пойти с ним в бухгалтерию, получить документы на оплату
  • Оплатить 42 гривны (~$5.25) в банке
  • Отнести чеки
  • Получить печать на авианакладной

Наши банки снова на высоте, взяли с меня комиссию 10 гривен ($1.25) Во, чуть не забыл. Как-то странно себя повела компания UPS. Оказалось что для того чтобы доставить посылку из Киева под таможенным контролем в Запорожье, мне нужно заплатить еще 115 гривен ($14.4). Ну, спрашивается, за что? В накладной же английским по белому написано, доставить из Гонконга в Запорожье. Причем здесь Киев? Причем здесь вообще таможенный контроль, если у нас в городе есть региональное отделение таможни? С DHL и с FedEx такого не было поэтому подобные сборы я трактую как желание на@бать клиента. Итого, что у нас получается на данный момент: $440 за ноутбук и доставку + $15.75 комиссия банка + $6.5 радиологический контроль + $14.5 непонятная мзда за доставку под таможенным контролем = $476.75 Много, а было мало – начальная стоимость зверушки $290 Но ладно, индейцы не ищут легких путей. Через 5 дней праздников надо было ехать в отделение таможни проводить таможенный досмотр. К слову хочу сказать, что китайцы по какой-то ведомой только их китайским богам причине указали стоимость посылки в $10. В UPS мне сказали, что при таможенном досмотре эта цена может показаться, мягко говоря, подозрительной, поэтому я попросил перепослать мне инвойс, с ценой, ну, скажем, в $120. Нормальная такая цена, учитывая, что когда я заказывал NPX-9000 в прошлый раз, их себестоимость была $129. Копию инвойса со стоимостью $120 мне прислали по e-mail’у, а в локальный офис UPS она почему-то не дошла – еще один пример невнимательного отношения к документам. В DHL уточнения приходили за 3 дня и с этим проблем не было вообще. Таким образом, получилось что на руках у меня один инвойс, а с посылкой пришел другой, на что таможенный инспектор, конечно же, обратил внимание. Мою копию инвойса на таможне проигнориловали, а из-за того что цена указана не соответствующая действительности, пришлось ехать в отдел тарифов проводить оценку содержимого посылки. А из-за того что в посылке были еще и диски с драйверами, надо пройти еще и отдел проверки носителей информации. Вообще не понимаю, на каком принципе у них все это построено: санэпидемстанция и радиологический контроль проходится без предъявления посылки. Просто пришел с накладной, заплатил бабло и получил штамп. И никого не волнует, что там, в действительности пришло. Относительно честный способ отъема денег у населения. Отдел тарифов делает оценку по текстуальному описанию содержимого посылки, которое напишет таможенный инспектор. Кстати в отделе тарифов мне довелось побывать впервые, т.к. все предыдущие разы за меня этот делал таможенный брокер. Все это можно и нужно делать самостоятельно. Работа брокера стоит довольно дорого, а покататься немного по городу вы можете и сами, нечего свои деньги за зря отдавать. Посылку в отделе тарифов оценили в… 285 американских президентов. И никого не волнует что там написано на вашем инвойсе, никого не волнует что указано на авианакладной. Наша любимая таможня трактует все только в свою пользу. Если вы, например, купили какие-то шмотки на eBay и нидайбох получаете их курьерской фирмой, то например, за те же джинсы, купленные за 30 баксов, вы заплатите пошлину равную 20% от стоимости, которую вам посчитает отдел тарифов + стоимость доставки. Ну, это где-то так вам получится еще +50. Классно? Вот я так же обрадовался, когда мне мою посылочку оценили в 2.5 раза выше, чем заявленная стоимость. Да, в этом месте сэкономить не получилось, я, правда, немного расстроился, ибо, в общем, сумма получалась уже совсем не радужная, но в целом еще не совсем разочаровался в затее. Итак, НДС для моей посылочки составила 571 гривну ($71.4) и еще 13 гривен комиссии пришлось отдать банку ($1.6). И вот тут мы подходим еще к одному интересному моменту, от которого я в непонятках до сих пор. Для того чтобы оформить посылку на таможне, необходимо заполнять таможенную декларацию. Для посылок до 1000 евро это декларация формы M-16. Подавать эту декларацию нужно в письменном и электронном виде. Электронная копия должна быть ОБЯЗАТЕЛЬНО и представлена должна быть на floppy-диске. А-фи-ген-но! НО это еще не самое интересное. Самое интересное что декларация подается в виде файла определенного формата. Файлики эти делаются проприетарной программой, которой для обычных людей в свободном доступе нет. После небольшого допроса представителя UPS я узнал что:

  • Программа стоит 1200 гривен ($150)
  • Шаблон документа M-16 стоит 600 гривен ($75)
  • Ежемесячная плата за поддержку и обновления 120 гривен ($15)

Ну и спрашивается, как обычному человеку можно сдать документы нашей доблестной таможне, не прибегая к услугам брокеров (которых заставили покупать эту программу и теперь они за оформление декларации берут 150 гривен, это $18.75)? Супер. Монополия блин. Вот и мне пришлось расстаться с честно заработанными 150 деньгами непонятно по какой причине. Написать все в текстовом виде я мог бы и сам. И в итоге, что мы получили: $476.75 + 71.4 + 1.6 + 18.75 = 568.5 В общем итоге переплата за доставку и мзду нашим таможенным органам составила 278.5, это почти столько же, сколько стоит сам ноутбук. small_notebook Вот так получается, в нашей стране честно работать невозможно. НО Я не говорю что, я не доволен результатом. Во-первых, ноутбук оказался рабочим, при чем, рабочим полностью. Во-вторых, ноутбук оказался довольно хорошего качества и сборка аккуратная, я даже не ожидал: лакированный корпус, довольно удобный тачпад и клавиатура, Windows XP на нем тоже отлично работает, Web-камера – полет нормальный. Если еще и заявленная поддержка 3G заработает, будет вообще шикарно. 3G не пробовал, ибо нет карточки. Сам ноутбук, как я писал выше, я заказал в качестве пробного образца и как рабочий инструмент он меня мало интересует, поэтому если кто-то захочет его приобрести ровно за ту сумму, которую я на него потратил, можно написать в приват – договоримся. Обзор… готовлю. Несколько фоток даю прямо сейчас 🙂 Скачать полную спецификацию ноутбука.

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