воскресенье, 1 ноября 2015 г.

Java JDBC подключение к firebird из oracle database



Итак, ни для кого не секрет что в БД oracle работает java-машина, которую можно использовать для работы с нетипичными для БД задачами: работа с  электронной почтой, работа с файловой системой сервера,  работа с сокетами, и любыми другими задачами, которые позволяет реализовать язык java. На сервере БД Oracle используется JEE (Java Enterprise Edition), версия java машины зависит от версии сервера. Для ее определения необходимо выполнить функцию на Java:
System.getProperty("java.version");
Как это правильно сделать, можно увидеть из прилагаемого листинга программы. Это отступление очень важно, так как в зависимости от версии java на сервере необходимо использовать сборку драйвера JDBC соответствующей версии. Иначе ваш код будет сыпать системными ошибками и откажется работать. При разработке я использовал версию сервера 11.2.0.3.0, на котором была запущена java-машина версии 1.5.0_10.
Для некоторого комфорта в разработке на Java рекомендую использовать JDeveloper от oracle с необходимой версией JEE. При этом уже готовый код я компилировал в базе данных, используя TOAD.
Теперь опишем алгоритм действий:
1.      Скачиваем необходимый драйвер JDBC и записываем его на сервер (и на компьютер с Java средой разработки)
2.      Открываем удобную среду разработки для  java JEE.
3.      Пишем Java класс с собственным загрузчиком классов, чтобы можно было подгрузить JDBC драйвер, не используя переменные сессии сервера CLASSPATH.
4.      Тестируем работоспособность класса и переносим его в TOAD.
5.      Пишем БД обертку для созданного класса и компилируем его. Отлаживаем, чтобы компиляция прошла без ошибок (не забываем поменять путь до файла JDBC драйвера с тестового на серверный).
6.      Оборачиваем Java-код PL/SQL пакетом.
7.      В том же PL/SQL пакете разрабатываем способ хранения полученной информации в БД, если это необходимо.
8.      Даем права на использование схемой java-машины
GRANT JAVAUSERPRIV TO XX_SCHEME;
Проверяем права запуском запроса
select * from user_role_privs
из под схемы XX_SCHEME. При успехе должны увидеть такую строку:
USERNAME
GRANTED_ROLE
ADMIN_OPTION
DEFAULT_ROLE
OS_GRANTED
XX_SCHEME
JAVASYSPRIV
NO
NO
NO

9.      После запуска работоспособной функции connect сервер БД потребует дать права на использование java (в описании ошибки будет пример раздачи прав). Даем такие права как в описании ошибки (Если позволяет безопасность – можно дать сразу PUBLIC права)
exec dbms_java.grant_permission( 'PUBLIC', 'SYS:java.net.SocketPermission', '192.168.1.3:1433','connect,resolve');
Такие права даются из под пользователя SYS. Проверить доступность прав можно запросом
select * from USER_JAVA_POLICY order by SEQ desc
из под пользователя XX_SCHEME
10.  Создаем пакет-обертку на PL/SQL, заполняем разработанные структуры данных и наслаждаемся результатом.

Прикрепляю ссылку для возможности Просмотреть исходники архивом



четверг, 4 июня 2015 г.

2. Тестируем возможности opencv на обученном каскаде



Описание Алгоритмов для работы с тем или иным подходом работы с opencv мы можем найти во встроенной документации  по пути <путь до opencv>\sources\doc\py_tutorials\

У меня этот путь C:\opencv\sources\doc\py_tutorials\
В дальнейшем описания буду использовать свой путь до файлов opencv.

Пример работы с определением лиц описан в фалах следующей папки: 
C:\opencv\sources\doc\py_tutorials\py_objdetect\py_face_detection
В указанной папке увидим файл py_face_detection.rst, в котором находится текстовое описание подхода.


Для определения возьмем какое-либо лицо. Я взял по следующему пути:
С:\opencv\sources\samples\java\clojure\simple-sample\resources\images\lena.png



Теперь, собственно, откроем netbeans, создадим проект, подключим к нему библиотеку openCV как описано в предыдущем посте.
Добавим в созданный проект помимо класс Detector, со следующим кодом (описание кода в комментариях):

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
/**
 * Определение лиц.
 * @author brudanovom
 */
public class Detector {
    public void DetectFace(){
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); //Инициализируем библиотеки
/*подгружаем обученный классификатор Хаара*/
String CascadePath;
CascadePath = "c:\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml";
CascadeClassifier faceDetector = new CascadeClassifier(CascadePath);
//Задаем путь до картинки с лицом
String ImagePath = new String("c:\\opencv\\sources\\samples\\java\\clojure\\simple-sample\\resources\\images\\lena.png");
System.out.println(ImagePath);
Mat image = Highgui.imread(ImagePath);
        // Определяем наличие лиц на фото
        MatOfRect faceDetections = new MatOfRect();// MatOfRect специальный контейнер прямоугольников типа Rect
        faceDetector.detectMultiScale(image, faceDetections);//непосредственно функция определения
        System.out.println(String.format("Detected %s faces", faceDetections.toArray().length)); //Выводим результаты определения в консоль
        // Рисуем определившиеся прямоугольники на картинке
        for (Rect rect : faceDetections.toArray()) {
            Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x
                    + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));           
        }
        String filename = "c:\\DOWNLOADS\\faceDetection.png"; // Задаем путь для сохранения результатов
        System.out.println(String.format("Writing %s", filename)); //Пишем о сохранении в консоль
        Highgui.imwrite(filename, image);// Сохраняем результат определения лиц
    }
}


Теперь используем созданный класс в функции Main:



public static void main(String[] args) {
        Detector d = new Detector();
       d.DetectFace();
    }

Результат сохранится в виде следующей картинки:



Итак, в результате мы получили представление об использовании библиотеки opencv для программирования в java, попутно разработав простенькую программку для определения лиц на фотографии. Названия классов и функций библиотеки в разных версиях opencv могут отличаться. При разработке не ленитесь смотреть туториалы, входящие в состав opencv.