воскресенье, 11 мая 2008 г.

День Победы

Мишка ходил на праздник к памятнику. Впечатлился. Марширует, как солдат. Честь отдаёт. Постоянно поздравляет всех с Днём Победы. Где бы ему такую одёжку найти:

Поубивал бы гадов

Хорошо, что я был с бабушкой. Какая-то сука позвонила: мама, мама, я человека насмерть сбил, денег надо, бла-бла-бла...
Бабушку аж трясёт всю. Я-то сразу заподозрил неладное, когда она мне трубку стала передавать, на том конце отсоединились. Блин! Её до вечера колбасило.
Я, конечно, быстро папу набрал, проверил, что всё в порядке. Бабушку как мог успокоил. Позвонил в полицию, а там говорят, что такие случаи последнее время участились. За день до этого, мы сидели на кухне и новости по радио слушали. Там тоже об этом говорили. Спрашивали в полиции, не знаю ли я телефона, с которого мне звонили. Но на домашнем нет автоответчика, а сами они проверить, кто мне звонил, видите ли, не могут.
Хорошо, что я был с бабушкой. Теперь то она готова к таким звонкам, но а если бы она была одна? Сабж!

Крутые парни

Жаль, что обычно не таскаю с собой фотоаппарат.
Приезжаю сегодня на Балтийский вокзал. 7 утра. Солнце слепит. Машин практически нет. Лепота...
А по Обводному проезжают два мотоциклиста полной защите. Все в чёрном. И только одна деталь портит всю картину. У каждого мотоцикла нелепая жёлтая крыша с надписью ОХРАНА. Повеселило ;)

пятница, 9 мая 2008 г.

С Днём Победы

Поеду в Таллинн на праздник. Если бабушка будет в состоянии, то дойдём до памятника. Вы же можете возложить цветы виртуально.


Джентльмены! Поздравляю вас с победой!

понедельник, 5 мая 2008 г.

Java Puzzle 88: Raw Deal

Что напечатает следующая программа?
import java.util.Arrays;
import java.util.List;
public class Pair<T> {
private final T first;
private final T second;
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public List<String> toArray() {
return Arrays.asList(
String.valueOf(this.first),
String.valueOf(this.second));
}
public static void main(String[] args) {
Pair pair = new Pair<Object>(23, "skidoo");
for (String str : pair.toArray()) {
System.out.println(str);
}
}
}

Удивлены? Я тоже. Она просто не скомпилируется. Несовместимость типов в строке:
    for (String str : pair.toArray()) {

Что происходит? Ведь метод toArray всегда возвращает список строк! Проблема в том, что локальная переменная pair использует raw type. А это означает, что все поля и методы тоже будут использовать raw types. Т.е. метод toArray в таком случае возвращает просто список List. Бороться с этим просто. Измените декларацию переменно таким образом:
    Pair<Object> pair = new Pair<Object>(23, "skidoo");

или ещё более просто:
    Pair<?> pair = new Pair<Object>(23, "skidoo");

И запомните, что тип List (raw type) отличается от List<Object> (parametrized type).

А для меня, как разработчика пакета JavaBeans, который в полный рост использует reflection, это знание ОЧЕНЬ важно. Я вышел на новый уровень понимания generics!

Java Puzzle 87: Strained Relations

Тут задачка на равенства. Отношение равенства должно быть рефлексивным (reflexive), транзитивным (transitive) и симметричным (symmetric). Это в теориии...
А в Java определяет ли оператор сравнения == отношение равенства для значений примитивных типов? Если нет, то какое из трёх свойств оно нарушает?

В головоломке 29 мы узнали, что оператор сравнения не рефлексивный, так как Double.NaN == Double.NaN возравщает false.

Головоломка 35 поможет понять, что оператор сравнения не транзитивный. При сравнении двух числовых значений сначала осуществляется приведение типов. Но аккуратнее, конвертация int или long в double может привести к потере точности. А это чревато!
public class Transitive {
public static void main(String[] args) {
long x = Long.MAX_VALUE;
double y = (double)Long.MAX_VALUE;
long z = Long.MAX_VALUE - 1;
System.out.println(x == y);
System.out.println(y == z); // surprise!
System.out.println(x == z);
}
}

Haluz

Хороший on-line квест, продолжающий традиции Samorost 1 и 2. И тоже двухсерийный...

воскресенье, 4 мая 2008 г.

Опять в Таллинн

На выходные собираюсь поехать в Таллинн, встретить с бабушкой праздник. Осознал, что ОЧЕНЬ хочу, чтобы из нашего окна звучала патриотическая музыка. Надо качать!
Тут, тут и тут...

Opeth


3 июня на лейбле Roadrunner Records выходит новый диск группы Opeth: Watershed (2008). Очень люблю их творчество, особенно альбом Morningrise (1996), который слушаю прямо сейчас.
Я чего бучу поднял раньше времени. Они сняли клип на песню Porcelain Heart. Съёмки проходили в замке Bogesund (Vaxholm, Швеция), построенном в 1640 г. И клип красивый, и песня клёвая!
А вот так развлекаются настоящие фанаты:

среда, 30 апреля 2008 г.

Мороженое

Катался в Таллинн на днях. Видел там мороженое фирмы Premia. Фишка в том, что у них появилось мороженое в стиле ретро. В старые добрые советские времена оно по 20 копеек, кажется, было. Я даже не удержался - купил попробовать. Вкусно! И ностальгия...

пятница, 25 апреля 2008 г.

Java Puzzle 86: Poison-Paren Litter

Можете ли вы придумать корректное выражение, которое превращается в некорректное, если входящее в него выражение взять в скобки?

Обычно добавление пары скобок используется для улучшения читаемости кода. Однако, существует два случая, когда это не так (вспомните задачки 33 и 64).

int i = -2147483648; - корректно
int i = -(2147483648); - некорректно

long l = -9223372036854775808L; - корректно
long l = -(9223372036854775808L); - некорректно

Java Puzzle 85: Lazy Initialization

Следующему классу лень инициализировать себя обычным путём, поэтому он делает это на фоновом потоке. Что программа напечатает? Гарантируется одинаковый результат для каждого запуска?
public class Lazy {
private static boolean initialized = false;
static {
Thread thread = new Thread(
new Runnable {
public void run() {
initialized = true;
}
}
);
thread.start();
try {
thread.join();
} catch (InterruptedException ie) {
throw new AssertionError(ie);
}
}
public static void main(String[] args) {
System.out.println(initialized);
}
}

Кажется, что программа должна каждый раз печатать true, но нет! Она просто виснет.
Симпатичный deadlock. Попробую объяснить.
Понятно, что при обращении к методу main JVM начинает инициализировать класс. И только когда инициализация закончится будет вызван метод main. Во время инициализации запускается метод run. Однако, этот метод перед установкой initialized в true делает тоже проверку на то, что класс уже проинициализирован. Таким образом получается, что основной поток ждёт завершения фонового потока для завершения инициализации, а фоновый поток ждёт завершения инициализации. Вуаля!

Guitar Heroes


Скачал в интернете Guitar Heroes: Album (2007). Чисто инструментальный альбом, записанный известными финскими гитаристами:
    Timo Tolkki from Stratovarius
    Alexi Laiho from Children Of Bodom
    Roope Latvala from Children Of Bodom
    Emppu Vuorinen from Nightwish
    Esa Holopainen from Amorphis
    Nino Laurenne from Thunderstone
    Mr Crab from Bleak
    Mikko Salovaara from Kiuas
    Tuomo Louhio from Impaled Nazarene
    Sakari Hietala from Tarot
    Euge Valovirta from Godsplague
Некоторые песни очень даже цепляют. Например, Hellbilly. Впечатления, в основном, положительные. Теперь думаю, где бы диск купить. Кайлас совсем испортился...

Без очереди

Пришёл в банк погасить задолженность по кредитной карте. Там, как обычно, большая очередь. Напрягает стоять. Даже думал получить код для управления своим счётом через Интернет, хотя мне эта идея не очень нравится. Но один из сотрудников банка сказал, что при наличии паспорта и кредитной карты счёт можно погасить без очереди. Это радует...

вторник, 22 апреля 2008 г.

The Sniper

На flash делают уже вполне достойные игры. Например, Снайпер. Интересная игра про высадку союзных войск в Нормандии.
И вот дают нам очередную миссию:

Вот в прицел мы видим фрицев:

Смотреть можно не только в прицел:

Крестиками помечаются трупы, так что искать придётся всё равно через прицел.

Между миссиями пишут разные сообщения, сопровождая их прикольными картинками:

А вот и мой результат.

Java Puzzle 84: Rudely Interrupted

В этой задаче мы пытаемся прервать исполнение текущего потока, а затем проверяем удалось это или нет. Что напечатает следующая программа:
public class SelfInterruption {
public static void main(String[] args) {
Thread.currentThread().interrupt();
if (Thread.interrupted()) {
System.out.println("Interrupted: "
+ Thread.interrupted());
} else {
System.out.println("Not interrupted: "
+ Thread.interrupted());
}
}
}

Вы удивитесь, но она напечатает "Interrupted: false"
Но почему? Дело в том, что вызов метода Thread.interrupted() всегда очищает состояние флага interrupted текущего потока. Ну мы и получили, что первый вызов вернул true, а второй - false. Для решения проблемы нужно вызывать метод Thread.currentThread().isInterrupted(), который не изменяет состояние флага interrupted.

Java Puzzle 83: Dyslexic Monotheism

Однажды один мужик режил что он единственный такой исключительный пёс. И тогда он написал класс, думая что написал singleton:
public class Dog extends Exception {
public static final Dog INSTANCE = new Dog();
private Dog() {
}
public String toString() {
return "Woof";
}
}

Но он ошибался. Во всём. Сможете ли вы создать второй экземпляр класса Dog не используя reflection?

Ну тут надо сообразить, что класс Exception является Serializable. А дальше всё просто. Эта проблема и её решение были описаны в книге Effective Java: singleton, который имплементирует интерфейс Serializable должен определять readResolve метод, который возвращает единственный экземпляр:
public class Dog extends Exception {
public static final Dog INSTANCE = new Dog();
private Dog() {
}
private Object readResolve() {
return INSTANCE;
}
public String toString() {
return "Woof";
}
}

А иначе при десериализации вы получите другой экземпляр.

понедельник, 21 апреля 2008 г.

Москва - Питер

Как вы думаете, чем может заняться человек, приехавший в 5 утра из Москвы? До открытия метро - 40 минут. Японские кроссворды кончились, новых ещё не продают. Батарейка на телефоне почти села, так что не поиграться...
Физкультпоход!
Сначала по Лиговскому проспекту до метро, там по улице Константина Заслонова выходим на набережную Обводного канала, по которой пилим до Лермонтовского проспекта. По нему уже доходим до офиса. Итого 5 километров, пройденные ровно за 1 час.
Романтика!
Вспомнилось время, когда я пешком ходил из общаги на Московский вокзал поезд встречать. И как мы со Стасом возвращались из кафе Визит, что в районе Чернышевской, на проспект Большевиков. Забавно...

Логично

Пока шли в гараж, я увидел Форд Фокус и говорю: Форд Фикус. Мишке понравилось и он стал трындеть: Фикус, Фикус...
Ну я ему объясняю, что я пошутил, что машина - это Фокус, а Фикус - это такое растение. На что Мишка вполне логично заметил машина - растение. И засмеялся...

Питер - Москва

Выехали в пятницу в 18:00, хотя планировали в пять. Подъезжаем к КАДу и видим, что вантовый мост стоит. Решили объехать под КАДом, выехать на Дунайский, а затем на Витебский. Пока ехали удивлялись: почему это на КАДе машин так мало и все едут. Потом только по РОКСу сказали, что авария на съезде с Вантового и, соответственно, там пробка. Так что могли мы и не объезжать, только время потеряли.
Съезд с Дунайского прост: направо и под мост развернуться. А в iGO, видимо, опечатка. Он честно сказал принять правый ряд, но, почему-то, кричал резко свернуть налево. Послушай дурака...
Там, где Московское шоссе сужается, началась пробка. Долго ехали до Пушкина. Дальше свободно. Мы привязались за джипом Volvo и ехали как он достаточно долго, пока он не свернул. Видимо испугался. Причём он ехал честно: тормозил в населённых пунктах, разгонялся вне их. Правда один раз он пытался от нас уйти, но мы на 175 его догнали. Ну а связку двух машин обогнать по правой полосе довольно сложно, пытался там один фольксваген, но потом отстал...
Часа через 3 уже были в Новгороде. Ещё светло было. Переезжали малый Волховец, так он ни разу не "малый". Такое море! Правда мелкое, скорее всего. Видели там лебедей много. Выехали из Новгорода на трассу - там ремонт ещё не закончен. Как раз на узкое место попадаешь. Надо было ехать через Пролетарий.
282-ой километр от дома. Там находится самая южная Neste. Всегда там заправляемся, так как скидка есть, во-первых. А во-вторых, там просто душевное место и кофе варят неплохой. Пока мы там отдыхали, продавщица выдала Мишке фломастеры и он там рисовал.
Ещё через 220 километров (уже в Тверской области) дорога - просто мясо. Там мы пробили колесо. Не было знака никакого, что ведутся работы, а асфальт срезан. Кусками срезан. Суки! 10 метров срезан на глубину сантиметров в 5, дальше полоса в метр. Ещё срезан, и опять полоса. И таких ям штук 10! Ну почему бы не срезать всё сразу? Прошлый раз (на Матизе ещё) мы там в резонанс попали. Раскачало не по-детски. А в этот раз влетели в яму и переднее колесо пробили. Меняли в темноте. По-хорошему надо было вызывать ГИБДД, оформлять ДТП и вину на дорожников. Тогда бы по страховке починились. Но кому охота несколько часов тусоваться в ночи в какой-то глуши, а потом общаться с гайцами и терять пол дня на это? И так 13 часов ехали...
Поэтому приехали в 7 утра. Всего проехали 750 км со средней скоростью 60 км/ч. Потратили 60 литров, т.е. 8 литров на 100 километров.