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

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();
    }
}

вторник, 6 ноября 2007 г.

Стая


Купил в Кайласе диск Страна Льдов (2005). Сначала заинтересовало оформление альбома - очень качественное, как на западных лейблах. Прикинул музыку - вполне добротный тяжелый рок с большим количеством баллад, причем очень качественно сведен. Голос вокалиста очень напоминает Кипелова в его лучшие годы. Лирика русскоязычная, незапоминающаяся, но ведь не это главное...
Главное, что слушать интересно!
Пошукал в интернет и нашел сайт белорусской группы Стая. Во братья славяне дают!
ЗЫ. Кипелов ТАК уже не поет, а Беркут, видимо, и не будет. Да и Ария уже не та...

воскресенье, 4 ноября 2007 г.

Обновление шкафов

Наконец-то нам привезли шкафы и полки, что мы заказали. Поставили пока шкаф для обуви в коридоре, и шкафы для CD и DVD в зале. Очень симпатично выглядит!
Расставлял свои диски - теперь их удобно брать и таскать на работу. Думаю различные обзоры станут чаще появляться, если мне не надоест ;)
DVD влезли вплотную. Как дальше быть - не знаю. Может купить тонкие коробочки, чтобы больше влезло?

С первым снегом

Сегодня с утра обнаружили снег за окном. Мишка ходил, изучал его...

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

КАД - ИКЕА

Сегодня ездили в Мега-ИКЕА. Пройтись по магазинам да на детской площадке поиграться.
Обнаружили, что открылся второй вантовый мост. Теперь выезд на мост гораздо проще, так как там 4 полосы и никто по крайней не едет. Едем в общем потоке... Смотрю на спидометр - там уже 150. Смотрю за окно - пора с моста съезжать. Клево!
В обратную сторону на мосту пока две полосы. Все еще спиливают старое ограждение...
Быстрее бы КАД до Пашки проложили. Так не хочется по Ленинскому ездить.

Пока мы с Мишкой на деской площадке тусовались Юля гуляла по ИКЕА. Накупила всякого...
Пытался понять по чеку, что конкретно мы купили и почем - так и не понял:
БУРКЕН КН+КР 15
ИСИГ САЛФ БУМ 3 (салфетки)
ФЁРВОНА ТНСН РК
СМИККА СУХ БУКЕ (букет сухих цветов)
МЮКЕН ЗЕРК НАСТ (зеркало настольное)
БУРКЕН ДЗТР СХР (дозатор сахара)
КОМПЛИМЕНТ НАБ
БАРНСЛИГ МИНИ-К
БУХОЛЬМЕН ДСК Р (доска разделочная)
КЛАППАР ИГЕЛЬКО
ЭПИСК МСК 14 КР
ИСИГ ГИРЛ 5 М Ж
ИСИГ ГИРЛ 5 М М
НЬЮТА МОЧ Д/ТЕЛ
ФЁРВОНА ТЕНН МЯ
БЕВАРА ЗЖМ Д/ПК (зажимы для пакетов)
ПАТРУЛЬ ОТРАЖАТ (отражатель на одежду)
ШАРМ ТРК КРСН/Ч

Ну что такое Клаппар Игелько?
Шведы, блин....

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

Rammstein - Das Modell

... или Иван Васильевич меняет профессию:

Quazatron

Была на ZX Spectrum одна занятная игрушка. Там нужно было ездить на роботе по трёхмерным уровням, постреливать по другим роботам или брать их на абордаж, во время которого нужно было успеть справиться с некоей вариацией лазерной головоломки за ограниченное время.

И вообще, на этом сайте есть все спектрумовские программы, о которых я вообще что-то слышал. Надо бы попробовать установить эмулятор на Pocket PC. Вот только не знаю, как можно играть стилусом вместо джойстика и клавиатуры...

Новый загранпаспорт

Тут коллега пишет, как надо получать загранпаспорт с минимумом геморроя. Полезная информация. Через пару лет поеду в центральный ОВИР, так как с районными отделениями у меня всегда куча проблем. А в центральном (давным-давно) делал и себе, и бабушке (жительница Эстонии, но гражданка России) без проблем.

Sonata Arctica


Переслушал альбом Reckoning Night (2004). Очень добротный альбом в отличии от следующего...
Первые же аккорды дают понять, что группа не растеряла своей энергетики - настолько "по-сонатовски" быстро открывается этот альбом. Дальше - больше. Композиции звучат мощно и сильно, с неким хэви-металлическим оттенком, но именно они придают этим песням особый шарм. Есть и красивые баллады для романтиков...
Некоторые отрезки звучат настолько необычно для группы, что ее и не узнать. Просто у Sonata Arctica появилось новое звучание. Развивается группа, вот только куда?

Java Puzzle 54: Null and Void

Что произойдет со следующей программой:
public class Null {
    public static void main(String[] args) {
        ((Null) null).hello();
    }
    private static void hello() {
        System.out.println("Hello world!");
    }
}

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

Но я бы еще больше бы постарался запутать тестируемого:
public class Null {
    public static void main(String[] args) {
        call(null);
    }
    private static void call(Null object) {
        object.hello();
    }
    private static void hello() {
        System.out.println("Hello world!");
    }
}
И совет на будущее. Не используйте ссылки на объекты для вызова статического метода - всегда указывайте имя класса, например:
Integer.toString(10)

Java Puzzle 53: Do Your Thing

Допустим, что есть некоторый библиотечный класс, который нельзя изменить:
public class Thing {
    public Thing(int i) {}
}
Допустим, вам надо отнаследоваться от этого класса следующим образом, чтобы иметь доступным значение, которое передается суперклассу при инициализации:
public class MyThing {
    private final int i;
    public Thing() {
        super(this.i = Generator.getId());
    }
}
Приведенный выше класс не скомпилируется, так как нельзя ссылаться на переменную класса до вызова метода super(). Как можно выкрутиться из этой ситуации, чтобы метод Generator.getId() не вызывался дважды?

Решение использует альтернативный вызов конструктора, описанный в JLS 8.8.7.1:
public class MyThing {
    private final int i;
    public Thing() {
        this(Generator.getId());
    }
    private Thing(int i) {
        super(i);
        this.i = i;
    }
}

Красиво

1 x 8 + 1 = 9
12 x 8 + 2 = 98
123 x 8 + 3 = 987
1234 x 8 + 4 = 9876
12345 x 8 + 5 = 98765
123456 x 8 + 6 = 987654
1234567 x 8 + 7 = 9876543
12345678 x 8 + 8 = 98765432
123456789 x 8 + 9 = 987654321

1 x 9 + 2 = 11
12 x 9 + 3 = 111
123 x 9 + 4 = 1111
1234 x 9 + 5 = 11111
12345 x 9 + 6 = 111111
123456 x 9 + 7 = 1111111
1234567 x 9 + 8 = 11111111
12345678 x 9 + 9 = 111111111
123456789 x 9 + 10= 1111111111

1 x 1 = 1
11 x 11 = 121
111 x 111 = 12321
1111 x 1111 = 1234321
11111 x 11111 = 123454321
111111 x 111111 = 12345654321
1111111 x 1111111 = 1234567654321
11111111 x 11111111 = 123456787654321
111111111 x 111111111 = 12345678987654321

Ваши деньги не доступны

При попытке снятия денег на выходные я обнаружил, что закончился срок действия зарплатной карты. С кредитной снимать наличку - себе дороже, да и ПИН код я не знаю.
Позвонил в Райффейзен банк - мне сказали, что карта перевыпускается автоматически, если на счету достаточно средств. Но сказать, перевыпущена ли карта и в каком отделении ее забирать отказались, мотивируя это тем, что я отказался от предоставления информации по телефону. Я то имел ввиду всякие счета и т.п.
Написал представителю Sun Microsystems в Raiffeisen, чтобы сообщила куда и когда ехать. Очень не хочется потерять пару часов на путешествие по отделениям.