30 дек. 2011 г.

position: relative в Opera 9.X-10.X

Столкнулся с глюком в Opera 9.X-10.X (проверял на 9.64, 10.10, 10.63): при назначении через CSS параграфу position: relative его стили left и top считаются неверно (точнее, не пересчитываются - они должны обнулиться, а остаются равными offsetLeft, offsetTop).

23 нояб. 2011 г.

Рефакторинг кода и Warning: The method can be declared as static

Есть у компилятора Java интересное предупреждение "The method foo() from the type Bar can be declared as static" - в среде разработки Eclipse включается в настройках ошибок/предупреждений компилятора Java (Window - Preferences - Java - Compiler - Errors/Warnings). Иногда оно помогает в анализе и улучшении качества кода, особенно это касается JUnit-тестов.

2 нояб. 2011 г.

Защита jmx-консоли и web-консоли JBoss 4.X-5.X от JBoss worm

В интернетах распространяется JBoss worm - червь, атакующий сервера JBoss с настройками jmx-консоли и web-консоли по умолчанию. Суть в том, что через консоль можно получить доступ к серверу (выполнить произвольный код в контексте пользователя JBoss), а в настройках по умолчанию защита или выключена вообще (JBoss 4.X) или ограничена типами HTTP-запросов GET и POST, что червь легко обходит.

Что надо сделать, чтобы защитить консоли JBoss (в примере - с использованием файла с логином/паролем):

27 окт. 2011 г.

Мониторинг состояния JBoss 4.2.X в JBoss Web Console


Ключевые параметры работы сервера приложений JBoss можно отслеживать в реальном времени в JBoss Web Console.

Открываем в браузере http://localhost:8080/ и выбираем ссылку JBoss Web Console или сразу открываем URL http://localhost:8080/web-console/ (конечно же, вместо localhost:8080 надо подставить реальные имя хоста и номер порта).

Разворачиваем ветку System, в ней JMX MBeans, далее последовательно открываем нужный домен, выбираем бин (значения его атрибутов загрузятся в правый фрейм), нажимаем правой кнопкой мыши на атрибуте, выбираем "graph" и смотрим...

25 окт. 2011 г.

Фокусы с фокусом в Opera

Случайно наткнулся на неприятную проблему в Opera, которая существовала ещё в версии 9.64 (а может и в более ранних, просто это самая старая версия, которая у меня имелась), и существует до сих пор (в версии 11.51 - последней имеющейся у меня на момент написания статьи).

3 окт. 2011 г.

debug.css

У хороших парней из Blueprint позаимствовал идею debug.css - CSS, которая подключена в процессе разработки страницы/сайта/web 2.0 приложения, и которая при предварительном просмотре разрабатываемой страницы в браузере визуально выделяет некоторые ошибки HTML-разметки:

8 сент. 2011 г.

Snapshot и репозиторий Nexus thirdparty

Обнаружил, что разработка DisplayTag всё ещё продолжается, хотя артефакты 1.3-SNAPSHOT можно найти только в репозитории SourceForge. Поэтому скачал исходники из SVN, пофиксил JUnit-тесты тупых америкосов (в моей локали по умолчанию при выводе в текст дня недели получится что угодно, но никак не "tuesday"), собрал локально (сначала mvn package, затем mvn source:jar) и попробовал залить в свой репозиторий thirdparty (как я это обычно делал для Java plugin и JDBC-драйверов Oracle и MS SQL):

30 авг. 2011 г.

Валидное унифицированное подключение Java-апплета в XHTML

Когда встала реальная необходимость использования Java-апплета в проекте, освежил знания по этой тематике и перекопал интернеты. Результат совершенно не удовлетворил меня как веб-девелопера: невнятные советы, невалидная древняя разметка, куча логики, проверки на Netscape 6. Нужно было своё решение - современное, валидное, правильное.

29 авг. 2011 г.

javascripts.sourceforge.net

Обновил свои скрипты на SourceForge:
  1. демо
  2. страница проекта
  3. архив демо (1.2 Mb)
  4. архив проекта Aptana (6 Mb)
  5. просмотр в SVN
IDE Aptana (для которой архив проекта предназначен) - более-менее неплохая среда разработки JavaScript, основанная на Eclipse, имеет встроенный веб-контейнер Jetty, предпросмотр (Gecko), форматирование и валидацию HTML и JS (JSLint), заливку на SourceForge по SFTP.

26 авг. 2011 г.

Exception в setSelectionRange() в Firefox

Иногда при вызове element.setSelectionRange(begin, end); Firefox вываливает исключение:

uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMNSHTMLInputElement.setSelectionRange]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: http://127.0.0.1:8000/ui/lib/ui/maskedinput.js :: caret :: line 38" data: no]

Возможные причины:
  1. Элемент не подключен к документу (создан в JavaScript и не вставлен или только что вставлен в дерево DOM - возможны варианты в разных версиях Firefox).
  2. Элемент невидим (элемент или один из его родителей имеет стиль display:none).
  3. Элемент не имеет фокуса (проявилось в Firefox 3.6+).

25 авг. 2011 г.

Проверка слова на попадание в список зарезервированных идентификаторов

В ходе доработки ООП Prototype встала необходимость определения, является ли название поля/метода зарезервированным словом или нет. Придумал три возможных алгоритма решения (точнее придумал два, а один был подсмотрен в RightJS). На вполне закономерный вопрос, какой из трёх вариантов быстрее, ответ даёт онлайн-сервис тестирования производительности JavaScript  - весьма удобный инструмент для сравнения скорости выполнения разных вариантов скрипта в разных браузерах.

Нестандартные атрибуты тегов HTML

Тема нестандартных атрибутов (пользовательских, custom attributes) в тегах HTML уже давно бродит в кругах web-девелоперов. Некоторые, не долго думая, пишут всё что им вздумается, забивая на то, что получившийся HTML-код не пройдёт валидацию (раньше этим сильно грешил ZK framework). Некоторые с недавних пор уповают на будущий HTML5 и атрибуты, начинающиеся с префикса data-.

Практически никто не вспоминает (или вообще не знает) о решении, которое существует уже давно: XHTML. С самого начала XHTML позволял указывать свои пространства имён XML, в которых можно было творить почти всё, что душе угодно, не нарушая валидности XHTML кода.

23 авг. 2011 г.

Тонкости split() в IE

Чисто случайно (впрочем, как обычно это и происходит) при разборе на стороне клиента CSV-подобного ответа сервера обнаружил различие в результатах String#split(RegExp) и String#split(String) в Internet Explorer 6, 7 и 8 версий (в 9 и 10 не проверял):

"1||2".split(/\|/) // вернёт ["1", "2"]
"1||2".split("|")  // вернёт ["1", "", "2"]

То есть при вызове split с регулярным выражением осёл IE считает подряд идущие совпадения одним совпадением и пустых элементов в результате не возвращает, в отличие от вызова split с использованием строки. Во всех остальных браузерах split возвращает одинаковые результаты (с пустыми элементами).