Статьи на компьютерную тематику и личный блог » Программирование http://westward.cv.ua Mon, 01 Jul 2013 21:06:34 +0000 ru-RU hourly 1 http://wordpress.org/?v=3.4.2 Попытка написать ping и traceroute http://westward.cv.ua/android/programming/ping-and-traceroute.html http://westward.cv.ua/android/programming/ping-and-traceroute.html#comments Sat, 29 Jun 2013 15:38:23 +0000 admin http://westward.cv.ua/?p=87 Дочитал начатую еще в 2010 году книгу по программированию для платформы Android, “Teach Yourself Android Application Development in 24 Hours”. Название из серии “24 часа из жизни чайника” ;) , но на деле эта книга показалась мне наиболее краткой и доступной. Конечно же, одной этой книги недостаточно, также не хватает общих знаний по Java. Но я немного подумал и решил, что браться за новую книгу я пока не буду, иначе процесс изучения теории может затянуться до бесконечности. Надо переходить к практике, а уже потом заходить на следующий круг чтения.

Ок, сказано-сделано. Попробовал закодировать кусочек одной идеи, для которой мне необходимо реализовать функционал двух сетевых утилит: ping и traceroute.

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

В текущем API (java.net) для android нет поддержки ICMP и RAW сокетов. То есть, нет возможности создать IP пакеты с произвольным заголовком. Это важно для реализации алгоритма traceroute, когда вначале нужно отправить пакеты с временем жизни (TTL) = 1, затем 2 и так далее.
Я не смог найти готовых сторонних библиотек для android, которые обеспечивали бы собственный функционал Raw Sockets. Есть исходники библиотеки для linux под GPL лицензией, java и c++ код, но их нужно переносить на android. А это, к сожалению, работа далеко не на один день для моей текущей квалификации.

Но нашлось обходное решение: запустить ping и traceroute как внешние процессы. Вначале это решение показалось мне некрасивым: поверх окна моего приложения будет запускаться какое-то консольное окно утилиты? Но оказалось, что во-первых, никаких консольных окон не появляется, и во-вторых, при запуске внешнего процесса к нему можно подключить потоки ввода и вывода. То есть, я могу спокойно перехватить вывод утилиты в поток, отформатировать его и вывести в свое приложение.

В качестве примера, три строки запуска утилиты ping:
ProcessBuilder pb = new ProcessBuilder( “ping”, “-c 2″, “android.com” );
Process process = pb.start();
InputStream es = process.getErrorStream();

Кстати, час прокувыркался с аргументами. Пока не разделил их на отдельные строки, ping методично ругался на неправильное имя хоста и выводил экран подсказки. Почему именно так – загадка природы.

]]>
http://westward.cv.ua/android/programming/ping-and-traceroute.html/feed 0
Неоценимый источник советов для программиста http://westward.cv.ua/android/programming/stackoverflow-com-for-android.html http://westward.cv.ua/android/programming/stackoverflow-com-for-android.html#comments Sat, 29 Jun 2013 15:36:38 +0000 admin http://westward.cv.ua/?p=86 Понимаю, что по теме “программирование для Android” не так просто написать что-либо новое, особенно если стартовал совсем недавно. Тем не менее, вдруг именно сейчас кто-то в Сети ищет ответы на свои вопросы и не знает, где их лучше всего задать.

В последние недели ежедневно использую замечательный ресурс, сайт stackoverflow.com, для поиска решений, возникающих при программировании для платформы Android. Огромнейшая куча вопросов и, что самое важное – ответов, структурированных по всем популярным платформам и языкам программирования. Всем новым посетителям сайт услужливо предлагает ознакомиться с FAQ по поиску – и тот, кто игнорирует это приглашение, делает большую глупость. Потому, что там объясняется, как правильно пользоваться поиском, фильтруя только нужные разделы.

Безусловно, без знания технического английского на сайте делать нечего. Но это как бы само собой разумеющееся, мне нелегко представить себе программиста, не знающего хотя бы в минимальном объеме английский язык.

]]>
http://westward.cv.ua/android/programming/stackoverflow-com-for-android.html/feed 0
Маленькая доработочка http://westward.cv.ua/android/programming/small-update-may2011.html http://westward.cv.ua/android/programming/small-update-may2011.html#comments Sat, 29 Jun 2013 15:36:14 +0000 admin http://westward.cv.ua/?p=81 Показал практически законченную версию приложения другу. Получил два неплохих совета, решил включить их в эту же версию.

В результате за пару дней наломал в коде приложения столько, что вчера вечером в ужасе откатился на 80% назад. На будущее:

Лучшее -враг хорошего.
За один раз – одно изменение.

Разумеется, это прописные истины, но что поделаешь – время от времени приходится открывать лично для себя очередную Америку через форточку.

]]>
http://westward.cv.ua/android/programming/small-update-may2011.html/feed 0
Регистрация в Android Market http://westward.cv.ua/android/programming/android-developer-registration.html http://westward.cv.ua/android/programming/android-developer-registration.html#comments Sat, 29 Jun 2013 15:07:44 +0000 admin http://westward.cv.ua/?p=80 Зарегистрировался как разработчик в Android Market. Вроде бы простая процедура, но получилась не сразу. Рад, что повезло уложиться в один день: поиск в интернет выдал отзывы людей, которые несколько дней безуспешно пытались зарегистрироваться. Попытаюсь просуммировать, что я делал, хотя если честно, до сих пор не понимаю, почему оно заработало только с третьей или четвертой попытки.

Итак, всем известно, что регистрация в Android Market стоит 25$. У меня есть зарплатная карта Приватбанка, от друга узнал о системе Приват24, в которой моя карта уже “прописана”. В этой же системе можно зарегистрировать виртуальную банковскую карту типа Visa Internet, по мере необходимости перебрасывать деньги с зарплатной на виртуальную карту и оплачивать покупки в Интернет.

Начнем с системы Приват24:

Необходимо зарегистрироваться в Приват24 и иметь какой-либо финансовый источник (счет, карта, …), привязанный к системе, с которого будет переводиться денежка;
В Приват24 заказать виртуальную карту (на текущий момент это Настройки – Карты – Заказ карт);
Выбрать тип Visa Internet, USD, заполнить поля адреса (Говорят, что адрес необязателен, т.к. это виртуальная карта. Я все же указал.);
Моя карта появилась через пару часов. Важно записать ее реквизиты: дату окончания действия и 3х-значный CVV2 код. В интернет пишут, что если вы забудете эти цифры, придется обращаться в банк, просто так их не скажут.
Необходимо активировать виртуальную карту для работы в Интернет, для этого в интерфейсе Приват24 есть специальная кнопка. Если все сделано правильно, при выборе этой карты кнопка Оплата в Internet подсвечена, активна. Кажется, в этот же момент система спрашивает вас о месячном лимите расходов. Учитывая, что мне нужно было оплатить сумму 25$, я посмотрел на потолок и решил установить лимит в 30$.
Перевод нужной суммы на виртуальную карту. Я выбрал меню Валюта – Обмен валют. Далее неочевидный момент: в верхней части окна есть таблица валют, ее элементы практически не отличаются от обычного текста. Тем не менее, нужно кликнуть на цифре USD – Продажа. Почему продажа, если я хочу купить доллары? Для меня покупка, а для банка – продажа.
Перепроверить, откуда снимаются деньги и куда они поступают. Указать требуемую сумму. Выбрал 27$, с учетом возможных комиссий и проверок и не пожалел: когда регистрация наконец-то была оплачена, на карте осталось 0.67$. Гугл чуть позже вернул доллар, снятый при проверке карты, но если бы я перевел строго 25$, мне бы их не хватило в момент регистрации.

Google account у меня имеется давно, насколько я понимаю, он появился вместе с регистрацией на Gmail. Карта с денежкой только что была создана. Кажется, есть все необходимое, чтобы оплатить аккаунт android девелопера. По ссылке сайта Android Developers отправился к необходимым шагам для публикации приложения.

Гугл сообщил о том, что мне необходимо оплатить регистрацию с помощью платежной системы Google Checkout. Ок, нажимаю кнопку Продолжить, у меня запрашивают данные платежной карты: номер, дату окончания действия (две цифры месяца и 4 цифры года), CVV код. Далее сообщается, что будет произведена покупка на сумму 25$, соглашаюсь. Выводится сообщение, что счас быстренько, буквально за какие-то 20 секунд, карта будет верифицирована. Чуть позже система грустно заявляет, что процедура занимает большее время и предлагает подождать.

Вот тут-то и начались непонятные проблемы. Какое-то время информация не менялась, даже с обновлением окна браузера. Потом было выдано сообщение, что мне у меня не активирован аккаунт Gogole Checkout, и я должен либо зайти в систему, используя Google Account (Gmail адрес + пароль), либо снова ввести все данные платежной карты. Хохма в том, что оба способа не работали: я вводил все требуемые данные, окно браузера моргало и требовало то же самое. Да, такой подляны от крутой IT-корпорации я не ожидал.

В Приват24 прошла операция “покупки в интернет” на сумму 1$. Таким образом Гугл верифицирует карту, позже возвращая этот доллар назад. Операции на сумму 25$ не было. Через час попробовал повторить процедуру оплаты еще раз и она с тем же результатом не отработала.

По совету друга в третьей попытке использовал браузер Chrome. Нет, если бы на каком-либо этапе регистрации мне сообщили бы, что Опера не поддерживается, я бы это понял. Но никаких сообщений на такую тему не было. Кроме этого, до начала очередной попытки вначале зашел браузером на свою Gmail почту, далее по ссылкам в верхней части экрана добрался до Google Checkout. К сожалению, уже успел забыть, пришлось ли мне еще раз вводить данные своей платежной карты. но в итоге Checkout показывал, что знает меня и мою карту. Потом отправился в очередной раз регистрироваться, и, к моему счастью, все прошло быстро и без запинок: предложение оплатить 25$, через минуту успешное подтверждение и финальный шаг, принятие лицензионного соглашения.

Повторю еще раз: я так и не понял, почему регистрация не сработала с первого раза. Возможно, в Opera и Firefox что-то неправильно отрабатывалось. Возможно, вначале надо было специально зайти в Google Checkout. В любом случае, если сказанное выше как-то поможет вам с регистрацией в Android Market – значит эта заметка была написана не зря.

]]>
http://westward.cv.ua/android/programming/android-developer-registration.html/feed 0
Conversion to Dalvik format failed with error 1 http://westward.cv.ua/android/programming/conversion-to-dalvik-error-one.html http://westward.cv.ua/android/programming/conversion-to-dalvik-error-one.html#comments Sat, 29 Jun 2013 14:58:47 +0000 admin http://westward.cv.ua/?p=75 Сегодня угрохал практически весь рабочий день на поиск решения проблемы. Понадобилось собрать тестовую версию моего приложения, изменил одну опцию в проекте, выбрал команду Export Android Application в Eclipse и… получил ошибку “Conversion to Dalvik format failed with error 1″.

Советов в интернет по поводу этой ошибки много. Следуя им, я переустановил несколько библиотек SDK, удалял из Eclipse свои проекты и заново их добавлял, запускал eclipse.exe -clean. Не успел последовать совету “снесите все и поставьте заново”, угрохал бы еще вечер впридачу.

Слава высшим силам, нашелся-таки правильный для моей ситуации совет. В чем проблема: недавно обновился набор инструментов, Android SDK tools до версии 12. В частности, гугл прилично улучшил Layout Editor, редактор окон Android приложений. Похоже, в этот пакет инструментов включен и ProGuard, утилита защиты андроид приложений от реверс-инжениринга. Утилита вызывается на финальном этапе сборки андроид приложения через командный файл:

(путь к установленному SDK)\tools\proguard\bin\proguard.bat

И этот файл неправильный для нового комплекта SDK Tools версии 12. Вот рецепт исправления ошибки:

Измените строку
call %java_exe% -jar “%PROGUARD_HOME%”\lib\proguard.jar %*
на
call %java_exe% -jar “%PROGUARD_HOME%”\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9

P.S. В ветке обсуждения проблемы были и другие варианты – обновить ProGuard, а также откатиться на SDK Tools 11.

]]>
http://westward.cv.ua/android/programming/conversion-to-dalvik-error-one.html/feed 0
Досадный глюк Eclipse в самый неподходящий момент http://westward.cv.ua/android/programming/annoying-eclipse-bug.html http://westward.cv.ua/android/programming/annoying-eclipse-bug.html#comments Sat, 29 Jun 2013 14:26:30 +0000 admin http://westward.cv.ua/?p=70 Безусловно, Eclipse IDE вполне удобная среда программирования. И я не уверен на все 100, что в моем конкретном случае виноват Eclipse, а не Android Development Toolkit плагин. Но неприятно, когда IDE подкладывает разработчику свинью в самый неподходящий момент.

Думаю, любой Android разработчик, использующий Eclipse, рано или поздно нарывается на глюк со сборкой ресурсов. Как правило. этот глюк проявляется в том, что строки сообщений, элементов меню, кнопок Android приложения при очередном отладочном запуске приложения вдруг меняются на соседние. Почему этот глюк изредка появляется – мне неизвестно. И лечится он просто, командой меню Project – Clean.

Но сегодня этот глюк проявился при сборке APK, который был загружен в Android Market. Хорошо, что я перепроверил только что загруженный в Маркет релиз, увидел на своем смартфоне черное окно без какого-либо текста вместо Welcome Screen, и за 15 минут поисков ответа на вопрос “What a fuck is here?”смог догадаться, в чем дело. А если бы не догадался? Оно ж несолидно, блин, если люди загружают обновление и получют совсем не то, что ожидали.

Короче говоря, надо составлять checklist, контрольную карту обязательных процедур перед взлетом публикацией приложения. И там обязательно должен быть пункт Project – Clean.

P.S. Сергей, я верю что Xcode вылизан по самое нехочу и подобных глюков там по определению быть не может.

P.P.S. Виноват, в этот раз зря накатил бочку на Eclipse. Моя была ошибка. Каюсь.

]]>
http://westward.cv.ua/android/programming/annoying-eclipse-bug.html/feed 0
Глюк Eclipse в Layout Editor’е http://westward.cv.ua/android/programming/android-eclipse-layout-editor.html http://westward.cv.ua/android/programming/android-eclipse-layout-editor.html#comments Sat, 29 Jun 2013 11:30:45 +0000 admin http://westward.cv.ua/?p=14 Открыл layout одного из окон android проекта в layout editor’е Eclipse. И получил сообщение NullPointerException при вызове метода getSystemService() в кастомном компоненте (compound control), который пару дней назад закончил и он без проблем работал. Минут пять смотрел код, думал, а потом решил перезапустить Eclipse.

С перезапуском проблема сама собой исчезла. Не зню, чего Eclipse не хватало, но я подумал: хорошо, что я знал – мой компонент рабочий, что фигня какая-то. А если бы я только работал с этим компонентом? Эдак же можно день кувыркаться, борясь с проблемой, которой на самом деле нет… Грустно.

]]>
http://westward.cv.ua/android/programming/android-eclipse-layout-editor.html/feed 0