суббота, 15 марта 2008 г.

Чеширский кот

Хороший аватар, когда злобное настроение ;)

Metallica tribute

Смотреть до конца:

четверг, 13 марта 2008 г.

Тестируем замену Skype

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

Java Puzzle 76: Ping Pong

Следующая программа содержит синхронизированные статические методы. Что она напечатает? Гарантируется ли её результат от запуска к запуску?
public class PingPong {
public static synchronized void main(String[] args) {
Thread thread = new Thread() {
public void run() {
pong();
}
};
thread.run();
System.out.print("Ping");
}
static synchronized void pong() {
System.out.print("Pong");
}
}

Начнём с того, что синхронизировав статические методы мы добились того, что результат программы гарантируется от запуска к запуску. Но почему она пишет PongPing вместо PingPong?
Типичная ошибка и простая невнимательность. Для запуска отдельного потока надо вызывать метод start, а не метод run. В нашем случае всё действие происходит на одном потоке.
Будьте внимательны!

Java Puzzle 75: Heads or Tails?

Поведение приведённой ниже программы меняется при переходе на Java 5. Почему? Как будет себя вести программа на версиях 1.4 и 5?
import java.util.Random;
public class CoinSide {
private static Random rnd = new Random();
private static CoinSide flip() {
return rnd.nextBoolean()
? Heads.INSTANCE
: Tails.INSTANCE;
}
public static void main(String args) {
System.out.println(flip());
}
}
class Heads extends CoinSide {
private static Heads INSTANCE = new Heads();
public String toString() {
return "heads";
}
}
class Tails extends CoinSide {
private static Tails INSTANCE = new Tails();
public String toString() {
return "tails";
}
}

Начнём с версии 1.4 - программа не скомпилируется. Поведение условного оператора (?:) раньше было более ограничивающим. Он требовал, чтобы обе части были одинакового класса или один класс был бы подклассом другого. А в нашем примере это не так.
После версии 5 стало дозволено немного больше. Результат условного оператора имеет наиболее общий класс (в нашем случае - CoinSide). В большинстве случаев все классы имеют общий тип - Object.
Надо будет проверить ещё с примитивными типами. Будет ли работать auto-boxing?
Авторы рекомендуют всегда использовать последний релиз Java-платформы, так как в последние релизы включены многие улучшения, делающие жизнь программистов легче.
А вот о новых багах, особенно регрессиях, авторы молчат... ;)

среда, 12 марта 2008 г.

Google Pages: No JNLP

Хотел использовать Google Pages, чтобы размещать на нём свои Java-приложения, включая пресловутую Reversy. Однако, они отображают JNLP файлы, как текстовые XML.
Обнаружил способ, как заставить сервер понимать JNLP - надо в папку положить файл .htaccess, в котором есть следующая строка:
AddType application/x-java-jnlp-file .jnlp
Это прекрасно сработало на локальном сервере, но не работает с Google! Этот файл автоматически переименовывается при загрузке - убирается точка. Надо писать в службу поддержки, хотя я год назад писал туда сообщения о багах, но мне так ничего и не ответили...

Bloc at SillyBull

Хорошая головоломка, но короткая...

Там ещё много разных игр, которые даже можно положить на свою страничку.

Kellermann Center

Сейчас офис Сан в Питере расположен в офисном центре, фасад которого вы можете видеть на шестикилограммовом торте:

Тут ещё есть...

Авангард разгоняется

Была новость, что Авангард увеличивает скорости на существующих тарифах в два раза. Я уже писал как измерить скорость Интернет. Вот я и решил измерить скорость и сравнить её с последними измерениями. Это измерения из дома (ADSL) до ближайшего сервера в Санкт-Петербурге:

А так выглядит скорость до Сан Франциско:

Ускорения нет! Более внимательное прочтение новости показало, что это касается всех абонентов, кроме выбравших тарифные планы 300К и 600К.
Блин! Надо посчитать деньги и переоформиться что-ли...

пятница, 7 марта 2008 г.

Java Puzzle 74: Identity Class

Как определить класс Enigma, что бы следующая программа выдавала false? Переопределять метод equals нельзя!
public class Conundrum {
public static void main(String[] args) {
Enigma e = new Enigma();
System.out.println(e.equals(e));
}
}

А подсказка в том, что перегружать можно ;)
class Enigma {
public boolean equals(Enigma e) {
return false;
}
}

Если два перегруженных метода принимают разные параметры, то они должны иметь идентичное поведение! И ещё, эта головоломка была бы не возможна, если бы переменная e была бы типа Object:
    Object e = new Enigma();

Java Puzzle 73: Your Privates Are Showing

Идея этой головоломки - дать понять, что private члены класса не настолько приватные, как принято думать. Например, при использовани сериализации по-умолчанию все private поля класса становятся частью экспортируемого API. Ну и задача состоит в том, чтобы написать в некоторой библиотеке что-нибудь приватное так, чтобы перестал компилироваться клиент, который использует эту библиотеку. Авторы предлагают раскомментировать строчку в следующей программе:
package library;
public final class Library {
// private static class String {}
public static String newString() {
return new String();
}
}
package client;
import library.Library;
public final class Client {
private String str = Library.newString();
}

Ну или в следующей:
package library;
class AbstractLibrary {
public static final int ANSWER = 42;
}
public final class Library extends AbstractLibrary {
// private static final int ANSWER = 6 * 7;
}
package client;
import library.Library;
public final class Client {
private int answer = Library.ANSWER;
}

Вывод: переиспользование имён опасно, избегайте сокрытия и затенения...

JavaFX

В Sun разработали JavaFX Script. И делают сейчас JavaFX. Это некая сборка, которая включает в себя полноценный JRE и скрипт. Основная фишка в том, что бы был аналогичный пакет JavaFX Mobile, способный работать на телефонах и встраиваемых устройствах. Сейчас существует open-source версия, которая работает как интерпретатор. В разработке находится компилятор, но по синтаксису он отличается от интерпретаторной версии, так как сильно не доработан. Да и технические проблемы есть...
К чему это всё? Так меня попросили писать демки для JavaOne именно для компиляторной версии. Сколько я матюков сложил, пока не вкурил эту разницу в синтаксисе. Документации ещё нигде нет. Приходится идти по этому минному полю, где шаг вправо или шаг влево - exception. Сейчас портировал вот эту демку под JavaFX. У меня она выглядит почти так же, но Дюк летает медленнее. И задержки при появлении элементов нет. Но для обучения - сойдёт. Сейчас работаю над демо для Java Media Component, который Кирилл разрабатывает под Linux. Ну и пытаюсь сделать Reversy, как всегда при изучении нового языка. Только я понял, что этот скрипт не предназначен писать программы. С его помощью можно быстро наваять GUI, а вот логику придётся писать на Java.
Кстати, JavaFX Script базируется на Scene Graph, достаточно мощной библиотеке для создания GUI с использованием двумерной графики. Демки, созданные с использованием Scene Graph можно посмотреть тут. Swing-компоненты можно легко вращать, трансформировать и масштабировать. Хоть это никому в GUI не нужно, зато какой WOW эффект!

Медицина, панимаиш

Сегодня с утра ездили в отделение клиники семейной медицины, чтобы оформить карту для детского сада. За полчаса прошли всех врачей, сдали анализы. Отношение к посетителям - просто супер! Даже бахилы бесплатно. Однако пришлось отдать 2000 р.
Расположены они на пр. Большевиков, д. 22, кор. 5. Дом находится на задворках Бонча, там где должны были построить информационный центр, а построили несколько жилых домов, под названием "Изумрудный город". Въезд с Большевиков, через пустырь и, далее, шлагбаум.

В среду ездили к аллергологу на Суворовский пр., д. 4. Детская поликлиника №19 (по корпоративной страховке от УралСиб). Врач оказался хороший, несмотря на то что мы опоздали на полчаса. Но регистратура!..
Сначала я им позвонил из пробки на ПлАНе, что мы встряли и задерживаемся. Мне грубо так сказали, что придётся стоять в общей очереди. Ладно. Но когда мы приехали и отмечались в регистратуре, на нас наехали, что мы опоздали. На оправдание, что пробки в центре, нам сказали, что все так отмазываются. И что сейчас к аллергологу толпа детей придёт, а мы должны по очереди всех пропускать. Но никто так и не пришёл за тел полчаса, что Юля провела у доктора. Мы с Мишкой были там всего пару минут и пошли шляться по клинике. Короче, страховая медицина стала теперь напоминать обычную бесплатную. Хотя не везде. Наш доктор, что к Мишке с рождения приписан, вполне нас устраивает...

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

пятница, 29 февраля 2008 г.

Реклама GMail

Лучшие люди

Видимо ФСБ надоело, что кто-то тусуется на одноклассниках, кто-то в контакте, а кто-то вообще непонятно где. Ну и было решено завести надстройку над блогосферами, социальными сетями и т.д.
Встречайте - BestPersons. Продукт пока сырой, но разработчики быстро отвечают на глупые вопросы и, я так думаю, будут активно решать возникающие проблемы. Страничка используется для указания тех мест в сети, где люди тусуются. Вот, например, моя страница.
А еще можно информер использовать. Это такой набор иконок, ведущий сразу на все персональные страницы. Эти иконки можно видеть у меня в правом верхнем углу. Поначалу были проблемы с цветом ника, но мне подсказали авторы, что надо использовать следующий код:
<style>.bp_nick {color:#aa77aa!important;}</style>
<script language="javascript" src="http://www.bestpersons.ru/service/info?u=2125" type="text/javascript"></script>

Java Puzzle 72: Final Jeopardy

Рассмотрим следующую программу. Какое поведение вы ожидаете от неё или от компилятора?
class Jeopardy {
public static final String PRIZE = "$64,000";
}
class DoubleJeopardy extends Jeopardy {
public static final String PRIZE = "2 cents";
}
public class Main extends DoubleJeopardy {
public static void main(String[] args) {
System.out.println(PRIZE);
}
}

Дело в том, что поведение модификатора final для поля и метода отличаются. Модификатор final для метода означает, что его нельзя переопределить или скрыть. А для поля он означает, что значение этого поля нельзя изменить. И всё!
Я рекомендую хранить ваши статические константы в отдельном классе. Ну а нестатические поля класса должны быть private. И не спорьте. ;)

Java Puzzle 71: Import Duty

Проверка знаний о статическом мпорте, появившемся в JDK 5. Что напечатает следующая программа?
import static java.util.Arrays.toString;
class ImportDuty {
public static void main(String[] args) {
printArgs(1, 2, 3, 4, 5);
}
static void printArgs(Object... args) {
System.out.println(toString(args));
}
}

Программа не скомпилируется, так как члены класса в области видимости имеют преимущество перед статическим импортом. Поэтому не рекомендуется их использовать, так как появление в классе-родителе метода с таким же именем приведёт к порой незаметному изменению работы программы.

Авангард DSL

Мне тут прислали ссылку, что интернет дома станет быстрее. Надо будет проверить...

Проверь антивирус

Хотите проверить, насколько хорошо ваш антивирус справляется со своими обязанностями? Это очень просто. Для этого откройте любой текстовый файл и вставьте туда эту строчку:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Как только вы попытаетесь сохранить его, то антивирус должен его переварить и предупредить. У меня корпоративный Symantec тут же спрятал этот файл в карантин.

Школьный портал

Говорят, что у нас открыли Школьный портал. Потратили на это дело 15 миллионов рублей, а результат пока слабенький. Если бы не группа энтузиастов, то может его и не стали дорабатывать, а так - приходится...
(смотреть по порядку: один, два, три и четыре)