вторник, 30 октября 2007 г.
пятница, 26 октября 2007 г.
Lord of the pings
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
English
A panda eats shoots and leaves
Панда ест побеги и листья
A panda eats, shoots and leaves
Панда ест, стреляет и уходит
А всего одна запятая...
Панда ест побеги и листья
A panda eats, shoots and leaves
Панда ест, стреляет и уходит
А всего одна запятая...
Bier König
Вчера сидели в хорошем пивном ресторане "Bier König" (Пивной король) на Гороховой, 40. Все было просто замечательно: и пиво, и еда. Пива огромный выбор. Не только немецкое, но и чешское есть, и ирландское. Одно не понравилось: пока я отлучился в туалет шустрый официант унес недоеденный стейк. Предлагал возместить оплошность пивом, но свою норму я уже выпил.
В ресторане есть телевизоры и народ приходит туда смотреть игры. Вчера, например, был футбол: Зенит играл с Нидерландами. Было шумно, но был и бонус. За забитый гол Зенитом нам принесли по стопке водки. Васисуалий приносил фотоаппарат.
Очень рекомендую посетить!
пт, сб: 11:00-05:00; остальные дни: 11:00-01:00
тел.: 310-95-85
В ресторане есть телевизоры и народ приходит туда смотреть игры. Вчера, например, был футбол: Зенит играл с Нидерландами. Было шумно, но был и бонус. За забитый гол Зенитом нам принесли по стопке водки. Васисуалий приносил фотоаппарат.
Очень рекомендую посетить!
пт, сб: 11:00-05:00; остальные дни: 11:00-01:00
тел.: 310-95-85
среда, 24 октября 2007 г.
Sonata Arctica
Купил новый альбом Unia (2007). Sonata Arctica в свое время была для меня большим открытием в power metal. Но в последнем альбоме весь их power куда-то делся. Вроде и играют неплохо, но как-то скучно и однообразно. Говорят, что его нужно прослушать еще несколько раз, чтобы зацепило. Попробовать, конечно, можно. Вот, боюсь, толку от этого будет ноль.
Запрещено гадить
17 мгновений весны
Тут какой-то чудик пытается проанализировать Штирлица на примере нелепостей в фильме "17 мгновений весны".
А мы все равно любим нашего штандартенфюрера ;)
А мы все равно любим нашего штандартенфюрера ;)
суббота, 20 октября 2007 г.
Таллинн: халява
Весь город покрыт WiFi сетями. Почти в каждой кафешке есть открытый доступ. вот и сейчас мы зашли в Stockmann, отправили Мишку на детскую площадку и вышли в сеть. в основном, Юля в сети, но вот и я высунул свой нос. и первым делом - сюда, а после пойду почту читать. В понедельник уже буду на работе. Всем привет!
воскресенье, 7 октября 2007 г.
суббота, 6 октября 2007 г.
Отпуск
Сегодня первый день отпуска. Сначала по Питеру погуляем, потом в Таллинн на недельку смотаемся. Доступ к компу будет очень ограниченный...
четверг, 4 октября 2007 г.
id Software
Небезызвестная id Software недавно выпустила многопользовательский шутер Enemy Territory Quake Wars. И просочилась информация о следующем проекте - Rage.
Rage поведает о нелегкой борьбе главного героя с тоталитарным правительством в постапокалиптическом мире (привет Fallout). В отличие от предыдущих проектов id Software, это первая игра, которая отойдет от привычного "коридорного" стиля, позволив игроку свободно гулять пешком и кататься на машинах по открытым пространствам. Иллюзия свободы станет возможной благодаря новому движку id Tech 5, главная способность которого - отрисовка больших площадей с большим количеством деталей, видимостью до горизонта и безо всяких "тормозов".
id Software не огласила ни дату выхода Rage, ни имя ее издателя. Последнее стало сюрпризом, ведь студия уже много лет сотрудничает с компанией Activision. Судя по тому, что недавно они запустили в Steam почти все свои проекты, начиная с Commander Keen и заканчивая Doom 3: Resurrection of Evil, возможно, что Кармак решил заняться цифровым самиздатом.
Rage поведает о нелегкой борьбе главного героя с тоталитарным правительством в постапокалиптическом мире (привет Fallout). В отличие от предыдущих проектов id Software, это первая игра, которая отойдет от привычного "коридорного" стиля, позволив игроку свободно гулять пешком и кататься на машинах по открытым пространствам. Иллюзия свободы станет возможной благодаря новому движку id Tech 5, главная способность которого - отрисовка больших площадей с большим количеством деталей, видимостью до горизонта и безо всяких "тормозов".
id Software не огласила ни дату выхода Rage, ни имя ее издателя. Последнее стало сюрпризом, ведь студия уже много лет сотрудничает с компанией Activision. Судя по тому, что недавно они запустили в Steam почти все свои проекты, начиная с Commander Keen и заканчивая Doom 3: Resurrection of Evil, возможно, что Кармак решил заняться цифровым самиздатом.
Октябрятам - привет!
Так сложилось, что у многих моих знакомых дни рождения в октябре. У Саши Поточкина и Сереги Александрова вчера случился, у Стаса Торгашова - сегодня. 7-го будет 56 лет моему отцу. Всем мои поздравления!
Java Puzzle 52: Sum Fun
class Cache {
static {
initIfNeeded();
}
private static int sum;
public static int getSum() {
initIfNeeded();
return sum;
}
private static boolean inited = false;
private static void initIfNeeded() {
if (!inited) {
for (int i = 0; i <100; i++) {
sum += i;
}
inited = true;
}
}
}
class Main {
public static void main(String[] args) {
System.out.println(Cache.getSum());
}
}
Программа напечатает не 4950, а 9900. Это не то, что автор такого класса хотел. Весь прикол в том, что JVM инициализирует статические переменные в классе последовательно. Сначала вызывается статический блок, в котором устанавливается значение sum и inited. Затем пропускается инициализация sum. После чего inited принудительно инициализируется в false. Таким образом, при вызове getSum будет повторно увеличено значение sum. Для того, чтобы этого не произошло, надо объявить sum так:
private static int sum = 0;
или же объявить inited так:
private static boolean inited;
А вообще так делать не рекомендуется. Лучше сделать так:
class Cache {
private static final int SUM = calculate();
public static int getSum() {
return SUM;
}
private static int calculate() {
int sum = 0;
for (int i = 0; i <100; i++) {
sum += i;
}
return sum;
}
}
static {
initIfNeeded();
}
private static int sum;
public static int getSum() {
initIfNeeded();
return sum;
}
private static boolean inited = false;
private static void initIfNeeded() {
if (!inited) {
for (int i = 0; i <100; i++) {
sum += i;
}
inited = true;
}
}
}
class Main {
public static void main(String[] args) {
System.out.println(Cache.getSum());
}
}
Программа напечатает не 4950, а 9900. Это не то, что автор такого класса хотел. Весь прикол в том, что JVM инициализирует статические переменные в классе последовательно. Сначала вызывается статический блок, в котором устанавливается значение sum и inited. Затем пропускается инициализация sum. После чего inited принудительно инициализируется в false. Таким образом, при вызове getSum будет повторно увеличено значение sum. Для того, чтобы этого не произошло, надо объявить sum так:
private static int sum = 0;
или же объявить inited так:
private static boolean inited;
А вообще так делать не рекомендуется. Лучше сделать так:
class Cache {
private static final int SUM = calculate();
public static int getSum() {
return SUM;
}
private static int calculate() {
int sum = 0;
for (int i = 0; i <100; i++) {
sum += i;
}
return sum;
}
}
Java Puzzle 51: What's the Point
class Point {
private final int x, y;
private final String name; // cached at construction time
Point(int x, int y) {
this.x = x;
this.y = y;
this.name = makeName();
}
protected String makeName() {
return "[" + this.x + "," + this.y + "]";
}
public final String toString() {
return this.name;
}
}
class ColorPoint extends Point {
private final String color;
ColorPoint(int x, int y, String color) {
super(x, y);
this.color = color;
}
protected String makeName() {
return super.makeName() + ":" + this.color;
}
public static void main(String[] args) {
System.out.println(new ColorPoint(4, 2, "purple"));
}
}
Программа напечатает:
Этот паззл показывает, что возможно получить значение final переменной до того, как она буде проинициализирована. Для того, чтобы избежать этой проблемы, никогда не вызывайте из конструктора те методы, которые можно перекрыть (напрямую или косвенно). Автор ссылается на свою предыдущую книгу Effective Java.
Для решения проблемы с производительностью в данном случае лучше всего использовать lazy initialization:
public final synchronized String toString() {
if (this.name == null) {
this.name = makeName();
}
return this.name;
}
(еще надо убрать final перед декларацией поля name и инициализацию этого поля из конструктора)
private final int x, y;
private final String name; // cached at construction time
Point(int x, int y) {
this.x = x;
this.y = y;
this.name = makeName();
}
protected String makeName() {
return "[" + this.x + "," + this.y + "]";
}
public final String toString() {
return this.name;
}
}
class ColorPoint extends Point {
private final String color;
ColorPoint(int x, int y, String color) {
super(x, y);
this.color = color;
}
protected String makeName() {
return super.makeName() + ":" + this.color;
}
public static void main(String[] args) {
System.out.println(new ColorPoint(4, 2, "purple"));
}
}
Программа напечатает:
[4,2]:null
Этот паззл показывает, что возможно получить значение final переменной до того, как она буде проинициализирована. Для того, чтобы избежать этой проблемы, никогда не вызывайте из конструктора те методы, которые можно перекрыть (напрямую или косвенно). Автор ссылается на свою предыдущую книгу Effective Java.
Для решения проблемы с производительностью в данном случае лучше всего использовать lazy initialization:
public final synchronized String toString() {
if (this.name == null) {
this.name = makeName();
}
return this.name;
}
(еще надо убрать final перед декларацией поля name и инициализацию этого поля из конструктора)
Подписаться на:
Сообщения (Atom)