вторник, 23 января 2007 г.

10 негритят

Десять негритят отправились обедать,
Один поперхнулся, их осталось девять.

Девять негритят, поев, клевали носом,
Один не смог проснуться, их осталось восемь.

Восемь негритят в Девон ушли потом,
Один не возвратился, остались всемером.

Семь негритят дрова рубили вместе,
Зарубил один себя — и осталось шесть их.

Шесть негритят пошли на пасеку гулять,
Одного ужалил шмель, их осталось пять.

Пять негритят судейство учинили,
Засудили одного, осталось их четыре.

Четыре негритенка пошли купаться в море,
Один попался на приманку, их осталось трое.

Трое негритят в зверинце оказались,
Одного схватил медведь, и вдвоем остались.

Двое негритят легли на солнцепеке,
Один сгорел — и вот один, несчастный, одинокий.

Последний негритенок поглядел устало,
Он пошел, повесился, и никого не стало…

Телефон - радио

Не писал об этом еще?
Рассказывал тут на работе, как во время ремонта к телефонным розеткам подвели кабель от радиосети. Телефон сначала просто висит, потом звонить начинает. Видимо частоты совпали. Снимаешь трубку - он бубнит. Пашка - свидетель. Это он высказал идею, что ремонтники могли радио подключить. Я бы не догадался, так как бубнил телефон очень неразборчиво...

Арройо

Вычитал, что по испански это значит пересохшее русло реки. Вполне понятно, почему так деревня в FallOut 2 называлась. Вспомните мост через это русло...

Ручкой в руку

Смотрел фильм Nikita (1990) Люка Бессона. Обратил внимание на момент, когда героиня хватает со стола ручку и втыкает ее полицейскому в руку. Вспомнил аналогичный момент в фильме DeadMan (1995) Джима Джарамуша, когда Джонни Депп втыкает перьевую ручку миссионеру. Задумался, кто у кого стырил идею. Залез на IMDB и уточнил года. Выходит, что эта идея Люка Бессона? Никто не видел ее раньше?

Виадук на Стачек

Интересно, когда построили виадук на Стачек возле метро Автово? Мне тут сказали, что лет 5 назад чел там ездил и стоял, пропуская поезд. У меня же такое чувство, что ему лет двадцать. По крайней мере, я его помню, когда из общаги на толпу ездили. Или же я его путаю с мостом на Жукова, рядом с Казакова...

Кирилл прошелся по Европе

Был на выходных в Таллинне. Слушал радио. В Пярну наводнение. Скоро до нас Кирилл дойдет?

четверг, 18 января 2007 г.

Java Puzzle 12: ABC

String letters = "ABC";
char[] numbers[] = {'1', '2', '3'};
System.out.print(letters + " easy as " + numbers);
Что будет напечатано?

А если попробовать так:
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
то будет ожидаемый результат:
ABC easy as 123

А с небольшим изменением:
String letters = "ABC";
Object numbers = {'1', '2', '3'};
System.out.print(letters);
System.out.print(" easy as ");
System.out.print(numbers);
результат опять будет неправильным.

Дело в том, что при конкатенации строк используется метод toString(). А массив символов, как и любой другой массив, не переопределяет этот метод. В то же время, класс PrintStream определяет метод print(char[]), который корректно выводит символы в поток. Однако, в третьем случае вызывается метод print(Object), который несмотря на то, что аргумент - массив символов, вызывает у него метод toString().
Для преобразования массива символов к строке авторы рекомендуют использовать метод String.valueOf(char[]).

Java Puzzle 11: The Last Laugh

Рассмотрим следущие выражения:
System.out.print("H" + 'a');
System.out.print('H' + 'a');

Результат первого: "Ha", а второго - 169. Причем тип второго выражения int. Вывод: оператор + выполняет конкатенацию строк только если один из операндов является строкой.

English

Сегодня узнал, что американцы подразумевают вежливый отказ, говоря:
I'll think about it.

среда, 17 января 2007 г.

Java Puzzle 10: Tweedledee

Напишите декларации переменных x и i так, чтобы следующий оператор компилился:
x = x + i;
а следующий оператор - нет:
x += i;

Тут тоже проблема в том, что составной оператор присваивания автоматически приводит тип выражения справа к типу переменной слева.
Object x = "X";
String i = "I";
Cледующий оператор компилится:
x = x + i; // создается новая строка
а следующий оператор - нет:
x += i; // нельзя сложить два объекта

Java Puzzle 9: Tweedledum

Напишите декларации переменных x и i так, чтобы следующий оператор компилился:
x += i;
а следующий оператор - нет:
x = x + i;

Многие думают, что проблема с классом String, а на самом деле проблема в том, что составной оператор присваивания автоматически приводит тип выражения справа к типу переменной слева.
short x = 0;
int i = 123456;
Cледующий оператор компилился:
x += i; // скрытое приведение типов
а следующий оператор - нет:
x = x + i; // ошибка: possible lost of precision
Короче, если не хотите неожиданных проблем - не используйте составные операторы присваивания для типов byte, short или char.

Язык D

Забавный язык народ придумал ;-)

Java Puzzle 8: Dos Equis

Рассмотрим следующий пример:
char x = 'X';
System.out.print( true ? x : 0 );
int i = 0;
System.out.print( true ? x : i );
Что будет напечатано в обоих случаях?

Почему в первом случае будет напечатано X, а во втором - 88? Читайте Java Language Specification 15.25
Ссылаясь на Puzzle 5, авторы рекомендуют не смешивать разные типы при вычислении. Нужно быть уверенным, что для второго и третьего операнда условного оператора используются значения одного типа.

Java Puzzle 7: Swap Meat

Тут рассказывается про технику обмена значениями без введения новой переменной.
x = 1984;
y = 2001;
x ^= y^= x ^= y;
Каков же будет результат?
x = 0;
y = 1984;
Проблема в том, что приведенное выше сокращение работает не так, как следующие операторы:
x ^= y;
y ^= x;
x ^= y;
Это происходит из-за того, что операнды операторов вычисляются слева направо. Если вы хотите записать в одну строку - расставьте правильно скобки:
y = ( x ^= ( y ^= x ) ) ^ y;
И вообще, я рекомендую всегда использовать скобки и не полагаться на приоритет операндов.
Авторы советуют никогда не присваивать значение одной и той же переменной несколько раз в одном выражении. И рекомендуют избегать умных программерских трюков...

Преферанс

На выходных играли в преф по рублю за вист. Проиграл 156 рублей. Как давно я не брал в руки карт!!!

вторник, 16 января 2007 г.

Java Puzzle 6: Multicast

Что напечатает следующий оператор:
System.out.println((int) (char) (byte) -1)?
Ответ 65535 (для наглядности 0x0000FFFF)
Знаковое расширение происходит только тогда, когда тип значения был знаковый. В данном случае расширения знакового разряда не выполняется.
Умный совет дают авторы: если вы не можете с первого взгляда сказать, что делает некая программа, то возможно она делает совсем не то, что вы от нее хотите.
Короче, пишите проще.

Java Puzzle 5: The Joy of Hex

Чему равно 0x100000000L + 0xCAFEBABE?
Прикол в том, что второе число типа int и расширяется знаковым разрядом до следующего long: 0x0000000100000000L + 0xFFFFFFFFCAFEBABEL = 0x00000000CAFEBABE.
Чему равно 0x100000000L + 0xCAFEBABEL?
В результате получим ожидаемое 0x00000001CAFEBABE.
Авторы дают совет избегать вычислений с аргументами разных типов.

Футураметр

Результат теста «На кого из героев „Футурамы“ ты похож»:


Проф.

Лила

Гермес

Бендер

Зойдберг

Фрай

Эми

Киф

Зепп
14-1340733

Если Вы желаете узнать больше о своем характере и о характере героев «Футурамы», то прочитайте статью «Псих-о-рама».

Пройти тест.

Еще один проект Google

Не все, что от Google - бесплатно: SketchUp

Java Puzzle 4: It's Elementary

Тут авторы советуют всегда использовать заглавную букву L для long-литералов: 5432L вместо 5432l, которое похоже на 54321. Я давно пишу заглавные буквы в long- и float-литералах, а также в шестнадцатиричной записи: 0xABCD вместо 0xabcd.
Так же они рекомендуют избегать однобуквенного идентификатора l, который легко спутать с единицей. Это правило меня не касается, так как я всегда предпочитаю использовать длинные названия, содержащие какой-либо смысл. Однобуквенные идентификаторы, которые я использую: x, y, z для координат и i, j, k... для счетчиков циклов.