среда, 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

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