пятница, 29 июля 2011 г.

Прогноз погоды через XML


  • gismeteo.ru - дает прогноз на сутки
  • foreca.com - дает яндексу
  • у гугла мутный секретный API - хуже чем у GisMeteo
  • суммируя до кучи всех прочих - нет нихрена в открытом доступе


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

На маркете из бесплатных пожалуй лучший вариант от Яндекса. Росгидрометцентр платный, Gismeteo ограничен суточным прогнозом и зря народ просит большего. Автор явно забил на свое творение (потому как развивать в общем-то некуда) и просто имеет какой-то трафик на свой сайт.

При таком раскладе свое приложение можно сделать исключительно в учебных целях

WebView - вот это номер!

Решил написать свое первое приложение, которое выполнят хоть что-то полезное, а именно выводит прогноз погоды. Сделать это можно по разному, в том числе не просто, а очень просто:


  1. Берем на GisMeteo код HTML информера
  2. Ложим в файлик, файлик кладем в assets
  3. Загружаем файлик в WebView. Не забываем про setSciptEnabled("true")
  4. Вуаля, все здорово


А вот и хрен. WebView говорит - страница недоступна. После непродолжительного траха выясняем, что удаление из файлика содержимого тега <style> лечит эту проблему и наступает счастье. Однако это не есть хорошо, потому как непонятно - а в чем собственно проблема заключалась? Проблем-то, собственно быть не должно изначально. Заметим также, что в браузере (который как бы идентичен WebView данный информер открывается нормально).

Ищем... ага, вот, не я один наступил на эти грабли

В конце концов выясняем. Символы типа % воспринимаются методом WebView.loadData(...) как специальные и он изгаляется над ними с особой жестокостью.

Поэтому передаваемую строку нужно как-то закодировать Как именно, вернее чем, документация этот вопрос скромно умалчивает. Могли бы и ссылочку дать на пример. Решение оказывается простым до безобразия

вместо
mWebView.loadData(data,"text/html" ,"utf-8");
используем
mWebView.loadDataWithBaseURL(null,data,"text/html" ,"utf-8",null);

и ничего, никуда перекодировать не надо. И работает!... один раз. Но тут выясняется что упал Gismeteo.ru. Неужели это я?!!! Да не, навряд ли.

Проверяем:
It's not just you! http://informer.gismeteo.ru looks down from here.

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

четверг, 28 июля 2011 г.

Крестики-нолики

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

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

Начнем с того, что тупо проверять все мыслимые варианты, в то время как тебе точно известно где поставлена последняя метка - граничит с идиотизмом. Достаточно проверить одну вертикальную линию, одну горизонтальную и две диагонали. 4 линии вместо 14. Это в наихудшем случае. Если метка не попадает на диагональ, то логично не проверять эту диагональ вовсе.

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

среда, 27 июля 2011 г.

Получение отладочного ключа для Maps API

Первым делом нужно снять отпечатки пальчиков и зарегистрировать в местном отделении полиции (почти шутка - пока ненужно, но скоро придется)

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

Чтобы сгенерировать отпечаток MD5 отладочного сертификата, нужно найти отладочное хранилище ключей (debug.keystore). По умолчанию он хранится в директории AVD, которая в свою очередь находится:

Windows Vista: C:\Users\\.android\debug.keystore
Windows XP: C:\Documents and Settings\\.android\debug.keystore
OS X and Linux: ~/.android/debug.keystore

Если вы пользуете Eclipse/ADT и слабо ориентируетесь, где она хранит ключи, можете посмотреть под кроватью (Windows > Prefs > Android > Build) чтобы выяснить точное место.

Когда найдете, используйте keytool чтобы получить требуемое:

$ keytool -list -alias androiddebugkey \
-keystore <путь к файлу>debug.keystore \
-storepass android -keypass android

В ответ получите что-то вроде этого: Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98

Вот эти вот цифирки и буковки, разделенные двоеточиями, вы предъявите гуглу от тут. Невредно перед этим войти в свой гугловский аккаунт, а за неимением оного - заиметь. Потому как незарегистрированным юзерам гугл ничего не выдаст.

В результате у вас появится набор тарабарщины, который вы вставите себе в MapView
<com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="364Fgjbdqwbduqwu82385285285"
/>

Как-то вот так

Hello, Gallery! Наступаем на те же грабли

Как я уже писал про GridView,
если вы возьмете для изучения набор свой картинок (у меня под рукой
оказалась неплохая подборка девчонок разной степени раздетости), то
выяснится, что туториал умалчивает об очень важном нюансе. Прежде чем
заталкивать картинки в GridView/Gallery их необходимо уменьшить.

Переписываем ImageAdapter следующим образом:

public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;
    if (convertView==null){
        Bitmap orig=BitmapFactory.decodeResource(mContext.getResources(), mImageIds[position]);
        int width=orig.getWidth();
        int height=orig.getHeight();
        int nw=150; int nh=150;       

        float scalew=((float)nw)/width;
        float scaleh=((float)nh)/height;
        Matrix matrix = new Matrix();
        matrix.postScale(scalew, scaleh);
        Bitmap nbmp=Bitmap.createBitmap(orig, 0, 0, width, height,matrix,true);

        imageView= new ImageView(mContext);
        //imageView.setImageResource(mImageIds[position]); раньше брали картинку прямо из ресурсов
        imageView.setImageBitmap(nbmp);
        imageView.setLayoutParams(new Gallery.LayoutParams(150,150));
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);

        imageView.setBackgroundResource(mGalleryItemBackground);
        } else {
            imageView=(ImageView) convertView;
        }
    return imageView;
}



Решение взято отсюда, и убраны лишние детали. Нужна ли конструкция
    if (convertView==null) { ...  }
      else {
            imageView=(ImageView) convertView;
        }

для меня пока под вопросом. Для GridView в туториале сделано так, для Gallery нет, хотя в остальном реализация идентичная.

вторник, 26 июля 2011 г.

Livejournal опять лежит

когда эти хреновы умники наконец поймут, что тупо наращивать мощность оборудования - бессмысленно? Система имеющая центр в одной точке всегда будет проигрывать распределенной по устойчивости к атакам.

unable start ComponentInfo

Типичная ошибка новичков, вызывающая данную ошибку - забыть прописать Activity в манифесте. Нужно запомнить раз и навсегда - все activity должны быть прописаны в манифесте.

понедельник, 25 июля 2011 г.

GridView

При исследовании туториала Hello.GridView обнаружилось, что хотя в него и можно просто напихать картинок, но делать это не стоит. Всего-то 20 изображений общим объемом 2.6Мб привели к тому, что приложение перестало загружаться - нехватает памяти! Вывод - нужно явно сжать изображения, и лишь затем заталкивать в GridView.

Из самого туториала это ни коим образом не следует - там изображений меньше и сами они меньше размером.

Расписание автобуса

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


  1. Предварительно определяются координаты всех остановок города. Подходишь со смартфоном, фиксируешь координаты и записываешь название. Все данные фиксируются в БД на бесплатном сервере. Например Google App Engine.
  2. Каждому водителю выдается смартфон. Бюджетная модель, в которой самая главная вещь - GPS приемник.
  3. Смартфон лежит в кабине водителя и периодически отсылает координаты автобуса и номер маршрута на тот же сервер.
  4. Сервер фиксирует местоположение автобуса, определяет куда он движется (по последовательности прохождения остановок), и рассчитывает примерное время необходимое автобусу чтобы достичь всех последующих остановок маршрута. При этом алгоритм расчета может учесть очень многое - среднее время прохождения каждого перегона в данное время суток и день недели, среднюю скорость данного автобуса или автобуса с другого маршрута, который проехал тут непосредственно перед ним и т.д. и т.п.
  5. Пассажир, подходя к остановке может посмотреть ожидаемое время прибытия нужных маршрутов. Причем, если смартфон оборудован GPS - остановка определится автоматически, нужно будет лишь выбрать направление. Если не оборудован - придется выбрать из списка, но выбор будет сохранен, а обычно у каждого из нас не так много остановок где мы часто бываем, и эти остановки скоро будут в первых строках списка


Как видите ничего сложного. Реализация достаточно тривиальная. Вопрос лишь в том - достаточно ли у населения смартфонов, чтобы оправдать затею?

Hello, world

Мало что бесит меня сильнее чем косяки в документации. Я знаю, что поддерживать ее в актуальном состоянии для серьезного проекта мучительно, но все же... Примеры должны быть рабочими. В тесты (а такая система просто обязана иметь автоматические тесты, и без всякого сомнения - имеет) должна быть включена и сборка всех учебных проектов. Если не проходит - либо что-то накосячили, либо пора привести учебный проект в соответствие.

Собственно о Hello, world:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>

подобный main.xml вызывает ошибку
error: Error parsing XML: unbound prefix

суть проблемы - судя по всему тег TextView не может являться корневым. Он должен быть завернут например в LinearLayout. Т.е. правильно вот так:
<?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">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
</LinearLayout>

Update: Погорячился :). Проблема была в том что я забыл добавить xmlns:android="http://schemas.android.com/apk/res/android" в TextView


P.S. Какого лешего редактор блоггера все время пытается вставить в тему какие-то иероглифы?

суббота, 23 июля 2011 г.

Ну наконец-то

целый месяц я был вынужден сидеть, читать про программирование для Android и облизываться - на моем стареньком RoverBook'е делать что-то еще было физически невозможно.

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

Столкнулся с неожиданным препятствием. Для Ubuntu 11.04 x64 пакет sun-java-jre отсутствует... А иметь головняк с несовместимостью всяких прочих, открытых, вариантов не хочется. Как говорится - плавали, знаем.

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

Надеюсь с другим софтом проблем не возникнет. И без того хлопот с освоением нового компа хватило.

Началось все с того что Ubuntu 11.04 x86 не разглядела 4Гб памяти, и я было уже собрался идти в магазин, выяснять почему у меня на 1Гб меньше чем написано в чеке... но вовремя вспомнил, что 386 проц (а стало быть и все его наследники) имеет сопоставимое по размерам адресное пространство, и какие-то сходные проблемы с разрядностью уже когда-то возникали и цифра звучала знакомая - 2Гб, и тут до меня наконец дошло что дело может быть именно в разрядности ОС. Не прошло и трех суток ;). Пришлось скачивать 64битный вариант.

И тут оказалось что решив сэкономить на DVD (а фигли, старый работает - зачем брать новый?) я подложил себе небольшую свинью. В новой машине интерфейс IDE отсутствует как класс, а в старой, на DVD хотя и обнаружился разъем SATA, но вот шлейфа лишнего не нашлось. Хорошо хоть винт там был c SATA, а то я и на нем сэкономил :)))

Интересно, а если засунуть дивидюк в USB Mobil Rack c IDE - он будет работать корретно? Ну да неважно, под рукой оказалась флешка на 4Гб и была благополучно превращена в загрузочную. Да и неудобно, не лезет он туда.

Между делом попробовал Ubuntu Studio 11.04 и содрогнулся. Корявый текстовый инсталятор для заточенного под мультимедийный софт дистрибутива - это что-то. Да и не заработала она у меня толком. Уж не знаю в чем дело, но пробуя студию с версии 8.04 еще ни разу не добился чтобы она работала нормально. И уже не хочется.

Да, к слову об экономии... Большой респект омскому филиалу nix.ru, который мало того, что предлагает готовые системники по ценам несравненно ниже чем обычные магазины, так при этом еще можно отказаться от предустановки винды (а на кой она? если что - у меня уже аж две лицензионные XP пылятся - по числу купленных за минувшие 10 лет компов). Да еще и позволяют выбросить (и вычесть) все лишнее.

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

среда, 20 июля 2011 г.

Baby Monitor

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

Беглый поиск показал что все уже придумано до нас:
Например IP Webcam Превращает телефон в сетевую камеру. Поддерживает множество способов просмотра во всех распространённых ОС. Смотрите видео в реальном времени за через проигрыватель VLC, браузер или любое ПО для видеонаблюдения.

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

Однако есть еще простор для творчества. Во-первых, должна быть возможность подключаться удаленно (без доступа к телефону) и в любой момент времени - скайп тут же отпадает. Разве что в комплекте с какой-нибудь другой утилитой для удаленного доступа. Во-вторых должна быть возможность использовать как интернет, так и локальные способы связи (BlueTooth, WiFi). Кстати, я не в курсе - два телефона могут общаться по WiFi непосредственно, или им нужна базовая станция? Ну и много еще разных фишек, раскиданных по разным программам.

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

пятница, 15 июля 2011 г.

Ustream Broadcaster

Еще одно приложение, которое позволяет транслировать видео с мобильника. Ну и естессно не только с мобильника, об этом можно почитать на их сайте.

Вот описание мобильного приложения для Android
Ustream Broadcaster позволяет вам транслировать видео с вашего устройства на Ustream(сайт)!

Важно: Если у вас на девайсе Android 2.1 или более, пожалуйста ставьте новое приложение "Ustream", которое объединяет в себе запись и посмотр (в более ранней версии они идут раздельно)! Ищите "Ustream" на Android Market и обрящете.

Ustream Broadcaster для Android позволяет пользователям транслировать живое видео с мобильника на Ustream через 3G или WiFi, ну и конечно записывать его в оффлайне и загружать на Ustream позднее.

Ustream также позволяет публиковать видео через Twitter и Facebook и загружать его на YouTube!

Реал-тайм видео

http://qik.com/
http://ru.justin.tv/

трансляция видео в реальном времени (де факто - с небольшой задержкой). Имеется приложение для Android, от чего меня это и заинтересовало. Наткнулся на LiveCast, но это ну оочень серьезно, а вот чтобы было доступно каждому - эти две сцылки.

А вот приложение Android
Перевод описания:
Socialcam - самый легкий способ обмениваться видео с друзьями. Это приложение делает передачу видео с вашего телефона таким же простым делом, как загрузка фоток на Facebook. В несколько кликов вы можете записывать, помечать и передавать видео, а также просматривать и комментировать видео ваших друзей.

Возможности:
- Неограниченная продолжительность и объем
- Загрузка видео на сервер происходит сразу, в процессе записи
- Можно также записывать виде в оффлайне и загружать на сервер позже, когда будет доступ к интернету
- Можно отметить на видео ваших друзей
- Уведомления о том, что вас отметили на видео
- Просмотр и добавление комментариев к видео ваших друзей
- Обмен видео через Facebook, Twitter, Email и SMS

P.S. YouTube - разочаровал. Они еще год назад тестировали передачу живого видео, но в результате эта фича широким массам не доступна. А зря. Очень зря.

понедельник, 11 июля 2011 г.

LUbuntu

Мои попытки обойтись в борьбе с Android инструментами командной строки потерпели фиаско. Не то чтобы я не понял как это делается, или что-то не получилось, просто эмулятор Android запущенный из командной строки работает так же медленно, как запущенные из Eclipse. 5 минут на загрузку типовой системы с Android 1.5 и 10 минут на Android 2.2 - это за пределами моего терпения. Да и система запущенная в VirtualBox'е тоже не отличается особенным быстродействием, как это показалось сначала.

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

И наконец возникла мысль что раньше (когда трава была зеленой, а мобильники были мобилами) тоже были всякие линуксы и работали на гораздо более слабом железе и при том довольно шустро. Не то чтобы мне хотелось возвращаться к FireFox 1.0 и прочим раритетам, но... чем черт не шутит? Вдруг есть дистрибутив с более менее современным набором софта и в то же время заточенный под старое железо?

Беглый поиск показал, что сильно далеко (от Ubuntu) ходить и не надо, поскольку имеется дистрибутив LUbuntu, заточенный именно в нужном направлении. Дабы не делать резких движений по смене шила на мыло, для начала решил пощупать оконный менеджер LXDE, благо он входит в состав традиционного дистрибутива.

И вот тут меня ожидал сюрприз.

Одна лишь замена оконного менеджера (а я полагаю, что этим различия дистрибутивов ограничиваться не должны) оказала существенное влияние на производительность. VirtualBox зашуршал с приемлемой скоростью, да и скорость загрузки эмулятора Android увеличилась в разы (!) хотя казалось бы - какое дело им до оконного менеджера? Тем более что некоторые другие программы работать быстрее не стали. Так что странно это и непонятно.

Вобщем на радостях я поковырялся немного в своем виртуальном eeePC и получил второй сюрприз, на этот раз неприятный. Имеющееся на нем приложение AppStore без проблем загружает новые приложения, однако интересующий меня Astro File Manager там не обнаружился. Зайдя же на Android Market напрямую через браузер - получил облом. К моему аккаунту видите ли не привязано устройство с android. Потому как я видите ли, давно с него туда не заходил.

Устройства такого у меня естественно нет вообще, а виртуальный eeePC как таковое не воспринимается. И по этой вполне дурацкой причине я не могу загрузить с маркета(напрямую) даже бесплатные приложения. При этом через универсальный интерфейс (_._) - это вполне возможно. Дурдом

И по прежнему для меня остается открытым вопрос - какой же должна быть минимальная система для комфортной отладки приложений для Android?

воскресенье, 10 июля 2011 г.

Ужос

В силу неудачного стечения обстоятельств мой десктоп пылится в углу, а эти заметки я строчу на (относительно) стареньком ноутбуке. Относительно, потому как даже сейчас машинка с P4 3ГГц и 512Мб ОЗУ как бы не выглядит так уж плохо. Но судьба жестока - клавиатура и мышь подключены через универсальный интерфейс (отчего они иногда отрубаются без видимых на то причин), вентилятор жутко воет пытаясь удержать температуру в разумных рамках (безуспешно - даже корпус на ощупь ощутимо горячий, что там внутри - страшно представить). Винт также не отличается быстродействием.

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

К чему собственно эти стенания - если запустить Eclipse, да браузер (ну как без него), а потом еще и Android Device Emulator... то возникает желание побиться головой обо что-нибудь твердое. Желание же что-то поотлаживать пропадает начисто.

Кстати, если запустить Android на VirtualBox - он шевелится там вполне ничего так себе (все таки аппаратная эмуляция вместо программной), но к сожалению прикрутить его вместо реального устройства нельзя (я по крайней мере о таком не слышал). Да и опять же - на оставшейся после запуска VirtualBox'а памяти Eclipse будет ворочаться как бегемот в типовом санузле.

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

Update: Нормальная конфигурация для разработки - двухядерный процессор и не менее 1Гб памяти. А лучше 2Гб.