понедельник, 19 ноября 2007 г.

Android SDK

Google представила документацию и набор для разработки программного обеспечения (SDK) к своему основанному на Linux стеку для мобильных телефонов Android, а также объявила о начале конкурса для программистов с призовым фондом 10 миллионов долларов. С помощью предложенного SDK разработчики могут создавать приложения для платформы Android на языке программирования Java и запускать их в среде виртуальной машины Dalvik, предназначенной для встраиваемого использования и работающей поверх ядра Linux.

Объявленный конкурс для разработчиков призван стимулировать Open Source-сообщество создавать программное обеспечение для Android. Задача для участников — создать свое любимое приложение для мобильных телефонов. Принимаются программы любого типа, однако приветствуется инновационность и, конечно, полезность разрабатываемых приложений. Среди областей, с которых можно начинать разработку приложений для конкурса Android, выделены такие, как социальные сети, работа с информацией различного типа (например, фотографиями), email/IM/календарь, игры, новости, переосмысление традиционных пользовательских интерфейсов.

Сдается мне, что скоро для мобильников от Google будет гораздо больше ПО, чем сейчас для Window Mobile...

суббота, 17 ноября 2007 г.

Crematory


Недавно купил диск Klagebilder (2006), что переводится как "Картины плача". В отличии от большинства дисков группы альбом на немецком языке. На мой взгляд, это - плюс. Альбом достаточно сильный, обладающий должной хитовостью. Проходных песен, похоже, нет совсем. Даже смена гроула Феликса и чистого вокала гитариста Маттиаса неплохо вписывается. Рекомендую!

пятница, 16 ноября 2007 г.

Java Puzzle 60: One-Liner

Этот вопрос проверяет знание API. Для каждой мини-задачки необходимо написать метод, содержащий только одну строку. Тестируется знание новый фич Java 1.4 и 5. Авторы утверждают, что знание библиотек может сэкономить много времени и увеличить скорость и качество программ. Насчет качества - несомненно, но вот насчет скорости...

A. Напишите метод, принимающий список элементов и возвращающий список элементов в том же порядке, но без дубликатов. Например, передаем список {"spam", "sausage", "spam", "spam", "bacon", "spam", "tomato" и "spam"}, а получаем список {"spam", "sausage", "bacon" и "tomato"}.

Тут необходимо вспомнить про полезный класс LinkedHashSet, базирующийся на классе LinkedHashMap, который сохраняет порядок добавления записей. Метод будет выглядеть следующим образом:
static <E> List<E> noDups(List<E> list) {
    return new ArrayList<E>(new LinkedHashSet<E>(list));
}

B. Напишите метод, принимающий строку, содержащую 0 или больше токенов, разделенных запятой, и возвращающий массив строк, содержащий токены в том порядке, как они встречаются во входной строке.

Если вы подумали про StringTokenizer, то вы очень давно программируете на Java, как и я. В версии 1.4 была добавлена поддержка регулярных выражений (java.util.regex). Давно пора их выучить, так как размер кода существенно сокращается:
static String[] parse(String string) {
    return string.split(",\\s*");
}

C. Напишите метод, который преобразует некоторый многомерный массив к строковому виду, который был бы удобен для целей отладки.

Тут авторы прикололись. Такой метод уже есть в JDK: Arrays.deepToString(Object[]). Кроме него есть еще пара полезных методов: Arrays.deepEquals(Object[],Object[]) и Arrays.deepHashCode(Object[]). И хотя в этом методе не одна строка, наш метод может просто вызывать библиотечный:
static String toString(Object[] array) {
    return Arrays.deepToString(array);
}

D. Напишите метод, принимающий два целых числа и возвращающий true, если у них установлено одинаковое количество бит.

Для целочисленных типов (Integer и Long) в Java 5 были добавлены методы работы с битами. Воспользуемся методом Integer.bitCount(int), который возвращает количество установленных бит в целом числе:
static boolean equals(int one, int two) {
    return Integer.bitCount(one) == Integer.bitCount(two);
}

Java Puzzle 59: What's the Difference?

В задачке используется массив предопределенных значений. Суть задачки не важна, так как сконцентрировавшись на ее решении можно упустить очевидное. Я натыкался на такие проблемы, когда начинал изучать Java. Вот массив значений каждое из которых меньше предыдущего на 111:
int[] values = {
        789, 678, 567, 456,
        345, 234, 123, 012 };
Или нет?

Согласно JLS 3.10.1 целочисленные литералы, начинающиеся с 0 интерпретируются как числа, записанные в восьмеричной системе счисления. Таким образом, последние значение равно 10. Авторы рекомендуют никогда не выравнивать целочисленные литералы с помощью 0. А так хочется иногда иметь красивую табличку в коде!

Тяжелое наследие Fortran и C...
Неужели сейчас кто-то использует восьмеричную систему?

Gmail поддеживает IMAP

Google добавил поддержку IMAP в почтовый сервер. Знаю многих любителей этого дела, но я сам сторонние почтовые клиенты теперь не люблю. Метки рулят!

среда, 14 ноября 2007 г.

Helloween


Перед поиском и покупкой нового альбома решил послушать предыдущий: Keeper of the Seven Keys: The Legacy (2005). Альбом двойной, но общей продолжительностью 76 минут. Половина песен только удалась и переплюнуть первых двух Хранителей им не удалось. Лучше бы склепали однодисковый вариант, выкинув отстойные композиции, которые очень мешают прослушиванию. Музыканты разошлись по разным группам, типа, Gamma Ray и Masterplan. Вроде бы и играют профессионально, но нет у них хороших композиторов и поэтов-песенников...

iGO

Пытаемся пользоваться GPS приемником с помощью iGO. Он все время пытался нас вытащить на Невский, даже когда тот на ремонте был.
Но вчера с утра он повез нас к моему офису (точнее, в центр вакцинации на Фонтанке) через Цимбалина. Доехав до перекрестка Седова-Цимбалина, мы обнаружили, что там все стоит и двигаться не собирается. Я стал командовать, как доехать дворами до Московского вокзала. Там по Невскому он нас довез до Аничкова моста. Там поворота налево нет и он нам порекомендовал ехать через Садовую. Но зная как там забито, мы развернулись на Фонтанке через мост у цирка и по прямой доехали нормально.
Выводы:
1. Короткий путь, обычно, не самый быстрый.
2. Надо найти программу, которая поддерживает информацию о пробках через GPRS.
Кажется, Серега Александров что-то подобное показывал, но она платная для PPC.

Пробки

Брал вчера day off. Надо было свозить Мишку на вакцинацию, записать в детский садик, поменять резину на зимнюю и за посылкой смотаться. Пробки везде!
Мы в обед час простояли пытаясь въехать с Октябрьской набережной на Володарский мост. После того, как свернули с набережной, я вышел, перешел мост, сходил в РОНО, написал анкету для детского садика и вернулся. А Юля только-только на мост въехала...
Потом ехали из дома на Хасанскую через КАД. Вроде все нормально, но встречка стоит. Несмотря на то, что въезды с Мурманского шоссе закрыты.
Вечером час простояли на съезде с моста Александра Невского на набережную, чтобы домой ехать. Тоже мясо.

Quazatron

Я уже писал про Head Over Heels, но вот, пока собирался билд, попробовал Quazatron.
Слишком быстро для меня. Постарел я, постарел...

Эрудит ПК и КПК

Как я уже писал, есть такая игра как Эрудит. Так вот, недавно обнаружил, что версия для ПК обновилась. Кроме того, появилась версия для КПК. Хочу попробовать...
А еще в клубе Scarlett есть еще игры.

понедельник, 12 ноября 2007 г.

Java Puzzle 58: Making a Hash of It

В этой задаче (продолжение предыдущей) авторы добавили метод hashCode(), однако поменяли тип параметра метода equals() с Object на имя класса, используемого в качестве элемента множества HashSet. Естественно, что никакого переопределения не происходит, а происходит перегрузка методов.

В языке Java перегрузка разрешена, но приводит к ошибкам и неразберихе. Читаем секцию 26 все той же необходимой к прочтению книги Effective Java. Начиная с версии Java 5 появилась аннотация @Override, которую авторы рекомендуют использовать. Я, например, включил в IDEA опцию, которая автоматически добавляет эту аннотацию при переопределении метода. Если в супер классе метод поменяет сигнатуру (всякое бывает), то не возникнет скрытого бага - проект просто не скомпилируется и вы найдете проблему за 5 секунд.

Java Puzzle 57: What's in a Name?

Задачка довольна простая. Некий объект используется как элемент множества HashSet. Метод equals() переопределен, а про метод hashCode() забыли.

В общем, автор напоминает 8 секцию его предыдущей книги Effective Java. Я уверен, что эта книга должна быть прочитана каждым Java-программистом, поэтому останавливаться здесь не будем. Скажем просто: переопределяйте метод hashCode() всегда, когда переопределяете метод equals().

Solid State Disk

Такое чувство, что в моем ноуте начинает сыпаться винт. Очень неприятно. Поэтому стал смотреть, на что бы такое его можно заменить...
Оказывается, уже вышел Solid State Disk от Samsung. Правда - дорого пока. Зато, блин, не посыпется, если в дороге стукнешь. А Toshiba начала выпускать ноуты с такими дисками. Но из-за SSD диска цена тоже зашкаливает все разумные пределы.

Myon


Поскреб по сусекам и нашел альбом Ghost In Paradise (2002). Очень добротно сделанный альбом. Как говорится, очередная пятерка очередных финнов...
Достаточно динамичный power metal с кучей мелодичных вставок, которые делают музыку очень приятной слуху. Альбом на твердую четверку, так как не смотря на качество записи и профессионализм музыкантов альбом не цепляет. Да, есть некоторые интересные композиции, но, в основном, под настроение...

четверг, 8 ноября 2007 г.

Метровый негатив

Сегодня что-то дикое в метро творилось. Меня достали настолько, что на ПлАНе я не выдержал. Спускаюсь с эскалатора, а там поезд приехал. Все с этого поезда по всей платформе общей массой рвутся на эскалатор. Те кто спускается с эскалатора в ужасе стоят всех пропускают или прячутся за колонны. Ну я сказал себе, что у нас правостороннее движение и пошел по самой правой стороне. Несколько человек пытались меня сбить, но неуспешно. Масса мне позволяет. Двое особо шустрых очень сильно отлетели обратно в толпу, возмущаясь. Чем - непонятно.
Есть предположение, что автомобилисты-уроды, которые помялись на свежем голольду, спустились в метро и ведут себя как на дороге. Только если на дороге нормальные люди их пропускают, боясь повредить машину, то в метро все совсем по-другому. Хотя может быть это из-за того, что Обводный закрыт и, как пишет Стас, нигде не проехать...
Когда в вагон заходил поразился. Стоит тетка с парнем и огромным чемоданом. Стоит прямо напротив двери. Народ протискивается мимо ругается. Ей сын, видимо, сказал, что подвинуться надо бы. На что тетка громко ответила: "Что я с чемоданом по вагону ходить должна? Пусть остальные обходят!"
Бля!

среда, 7 ноября 2007 г.

Железная дорога

Мои родители подарили Мишке набор Кроха - Железная дорога. Мы докупили еще деталей и получаются различные конфигурации. Мишка очень доволен!

Шкаф для дисков

Шкаф для обуви

Java Puzzle 56: Big Problem

Проверим знание класса BigInteger. Что напечатает следующая программа?
BigInteger value = new BigInteger("1000000");
value.add(new BigInteger("1000000"));
System.out.println(value);

А вот и нет! Не 2 миллиона, а всего 1. Авторы данного API использовали не вполне корректные имена для методов неизменяемого (immutable) объекта, что и вводит пользователей в заблуждение. Чтобы исправить ошибку надо сделать так:
BigInteger value = new BigInteger("1000000");
value = value.add(new BigInteger("1000000"));
System.out.println(value);

Java Puzzle 55: Creationism

Иногда полезно для класса знать количество экземпляров, которые были созданы. Следующая программа демонстрирует эту технику. Что будет напечатано?
public class Creator {
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++)
            Creature creature = new Creature();
        System.out.println(Creature.getCount());
    }
}
class Creature {
    private static long count = 0;
    public static long getCount(String[] args) {
        return count;
    }
    public Creature() {
        count++;
    }
}

Программа не скомпилируется, так как декларация локальной переменной допустима только внутри блока (JLS 14.12-14). Декларацию можно убрать, используя только создание объекта, так как локальная переменная все равно не используется.
Кроме того, авторы не рекомендуют использовать int как тип счетчика, чтобы избежать переполнения. Максимум для типа int - 231 - 1 (около 2.1 * 109), а для типа long - 263 - 1 (около 9.2 * 1018). Сейчас компьютеры способны создавать около 108 объектов в секунду. Следовательно переполнение для типа long произойдет через три тысячи лет.
Также авторы рекомендуют использовать thread-safe вариант:
class Creature {
    private static long count = 0;
    public static long getCount(String[] args) {
        synchronized (Creature.class) {
            return count;
        }
    }
    public Creature() {
        synchronized (Creature.class) {
            count++;
        }
    }
}
В Java 5 и выше можно использовать класс AtomicLong:
import java.util.concurrent.atomic.AtomicLong;
class Creature {
    private static final AtomicLong count = new AtomicLong();
    public static long getCount(String[] args) {
        return count.get();
    }
    public Creature() {
        count.incrementAndGet();
    }
}