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

воскресенье, 28 января 2007 г.

CoD 2 & HoMaM V

Установил себе на лаптоп Heroes of Might and Magic V. Дико дергается картинка. Невозможно играть.
Установил Call of Duty 2. Вообще не запускается: не поддерживаются, видите ли, динамические текстуры.
Пора апгрейдится?

Удаляем мусор

Хорошая программа тут. Поможет почистить диск. Хотя форматирование еще никто не отменял ;-)

Мужское здоровье

Народ стал спамить смешными ответами доктора на идиотские вопросы пациентов. Нашел тут оригинальный форум. Местами смешно...

суббота, 27 января 2007 г.

Авангард DSL

Подключился на 256К. Работает вроде...
Пишу из дома сейчас.

пятница, 26 января 2007 г.

Java Puzzle 18: String Cheese

byte[] array = new byte[256];
for ( int i = 0; i < array.length; i++ )
array[i] = (byte)i;

String str = new String(array);
for ( int i = 0; i < str.length(); i++ )
System.out.println( (int)str.charAt( i ) );

Не забывайте, что при конвертации массива байт в строку используется преобразование, которое зависит от установленной кодировки. Текущая кодировка задается в системном свойстве file.encoding.
При таком преобразовании может потеряться часть информации. Необходимую кодировку можно задать вторым параметром конструктора. Но преобразование будет всегда.

Java Puzzle 17: Huh?

В качестве примера приведена последоательность Unicode-символов и спрашивается, что быдет делать эта программа. А я что... должен помнить код каждого символа?
Вывод: Используйте Unicode-символы, только если не можете ввести требуемую информацию другим способом. Не используйте их, если можно ввести символы другим способом.

Математические этюды

Забавно

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

Java Puzzle 16: Line Printer

What does the following code print? Is its behavior platform dependent?
// Note: \u000A is line feed
System.out.print(\u000A);

Все та же проблема с Unicode-символами. Это не скомпилируется, так как первый \u000A разобъет комментарий на две части. Если же комментарий убрать, то все равно не скомпилируется, так как нет метода print() без параметров. Вывод: старайтесь вообще не использовать Unicode-символы.

Java Puzzle 15: Hello Whirled

Is it a valid comment?
// generated from F:\Root\app\units\my.idl

Это не скомпилируется из-за проблем с Unicode-символом \units, который является неправильным. Тут авторы дают совет, чтобы все Unicode-символы оформлялись правильно, даже если они находятся в комментарии. Рекомендуют аккуратно использовать \ и, как следствие, не копировать файловые имена Windows в код с помощью автоматических средств.

Остров

Посмотрел фильм Павла Лунгина "Остров". Сильный фильм. На мой взгляд только один просчет - слабый саундтрек, но и так этот фильм очень цепляет. Смотрел неотрываясь. Все остальное - 5 баллов, а подбор актеров - 5+. Мамонов клево сыграл, но и остальные не подкачали. Рекомендую!

Колонки

Наконец-то перевез от Паши колонки. Впервые за два года послушал качественный звук. Приятно. Решил посмотреть фильм.

Наушники для улицы

Тут народ вовсю обсуждает, какие наушники использовать на улице, чтобы шумов слышно не было. Koss the Plug или Sennheiser PX200 (или даже PXC250 с активной системой подавления шума).
Я считаю, что все это чушь. Так как если не будешь слышать ничего, то в неприятность попасть - запросто. Например, под машину...

Java Puzzle 14: Escape Rout

Что будет напечатано:
System.out.print("a\u0022.length()+\u0022b".length());

Java не выполняет никакой специальной обработки Unicode-символов в строке. При компиляции \u0022 преобразуется в ". И в результате напечатает 2. Если же автор хочет вставит двойную кавычку в строку, то он должен использовать не Unicode-символы, а escape последовательности (типа \"). И не используйте Unicode-символы для ASCII символов во избежание путаницы.

Java Puzzle 13: Animal Farm

Что напечатает следующий код:
String pig = "A2";
String dog = "A" + pig.length();
System.out.println("Animals are equal: " + pig == dog);

В этом разделе обсуждается несколько проблем:
1. Отсутствие скобок.
Поэтому выполнение сложения строк происходит до их сравнения.
2. Интернированные строки.
Любые объекты должны сравниваться не по ==, а с помощью метода equals(). При грамотно реализованном методе equals() затраты на его вызов будут минимальные.

вторник, 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... для счетчиков циклов.

Java Puzzle 3: Long Division

Когда работаете с большими числами, ищите переполнение. Приведенный пример показывает, что часто это случается с умножением и делением чисел, а также с неявным преобразованием:
public class LongDivision {
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
public static void main(String[] args) {
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
}
}

Человек на Луне?

Какие доказательства?

понедельник, 15 января 2007 г.

Наводнение

А здесь можно посмотреть фотки наводнения, которое произошло этой зимой. Больше все мне понравилась циничная надпись "С Новым Годом!" и фотография чмжика-пыжика под водой...

пятница, 12 января 2007 г.

Java Puzzle 2: Time for a Change

Оказывается, 2.00 - 1.10 не равно 0.90.
Не рекомендуется использовать float и double для расчетов чего-нибудь важного. Надо использовать BigDecimal(String), но ни в коем случае не использовать BigDecimal(double).
Кроме того, тут рекомендуют использовать форматтеры для вывода чисел.

Java Puzzle 1: Oddity

boolean isOdd( int i ) {
return i % 2 == 1;
}
Тут описывается проблема остатка от деления (оператор %).
Выражение ( i % 2 == 1 ) не работает для отрицательных чисел, так как там остаток от деления равен -1. Рекомендуют использовать выражение ( i % 2 != 0 ).

Java Puzzlers

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

javadoc - codavaj

Забавный проект.
Позволяет сгенерировать java-код по ранее сгенерированному javadoc.

Камни


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

Задачка

Для собеседования у нас придумали задачку: реализовать XOR через AND, OR и NOT. В связи с тем, что я подзабыл булеву алгебру, я решал ее минут 10, включая составление проверочной таблицы.
Для наглядности предлагается использовать блоки с двумя входами и одним выходом для AND и OR, или один вход и один выход для NOT. У меня получилось 4 блока.
А вам слабо?

понедельник, 1 января 2007 г.