
Японские мультяшки про русских зайцев: здесь.
В ролях:
- заяц в красном
- заяц в зеленом
- зайцы за дверью
- странный цыпленок
- жабко
- и т.д.
Ржал долго. Пыхово у авторов реально тяжелое.

localhost:c:/db/mydb.gdbc:\db\mydb.gdbunavailable database. В связи с этим излагаю выработанную последовательность шагов, которая позволяет запустить сервер Firebird под Windows Vista с работающим локальным протоколом:IpcName, заменяем ее на:IpcName = Global\FIREBIRD
Только что два часа рубился в мега-игрушку (название в теме). Скачать ее можно отсюда.
Вы находитесь в роли продюсера новой компьютерной игры. Программисты (или рабы, как они называются там), бегают по лесенкам вверх-вниз и якобы вносят свой вклад в разработку. По мере продвижения, картинка на заднем фоне растет вверх.
У каждого раба есть почасовая зарплата. Кроме того, имеются бюджет и баланс между графикой, геймплеем и затратами на маркетинг:
По мере продвижения работ мотивация рабов снижается. Увеличить ее можно либо повышая зарплату и соглашаясь на инициативы вроде «поставить кулеры с водой» или «внедрить супер-клевую фичу», либо… убивая этих ленивых козлов-программистов! Страх – лучшая мотивация!
Если убивать их слишком часто, может начаться забастовка, в которой могут принять участие несколько рабов (тогда парочку из них можно убить), либо всеобщая – с которой уже хрен чего сделаешь. По завершении работ нам показывают отзывы геймерских журналов, доход и ROI. Мой рекорд – 1795692%:
Убийственно классная штука!
У этого же автора в блоге есть много других отличных игр (рекомендую Humpster, Bloody, Crayon). Он их пишет по одной в неделю.
Ярчайшим событием уходящего года стал уход из Ля-ля одесского сайт-менеджера и директоров ИСГ и основание ими собственной компании Бэ-мэ. Было все:
И много еще чего было. Я (да наверняка и все остальные) чувствуем себя пережившими ядерную войну: мы выжили, но вспоминать обо всем этом не хочется, а мыслей столько, что лучше и не начинать.
Сначала я очень хотел перейти в Бэ-мэ. Сейчас мне все равно. Я устал. Устал от непрекращающейся агитации и постоянных выпадов с обеих сторон. Устал от организационных проблем, создающих ощутимые неудобства в работе, от самоустраняющихся немцев, от полных надежды лиц новых сотрудников, от звонящих HR-ов других компаний, пронюхавших, что не все ладно в Датском королевстве... Мне неудобно ходить в Ля-ля: я чувствую, что знаю больше остальных. Мне неудобно ходить в Бэ-мэ по той же причине. Я не знаю точно, где правда, но знаю, что период полураспада продолжается и многое еще впереди.
При всем этом я люблю свой проект и дорожу своей работой. Многое удалось сделать, и я надеюсь, что Крысячий год даст сделать еще больше. Искренне уважаю и горжусь всеми, прошедшими через эти события.
Мы все молодцы.
Вот он, конец 2007-го! Еще немножко – и начнется новый, 2008-й. В связи с этим, а также с тем, что мне до одури надоела эта мышиная возня с моим Web Wiz Journal, мой блог переходит на Blogger.com.
Причины:
Старый блог будет грохнут. Я уже перенес в новый все записи (только комменты пропали, но я рассчитываю на новые J)
Новый блог будет открываться по ссылке с сайта, при этом в нем есть также ссылки на все основные разделы сайта. Таким образом, получится какая-никакая, а все-таки интеграция.
Придется, правда, обновить фиды:
Форца Гугл J
public class Pair {
public Object first;
public Object second;
public Pair(Object f, Object s) {
first = f;
second = s;
}
}
public class UndoManager {
private Stack undoStack = null;
private Object target = null;
public UndoManager(Object forWhom) {
undoStack = new Stack();
target = forWhom;
}
public void addInvocation(Method method, Object[] args) {
Pair p = new Pair(method, args);
undoStack.push(p);
}
public boolean canUndo() {
return (undoStack.size() > 0);
}
public void undo() {
if (!canUndo()) {
return;
}
Object obj = undoStack.pop();
if (obj instanceof Pair) {
Pair p = (Pair)obj;
invokeCommand(p);
}
}
protected void invokeCommand(Pair p) {
Method method = (Method)p.first;
Object[] args = (Object[])p.second;
try {
method.invoke(target, args);
return;
} catch (Exception ex) {
System.err.println("Cannot undo " + method.getName());
ex.printStackTrace();
return;
}
}
}
public void undo() {
. . .
Object obj = undoStack.pop();
. . .
}
. . .
private Stack redoStack = null;
. . .
public UndoManager(Object forWhom) {
. . .
redoStack = new Stack();
. . .
}
. . .
public boolean canRedo() {
return (redoStack.size() > 0);
}
. . .
public void redo() {
if (!canRedo()) {
return;
}
Object obj = redoStack.pop();
if (obj instanceof Pair) {
Pair p = (Pair)obj;
invokeCommand(p);
}
}
public class MyClass {
private String value;
public MyClass() {
value = "";
}
public String getValue() {
return value;
}
public void setValue(String s) {
value = s;
}
}
public void setValue(String s) {
try {
// Get the method as an instance
Method m = this.getClass().getDeclaredMethod(
"setValue",
new Class[]{String.class}
);
// Get the current value
Object[] args = new Object[]{getValue()};
// Add it to the undo manager
undoManager.addInvocation(m, args);
} catch (Exception e) {
// . . .
}
// Modify value
value = s;
}
public void undo() {
isUndoing = true;
. . .
isUndoing = false;
}
public void addInvocation(Method method, Object[] args) {
Pair p = new Pair(method, args);
if (isUndoing) {
redoStack.push(p);
} else {
undoStack.push(p);
}
}
public void beginUndoGroup() {
if (isUndoGroupOpened == true) {
throw new IllegalStateException("beginUndoGroup() call while undo group is already opened");
}
isUndoGroupOpened = true;
}
public void endUndoGroup() {
if (isUndoGroupOpened == false) {
throw new IllegalStateException("endUndoGroup() call without matching beginUndoGroup()");
}
ArrayList actions = new ArrayList(groupStack);
if (isUndoing) {
redoStack.push(actions);
} else {
undoStack.push(actions);
}
isUndoGroupOpened = false;
groupStack.clear();
}
import java.lang.reflect.Method;
import java.util.*;
public class UndoManager {
private Stack undoStack = null;
private Stack redoStack = null;
private Object target = null;
private boolean isUndoGroupOpened;
private Stack groupStack = null;
private boolean isUndoing;
private boolean isRedoing;
public UndoManager(Object forWhom) {
undoStack = new Stack();
redoStack = new Stack();
groupStack = new Stack();
target = forWhom;
isUndoGroupOpened = false;
isUndoing = false;
isRedoing = false;
}
public void addInvocation(Method method, Object[] args) {
if (!isUndoing && !isRedoing) {
redoStack.clear();
}
Pair p = new Pair(method, args);
if (isUndoGroupOpened) {
groupStack.push(p);
} else {
if (isUndoing) {
redoStack.push(p);
} else {
undoStack.push(p);
}
}
}
public void beginUndoGroup() {
if (isUndoGroupOpened == true) {
throw new IllegalStateException("beginUndoGroup() while " +
"undo group is already opened");
}
isUndoGroupOpened = true;
}
public void endUndoGroup() {
if (isUndoGroupOpened == false) {
throw new IllegalStateException("endUndoGroup() without " +
"matching beginUndoGroup()");
}
ArrayList actions = new ArrayList(groupStack);
if (isUndoing) {
redoStack.push(actions);
} else {
undoStack.push(actions);
}
isUndoGroupOpened = false;
groupStack.clear();
}
public boolean canUndo() {
return (undoStack.size() > 0);
}
public boolean canRedo() {
return (redoStack.size() > 0);
}
public void undo() {
if (!canUndo()) {
return;
}
if (isUndoing || isRedoing) {
throw new IllegalStateException();
}
isUndoing = true;
Object obj = undoStack.pop();
if (obj instanceof Pair) {
// Plain undo
Pair p = (Pair)obj;
invokeCommand(p);
} else if (obj instanceof ArrayList) {
// Undo group
beginUndoGroup();
ArrayList actions = (ArrayList)obj;
for (int i = actions.size() - 1; i >= 0; i--) {
Pair p = (Pair)actions.get(i);
invokeCommand(p);
}
endUndoGroup();
}
isUndoing = false;
}
protected void invokeCommand(Pair p) {
Method method = (Method)p.first;
Object[] args = (Object[])p.second;
try {
method.invoke(target, args);
return;
} catch (Exception ex) {
System.err.println("Cannot undo method " + method.getName());
ex.printStackTrace();
return;
}
}
public void redo() {
if (!canRedo()) {
return;
}
if (isUndoing || isRedoing) {
throw new IllegalStateException();
}
isRedoing = true;
Object obj = redoStack.pop();
if (obj instanceof Pair) {
// Plain redo
Pair p = (Pair)obj;
invokeCommand(p);
} else if (obj instanceof ArrayList) {
// Redo group
beginUndoGroup();
ArrayList actions = (ArrayList)obj;
for (int i = actions.size() - 1; i >= 0; i--) {
Pair p = (Pair)actions.get(i);
invokeCommand(p);
}
endUndoGroup();
}
isRedoing = false;
}
}
Sergey Borodavkin, 2006-2011. Blog design by Lucian E. Marin