четверг, 27 сентября 2007 г.

Growl Karaoke

Если вам нравится петь караоке и вы уважаете тяжелый рок, то попробуйте Growl Karaoke. Даже если вы знаете, что такое Growl, текст может вас очень удивить. Лично меня это караоке на хи-хи пробивает...

среда, 26 сентября 2007 г.

Приехали

Вот мы и приехали из Москвы. Доехали за 12 часов. Получается все быстрее и быстрее. Правда, у Юли права под Тверью поменяли временное разрешение за превышение скорости на 65 км/ч. Дорога только что отремотирована, тачка хорошая, временный знак с ограничением видно плохо...
Автомобильный холодильник температуру держит нормально несмотря на то, что один раз выдернули из розетки и не сразу обнаружили. На обогрев его не тестировали, хотя и такая фишка в нем есть.
Жаль теперь не получится в Таллинн поехать на машине. Или же придется ждать прав месяц. А ведь погода не улучшается...

пятница, 21 сентября 2007 г.

The missile game

Очень забавная флеш-игрушка. Летишь на ракете по длинной трубе, а там препятствия...

четверг, 20 сентября 2007 г.

Java Puzzle 50: Not Your Type

public class Type1 {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s instanceof String);
    }
}
Тут все просто. Оператор instanceof определен так, чтобы возвращать false, когда его левый операнд null. Этим многие пользуются, чтобы не делать дополнительных проверок на null.

public class Type2 {
    public static void main(String[] args) {
        System.out.println(new Type2() instanceof String);
    }
}
Тут задачка посложнее и я пропустил тот факт, что оператор instanceof требует, чтобы оба операнда имели такой тип, чтобы один был подтипом другого. А программа не скомпилится.

public class Type3 {
    public static void main(String[] args) {
        Type3 value = (Type3) new Object();
    }
}
Опять подколка. После предыдущей задачи можно решить, что программа не скомпилится. Так оно и было бы, если бы создавался объект типа String. Но в программе создается Object, наследником которого являются все классы, включая Type3. Однако, при попытке выполнения произойдет исключение ClassCastException.

Java Puzzle 49: Larger Than Life

Что напечатает следующая программа?
public class Person {
    private final int age;
    private static final Person PERSON = new Person();
    private static final int YEAR
        = Calendar.getInstance().get(Calendar.YEAR);
    public Person() {
        this.age = YEAR - 2000;
    }
    public static void main(String[] args) {
        System.out.println("age = " + PERSON.age);
    }
}
А программа напечатает не 7, а -2000!
Программа показывает, что можно наблюдать final static поле до того, как оно будет проинициализировано. И чтобы это исправить надо изменить порядок следования полей: поставить YEAR перед PERSON, так как создание экземпляра Person требует проинициализированной переменной YEAR.

Русский сайт Лема

Когда будет сконструировано устройство, которое по желанию сможет понизить или повысить интеллект любого человека, то появится спрос на понижение интеллекта, раз утверждают, что самые счастливые - идиоты. С. Лем

Стройка

Рядом с нашим офисом уже год как строится новое здание центральной налоговой инспекции. Что самое забавное, его строят какие-то южные гастарбайтеры, которые живут прямо в бараках на этой стройке. Наверняка налогов не платят ;-)
Ну а их биотуалеты, видимо, исчерпали свой ресурс и воздух не озонируют...

Пробки

Что-то сегодня на Володарском мосту и в округе офигенная пробка. Видимо из-за того, что на КАДе грузовики покрытие повредили и осталась одна полоса. От дома до налоговой ехал 50 минут. За это время можно было дойти до метро, проехать пару станций и там еще пешочком пройтись. Обратно я так и делал.
Забавный способ объезда пробки по встречке видел. Разворачивается машина на встречку и по ней сдает задо до перекрестка. Там снова разворачивается и впихивается в поток. Уроды!

Налоговая

Сегодня с утра пытался подать документы на налоговые вычеты. После всех остальных попыток я думал, что эта будет последняя. Фиг!
Мне сказали, что я заполнил все правильно, но они не принимают мое заявление, так как я должен подавать его по месту постоянной прописки, а не временной регистрации. Так лениво в Одинцово ехать, а бабла-то хочется...

среда, 19 сентября 2007 г.

Я сделаю для тебя ночь

Видимо, в Microsoft работают любители барона Мюнхгаузена. Они активировали черный экран тьмы, который включается после часа работы на нелицензионной Vista.

Балтийский вокзал

Говорят, что Балтийский вокзал перекрыли - ищут бомбу. Народ возвращается в офис, так как на маршрутки не сесть - безумная давка. Оказалось, что один бдительный страж порядка принял за бомбу кипу журналов. Это, конечно, хорошо. Только пассажиры в час пик, я думаю, были очень недовольны. У нас, например, многие из Петергофа работают.

Java Puzzle 48: All I Get Is Static

Тут рассматривается другая прописная истина: статические методы не виртуальны. Авторы перекрывают статический метод класса в его потомке, приводят экземпляр потомка к типу родительского класса и вызывают статический метод. Естественно, что вызывается метод родительского класса. Для избежания таких проблем - никогда не перекрывайте статические методы! А я еще заявлю, что профессионалы никогда не вызовают статический метод используя экземпляр класса. Я бы вообще запретил это на уровне языка.

Java Puzzle 47: Well, Dog My Cats!

Ну про эту задачку я и писать ничего не хочу. Авторы завели в базовом классе статический метод, а в классах-потомках его вызывают и удивляются, почему счетчик увеличивается для обоих экземпляров класса. Естественно! Каждое статическое поле едино как для самого класса, так и для его потомков.

Das Experiment

Есть такой немецкий фильм как Das Experiment. Он снят по мотивам Стэнфордского тюремного эксперимента. Это психологическая драма. Смотрел как-то по телевизору - очень тяжелый фильм. По началу может показаться нудным, но потом цепляет очень сильно. Хотя для любителей ужастиков со спецэффектами - смотреть не на что. Мориц Бляйбтрой (араб Абдул из фильма Достучаться до небес) играет просто супер!
На NoName пробежала ссылка - поставил качаться.

вторник, 18 сентября 2007 г.

Фантазии из песка

Наткнулся на забавный сайт. Там можно скачать несколько интересных видеосъемок, как Ilana Yahav рисует песком раличные картины. Особенно радует динамика - то что постепенно картины меняются...

Nissan Quest

Недалеко от Казанского собора видел новенький Nissan Quest. Очень длинный минивэн. Я бы даже сказал макровэн - машинка явно не для крупных городов...

Бабье лето

Погода нынче отличная. Сегодня ездил в Городской Ипотечный банк за справкой. Это на набереной Мойки рядом с Исакиевским. Оттуда по каналам и мостам шел пешком на работу: Мойка, Грибанал и Фонтанка. Порадовало, что многие старые дома ремонтируют. Минус такой прогулки один: местные собачники заминировали все набережные...

Java Puzzle 46: The Case of the Confusing Constructor

Что делает следующая программа?
public class Confusing {
    private Confusing(Object object) {
        System.out.println("Object!");
    }
    private Confusing(double[] array) {
        System.out.println("Array!");
    }
    public static void main(String[] args) {
        new Confusing(null);
    }
}
Это вопрос по спецификации. Первый из раздела "классические головоломки". Программа скомпилируется и выполнится конструктор, напечатающий Array. В приведенном выше примере оба конструктора можно вызвать, но по спецификации выбирается тот, который более конкретный. Это второй конструктор, так как каждый массив - это объект, но не каждый объект - массив. Для принудительного вызова необходимого конструктора нужно привести аргументы к типу, определенному в списке формальных параметров:
    public static void main(String[] args) {
        new Confusing((Object) null);
    }
Обратите внимание, что если поменять тип первого конструктора в примере на Double (например), то программа не скомпилируется. В идеале, лучше избегать перегрузки конструкторов и методов.

Java Puzzle 45: Exhausting Workout

Проверяются знания рекурсии. Что делает следующая программа?
public class Workout {
    public static void main(String[] args) {
        workHard();
        System.out.println("It's nap time.");
    }
    private static void workHard() {
        try {
            workHard();
        } finally {
            workHard();
        }
    }
}
Забавно, но если метод будет вызывать сам себя, то вы достаточно быстро получите StackOverflowError. Но если использовать блоки try-finally, как в примере, то на ожидание StackOverflowError уйдет 10291 лет. Можно сказать

понедельник, 17 сентября 2007 г.

Ленинградское настроение

Контрабас не попадает
Гитарист всегда лажает
Барабанщик мимо кассы
И не слышно марокасов
Наше шоу - это говно
Но оно такое одно
Но оно такое, такое одно

Опять Raiffeisen

Сегодня позвонили из банка и сказали, что выпуск моей кредитки откладывается, так как я принес ксерокопию не всех страниц паспорта. А при приеме документов проверить не могли???
Завтра опять идти...

Death Drive

Прислали ссылку на Death Drive. Это, похоже, клон старого, доброго Death Track под PocketPC. Интересно, что создатель предлагает игру на халяву. Поставил качаться...

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

В чем разница

Как произносится C#?
Программист: Си шарп
Музыкант: До диез

Может подколоть кого-нибудь, например, ГерМиша:
"И как тебе на До диезе программируется?"

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

Московская площадь

Возвращаясь в четверг из кабака шли с Кэпом к метро. И тут приспичило. Ну Кэп сказал, что знает выход: на площади построили туалеты. Ну мы и пошли...
Блин, как давно я там не был! Площадь отремонтировали, сделали фонтанный комплекс, скамеечки поставили, туалеты сделали с двух сторон площади. Облагородили короче. Теперь это любимое место молодежи, катающейся там на скейтбордах и роликах, так как там есть горки и препятствия разные. Короче, стоит съездить посмотреть.
Знай и люби свой город!

Java Puzzle 44: Cutting Class

Рассмотрим следующие классы:
public class Missing {
    public Missing() {
    }
}
public class First {
    public static void main(String[] args) {
        try {
            Missing m = new Missing();
        } catch (NoClassDefFoundError error) {
            System.out.println("Got it!");
        }
    }
}
public class Second {
    public static void main(String[] args) {
        Missing m;
        try {
            m = new Missing();
        } catch (NoClassDefFoundError error) {
            System.out.println("Got it!");
        }
    }
}
Если скомпилировать все три класса, а затем удалить файл Missing.class, то можно обнаружить, что программы First и Second выполняются по разному. Одна из них генерирует исключение NoClassDefFoundError, а вторая печатает Got it!
Можете определить и объяснить, как выполняется каждая из программ?

Программа First содержит удаленный класс только внутри блока try, поэтому можно ожидать, что исключение NoClassDefFoundError будет перехвачено и программа напечатает Got it! Программа Second содержит удаленный класс вне блока try, поэтому можно ожидать, что исключение NoClassDefFoundError не будет перехвачено. Однако, если запустить обе программы, то можно убедится, что они ведут себя совсем наоборот!

Проблема заключается в небольшой разнице в скомпилированном коде. А если необходимо определить, что класс пропал, используйте reflection:
public class Third {
    public static void main(String[] args) {
        try {
            Object m = Class.forName("Missing").newInstance();
        } catch (ClassNotFoundException exception) {
            System.out.println("Got it!");
        }
    }
}
Но самый главный совет: не перехватывайте Error или его подклассы. Эти исключения зарезервированы для проблем, после которых невозможно восстановиться...

Java Puzzle 43: Exceptionally Unsafe

пятница, 14 сентября 2007 г.

Солдат

Пока сидели зашел разговор о фильме Солдат. Оказалось, что Кэп его не видел.
Пересмотрел сейчас. Классный боевик. Каждый раз считаю сколько солдат завалил Курт Расселл и каждый раз сбиваюсь со счета. Из 20 возможных он убил 21 или 22 солдата. Забавно. Ляп на ляпе, но смотрится на одном дыхании. И не один раз. А как они с пареньком мелким играют! Без слов друг друга понимают...
На IMDB пишут, что среди мусора на планете-свалке американский корабль Франклин Рузвельт, самолет F-117X Remora из фильма Executive Decision (1996) и агрегат из фильма Blade Runner (1982). А так же много других приколов, типа карты московского метрополитена...
У меня еще перевод хороший, одноголосый. Мне больше нравится, чем перевод на DVD, который я видел.
- Почему они это делают?
- Они выполняют приказ, сэр.
- Сколько их?
- Осталось 17, сэр.
- Один против 17-ти. Что вы будете делать?
- Я их всех убью!

четверг, 13 сентября 2007 г.

Хорошо посидели

День программиста мы отпраздновали, посидев в неплохом кабачке на площади Конституции. Были Пашка и Кэп. Ринат обещал, но не доехал.
Гиннесс наливают по 170 рублей. Кажется самое дешевое место в городе. Еще есть Килкенни и Крушовице. Народу мало - не то что в центре.
Литр Гиннесса - это пять! А сейчас - спать...

С праздником!

Сегодня 256-й день года. И что из этого следует?
Это же наш профессиональный праздник - День программиста!
Поздравляю всех друзей и коллег!
Да поможет вам F1!
Да сохранит вас F2!
Во имя Ctrl, Alt и Del - RESET!

среда, 12 сентября 2007 г.

Пожар в Рыбацком

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

Korpiklaani

Прикупил тут их альбомчик Voice Of Wilderness (2005). Очень забавный Folk Metal, сочетающая в себе гитарные партии, ударные, флейту, скрипку, клавишные и прочие фолк инструменты. Атмосфера в музыке очень позитивная. Очень удачно выходят у них припевы.
Слушать ее лучше всего попивая пивко в кабаке и танцуя время от времени, как мы это делали в Визите под Lucky Sharks. Расслабляйтесь!

Java Puzzle 42: Thrown for a Loop

Тут авторами была написана большая программа, которая обходила все массивы, содержащиеся в другом массиве. Приводить я ее не буду, расскажу вкратце...
Обход массива был сделан с помощью бесконечного цикла, выход из которого осуществлялся при отлавливании ArrayIndexOutOfBoundsException. И программа работала непонятным образом, так как все такие исключения втихую пропускались. Это первый совет: никогда не используйте исключений для управления циклом, а используйте исключения только для обработки исключительных условий. Этот совет, кстати, был еще в книге Блоха "Эффективное программирование на Java", Item 39.
Второй проблемой в программе было использование оператора & для логического выражения: (3 <= array.length) & (array[2] == 3)
При таком использовании второе выражение вычисляется несмотря на то, что первое имеет значение false. И, естественно, происходит исключение...

Java Puzzle 41: Field and Stream

Копируем содержимое файла. При окончании процесса копировани закрываем потоки. Или нет?
static void copy(String in, String out) throws IOException {
    InputStream input = null;
    OutputStream output = null;
    try {
        input = new FileInputStream(in);
        output = new FileOutputStream(out);
        byte[] array = new byte[1024];
        int count;
        while ((count = input.read(array)) >= 0) {
            output.write(array, 0, count);
        }
    } finally {
        if (input != null) input.close();
        if (output != null) output.close();
    }
}
Ну да! Как и ожидалось при возникновении ошибки при закрытии первого потока второй закрыт не будет. Главный урок этой задачи: обрабатывайте любые проверяемые исключения, которые могут произойти в блоке finally.

Предвыборная суета

Путин принял отставку правительства Михаила Фрадкова. Фондовые рынки просели в ответ на отставку. Блин! А не ожидает ли нас очередной дефолт?

Гонка вооружений

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

Apocalyptica in Tallinn

Apocalyptica устраивает тур в поддержку своего нового альбома Worlds Collide (2007). Из турфирмы Визит пришла рекламка на их концерт в Хельсинки, но выйдет дороже, так как еще гостиницу оплатить надо, да и саму турфирму не обделить. Есть вероятность, что мы с Юлей и Мишкой в это время будем гостить у бабушки в Таллинне. Надо попробовать выделить время на концерт.

System Shock


Зашел вчера в Кайлас. Искал чего-нибудь послушать. Случайно увидел диск группы System Shock. Название привлекло тем, что когда-то была такая компьютерная игра. Интересная. Послушал альбом Arctic Inside (2004). Понравилось. Решил взять...
Вечером слушал дома. Наслаждался. Несколько первых песен и последняя очень даже зацепили. Альбом короткий, минут на 40. Надоесть не успевает. Добротный мелодичный death от шведов. Гитарный саунд достаточно тяжёлый, но при этом очень мелодичный. Вокал - стандартный гроулинг, но не напрягающий.
Понравилось настолько, что хочу найти их второй альбом Escape (2006). Говорят он еще лучше первого...

Масяня

Что-то Куваев размахнулся. Новый мульт на 7 метров выпустил. Самый длинный, говорит...

вторник, 11 сентября 2007 г.

Opeth


Купил альбом Ghost Reveries (2005). На этом альбоме снова появляется превосходный глубокий гроул и сочные гитарные риффы. Так же слух радует наличие лирических акустических вставок. Воистину мастерское владение каждого участника группы своими инструментами разбавляют и вносят в каждую песню неповторимые и разнообразные ходы. Альбом богат всяческими переходами и измененем звучания практически в каждой композиции. Еще бы! Там 4 композиции из 8 продолжительностью более 10 минут.
Пожалуй, на данный момент это наиболее интересный диск Opeth. Здесь нет легко запоминающихся мелодий и рефренов. Есть профессионализм и мастерство, высочайший уровень техники исполнения и нестандартность музыкального мышления. Супер!

Java Puzzle 40: The Reluctant Constructor

Вот, блин, навернули:
public class Reluctant {
    private Reluctant instance = new Reluctant();
    public Reluctant() throws Exception {
        throw new Exception("I'm not coming out");
    }
    public static void main(String[] args) {
        try {
            Reluctant r = new Reluctant();
            System.out.println("Surprise!");
        } catch (Exception e) {
            System.out.println("I told you so");
        }
    }
}
А StackOverflowError получить не желаете? Дело в том, что поля класса инициализируются перед исполнением содержимого конструктора. Вот так и зацикливаемся...
Обратите внимание, что конструктор должен декларировать все проверяемые исключения, которые могут возникнуть не только в теле конструктора, но и в процессе инициализации полей класса.

Java Puzzle 39: Hello, Goodbye

Что напечатает следующая программа?
try {
    System.out.println("Hello");
    System.exit(0);
} finally {
    System.out.println("Goodbye");
}
System.exit останавливает выполнение текущего потока и всех других в текущей позиции. Даже finally блок не имеет права продолжать работу. Если очень надо, чтобы программа выполняла некоторые действия при завершении работы виртуальной машины - используйте shutdown hooks:
System.out.println("Hello");
Runtime.getRuntime().addShutdownHook(
    new Thread() {
        public void run() {
            System.out.println("Goodbye");
        }
    }
);
System.exit(0);

Хайям о нас

Мир я сравнил бы с шахматной доской:
То день, то ночь. А пешки? – мы с тобой.
Подвигают, притиснут, – и побили,
И в темный ящик сунут на покой.

NetApp vs Sun

В среду компания Network Appliance подала патентный иск против Sun Microsystems. В заявлении, поданном в окружной суд в Техасе, ответчику вменяется нарушение семи патентов Network Appliance, касающихся систем обработки данных и связанного с ними программного обеспечения.
Интересно, а sin(x) запатентован?
Истец требует компенсации нанесенного ущерба и просит, чтобы суд вынес бессрочный судебный запрет, который не позволит Sun распространять запатентованную технологию NetApp в составе существующих и будущих версий систем обработки данных и ПО и продолжать дальнейшие разработки файловой системы ZFS.
О как! Давайте патентами инновации глушить...
В Network Appliance уверяют, что пытались решить конфликт с Sun мирным путем, но та заняла агрессивную позицию и отказалась признать свою вину. Network Appliance ничего не оставалось, как обратиться в суд. В своем иске компания не только предъявляет обвинения Sun, но и требует, чтобы суд признал, что сама NetApp не нарушала трех патентов Sun, и объявил их недействительными.
А сами-то нарушили. Лицемеры!

понедельник, 10 сентября 2007 г.

Google + Microsoft

Неужели Google и Microsoft подружились? Google предлагает скачать IE7 со встроенной панелью Google со своего сайта.

Играем мускулами

Несмотря на то, что некоторые западные критики свысока смотрят на российские ВВС, американские и британские самолеты с поразительной частотой по тревоге взлетают в небо для конвоирования российских стратегических бомбардировщиков, отслеживают их действия во время проведения летно-тактических учений. Это и есть реальная оценка НАТО потенциальных возможностей российских стратегических ВВС.

Java Puzzle 38: The Unwelcome Guest

Авторы наворотили безумную программу, высосанную из пальца, так как нормальные программисты так не пишут. Вкратце, рассмотрим следующий код:
public class UnwelcomeGuest {
    private static final long ID;
    static {
        try {
            ID = getID(); // can throw an exception
        } catch (Exception exception) {
            ID = -1;
        }
    }
}
Проблема тут в том, что blank final поле может быть инициализирована только в том месте программы, где она действительно неинициализирована. Но компилятор не может определить, что первое присваивание недостижимо. Авторы рекомендуют создать статический метод для вычисления значения поля:
public class UnwelcomeGuest {
    private static final long ID = calcID();
    private static long calcID() {
        try {
            return getID(); // can throw an exception
        } catch (Exception exception) {
            return -1;
        }
    }
}
Плюсом этого подхода является то, что вычисление значения константы вынесено в отдельный метод, для которого можно написать документацию (что, как и почему)...

пятница, 7 сентября 2007 г.

Java Puzzle 37: Exceptionally Arcane

Что вы думаете об этой программе?
public class Arcane1 {
    public static void main(String[] args) {
        try {
            System.out.println("Hello world");
        } catch (IOException exception)
            System.out.println("I've never seen println fail");
        }
    }
}
А она не компилится! Правильно. Спецификация гласит, что не должна выполняться компиляция блока catch для проверяемого исключения типа E, если соответствующий блок try не может сгенерировать исключение этого типа или одного из его подтипов (JLS 11.2.3).

А что вы думаете о следующей программе?
public class Arcane2 {
    public static void main(String[] args) {
        try {
            // If you have nothing nice to say, say nothing
        } catch (Exception exception)
            System.out.println("This can't happen");
        }
    }
}
А вот и нет! Она компилится. Дело в том, что для базовых типов исключений (Throwable и Exception) сделано исключение, так как они могут использоваться для перехвата непроверяемых исключений.

Попытаемся создать метод, в сигнатуре которого определены проверяемые исключения, но сам он их не кидает. И попробуем его вызвать без проверки. Скомпилится?
interface Type1 {
    void f() throws CloneNotSupportedException;
}
interface Type2 {
    void f() throws InterruptedException;
}
interface Type3 extends Type1, Type2 {
}
public class Arcane3 implements Type3 {
    public void f() {
        System.out.println("Hello world");
    }
    public static void main(String[] args) {
        Type3 t3 = new Arcane3();
        t3.f();
    }
}
Множество проверяемых исключений, которые метод может сгенерировать, является пересечением множеств проверяемых исключений, которые определены во всех типах. Заметьте, не объединение, а пересечение!

Total control

Военные тоже включились в гонку за технологиями, позволяющими контролировать человека. В начале августа Министерство обороны США профинансировало контракт на разработку специальных микрочипов, которые можно будет имплантировать в мозги солдатам и постоянно отслеживать состояние их здоровья. На своем ноутбуке офицер будет видеть, сколько процентов здоровья осталось у каждого бойца, так что сможет эффективнее распоряжаться имеющимися силами. По-видимому, это первый этап на пути к созданию солдата будущего, которым можно управлять через компьютер.

По-видимому, автор заметки переиграл в Quake. Проценты здоровья...
Ха!

Raiffeisen

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

четверг, 6 сентября 2007 г.

PocketPref

Некоторое время назад поддержал еще одного отечественного произодителя - купил карманный преферанс.
А дело было так. По пятницам мы на работе пишем пульку. Но меня все обыгрывали. И я решил попрактиковаться. Так как за компом я обычно работаю, то очень неудобно играть в Марьяж. Поэтому купил лицензионный диск и поставил себе на коммуникатор. Много тренировался - пошел в плюс. Статистика лежит на Google Docs. Потом тренировки забросил, когда у коммуникатора случился полный сброс (упал на пол). Теперь переустановил. Надо тренироваться. Завтра - игра!

Java Puzzle 36: Indecision

Что возвращает следующий метод, true или false?
boolean isValid() {
    try {
        return true;
    } finally {
        return false;
    }
}

Метод вернет false, согласно JLS 14.20.2: в выражении try-finally блок finally всегда выполняется, когда управление уходит из блока try. Авторы рекомендуют никогда не покидать блок finally с помощью return, break, continue or throw. Это небезопасно!

Java Puzzle 35: Minute by Minute

Следующая программа имитирует простые часы:
int minutes = 0;
for (int ms = 0; ms < 60*60*1000; ms++)
    if (ms % 60*1000 == 0)
        minutes++;
Программа считае миллисекунды, добавляя время от времени минуты. И чему будет равно количество минут в конце цикла?

А вот и нет! В часе получается не 60 минут, а 60000. А проблема в том, что % и * равнозначные операторы. Т.е. сначала выполняется ms % 60, и 0 тут получается гораздо чаще, чем ms % (60*1000). Как сделать правильно? Заменить все магические числа на константы:
int MS_PER_HOUR = 60 * 60 * 1000;
int MS_PER_MINUTE = 60 * 1000;
int minutes = 0;
for (int ms = 0; ms < MS_PER_HOUR; ms++)
    if (ms % MS_PER_MINUTE == 0)
        minutes++;

Пользователей може запутать, что вокруг % находятся пробелы, а вокруг * - нет. Компилятору до них никакого дела нет. Никогда не используйте пробелы для группировки операторов. Используйте скобки!

Lingvo 11

Купил год назад Лингво 11. Поддержал, так сказать, отечественного производителя. Активно использую. Иногда, для обычных слов открывает дополнительные окошки с нецензурным сленгом. Сейчас сразу не вспомнить, но было пару раз. На работе использую Tutor, который выдает слова на английском или на русском, а к ним нужно набрать перевод. Вещь удобная. Особенно на коммуникаторе. К нам приехали коллеги из штатов, так во время разговора можно быстро найти перевод. Чаще всего с русского на английский.
Ставил тут его на домашний компьютер. Он мне заявил, что неплохо было бы купить 12-ю версию. Залез на сайт. Сравнил. Сейчас напишу, что понравилось.

  • В новой версии они написали Tutor под PocketPC. Гораздо удобнее, когда карточки слов всегда собой, например, в метро.

  • Обновили поиск: теперь включается полнотекстовый поиск, если слово не найдено. Также можно искать по маске, если не уверен в написании слова.

  • Сделана полная интеграция в Windows: при наведении курсора мыши на слово в любом приложении всплывает окошко с его переводом.

  • Есть европейская версия с дополнительными языками: немецкий, французский, итальянский и испанский. И есть многоязычная версия, где помимо указанных языков есть китайский, турецкий, украинский и латинский.


Вот и думай, не поддержать ли отечественного производителя еще раз.

Налоговые вычеты

Занимаюсь возвратом денег с налоговой. Тот еще геморрой. В налоговой дали кучу каких-то бумажек и сказали заполнять. На стендах ничего не нашел по приобретенной недвижимости. Долго вникал в непонятные закорючки и, если бы не программа "Декларация 2006", то уже сошел бы с ума...
БЮРОКРАТЫ!

среда, 5 сентября 2007 г.

Негатив

Выруливаю из метро сегодня вечером. Настроение хорошее. Лечу на крейсерской скорости домой. Тут около метро меня девчока останавливает, типа, па-ма-ги-те. Буркнул в ответ, типа, не ко мне. Лечу дальше. Пролетаю через сквер. Темно. Фонарей нет. Чувак подруливает, типа, братишка не уделишь пару минут драгоценного времени. А еще двое невдалеке пасутся. Ну я говорю "нет" и улетаю. Он в догонку кричит "я, кажется, тебя знаю". Хрен с ним. Перехожу перекресток. Мне на перерез какая-то тетка выбежала и дорогу перегородила. Остановилась, типа, ждет меня. Но я сделал финт ушами, срезал угол и даже не знаю, чего она от меня хотела. Задолбали. Я что? медом намазан?

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

Java Puzzle 34: Down for the Count

Так же как и в головоломках 26 и 27 мы должны узнать количество итераций цикла (count):
final int START = 2000000000;
int count = 0;
for (float f = START; f < START + 50; f++)
    count++;

Если вы думаете, что count == 50, то ошибаетесь. Это вам не целочисленная арифметика! Начальное значение цикла близко к максимальному и требует 31 бит, но тип float предоставляет только 24 бита для точности числа. Часть числа теряется при конвертации, т.е. (float)2000000000 == (float)2000000050. Вот так и получается, что тело цикла не будет выполнено...

Авторы не рекомендуют использовать float и double как индекс цикла, так как поведение при больших значениях непредсказуемо. Если же все-таки нужно использовать арифметику с плавающей точной, то лучше использовать double, так как тут больше точность. И будьте начеку!

Java Puzzle 33: Looper Meets the Wolfman

Сделайте следующий цикл бесконечным, не используя возможности Java 5:
while (i != 0 && i == -i)

Забавно, но все кроется в компьютерной арифметике. Как получаются отрицательные числа? Изменяем значение каждого бита и прибавляем 1. Это сделано для удобства работы с 0: -0 => 0xFFFFFFFF + 1 => 0. Остальные числа либо отрицательные, либо положительные, но! Отрицательных чисел больше, так как количество комбинаций бит четное, а одна из них занята 0. Мы имеем уникальное отрицательное число, пары которому нет: -0x80000000 => 0x7FFFFFFF + 1 => 0x80000000. Т.е. i == -i, но в то же время не равно 0. Вот и ответ:
int i = Integer.MIN_VALUE;

Автохолодильник

Сегодня ездил в MediaMarkt покупать холодильник для автомобиля. Купил Vitek за 2000р. Выглядит он примерно так.
Иду я с ним на выход. Меня окликает Иван Платонов. Он там с сыном гулял на детской площадке. Он сказал, что подумал сначала, что я торгую, типа, пирожками (в кожанной жилетке, с холодильником, небритый). Вот как обо мне бывшие однокурсники думают!
Еще он рассказал, что его жена с дочкой рисуют возле ИКЕА. Там можно купить глиняную фигурку и расскрашивать ее красками, что там дают. Проходил потом мимо, видел кучу детей с родителями, разрисовывающих свои фигурки, но Елену не увидел, а жаль. Хотел подойти поприветствовать.
В конце сентября повезем от тещи замороженные ягоды, фрукты-овощи. Вот и потестируем, как оно ожлаждает. Можно, конечно, использовать охлаждаемый бардачок в Сценике, но не хотелось бы, чтобы протекло что-нибудь. Не отмоем потом.

Google Page Creator

Тестировал Google Page Creator, но без новых "экспериментальных" возможностей пока...
Теперь одному человеку разрешается заводить до пяти сайтов. Каждому сайту, естественно, свои настройки. Каждый сайт можно временно скрыть или, например, пометить, как ресурс дя взрослых.
Автоматически для сайта включена опция оптимизации загружаемых изображений. Сжимаются они в JPEG. Поэтому эту опцию рекомендуется отключать, если надо загружать анимированные GIFы, например. Работа с изображениями сделана на 5. Его можно подогнать к рамеру страницы или сделать маленьким. Кроме того, можно настроить яркость, показывать часть изображения, а по ссылке выдавать полное. Все это делается на стороне сервера, а пользователь качает минимум информации.
Но больше всего мне понравилась поддержка мобильных устройств. Сайт автоматически меняет расположение элементов и размеры картинок так, что читать действительно удобно!
Не понравилось, что до сих пор нет поддержки таблиц. Хотелось бы иметь возможность задавать содержимое footer не для каждой страницы, а один раз - для сайта, так как он все равно обычно содержит одинаковую информацию. Так же хотелось бы, чтобы в навигационной панели автоматически создавалось навигационное меню, а то приходится копировать его со страницы на страницу, убирая ссылки на текущую. Надо будет включить "экспериментальные" возможности и проверить, нет ли там того, что мне хочется...
И самый большой минус! После пары часов экспериментов Windows выдало мне предупреждение о том, что кончается память и место на диске C. Я проверил Task Manager - iexplorer.exe скушал 800 мегабайт ОЗУ! Явный memory leak 8(
Результаты экспериментов можно посмотреть здесь. Рекомендую посмотреть с мобильника - выглядит симпатично!

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

Java Puzzle 32: Curse of Looper

Определите i и j таким образом, чтобы сделать следующий цикл бесконечным:
while (i <= j && j <= i && i != j)

Необычный цикл. Если i <= j и j <= i, то это верно когда i == j. А следующее выражение проверяет i != j. Выглядит, что мы в цикл никогда не попадем. Хо-хо-хо!

А давайте использовать новые возможности Java 5: unboxing! Вот ответ:
Integer i = new Integer(0);
Integer j = new Integer(0);

При вычислении первых двух выражений он используется, так как операторы сравнения <= определены только для примитивных типов. А при вычислении последнего выражения - нет, и сравниваются ссылки на два разных объекта. А они не равны. Вот тут-то мы и попали 8(

Java Puzzle 31: Ghost of Looper

А как насчет такого цикла:
while (i != 0) i >>>= 1;
Сделаете его бесконечным?

Судя по оператору сдвига i должно быть целочисленным. А для присвоения используется составной оператор. Вот оно! Согласно JLS 15.26.2 такие операторы втихомолку выполняют сужающее преобразование примитивных типов. Согласно JLS 5.1.13 такое преобразование может терять информацию о величине или точности числовых значений. Вот и ответ:
short i = -1; // или byte

Вкратце: 0xFFFF != 0 и мы заходим в цикл. Так как оператор сдвига реализован только для типов int и long мы получаем 0xFFFF -> 0xFFFFFFFF -> 0x7FFFFFFF -> 0xFFFF. Тут мы и зацикливаемся. Авторы советуют не использовать составные операторы присвоения для типов short, byte или char.

Puzzle

Сегодня был у Пашки в гостях. Увидел, что он там паззл собирает. Осталось собрать небо и воду. А там штук по сто фишек одинакового цвета. Вспомнил дедство - помог ему с водой, так как там меньше фишек было.
Когда собираешь одноцветные фишки легко их перепутать. Я собрал нижний ровный край и стал собирать в центре. 4 фишки никак не лезут. Пришлось разобрать и пересобрать нижний край немного по другому. Странно, что существует два варианта.
Теперь ему небо собирать. Видимо еще неделю потратит ;)

СберБанк РФ

Давно уже плачу за коммунальные платежи в ПетроЭлектроСбыт. Очень удобно. Не берут коммиссию, если платишь в другом районе. Один из центров расположен очень удобно - рядом с работой. Очередей практически нет. Максимум что видел - очередь из трех человек, после чего прошел к дальнему окошку и стал вторым.
Но тут пришла квитанция на оплату домофона за 2 года. В ПЭСб мне сказали, что договора с той организацией у них нет и они не могут принять платеж. Пришлось идти в спербанк. Блин!
У нас достаточно большой центр - окошек 20 будет, но работают только 2 из них. Естественно очереди громадные - минут 40 потратил. И тетки там работают так, как будто делают нам одолжение. И очень медленно!