?

Log in

No account? Create an account

Jdbc stored procedure introspection

Недавно по работе столкнулись с необходимостью интроспектировать оракловские стореды (lookup etc)
http://www.java2s.com/Code/Java/Database-SQL-JDBC/GetStoredProcedureSignature.htm - Standard jdbc way for it...) Поддерживает добытие их схемы всех сторедов в ней, поиск в схеме хранимых процедур с определенным паттерном имени, определение типов параметров и возвращаемого значения и и другие полезности. Пробуйте! :)
Сабж. Встречайте! http://javafx.com
Кстати
Недавно я тут слышал такое мнение (тут несколько утрировано приведу) - сейчас есть две платформы для интернета, под которые стоит писать - это JavaScript и Flash.
Под остальные писать смысла нет - например потому , что IE другого, тех же разработок Sun, из коробки не поддерживает.

И вот представьте.
1) Выходит платформа. Технологически пусть сыровата, но перспективна.
2) Софт под нее никто не пишет - зачем кому-то писать софт под платформу, которые никто не
    юзает и вряд ли будет, правда? Спрошная потеря выгоды.
3) Потребители, само собой, ее не ставят у себя - зачем кому-то платформа без набора софта, у которой неизвестно какое будещее и вообще, нас все устраивает, а кому неймется, пусть экспериментируют.
4) Те, кто выпустил платформу - видит что она непопулярна, и не развивают ее. Платформа тихо сходит в гроб, не успев выпутаться из пеленок. Все остаются при своих.
5)  Выходит платформа. Технологически пусть сыровата, но перспективна....



TryCatchFinally, но какое!

Все знает это сочетание как короткое обозначение механизма перехвата и обработки исключений.
Но не все знают, что есть интерфейс в необозримых библиотеках J2EE SDK, который именно в точности
так и называется!.
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/jsp/tagext/TryCatchFinally.html.

Для тех кто не хочет идти по ссылке --


The auxiliary interface of a Tag, IterationTag or BodyTag tag handler that wants additional hooks for managing resources.
This interface provides two new methods: doCatch(Throwable) and doFinally(). The prototypical invocation is as follows:

 h = get a Tag();  // get a tag handler, perhaps from pool

 h.setPageContext(pc);  // initialize as desired
 h.setParent(null);
 h.setFoo("foo");
 
 // tag invocation protocol; see Tag.java
 try {
   doStartTag()...
   ....
   doEndTag()...
 } catch (Throwable t) {
   // react to exceptional condition
   h.doCatch(t);
 } finally {
   // restore data invariants and release per-invocation resources
   h.doFinally();
 }
 
 ... other invocations perhaps with some new setters
 ...
 h.release();  // release long-term resources
 


Java Unsafe

Во время обзора декомпиляторов натолкнулся я на несколько изумительных статей на wasm.ru -
wasm.ru/article.php - Unsafe Java (часть 1) и
wasm.ru/article.php - соответственно  часть два.
Описывают, что такое Unsafe api, предоставляющее программисту возможность работать с классами, методами и т.п. ниже того уровня , который позволяют штатные средства платформы Java - на фактически на уровне тех самых С-структур, которые используются внутри JVM для предоставления сущностей класс, инстанс класса, метод и т.п.
Что дает возможность делать многие вещи, которые в программировании на Java как бы "традиционно" считаются невыполнимыми - функция sizeOf, (возвращаются точный размер объекта в памяти , взятый напрямую из поля  структуры, которая представляет этот объект на уровне JVM), наследования от final-класса (делается двумя шагами по сути -  в список предков класса добавляется нужный нам класс, и из таблицы модификаторов доступа для этого суперкласса во время выполнения программы удаляется final - всего делов ;) ).

Ну и уже более изощренные и хакерские штучки - самомодицирующиеся во время выполнения методы..и т.п. Очень рекомендую эти статьи к прочтению :).
Да, конечно -- смещения полей в структурах высчитываются на пальцах, класс sun.mics.Unsafe недокументирован (но присутствует в Java с самого ее начала, и очень навряд ли будет из нее удален - я очень сильно подозреваю, что предоставляемые им низкоуровневые возможности используются инструментами типа отладчиков и т.п.), и в продакшне ни один Project Manager такое использоватьне позволит -- да и не требуется в обычных приложения никогда столь низкоуровневый доступ к JVM. Но знать, как ява-машины работает с классами внутри себя -- полезно и интересно, а знать что из обычной программы на чистой яве можно получать доступ такого уровня -- еще интересней.

И напоследок два слова по поводу того, что это gap в ява-машине, который будет закрыт в следующем же релизе и т.п.
Я не думаю, что это дыра в системе безопасности Java.
Собственно, суммирую и повторю описанное в первой из статей.
Итак. Есть две точки входа для получения инстанса класса Unsafe, который позволит нам творить черную магию:
1) Получить его можно через Unsage.getUnsafe() - НО! только в том случае, если вызывающий класс был загружен первичным класслоадером (www.tedneward.com/files/Papers/BootClasspath /BootClasspath.pdf - тут можно прочитать подробней про иерархию класслоадеров). Это сделать несложно -- всего-то добавить ключ -Xbootclasspath в список стартовых опций ява-машины. Но для этого надо иметь доступ  к среде выполнения.
2) Можно просто взять private переменную theUnsafe - которая хранит инстанс класса Unsafe внутри него. Но если есть Security Manager и установлена для него соответствующая политика запрещения опасной рефлексии , получить значение этой закрытой переменной не удастся.
Соответственно, мой вывод -- это API не является уязвимостью в JVM, вовсе нет.
Потому что точно так же рефлексией (если она не запрещена в политиках безопасности) можно творить безобразия внутри приложения, но и польза от нее может быть большая-- надо просто разумно выставлять политики безопасности в каждом конкретном случае.
Да - Unsafe API дает беспрецедентный уровень доступа к среде выполнения Java из программы. Но чтобы получить доступ к этому апи -- надо либо иметь соотв. права на той машине, где выполняется приложение (например, возможность задавать параметры запуска ява-машины), либо должен быть соответственно сконфигурирован (без учета этой опасности) Security Manager.

Надеюсь, кому-то было интересно это прочитать :)

 

Java Decompilers

Помню, на  forum.juga.ru один очень уважаемый там человек когда-то жаловался, что многие люди пытаются запустить .java файл, и ругаются что не работает. Шутки шутками -  как итог  на многих форумах есть в FAQ описание для новичков, как взять .java файл и скомпилировать его в .class файл.
При этом, я не припоминаю чтобы где видел описание обратного процесса -- как получить из .class файла .java файл.

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

Кто-то скажет, что  прежде всего надо разобраться, как устроен этот самый файл, прочитать его спецификацию, узнать как он процессится ява-машиной и т.п., но это уже just for fun или для профессионалов в области разработки инструментария в этой области. Я сам сторонник фундаментальности, однако современные декомпиляторы позволяют работать с .class файлами без предварительного изучения их структуры, кто считает полезным прочитать спецификацию формата .class -  http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html.  Сам считаю, что знать ее для серьезного ява программиста -- очень желательно, но пользоваться в повседневных задачах декомпилятором можно и без этого знания.

Итак, из  чтения пары статей на форумах, общения с некоторыми знакомыми кофейниками, пары часов в гугле, и собственного скромного опыта декомпилирования ява-приложений родилось:

А, вот интересная статья по этому поводу -
http://www.program-transformation.org/Transform/JavaDecompilers
Читать всем :)

Итак:

1. Java Decompiler - http://java.decompiler.free.fr/.
Очень простой, понятный интерфейс, запускаем, открываем .class файл (а так же можно открывать и .jar файлы, мелочь а приятно. При открытии джарника можно развертывать иерархию пакетов и смотреть исходный код классов, а вот манифест и ресурсы -- почему то нет, что немного обидно), и на экране желаемый сорскод.
Качество движка - спорное. С одной стороны, в моих тестах грамотно распознал рекурсию и аннотации, с другой -  времени от времени тупил, создавая некомпилирующийся код в простых случаях, вроде -

вместо
int count = 2, 
создавал:
int count;
int count = 2; // compilation error, var. already exists.

В целом -- ничего, неплохо.

2.  DJ Java Decompiler.
Выглядит серьезней, кроме декомпиляции поддерживает так же дизассемблирование, просмотр более полной информации о версии класса, его членах и их  аттрибутах,  пула констант, просмотр шестнадцетиричных кодов (специально для извращенцев  истинных ценителей) и многое другое.
По сути - фронтэнд к очень популярному, но имхо, несколько староватому движку декомпиляции Jad.

Более того -- почти все современные серьезные дизассемблеры, как прошлых лет, так и сегодняшние, используют этот движок :).

Чтобы не быть голословным --  вот список продуктов, являющихся по сути фрондэндом Jad:
FrontEnd Plus -
http://www.reflectonus.pwp.blueyonder.co.uk/download.htm [02/29/2004: page not found]

NMI's Java Code Viewer -
http://www.trinnion.com/javacodeviewer [02/29/2004: Discontinued]

Decafe Pro -
http://decafe.hypermart.net

mDeJava -
http://molesoftware.hypermart.net [02/29/2004: site not found]

FrontJad -
http://www.ire.pw.edu.pl/~mszklan/frontjad.htm [02/29/2004: page not found]

DJ Java Decompiler -
http://members.fortunecity.com/neshkov/dj.html

Cavaj Java Decompiler -
http://www.bysoft.se/sureshot/cavaj

JavaDecompiler -
http://iago-soft.iespana.es/iago-soft/jdecompiler/jdecompiler.htm (in Spanish) [02/29/2004: page not found]

JadClipse, Jad plugin for Eclipse IDE -
http://sourceforge.net/projects/jadclipse

decompile.zip - an add-on to the Java Development Environment (JDE) for GNU Emacs. It automatically decompiles a class file and offers you a buffer to view or edit it. The add-on is written and maintained by Ingo Koch (ingo.koch@ikoch.de).

VajDecompiler -
http://www.ibldesign.com/lorin/VAJDecompiler.shtml - Jad frontend for VisualAge for Java

decomp.zip - yet another LISP code for Emacs that runs Jad on the current buffer. Contributed by R. Mecklenburg.

jadAlign v1.01 is an utility created by Bernard Poulin (bernard@acm.org) that re-alignes Java source files produced by Jad. The resulting file can then be used for source-level debugging (i.e. stepping in the code). The size of the archive is 20942 bytes.

JADClassFileNode - an open tool by A. Sazonov that replaces the built-in decompiler in JBuilder.

JASM - Java disassembler module for NetBeans IDE.

JavaDecompiler.vim - plugin for VIM editor by David Bowers.


3. Cavaj Java Decompiler. Видимо авторы были заядлыми анимешниками, иначе откуда могло взяться  такое название :). 
Бросающаяся в глаза неприятная мелочь --  в диалоге открытия файла для декомпиляции нету фильтра по типам .class, .jar и т.п. Мелочь -- а раздражает.
Поскольку движок декомпиляции тот же самый, то тут комментировать особо нечего.
В интерерфейсе никаких вкусносней нет и в помине, подсветки полученного java-code нету, байткод посмотреть тоже нельзя. Мне не понравился.

Итог - DJ на мой взгляд, лучший из декомпиляторов Java на сегодняшний день.













Ganymede

Скачал и поставил дома (а потом и на работе) новый релиз Eclipse - Eclipse 3.4 Ganymede. http://www.eclipse.org/ganymede/
О новых фичах можно почитать в release notes, в основном они все ожидаемые.
Из архитектурных улучшений -- теперь благодаря новому equinox (часть " низкоуровневого ядра" Eclipse, реализация спецификации OSGi) стал проще апдейт и поддержка всей платформы, так же улучшился UI
для обновления и управления конфигурацией.
Вообще к черту описание технических фич -- кто хочет, уже наверное поставил все сам и попробовал :)
И найти их все можно за 1 минуту одним запросом к гуглу.
А вот о чем хочется сказать - так это о росте Eclipse. Переход от архитектуры, поддерживающей добавление новой функциональности в виде плагинов, к полностью открытой архитектуре (все, кроме минимальной части, по сути --- загрузчика платформы) - плагины. И эти плагины теперь не чьи-то мелкобуржуазные поделки (хотя, к сожалению, встречаются и такие) --- а качественно сделанные маленькие (и не очень) продукты. Eclipse растет и набирает обороты, бесспорно, что не может не радовать.
И напоследок --- тонкость для знатоков. Теперь переменная Eclipse  Home - unmodifiable, 
прошита где-то внутри(((.
Т.о. появились определенные трудности при конфигурации  билда у тех, кто использует Eclipse как базовую платформу для собственных приложений . Если кто-то знает, как можно все-таки поменять эту переменную -- велкам.

Milax - Open Solaris с флешки

Наткнулся в сети на http://www.opennet.ru/opennews/art.shtml?num=17993 -
результаты конкурса Sun на лучшую открытую разработку для Open Solaris.

Среди победителей понравился по описанию Milax - проект liveCD/USB для солярки
от Александра Еремина (если честно, понятия не имею кто это :) ).
http://www.opensolaris.org/os/project/milax/announcements/.
Советую посмотреть хотя бы скрины - выглядит более чем достойно.
Качаю не задумываясь.

Visual VM

Недавно по работе занимался изучением инструментов для мониторинга  и менеджмента Java-приложений (JMX-based в основном).
Самое известное и широко используемое из таких инструментов, из тех, что поставляются
в JDK от Sun - это наверное JConsole.
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html -
для тех кто не в курсе, небольшая статья (на английском), что это за зверь и как на него охотиться.

Но практика показала, что далеко не все в курсе, что совсем недавно (этим летом) Sun
выпустила новый,  более мощный инструмент для мониторинга, отладки и профайлинга приложений -
Visual VM.
Болеее подробно новость можно узнать тут -
http://www.cybersecurity.ru/development/51175.html?newstype=last,
а вот сам сайт проекта -- https://visualvm.dev.java.net/.

Поставляется как в комплекте с Sun JDK - (начиная с 1.6.07),
так и в виде отдельной программы.

Интересная фичи:

- Сделана на RCP-платформe NetBeans.
- Включает в себя профайлер из него же.
- Умеет кооперироваться с плагинами JConsole + имеет ряд своих плагинов.

Так же -
 - Display local and remote Java applications
 - Display application configuration and runtime environment
 - Monitor application memory consumption and runtime behavior
 - Monitor application threads.
 - Profile application performance or analyze memory allocation.
 - Take and display thread dumps.
 - Take and browse heap dumps
- Analyze core dumps.
 - Analyze applications offline.


Недавно на работе возникла необходимость запустить сервер приложений JBoss в виде
Windows NT service.
Найдено было два способа, дам ссылки на оба, может кому пригодится.
Первый из них подходит только для JBoss, зато второй гораздо более общий -- с его помощью можно запускать в виде сервисов любое Javа-приложение, причем с кучей дополнительных возможностей, (и, конечно, под любой осью).

Оба способа описаны тут - http://wiki.jboss.org/wiki/RunJBossAsAServiceOnWindows.

Итак, для первого способа -- качаем билд JBossNative под свою ось,  как указано в инструкции, и читаем readme-service для инструкций :)

http://wiki.jboss.org/wiki/JBossNativeWindows -- или смотрим их здесь.  Этим способом JBoss ставится действительно одной командой с консоли:
C:\> cd c:\jboss-4.2.0\bin
C:\> service.bat install
А теперь чуть подробней про второй способ. Прежде всего -- он не совсем бесплатный, бесплатен он для open-source и продуктов, лицензированных иным способом, но от которых вы не получаете дохода. В двух словах так, но советую внимательней прочитать лицензию. Идем на сайт производителя Java Service Wrapper тула - http://wrapper.tanukisoftware.org/. Качаем архив (я советую скачивать архив только под родную ОС), дальше действуем как описано в самой первой ссылке этого поста. Расписано все понятно, и собственно заводится и работает все без танцев с бубном, но есть пара неочевидных моментов, про которые я сейчас скажу и которые отняли у меня время. Во-первых, советую просмотреть сразу все свойства файла конфигурации - http://wrapper.tanukisoftware.org/doc/english/properties.html. Чтоб знать что и как можно делать. Не забываем про установку нужных -Dname=value свойств для передачи значений JVM. И еще -- иногда хотелось бы запускать сервер в interactive-mode, чтобы при его старте открывалась консоль. Сделать это можно следующим образом - добавьте в конфиг враппера строчки wrapper.ntservice.console=true
wrapper.ntservice.interactive=true.

Но учтите - 
 Desktops created with the Remote Desktop tool do not appear to ever be
 accessible by interactive services.  Other tools which are actually 
 mirroring the  local desktop will have access as Windows thinks it is 
 rendering the local desktop. 
Ну и напоследок - коротко о фичах.
Можно составлять файл комманд, которые должны выполняться в определенное время, и указать
его в файле конфигурации враппера. Шедулинг работает нормально.
Можно писать хэндлеры консольного вывода, которые могут, например, перезапускать сервис, когда
падает некоторая ошибка (например, OufOfMemoryError).
Можно настраивать нотификацию администраторам на email.
...

Всем спасибо за внимание :)
Надеюсь, профессионалам Java это окажется небесполезным.


Tags:

Решил для себя, что как будет возможность - возьмусь за изучение функционального программирования. Пусть это традиционная зона академичности, и не очень, мягко говоря, распространена в индустрии - зато свежий взгляд на то, чем я занимаюсь на работе каждый день. Начну прямо с хардкора, с Хаскелла. Никто не скажет, что Ынтырпрайз- программист спасовал ;-) А там может попробую что-то комбинированное, типа питона. Или раби. Это с гораздо большей вероятностью пригодится на практике.