Смешной код
1. Магический скрипт
private final String magicScript = "\nif(8==8)return;";
2. Глубокая иерархия
public void dragEnter(DropTargetDragEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dragEnter(arg0);
}
public void dragExit(DropTargetEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dragExit(arg0);
}
public void dragOver(DropTargetDragEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dragOver(arg0);
}
public void drop(DropTargetDropEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).drop(arg0);
}
public void dropActionChanged(DropTargetDragEvent arg0) {
((DropTargetListener)getParent().getParent().getParent()
.getParent().getParent()).dropActionChanged(arg0);
}
3. Магические вычисления
int ww0 = getWidth() ;//- 40;
int hh0 = getHeight();// - 40;
int sz = Math.min(ww0, hh0);
sz = sz/4*3;
int y0 = (hh0 - sz) / 2;
int x0 = 0;
int h = sz / 2;
int dh = sz / 4;
int y = y0 + h;
int hh = (int)Math.sqrt(h*h - h*h/4);
y0 = y - hh;
Rectangle rect = new Rectangle(x0, y0 , sz, hh + hh );
int arrX[] = {x0 + dh, x0 + 3*dh, x0 + sz,
x0 + 3*dh , x0 + dh, x0};
int arrY[] = {y0 , y0 , y ,
y0 + hh + hh, y0 + hh + hh, y};
Polygon poly = new Polygon(arrX, arrY, 6);
return poly;
CROW: Control the Development Workflow
Начало истории - см. здесь.
Сегодня выложил на SourceForge.net исходники и snapshot-релиз своего нового Java-проекта CROW (Control the development workflow).
CROW - это ASPICE-совместимая система, предназначенная для управления и мониторинга:- требований заказчика
- технических требований
- описания архитектуры
- детального дизайна
- ревизий кода в системе версионного контроля
- тестов
- добавлять/удалять/редактировать все артефакты, перечисленные выше
- устанавливать зависимости между ними (например, "changelist #800 реализует техническое требование REQ-007-DAT-DragAndDrop, которое описывает требование заказчика Support drag&drop of DAT-files")
- строить матрицу трассировки (RTM, Requirements Traceability Matrix), показывающую описанные выше отношения, в т.ч. транзитивные, т.е. связь между CRS и тестом через код, детальный дизайн, архитектуру и TRS программа вам покажет)
- создавать метки и присваивать их различным артефактам, что позволяет определять и фиксировать т.н. baseline для требований, ревизий, тестов и пр.
- JRE 1.6, в более старых не тестировал и не хочу.
- GUI в виде Swing-клиента. Пишу для Windows, но в Linux тоже проверял - явных косяков нет.
- База - через Hibernate. В текущей реализации используется PostgreSQL.
- Использую docking framework VLDocking, чтобы все окошки можно было перетаскивать как нравится.
- Пишу все сам, тестировщиков также нет. Добровольцы призываются!
Баг в JTable: теряется множественный selection при начале DnD
Ссылка на баг: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6195469.
Ошибка заключается в том, что, если в JTable выделить несколько ячеек и попытаться их перетащить (drag & drop), то, сразу же после нажатия кнопки мыши, selection сбрасывается со всех ячеек, кроме той, на которую непосредстенно нажали.
Воркараунд, приведенный по ссылке выше, по крайней мере в 1.6 не работает. Поэтому выкладываю свой класс FixedTableUI, которым можно подменить тот класс, который предлагается в воркараунде. Работает с 1.4 по 1.6 включительно:
/**
* This internal helper class helps to solve two bugs:
* The first is disable row selection with mouse drag
* The second is allow handling of multiple selected rows without need to
* hold a Shift key.
*/
private class FixedTableUI extends BasicTableUI {
private MouseInputHandler handler = new MouseInputHandler() {
private boolean isShiftDownInMousePressed = false;
public void mouseDragged(MouseEvent e) {
// Do nothing here!
}
public void mousePressed(MouseEvent e) {
isShiftDownInMousePressed = e.isShiftDown();
int row = rowAtPoint(e.getPoint());
if (!getSelectionModel().isSelectedIndex(row)) {
super.mousePressed(e);
} else {
if (e.isControlDown()) {
if (getSelectionModel().isSelectedIndex(row)) {
getSelectionModel().removeSelectionInterval(row, row);
}
}
}
}
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
int row = rowAtPoint(e.getPoint());
int col = columnAtPoint(e.getPoint());
int[] selRows = getSelectedRows();
if (selRows.length > 0) {
if (!e.isControlDown() && !e.isShiftDown() &&
!isShiftDownInMousePressed) {
getSelectionModel().setSelectionInterval(row, row);
}
}
}
};
protected MouseInputListener createMouseInputListener() {
return handler;
}
}
"Начало крупномасштабной кибервойны", или "Во всем виноват Гурвиц"
Тут вдруг оказалось, что небезызвестный многим http://today.od.ua лёг. Причина этому - взлом английского хостинга, на котором он был расположен. В результате хакерской атаки было положено порядка 100,000 сайтов и подробнее об этом можно почитать здесь.
Еще одна подробность: хозяин компании, разработавшей софт для этого хостинга, повесился. По результатам анализа, софт содержал 24 уязвимости и индусский директор, похоже, этого перенести не смог.
Самое смешное - вот что говорят по этому поводу местные медиа-ресурсы:
Александр Филиппов, и.о. генерального директора ТК «АТВ»: ресурсы, которые были взломаны, они очень неудобны городским властям, они очень неудобны руководству страны. На сегодняшний день нам не хотелось бы говорить о том, что это — просто совпадение. По простой причине: слишком эти совпадения выстраиваются в стройную взаимосвязь. Почему-то сайты, провластные мэрии, ни один не пострадал, не потерпел какого-то ущерба.
Вот так простой хакерский налет превращается в "начало крупномасштабной кибервойны".
java.io.tmpdir в Windows и Linux
System.getProperty("java.io.tmpdir") в Windows возвращает что-то наподобие:C:\Windows\Temp\А в Linux мне приходит вот что:
/tmpОбратите внимание - в первом случае завершающий слеш есть, а во втором - нет, что требует дополнительной проверки в коде.
"Java: написано однажды - тестируем везде" (c)

