Thursday, September 23, 2010

Monodroid preview 2

Быстренько пощупать не получилось. Я и не предпологал, что поднятие виртуалки со всем минимальным софтом займёт столько времени.

Задача у меня была простая - поднять какой-нибудь простой вебсервис с одним методом и сделать для него клиента под андроид, используя Monodroid. Сервис написался на Моно под линуксом за 5 минут, т.к. писать там кроме аттрибутов нечего. А вот для клиента пришлось поднять виртуалку с виндой и студией. Заняло кучу времени и утомило. Клиент сделался за 2 минут. Потому что на клиенте делать вообще нечего. Даже аттрибуты не надо писать. Он сам делает. И вот, запускаю я, значит клиента, нажимаю кнопку и жду. Долго жду. Потом активити падает. Как выяснилось - падает из-за таймаута. Вспомнил, что пермишны для своего пакета не прописал. Добавил доступ в интернет и всё заработало.

Практически можно утверждать, что Monodroid - это круто. Потому что как дотнет. Всё так же легко и непринуждённо. С другой стороны, есть какой-то негативный осадок. Возможно, это связано с тем, что у меня медленный комп и вместо 7ки на виртуалке нужно было поднять XP. Возможно, глупое занятие запускать на виртуалке и без того не очень быстрый эмулятор Андроида. Не знаю. Но вот сложилось такое ощущение, что процесс как-то хреново идёт. Возможно, более быстрый комп всё исправит.

Выводы:
1. Monodroid - это то, что и ожидалось.
2. Он пока сыроват.
3. Почему установленный hello world занимает 15 метров? Apk занимает 3 метра, а после установки - 15?

Wednesday, September 22, 2010

Monodroid preview

Вчера мне прислали приглашение поучаствовать в закрытом превью проекта Monodroid. Сегодня удалось потратить на это час времени. Проверил как работает их стандартный hello world. Работает. Очень даже. Грузится, конечно, значительно дольше, чем аналог на Java, но грузится и работает. Проверял на эмуляторе и на своём HTC Tattoo. Что сказать... впечатляет.

Вечером планирую потратить ещё пару часов - посмотреть как там обстоят дела с дотнетным фреймворком. Наверное попробую поднять дотнетный вебсервис, а для андроида реализовать клиента. Если будет работать, буду ещё сильнее впечатлён.

P.S. Небольшой апдейт. Обнаружил сейчас, что monodroid runtime занимает чуть больше 30 метров, а сама программка (hello world, одна кнопка с простым обработчиком), тут внимание, 15(!) метров :-) Неожиданно.

Sunday, September 19, 2010

CrystaX's Android NDK

Как известно, спустя некоторое время после выхода Android SDK, Google выпустил Android NDK. Это такой тулкит, позволяющий писать для андроида нативный код на C/C++. О UI речь конечно же не идёт, речь идёт о задачах, жадных до процессора. Так вот, при всей своей замечательности, у Android NDK есть ряд недостатков. Как минимум, это отсутствие поддержки RTTI и исключений. Нет исключений - нет STL. Нет STL - нет boost.

Есть такой замечательный проект по переделке Android NDK:
http://www.crystax.net/android/ndk-r4.php

Дмитрий сделал поддержку RTTI, исключений и стандартной библиотеки. Сегодня у меня наконец-то дошли руки пощупать это чудо. Оно действительно работает! Удалось даже частично поюзать boost (в маленьком объёме) - только shared_ptr, но оно работает и по-моему это очень круто.

В письменном виде сказал Дмитрию спасибо. Потому что Дмитрий реально крут и делает реально крутую вещь.

Friday, September 17, 2010

Под Андроид на Питоне

Нашёл интересный проект - Android Scripting. Поставили себе задачу - сделать скриптинг для Андроида. Доступны несколько скриптовых языков (среди них - Python). Также, как я понял, частично доступен API андроида (в плане работы с сенсорами, камерой и т.д.). Писать можно как на самом андроидном девайсе, так и на компе, а на девайсе только запускать. Вот мой хелло ворлд:

Пытаюсь представить как такое развлечение будет выглядеть на моём HTC Tattoo. По-моему это невозможно. Если на каком-нибудь таблете... всё равно кнопок типа page up и end там нет, а без них совсем не тру. А вот для быстрого прототипирования наверное использовать вполне можно: писать на компе, а запускать на девайсе.

Wednesday, September 15, 2010

Как-то.

В школе, наверное во втором классе, мы начали изучать "как пишутся программы". Однажды домой нам задали написать алгоритм чистки зубов. Я задание сделал, но получил тройку. Потому что у меня в алгоритме был такой кусок:
открыть рот,
закрыть рот,
отрыть рот,
вставить зубную счётку
(вообще там было штук 20 пунктов)

Только сейчас, спустя много лет, я понимаю весь маразм этой ситуации. Правильный алгоритм чистки зубов такой:
почистить зубы
Всё.

Ну, максимум такой:
подготовиться к чистке зубов,
чистить зубы,
вытереть кровь со стен убрать за собой.

Именно это - алгоритм. Вы спросите: "а что же такое [подготовиться к чистке зубов]"? "А это совершенно другая задача", - отвечу я. И буду прав. Потому что кто как привык, так и готовится. По-моему этот алгоритм достаточно абстрактен для того, чтобы подходить людям, которые либо не убирают за собой, либо чистят зубы без подготовки. Отличный такой generic алгоритм. Но есть большие сомнения, что за такой алгоритм я бы получил хорошую оценку.

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

И ведь работает. Как-то.

Tuesday, September 14, 2010

MPL

Открыл для себя сегодня boost MPL. От половины велосипедов теперь смело можно избавиться.

Возникла задача - реализовать простой "паттерн" (не в глобальном смысле, а в смысле идиомы для одного отдельно взятого проекта), который бы позволил ограничивать аргумент отдельно взятой функции некоторым набором заранее известных типов. С помощью буста решилось вот так:

#include <boost/mpl/list.hpp>
#include <boost/mpl/contains.hpp>
#include <boost/utility/enable_if.hpp>

struct A {};
struct B {};
struct C {};

struct D {
typedef boost::mpl::list<A, B> good_types;

template<class T>
void func(
T const& x,
typename boost::enable_if<
typename boost::mpl::contains<good_types, T>::type
>::type* dummy = 0) {
}
};

int main() {
D d;
d.func(A());
d.func(B());
d.func(C()); // тут ошибка компиляции - можно только A и B

return 0;
}

Без буста, очевидно, строчек на 100 больше было бы.