вторник, 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 (например), то программа не скомпилируется. В идеале, лучше избегать перегрузки конструкторов и методов.
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 лет. Можно сказать
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 или его подклассы. Эти исключения зарезервированы для проблем, после которых невозможно восстановиться...
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 или его подклассы. Эти исключения зарезервированы для проблем, после которых невозможно восстановиться...
пятница, 14 сентября 2007 г.
Солдат
Пока сидели зашел разговор о фильме Солдат. Оказалось, что Кэп его не видел.Пересмотрел сейчас. Классный боевик. Каждый раз считаю сколько солдат завалил Курт Расселл и каждый раз сбиваюсь со счета. Из 20 возможных он убил 21 или 22 солдата. Забавно. Ляп на ляпе, но смотрится на одном дыхании. И не один раз. А как они с пареньком мелким играют! Без слов друг друга понимают...
На IMDB пишут, что среди мусора на планете-свалке американский корабль Франклин Рузвельт, самолет F-117X Remora из фильма Executive Decision (1996) и агрегат из фильма Blade Runner (1982). А так же много других приколов, типа карты московского метрополитена...
У меня еще перевод хороший, одноголосый. Мне больше нравится, чем перевод на DVD, который я видел.
- Почему они это делают?
- Они выполняют приказ, сэр.
- Сколько их?
- Осталось 17, сэр.
- Один против 17-ти. Что вы будете делать?
- Я их всех убью!
четверг, 13 сентября 2007 г.
Хорошо посидели
День программиста мы отпраздновали, посидев в неплохом кабачке на площади Конституции. Были Пашка и Кэп. Ринат обещал, но не доехал.
Гиннесс наливают по 170 рублей. Кажется самое дешевое место в городе. Еще есть Килкенни и Крушовице. Народу мало - не то что в центре.
Литр Гиннесса - это пять! А сейчас - спать...
Гиннесс наливают по 170 рублей. Кажется самое дешевое место в городе. Еще есть Килкенни и Крушовице. Народу мало - не то что в центре.
Литр Гиннесса - это пять! А сейчас - спать...
С праздником!
Сегодня 256-й день года. И что из этого следует?
Это же наш профессиональный праздник - День программиста!
Поздравляю всех друзей и коллег!
Да поможет вам F1!
Да сохранит вас F2!
Во имя Ctrl, Alt и Del - RESET!
Это же наш профессиональный праздник - День программиста!
Поздравляю всех друзей и коллег!
Да поможет вам F1!
Да сохранит вас F2!
Во имя Ctrl, Alt и Del - RESET!
среда, 12 сентября 2007 г.
Пожар в Рыбацком
Возле метро Рыбацкое давно идет большое строительство. Разные торговые цетры вылезают как грибы. Сегодня с утра обратил внимание, что часть рынкочных ларьков, находящихся у самого метро, сгорела и остатки убирают. В свете того, что на этом месте можно возвести еще один торговый центр, думается это был поджог...
Korpiklaani
Прикупил тут их альбомчик Voice Of Wilderness (2005). Очень забавный Folk Metal, сочетающая в себе гитарные партии, ударные, флейту, скрипку, клавишные и прочие фолк инструменты. Атмосфера в музыке очень позитивная. Очень удачно выходят у них припевы.
Слушать ее лучше всего попивая пивко в кабаке и танцуя время от времени, как мы это делали в Визите под Lucky Sharks. Расслабляйтесь!
Слушать ее лучше всего попивая пивко в кабаке и танцуя время от времени, как мы это делали в Визите под Lucky Sharks. Расслабляйтесь!
Java Puzzle 42: Thrown for a Loop
Тут авторами была написана большая программа, которая обходила все массивы, содержащиеся в другом массиве. Приводить я ее не буду, расскажу вкратце...
Обход массива был сделан с помощью бесконечного цикла, выход из которого осуществлялся при отлавливании ArrayIndexOutOfBoundsException. И программа работала непонятным образом, так как все такие исключения втихую пропускались. Это первый совет: никогда не используйте исключений для управления циклом, а используйте исключения только для обработки исключительных условий. Этот совет, кстати, был еще в книге Блоха "Эффективное программирование на Java", Item 39.
Второй проблемой в программе было использование оператора & для логического выражения: (3 <= array.length) & (array[2] == 3)
При таком использовании второе выражение вычисляется несмотря на то, что первое имеет значение false. И, естественно, происходит исключение...
Обход массива был сделан с помощью бесконечного цикла, выход из которого осуществлялся при отлавливании 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.
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.
Предвыборная суета
Подписаться на:
Сообщения (Atom)