"Как будто ветры с гор..."

0 коммент. | добавить комментарий
пройти медкомиссию

Каллиграфии пост

0 коммент. | добавить комментарий



Создать свой рукописный TTF-шрифт можно на http://fontcapture.com

P.S. Релиз 0.6.0, кстати, вышел))

Смешной код

2 коммент. | добавить комментарий
Несколько смешных участков кода из нескольких проектов:

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

7 коммент. | добавить комментарий

Начало истории - см. здесь.

Сегодня выложил на 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, чтобы все окошки можно было перетаскивать как нравится.
  • Пишу все сам, тестировщиков также нет. Добровольцы призываются!
Адрес проекта на SourceForge - http://sourceforge.net/projects/opencrow/.

Баг в JTable: теряется множественный selection при начале DnD

0 коммент. | добавить комментарий
Пишу класс, перегружающий JTable, и снова вижу баг, который видел еще под JRE 1.4.2 году в 2006-м.

Ссылка на баг: 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;
}
}

"Начало крупномасштабной кибервойны", или "Во всем виноват Гурвиц"

0 коммент. | добавить комментарий

Тут вдруг оказалось, что небезызвестный многим http://today.od.ua лёг. Причина этому - взлом английского хостинга, на котором он был расположен. В результате хакерской атаки было положено порядка 100,000 сайтов и подробнее об этом можно почитать здесь.

Еще одна подробность: хозяин компании, разработавшей софт для этого хостинга, повесился. По результатам анализа, софт содержал 24 уязвимости и индусский директор, похоже, этого перенести не смог.

Самое смешное - вот что говорят по этому поводу местные медиа-ресурсы:

Александр Филиппов, и.о. генерального директора ТК «АТВ»: ресурсы, которые были взломаны, они очень неудобны городским властям, они очень неудобны руководству страны. На сегодняшний день нам не хотелось бы говорить о том, что это — просто совпадение. По простой причине: слишком эти совпадения выстраиваются в стройную взаимосвязь. Почему-то сайты, провластные мэрии, ни один не пострадал, не потерпел какого-то ущерба.

Вот так простой хакерский налет превращается в "начало крупномасштабной кибервойны".

java.io.tmpdir в Windows и Linux

4 коммент. | добавить комментарий
Только что попробовал запустить в Убунту программу, разработанную под Windows. Ну что сказать - был удивлен.

System.getProperty("java.io.tmpdir") в Windows возвращает что-то наподобие:

C:\Windows\Temp\

А в Linux мне приходит вот что:

/tmp

Обратите внимание - в первом случае завершающий слеш есть, а во втором - нет, что требует дополнительной проверки в коде.

"Java: написано однажды - тестируем везде" (c)

Пропали ярлычки на рабочем столе!!!

8 коммент. | добавить комментарий
Сегодня вдруг осознал, что уже несколько дней мой рабочий стол в Ubuntu 9.04 девственно чист - т.е. с него исчезли все ярлычки! Кроме того, правый клик тоже не работает и не приводит к появлению контекстного меню. Что самое обидное - я ну ничегошеньки не делал такого, что могло бы к этому привести :(

Однако, в папке Desktop все осталось как прежде. Permissions также не изменились.

Погуглив немного, нашел решение:

1. Запустить gconf-editor
2. Выбрать apps - nautilus - preferences
3. Найти чекбокс show_desktop. Он будет отмечен, что странно.
4. Нажать по нему два раза мышкой, в возникшем окне нажать ОК.
5. Ура, ярлычки снова на месте!

Мне непонятно, почему нужно "подтверждать" отмеченность и так отмеченного чекбокса, но факты - штука неумолимая...

JTabbedPane и фокус в ней

0 коммент. | добавить комментарий

Сегодня нашел новый (для меня, разумеется) баг в 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();
});
}
});

А в остальном Свинг по-прежнему хорош.

На пути к оптимизации

2 коммент. | добавить комментарий
Только что наткнулся на такой вот участок кода в нашем приложении:



// 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);



А за каждой из этих строчек - целая история...

Какой вы ученый?

0 коммент. | добавить комментарий
О, да вы - математик.
image Вы из тех, кто проверяет алгеброй гармонию и при проверке находит в гармонии ошибки. Ваша логика настолько безупречна, что порой смахивает на безумие. К людям вы относитесь осторожно, зато с компьютером вы даже не на "ты", а на "ты, сволочь". Вас порой упрекают в отрыве от реальности и в витании в облаках. Но, может быть, весь этот мир - всего лишь игра вашего блестящего ума.
Пройти тест

Пропустили дату: отмена общей поддержки Windows XP

0 коммент. | добавить комментарий


Выпущенные продуктыДата начала реализацииОтмена общей поддержкиОтмена расширенной поддержкиИстечение срока действия пакета обновленияПримечания
Windows XP Professional31.12.200114.04.200908.04.201430.08.2005

Источник: microsoft.com

А мы тут все вместе дату пропустили: 14 апреля 2009 г., когда прекратилась общая поддержка Windows XP Pro!

Что это значит: для поддержки исправлений, не связанных с безопасностью, теперь требуется дополнительное соглашение на поддержку, заключенное в течение 90 дней после окончания основной фазы поддержки.

Вот :)

The Domain Chronicles

0 коммент. | добавить комментарий
Итак, в 2002 году я создаю веб-сайт на Brinkster.com, чтобы впервые приобщиться к волшебному миру ASP и прочего server-side программирования. Сажусь на бесплатный хостинг.

Проходит год, и на выставке 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

0 коммент. | добавить комментарий
Нашу комнату посетила эпидемия MyBrute.com.

Я, например, создал персонажа ZhivtoneChoCho. По адресу http://zhivtonechocho.mybrute.com с ним можно подраться.

Также можно зарегистрироваться и самому драться с другими персонажами.

А, что самое приятное: бои происходят автоматически - на них нужно просто смотреть :)

Австралия

0 коммент. | добавить комментарий


Михаил Щербаков
АВСТРАЛИЯ

Мотор подъехал - чужеземный, фиолетовый - я марку бы назвал,
да забываю постоянно.
В него шатенка голенастая уселась, дверью хлопнула - и всё, и всё,
и только брызги из-под колеса...
Странно! Вы как хотите, мне странно!
Ведь я почти уже любил её за некоторый пафос очертаний, так сказать,
и вообще за выражение лица.

(Когда знакомишься на улице, тирады о погоде не проходят,
устарели как идея.
Предпочитаю для начала выразительный какой-нибудь вопрос
философического свойства, например:
"Где я? Скажите, девушка, где я?"
На многих действует. А этой хоть бы что. Не удивилась, как не удивился бы
реаниматор или милиционер.)

Нет, я не жалуюсь, я в принципе привык бы и к тому, что мир бывает
невнимательным и чёрствым,
что благородным образцам он соответствует не шибко или требованьям высшим
отвечает не вполне.
Чёрт с ним! Не отвечает, и чёрт с ним!
Но почему в таком количестве, во всяком переулке, изначально,
бесконечно - и как раз по отношению ко мне?

Ещё я мальчиком всё думал: заведу себе зверька, а то их вона
сколько скачет по полям-то!
Возьму в товарищи разумного жирафа, муравьеда или просто кенгуру,
я даже имя подыскал:
Лямбда! Я назову его Лямбда!
...Так думал я, но детство кончилось, а бедный муравьед и по сегодня
остаётся не востребован и скачет, где скакал...

А незнакомка номер два уже тем временем взошла на тротуар,
фосфоресцируя и рдея.
Весьма мила, не хуже первой, даже лучше, то есть даже лучше всех -
и очень кстати: я ведь тоже не любой.
Где я? Девушка, девушка! Где я?
Не к вам, не к вам ли я теперь уже совсем почти испытываю что-то,
что по некоторым признакам похоже на любовь?..

1994

speedtest.net

0 коммент. | добавить комментарий

Вот такой вот дома интернет.

Я - хороший PHP-программист!

0 коммент. | добавить комментарий

Эх, помнят руки-то))

Лекции по этнографии - для меня счастье, меня зовут Сева, bonsoir, здрасте!

0 коммент. | добавить комментарий
Что-то за-лытдыбрился я в последнее время... Встречайте - рэпер Сева!

"Не читал Бальзака - по е..лу на-ка!"

Коты-коты-коты

0 коммент. | добавить комментарий


КОТЫ.

вот ходят коты
поджав все хвосты
из-за кошек они дерутся
их когти от боли не гнутся
один удар лапой
разбить может лампу
собак лишь боятся
не лезут к ним драться

коты-коты-коты
затекаете вы в крови
коты-коты-коты
вы антонимы доброты
коты-коты-коты
лишь кошки вам нужны! (2 раза)

и чтоб не мочились
на вас и не злились
его оперируй
на всю жизнь кастрируй
тогда будет смирненький
котенька миленький
не будет рвать уши
(далее неразборчиво)

коты-коты-коты
затекаете вы в крови
коты-коты-коты
вы антонимы доброты
коты-коты-коты
лишь кошки вам нужны! (3 раза)

Приват-Надра: А всё...

0 коммент. | добавить комментарий
А я все-таки успел сделать скриншот со страницы браузера с сайтом Приват24. Сейчас там этой веселой картинки уже нет, но сегодня утром их главная страничка выглядела вот так:


Короче, банк Надра, всё бля))

Какого хера, или что такое crazy admin ru?!

4 коммент. | добавить комментарий
А вот какого, спрашивается, на http://crazyadmin.ru/category/programming висят все посты с моего бложика?!

Что это за сайт такой, вообще? Кто знает? Дерут посты через RSS? Я вот смотрю - ни рекламы там особой нет, ничего такого... Какой им смысл?

UPD 17.02.09: дальнейшие исследования вывели на определение термина Сплог в русской википедии:

Сплог по своему виду похож на блог, основное отличие — в контенте. Контент сплогов не является качественным или уникальным, часто он генерируется автоматически с использованием других ресурсов — популярных rss-лент и блогов.
Часто сплоги создаются в большом количестве — они не ориентированы на постоянную аудиторию пользователей, но за счёт большого количества сплогов и получения небольшого объёма трафика с поисковиков, достигается необходимый эффект привлечения определённого количества читателей. По сути пользователи ищут нужную им информацию, а поисковые машины частично выводят их на сплоги, в результате же пользователи не находят нужную им информацию, но видят определённую рекламу и ссылки на другие ресурсы.
Короче, таки в рекламе дело. Ну ладно, заодно и я попиарюсь))

Война подчеркивания и дефиса: разные стандарты именования в Maven и Eclipse PDE

0 коммент. | добавить комментарий
В одном из наших Eclipse-проектов сборка происходит следующим образом:

1. Сначала мы собираем target-платформу для системы uDig (user-friendly Internet GIS) - набор OSGi-bundles. Состоит она из:
  • GeoAPI и ее зависимостей
  • GeoTools и ее зависимостей
Сборка 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
  • наши проприетарные модули и их зависимости
Причем сборка второго пункта также выполняется с помощью Maven. Соответственно, нам очень удобно использовать модули, уже находящиеся в локальном m2-репозитории - такие, как, например, java3d.osgi.vecmath-1.3.1.jar. Однако, когда мы пытаемся добавить к нашим плагинам плагины из uDig, начинаются проблемы, поскольку в uDig, как мы помним, соответствующая библиотека называется уже java3d.osgi.vecmath_1.3.1.jar (подчеркивание вместо дефиса). Поэтому в результате простого копирования файлов получаем следующую картину:
...
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

4 коммент. | добавить комментарий
Вчера попользовал две системы управления требованиями: Reqheap (http://reqheap.sourceforge.net/) и OSRMT (Open Source Requirement Management Tool, http://osrmt.com). Сказать имею следующее:

ReqHeap сделан на связке PHP+MySQL, поднимается легко, мыслит в терминах проектов, подпроектов, требований и тест-кейсов. Поддерживает много пользователей и разграничение прав. Однако, проследить traceability, скажем, от требований к тестам, построить матрицу и пр. не представляется возможным - нет средств. Короче, просто удобная хранилка всего вышеперечисленного.

OSRMT - могучая вещь, имеющая как Swing-интерфейс, так и веб-клиента. Сделана на Java. Ее словарь, вкратце, таков:
  • Requirement
  • Feature
  • Design
  • Implementation
  • Test
Система позволяет строить traceability matrix от всего ко всему, рисовать диаграммы зависимостей и пр. Из недостатков можно отметить убогость веб-клиента (например, вводишь текст требования в Swing-приложение, форматируешь его там, а потом смотришь в веб - а оно все сплошняком порет. Уж хотя бы <pre>-теги ставило... Кроме того, странным кажется то, что веб-клиент и Swing-клиент по умолчанию использую разные БД, находящиеся в разных папках.

И зачем было так делать?

Короче, вопрос поиска (бесплатной) подходящей системы управления требованиями, позволяющей отслеживать их до дизайна, имплементации, тестов и обратно, пока остается открытым.

Ubuntu 8.10 + WiFi + WPA security

2 коммент. | добавить комментарий
Потратил пол-субботы на то, чтобы настроить беспроводной доступ в Интернет с ноута с новым Linux Ubuntu 8.10 Intrepid Ibex. Прошерстив найденные линки, я понял, что именно мой встроенный беспроводной адаптер BroadCom BCM4318 конфигурируется в линуксе особо сложным образом.

Итак, задача. Дано: в квартиру заведён Интернет по сетевому кабелю и воткнут в точку доступа. Она раздает его, зашифрованного посредством WPA-PSK. Требуется: настроить Ubuntu 8.10 таким образом, чтобы он этот самый беспроводной Интернет ловил посредством встроенной сетевой карты BroadCom BCM4318.

Решение:

Смотреть здесь: http://www.sampbar.com/2008/11/broadcom-bcm4318-ubuntu-intrepid.html.