Смешной код
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)
Пропали ярлычки на рабочем столе!!!
Однако, в папке Desktop все осталось как прежде. Permissions также не изменились.
Погуглив немного, нашел решение:
1. Запустить gconf-editor
2. Выбрать apps - nautilus - preferences
3. Найти чекбокс show_desktop. Он будет отмечен, что странно.
4. Нажать по нему два раза мышкой, в возникшем окне нажать ОК.
5. Ура, ярлычки снова на месте!
Мне непонятно, почему нужно "подтверждать" отмеченность и так отмеченного чекбокса, но факты - штука неумолимая...
JTabbedPane и фокус в ней
Сегодня нашел новый (для меня, разумеется) баг в Swing. Проблема заключается в том, что если на панели есть JTabbedPane, а в ней лежит компонент, который должен получить фокус после того, как происходит переключение на соответствующий таб, то фокус этот он не получит.
Вот неработающий код:
tabPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
txtName.requestFocusInWindow();
}
});
Баг #5089436 (а ему уже около 5 лет) предлагает воркэраунд, связанный с обрамлением вызова requestFocusInWindow()
в invokeLater()
:
tabPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
EventQueue.invokeLater(new Runnable() {
public void run() {
txtName.requestFocusInWindow();
});
}
});
А в остальном Свинг по-прежнему хорош.
На пути к оптимизации
// This method produces a HUGE overhead
//TreeNodesUpdater.updateComponentTreeUI(this);
// This works, but cuts end part of lines in bold (produces "...")
/*this.invalidate();
this.validate();
this.repaint();*/
// So, we just switch the renderer to null and back to the original one,
// which revalidates the sizes
setCellRenderer(null);
TreeCellRenderer renderer = createCellRenderer();
setCellRenderer(renderer);
А за каждой из этих строчек - целая история...
Какой вы ученый?
О, да вы - математик. |
Вы из тех, кто проверяет алгеброй гармонию и при проверке находит в гармонии ошибки. Ваша логика настолько безупречна, что порой смахивает на безумие. К людям вы относитесь осторожно, зато с компьютером вы даже не на "ты", а на "ты, сволочь". Вас порой упрекают в отрыве от реальности и в витании в облаках. Но, может быть, весь этот мир - всего лишь игра вашего блестящего ума. |
Пройти тест |
Пропустили дату: отмена общей поддержки Windows XP
Выпущенные продукты | Дата начала реализации | Отмена общей поддержки | Отмена расширенной поддержки | Истечение срока действия пакета обновления | Примечания |
Windows XP Professional | 31.12.2001 | 14.04.2009 | 08.04.2014 | 30.08.2005 |
Источник: microsoft.com
А мы тут все вместе дату пропустили: 14 апреля 2009 г., когда прекратилась общая поддержка Windows XP Pro!
Что это значит: для поддержки исправлений, не связанных с безопасностью, теперь требуется дополнительное соглашение на поддержку, заключенное в течение 90 дней после окончания основной фазы поддержки.
Вот :)
The Domain Chronicles
Проходит год, и на выставке HiTech 2003, проходящей в Одессе, я показываю Украинский Феномен. Программа эта настолько нравится некоему Константину, компания которого в то время предоставляла услуги веб-хостинга и регистрации доменов, что он берется сделать мне домен, причем бесплатно. Таким образом мой сайт получает имя lonewolf.od.ua. Однако, прав для управления им у меня нет, а Константин теряется спустя полгода бесследно. Домен с того времени живет и работает сам по себе.
История продолжается в январе 2009, когда домен работать перестает. На сайте http://ns.od.ua я узнаю о том, что, в соответствии с правилами доменной зоны OD.UA, все желающие регистраторы должны перезаключить с ними договор до января 2009 г. Домены, зарегистрированные до января 2009 г. прочими регистраторами, в феврале переводятся в состояние ON HOLD и удаляются спустя месяц.
Не желая терять привычное имя сайта, я жду месяц, потом туплю еще один, и в апреле 2009 г., наконец, убедившись, что домен lonewolf.od.ua снова свободен, покупаю его через TeNeT, но уже самостоятельно.
Ура, домен снова мой! Осталось связать его с моим хостингом на Brinkster. Для начала - сменить нейм-серверы от ТеНеТ на нейм-серверы от Brinkster. В ТеНеТовской админке эту операцию выполнить нельзя, поэтому пишу админам напрямую. Делают. После этого зайти в админку, чтобы прописать IP сайта, я уже не могу. Пишу письмо - отвечают, что после внесения новых нейм-серверов они запретили мне доступ в админку, поскольку новые серверы - не их. Ок, теперь я имею нерабочий домен, который нельзя поправить.
Обращаюсь в Brinkster. После недолгих раздумий, раз пошел такой праздник, покупаю себе хостинг-план "Rookie" за $4/месяц. Спустя полчаса, индус на другом конце Live Help добавляет домен lonewolf.od.ua к моему аккаунту, а еще спустя четыре часа мой сайт становится доступен по адресу lonewolf.od.ua.
А вот теперь вопрос - нужен ли мне сайт, если есть блог, твиттер, линкедин, пикаса, вконтакте, армия воинов на mybrute.com?..
А пусть будет. На сайте можно Матричный Вычислитель зарегистрировать, если кто захочет. Или резюме посмотреть. Или еще что ого-го какое мощное забабахать!
Мой домен опять со мной,
Мой домен стал снова мой!
Ля-ля-ля, ля-ля-ля,
Мой домен опять живой!
MyBrute.com
Я, например, создал персонажа ZhivtoneChoCho. По адресу http://zhivtonechocho.mybrute.com с ним можно подраться.
Также можно зарегистрироваться и самому драться с другими персонажами.
А, что самое приятное: бои происходят автоматически - на них нужно просто смотреть :)
Австралия
Михаил Щербаков
АВСТРАЛИЯ
Мотор подъехал - чужеземный, фиолетовый - я марку бы назвал,
да забываю постоянно.
В него шатенка голенастая уселась, дверью хлопнула - и всё, и всё,
и только брызги из-под колеса...
Странно! Вы как хотите, мне странно!
Ведь я почти уже любил её за некоторый пафос очертаний, так сказать,
и вообще за выражение лица.
(Когда знакомишься на улице, тирады о погоде не проходят,
устарели как идея.
Предпочитаю для начала выразительный какой-нибудь вопрос
философического свойства, например:
"Где я? Скажите, девушка, где я?"
На многих действует. А этой хоть бы что. Не удивилась, как не удивился бы
реаниматор или милиционер.)
Нет, я не жалуюсь, я в принципе привык бы и к тому, что мир бывает
невнимательным и чёрствым,
что благородным образцам он соответствует не шибко или требованьям высшим
отвечает не вполне.
Чёрт с ним! Не отвечает, и чёрт с ним!
Но почему в таком количестве, во всяком переулке, изначально,
бесконечно - и как раз по отношению ко мне?
Ещё я мальчиком всё думал: заведу себе зверька, а то их вона
сколько скачет по полям-то!
Возьму в товарищи разумного жирафа, муравьеда или просто кенгуру,
я даже имя подыскал:
Лямбда! Я назову его Лямбда!
...Так думал я, но детство кончилось, а бедный муравьед и по сегодня
остаётся не востребован и скачет, где скакал...
А незнакомка номер два уже тем временем взошла на тротуар,
фосфоресцируя и рдея.
Весьма мила, не хуже первой, даже лучше, то есть даже лучше всех -
и очень кстати: я ведь тоже не любой.
Где я? Девушка, девушка! Где я?
Не к вам, не к вам ли я теперь уже совсем почти испытываю что-то,
что по некоторым признакам похоже на любовь?..
1994
Лекции по этнографии - для меня счастье, меня зовут Сева, bonsoir, здрасте!
"Не читал Бальзака - по е..лу на-ка!"
Коты-коты-коты
КОТЫ.
вот ходят коты
поджав все хвосты
из-за кошек они дерутся
их когти от боли не гнутся
один удар лапой
разбить может лампу
собак лишь боятся
не лезут к ним драться
коты-коты-коты
затекаете вы в крови
коты-коты-коты
вы антонимы доброты
коты-коты-коты
лишь кошки вам нужны! (2 раза)
и чтоб не мочились
на вас и не злились
его оперируй
на всю жизнь кастрируй
тогда будет смирненький
котенька миленький
не будет рвать уши
(далее неразборчиво)
коты-коты-коты
затекаете вы в крови
коты-коты-коты
вы антонимы доброты
коты-коты-коты
лишь кошки вам нужны! (3 раза)
Приват-Надра: А всё...
Какого хера, или что такое crazy admin ru?!
Что это за сайт такой, вообще? Кто знает? Дерут посты через RSS? Я вот смотрю - ни рекламы там особой нет, ничего такого... Какой им смысл?
UPD 17.02.09: дальнейшие исследования вывели на определение термина Сплог в русской википедии:
Сплог по своему виду похож на блог, основное отличие — в контенте. Контент сплогов не является качественным или уникальным, часто он генерируется автоматически с использованием других ресурсов — популярных rss-лент и блогов.Короче, таки в рекламе дело. Ну ладно, заодно и я попиарюсь))
Часто сплоги создаются в большом количестве — они не ориентированы на постоянную аудиторию пользователей, но за счёт большого количества сплогов и получения небольшого объёма трафика с поисковиков, достигается необходимый эффект привлечения определённого количества читателей. По сути пользователи ищут нужную им информацию, а поисковые машины частично выводят их на сплоги, в результате же пользователи не находят нужную им информацию, но видят определённую рекламу и ссылки на другие ресурсы.
Война подчеркивания и дефиса: разные стандарты именования в Maven и Eclipse PDE
1. Сначала мы собираем target-платформу для системы uDig (user-friendly Internet GIS) - набор OSGi-bundles. Состоит она из:Сборка GeoAPI и GeoTools выпоняется с помощью Apache Maven, который автоматически скачивает нужные зависимости с прописанных репозиториев, запускает компилятор, генерирует MANIFEST.MF для OSGi-бандлов - короче, делает все. В результате мы имеем папку с набором JAR-файлов примерно следующего содержания:
...
java3d.osgi.vecmath-1.3.1.jar
javax.media.jai.osgi.jai_imageio-1.1.0.jar
net.opengis.ows-2.6.0-SNAPSHOT.jar
...
Эта папка - не что иное, как target platform для компиляции uDig, которая делается через PDE.
2. Мы запускаем Eclispe PDE batch build и компилируем uDig. В результате мы получаем продукт uDig, в папке plugins которого, среди прочих, оказываются уже такие файлы:
...
java3d.osgi.vecmath_1.3.1.jar
javax.media.jai.osgi.jai_imageio_1.1.0.jar
net.opengis.ows_2.6.0_SNAPSHOT.jar
...
Первый вывод уже очевиден:
Maven использует "-" (дефис) для отделения номера версии от имени бандла, в то время как PDE использует для этого "_" (подчеркивание)3. Для того, чтобы собрать наш проект, нам нужна платформа в составе:
- OSGi-бандлы из папки plugins системы uDig
- наши проприетарные модули и их зависимости
...
java3d.osgi.vecmath_1.3.1.jar
java3d.osgi.vecmath-1.3.1.jar
javax.media.jai.osgi.jai_imageio_1.1.0.jar
javax.media.jai.osgi.jai_imageio-1.1.0.jar
net.opengis.ows_2.6.0_SNAPSHOT.jar
net.opengis.ows_2.6.0-SNAPSHOT.jar
...
Т.е. набор идентичных по смылу OSGi-бандлов, но продублированных в файлах с разными именами.
Пока что, чтобы решить эту проблему, я стал используюVBS-скрипт, который переименовывает файлы по заданному регулярному выражению с тем, чтобы заменить подчеркивание на дефис. Хотя, наверное, нужно делать это прямо в PDE-сборке и заменять наоборот - дефис на подчеркивание...
А война дефиса и подчеркивания, между прочим, разгорелась нешуточная. В мейл-листах Maven утверждают, что единственно верный разделитель - это дефис. Эклипс пока что понимает только подчеркивание, хотя в 3.5 обещают это исправить (в 3.5 М4, вроде, уже вставили соответствующий патч).
Системы управления требованиями: ReqHeap и OSRMT
ReqHeap сделан на связке PHP+MySQL, поднимается легко, мыслит в терминах проектов, подпроектов, требований и тест-кейсов. Поддерживает много пользователей и разграничение прав. Однако, проследить traceability, скажем, от требований к тестам, построить матрицу и пр. не представляется возможным - нет средств. Короче, просто удобная хранилка всего вышеперечисленного.
OSRMT - могучая вещь, имеющая как Swing-интерфейс, так и веб-клиента. Сделана на Java. Ее словарь, вкратце, таков:
- Requirement
- Feature
- Design
- Implementation
- Test
И зачем было так делать?
Короче, вопрос поиска (бесплатной) подходящей системы управления требованиями, позволяющей отслеживать их до дизайна, имплементации, тестов и обратно, пока остается открытым.
Ubuntu 8.10 + WiFi + WPA security
Итак, задача. Дано: в квартиру заведён Интернет по сетевому кабелю и воткнут в точку доступа. Она раздает его, зашифрованного посредством WPA-PSK. Требуется: настроить Ubuntu 8.10 таким образом, чтобы он этот самый беспроводной Интернет ловил посредством встроенной сетевой карты BroadCom BCM4318.
Решение:
Смотреть здесь: http://www.sampbar.com/2008/11/broadcom-bcm4318-ubuntu-intrepid.html.