среда, 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 километров.

четверг, 17 апреля 2008 г.

ZFS is Smashing Baby

Я уже писал про то, как Jim Hughes разбивает винчестеры с ZFS. Так вот тут можно посмотреть целиком ролик с этой презентацией. Хоть она и в Питере была, но проходила на английском языке. Так что есть шанс попрактиковаться...

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

Magic Pen

Отличная головоломка:

Написана, естественно, на Flash. Но именно такие демки надо сейчас писать на JavaFX. Они тогда просто взорвут JavaOne!

суббота, 12 апреля 2008 г.

С днём космонавтики!


Типа, профессиональный праздник (по ВУЗу)

четверг, 10 апреля 2008 г.

App Engine

Некоторое время назад Google представил свою разработку GWT, предназначенную для быстрой разработки web-приложений с использованием новомодной технологии AJAX.
Теперь они пошли ещё дальше. Они разрабатывают App Engine, который предоставляет API для инфраструктуры Google. А это распределённый хостинг на серверах Google, включающий доступ к базам данных. Теперь не надо думать о том, какой сервер купить, к какому провайдеру его поставить, как обеспечить надёжность сервера и её непрерывную работу, если что-то сломается...

Для меня тут один минус - движок на языке Python. Но кое-кто из вас, читающих мой блог, использует этот язык. Хороший шанс попробовать - попади в десятку (тысяч ;) зарегестрировавшихся первыми!

Java Puzzle 82: Beer Blast

Переходим от нитей (Thread) к процессам (Process). Что напечатает следующая программа? А что она напечатает, если при запуске указать параметр командной строки slave?
public class BeerBlast {
private static final String COMMAND = "java BeerBlast slave";
public static void main(String[] args) throws Exception {
if ((args.length == 1) && (args[0].equals("slave"))) {
for (int i = 99; i > 0; i--) {
System.out.println(i + " bottles of beer on the wall");
System.out.println(i + " bottles of beer");
System.out.println("You take one down, pass it around,");
System.out.println((i - 1) + " bottles of beer on the wall");
System.out.println();
}
}
else {
Process process = Runtime.getRuntime().exec(COMMAND);
int value = process.waitFor();
System.out.println("exit value = " + value);
}
}
}

Авторы говорят, что в первом случае программа зависает. Однако у меня она выводит: exit value = 1, хотя по идее должно быть 0. Видимо, компиляторщики что-то пофиксили. Но проблема всё равно остаётся. Чтобы добиться значения 0, надо очистить поток вывода процесса, который можно получить с помощью метода process.getInputStream(). В JDK 5 для этого добавили класс ProcessBuilder. Рекомендуется использовать его, вместо показанного в программе подхода.
Авторы говорят, что класс Process - это пример плохого API. С хорошим API должно быть простым делать всё правильно и должно быть сложным или невозможным делать неправильно.

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

Java Puzzle 81: Charred Beyond Recognition

Следующая программа делает обычные вещи необычным способом. А вы догадаетесь, что она напечатает?
public class Greeter {
public static void main(String[] args) {
String greeting = "Hello world";
for (int i = 0; i < greeting.length(); i++) {
System.out.write(greeting.charAt(i));
}
}
}

А вот ничего и не напечатает! Всё дело в том, что System.out - это буферизованный поток вывода. Многие думают, что этот поток автоматически очищает буфер и выводит данные на консоль. Несмотря на комментарии в классе PrintStream об автоматическом очищении буфера, на практике можно обнаружить, что в этом классе есть единственный метод, который не очищает буфер. Это метод write(int).
Авторы рекомендуют всегда использовать привычные шаблоны где только возможно.

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

Двое других


Вчера ходили на комедию "Двое других". Денди, ловелас и остроумец Подходцев (Андрей Ургант) знакомится на улице с приезжим Громовым (Максим Леонидов), которого чуть не задавил извозчик Подходцева. Чуть позже в квартире Подходцева спасается от ревнивого мужа любовник замужней дамы Клинков (Алексей Кортнев). Эти приключения становятся началом большой дружбы. Они сталкиваются с различными персонажами, попадают в смешные ситуации, влюбляются, ссорятся, куролесят. Постоянно друг друга подкалывают, как мы в общаге ;)
Ургант, отец чудика рекламирующего Актимэль, играет достойно. Его герой лишний раз не суетится и умеет "держать удар". Леонидов как-то не зажёг. Кортнев играет этакого клоуна, появившись на сцене в семейных трусах. Весь спектакль он трындит, и трындит, и трындит...
Очень понравилось как играет Александр Шаврин. За ним все мужские роли второго плана. Перевоплощается очень убедительно. Зачёт!
Сходить рекомендую - отдохнёте на славу. Хотя пара неприятных моментов есть. Во-первых, спектакль идёт 3 часа 20 минут. Неожиданно долго. Во-вторых, шуток запоминающихся нет. Хорошо, что буклет купили:
    В беллетристике застой:
    Странный Мережковский,
    Глупый Горький, злой Толстой,
    Лысый Маяковский.
    А Есенин, просто - хам!
    Выкинь к чёрту этот хлам!

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

Sun Tech Days

Jim Highes разбивает 2 жестких диска 8 дисковой системы, после чего она восстанавливает данные на дисках и продолжает работать.

Оказывается, кое-где было забавно...

Lake Of Tears


Начинается Mushrooms On The Moon Russian Tour 2008. В Питер они заедут 20 апреля. Предположительно, группа выступит в Roks-клубе. Задумался...

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

Азбука - А

Решил тут посочинять стишки для азбуки:
    Вот аист, что живёт на крыше.
    Но альбатрос летает выше.
    Живёт акула под водой...
    Ты на её пути не стой!

Ну и про Смешариков можно:
    Лосяш - известный астроном.
    Он знает всё на свете!
    Копатыч - знатный агроном,
    Копает на рассвете.

четверг, 3 апреля 2008 г.

Java compiler лажает

Запустите следующую программу:
public class BooleanTest {
public static void main(String[] arg) {
System.out.println(1 == 2 ? false : null);
}
}

Скомпилировали? Словили NullPointerException?
С какого рожна компилятор решил, что null может быть приведён к типу Boolean? Чтобы запустить auto-unboxing? Это всё зло!

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

Те Ещё Дни

Завтра начинаются SunTechDays в Питере. Я там вечером буду, с пяти и до упора. В четверг и тяпницу - не поеду. Лениво. Надо ведь ещё и в пятничный преф поиграть ;)
Регистрация закрыта, так как мест больше нет. Но в связи с бешеным спросом наши организаторы попытаются выделить ещё несколько мест для тех, кто не успел зарегистрироваться. Я за Рустика замолвил словечко, может и ему входной билет достанется. А вечером я планирую попить пивка У Рудольфа вместе с моим коллегой из Москвы. Вместе работали в Люксофте.
Я, как и прошлый раз, буду стоять на будке JavaSE. Постараюсь выложить демки на JavaFX, надо которыми сейчас работаю. Хотя на сегодняшний момент это ещё очень глючная вещь. Я в пятницу оставил демку с летающими буквами, а в понедельник обнаружил, что программа упала, а система показала сообщение о том, что память кончилась и ей поплохело. Пришлось завести баг...