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

Traveler IQ Challenge

Забавный тест на знание географии:

Я дошел до седьмого уровня:

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

Квартира

Через год после ремонта наша квартира выглядит вполне обжитой.

Java.net blog post

Таки написал очередную статью...
Пишите комментарии!

Клуб 2м

В одном из магазинчиков нам выдали рекламку "Клуб 2м". Добрались мы до торгового центра Neo на Ладожской. Гуляем, ищем его...
Тут видим - висят джинсы длиной с меня. Вот оно! Этот магазин, в отличии от Богатыря, Больших размеров и т.п., создан не для жырных, а для высоких. Купил куртку с нормальными рукавами! Также купил футболку с длинными рукавами:

Кроме того, в честь открытия подарили еще одну футболку.

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

88 минут

Купили недавно новый фильм с Аль Пачино: 88 минут (2007). Очень понравилось! Сюжет закручен очень лихо и мне напомнил фильм Рекрут (2003). Детали раскрывать не буду, но настоятельно рекомендую посмотреть! Аль Пачино очень шикарный актер! Не подкачал...

Обратил внимание, что сейчас готовится видеоигра Схватка (2009) по мотивам фильма Схватка (1995).

Java Puzzle 62: The Name Game

Что напечатает следующая программа и почему?
Map map = new IdentityHashMap();
map.put("Mickey", "Mouse");
map.put("Mickey", "Mantle");
System.out.println(map.size());

Напечатает 1, но почему? IdentityHashMap в отличии от HashMap сравнивает объекты по равенству указателей, не вызывая метода equals, а по спецификации (JLS 15.28) два строковых литерала равны не только по значению, но и по ссылке (interned). Однако, следующая программа покажет возможную проблему:
StringBuilder sb = new StringBuilder("Mickey");
map.put(sb.toString(), "Mouse");
map.put(sb.toString(), "Mantle");
System.out.println(map.size());

Используйте IdentityHashMap очень осторожно, так как этот класс не является имплементацией общего назначения интерфейса Map.

Java Puzzle 61: The Dating Game

Следующая программа использует основные возможности классов Date и Calendar. Что она напечатает?

import java.util.*;

public class DatingGame {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.set(1999, 12, 31); // year, month, day
        System.out.println(c.get(Calendar.YEAR));

        Date d = c.getTime();
        System.out.println(d.getDay());
    }
}

Думаете, что программа напечатает 1999 и 31? А вот и нет! Она напечатает 2000 и 1. Думаете, что нашли проблему 2000 года (Y2K)? А вот и нет! Все гораздо хуже...

Первая ошибка в вызове "c.set(1999, 12, 31);". Классы Date и Calendar представляют года и дни начиная с 1, а вот месяцы - с нуля. Таким образом, тут устанавливается 31 день тринадцатого месяца. Но ведь в календаре всего 12 месяцев и должна быть ошибка типа IllegalArgumentException? Календарь просто пересчитывает дюжины и добавляет 1 за каждую к годам. Хреновая ошибка. Если 12 исправить на 11, то для программы все будет хорошо, но не для того, что читает и сопровождает код! Для человека 11-й месяц - это ноябрь.

Это объясняет почему мы получили 2000 вместо 1999, но почему 1 вместо 31? Читайте документацию: метод getDay возвращает не день месяца, а день недели (0-воскресенье, 1-понедельник и так далее). На что у нас выпадает 31 января 2000 года? На понедельник! Обратите внимание, что соответствующий метод Calendar.get(DAY_OF_WEEK) возвращает значения, начиная с 1, а не с 0.

Будьте очень осторожны, когда используете Date и Calendar. Всегда уточняйте поведение по спецификации!

Попов vs Маркони

Всем в России известно, что радио изобрел Попов. На западе считают, что радио изобрел Маркони. Старая разборка между коммунистами и капиталистами. Но вот появились новые "рассекреченные" данные. И не надоело им пинаться...

Е в рот сеть

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

Day off

Вчера брал отгул. В субботу отработаю...

В прошлый четверг Юле пришла повестка явится в суд... в среду! Специально они что-ли? Ну она позвонила и ей сказали приехать в ГИБДД на Цимбалина. Приемные часы: вт/чт с 15 до 18. Мы приехали туда и ей сказали, что суда еще не было и надо ехать к мировым судьям на бульваре Красных зорь. А там сказали, что суда еще не было и нам нужно придти в 10 утра в следующую среду.

Так мы и катались через улицу Народную, на которой доблестные парни в желтых накидках регулировали движение. Зеленый включали секунд на 30, а красный - минут на 10. Я, конечно, понимаю, что они разгружали Ивановскую/Народную/Славы, так как на КАДе (на вантовом мосту) пробка была из-за аварии. С каждым годом на дорогах все хуже и хуже...

И что самое обидное. У нас права отобрали на трассе Москва-Питер за превышение (на трассе!). А в самом Питере народ носится - и ничего. Мало того, еще и нам бибикает, что мы тащимся со скоростью 60 км/ч (нам GPS напоминает о превышении... зануда:). Например, Шлиссельбургский проспект вечером переходить просто опасно. Даже днем народ умудряется пролетать на красный свет.

понедельник, 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 есть еще игры.