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

Завтра в Таллинн

Раньше вторника обновлений не ждите!

Тяжело быть безработным

Вот такие новости: Вчера в Юго-западном округе столицы у 38-летней москвички, которая все еще не может найти работу, угнали автомобиль Porsche Cayenne. По словам женщины, в период со 2 по 8 ноября она отсутствовала дома и когда пришла в свой гараж на улице Дмитрия Ульянова, то обнаружила пропажу дорогостоящей иномарки, которая, кстати, была оснащена спутниковой сигнализацией.

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

Tarja Turunen


Не дождавшись похода в магазин загрузил послушать свеженький альбом Тарьи My Winter Storm (2007). Да, блин, это вам не Nightwish. Голос у Тарьи, конечно, шикарный, но вот музыка на альбоме... Странная какая-то музыка. Медленная и печальная. А вот то как она перепела Poison Элиса Купера мне совсем не понравилось.
Короче, музыка под настроение. Слушать долгими зимними вечерами, в одиночестве уставившись в потолок...

Тест: москвич или петербуржец?

Судя по этому тесту мы с Юлей из Питера. Ну я то - понятно, а она от меня, видимо, словечек нахваталась ;)
Может, вы и живете в другом городе, но у вас язык истинного петербуржца
И пусть они там смеются над "курой-гриль" и хрестоматийным "поребриком" — вы выше этого. Вы навсегда — житель культурной столицы, даже если сейчас вы далеко от дома.
Пройти тест

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

Java Puzzle 64: The Mod Squad

Следующая программа генерирует гистограмму чисел по модулю 3. Что она напечатает?
int[] histogram = new int[3];
int value = Integer.MIN_VALUE;
do {
    int index = Math.abs(value) % 3;
    histogram[index]++;
} while (value++ != Integer.MAX_VALUE);
for (int i = 0; i < 3; i++) {
    System.out.println(histogram[i]);
}

Считай - не считай... Но эта программа сгенерирует исключение ArrayIndexOutOfBoundsException: -2
Проблема в том, что метод Math.abs возвращает неотрицательное число всегда, кроме одного случая когда аргумент равен Integer.MIN_VALUE. В этом случае результат тоже равен Integer.MIN_VALUE. А при получении остатка от деления отрицательного числа получается отрицательный остаток. А ведь мы используем его в качестве индекса массива...

Java Puzzle 63: More of the Same

В этой задаче приводится программа, аналогичная предыдущей, но вместо IdentityHashMap используется HashMap:
public class MoreNames {
    private Map map = new HashMap();
    public void MoreNames() {
        this.map.put("Mickey","Mouse");
        this.map.put("Mickey","Mantle");
    }
    public int size() {
        this.map.size();
    }
    public static void main(String[] args) {
        MoreNames map = new MoreNames();
        System.out.println(map.size());
    }
}

Ну почему он возвращает 0? А потому, что первый метод не является конструктором. Случайно добавив возвращаемый тип к декларации конструктора можно долго искать эту ошибку. Аккуратнее! ;)

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...
Неужели сейчас кто-то использует восьмеричную систему?