Показаны сообщения с ярлыком it. Показать все сообщения
Показаны сообщения с ярлыком it. Показать все сообщения

24 дек. 2008 г.

Всех поздравляю!

Всех читателей поздравляю с наступающими праздниками!
Я сейчас нахожусь в заслуженном отпуске до 5-го января, который отбываю на Родине в Минске. Надеюсь, что читателей за это время меньше не станет, а только прибавится.
В наступающем году всех читателей этого блога ждут несколько сюрпризов. Один из них я готовлю сразу по возвращению из отпуска, так что ждать осталось недолго. Еще один надеюсь сделать к марту. Пока сохраню интригу и не буду раскрывать что это за сюрпризы.
Желаю всем успехов в новом году!

13 дек. 2008 г.

Управление проектами

На dev.by появился перевод обзора 15-ти инструментов для управления проектами. Полезно почитать.
Сам работаю с Jira и Trac. Первая вызывает исключительно негативные эмоции. Trac очень даже ничего. Из обзора вызвали интерес Basecamp, Creative pro Office и Simply Invoices.

В дополнение еще отмечу площадку для организации удаленных команд разработчиков и управления проектами Assembla.com, которую активно использую сам. Вот здесь очень неплохой обзор этого сервиса на русском языке.

12 дек. 2008 г.

SQLDeveloper 1.5.3

С вчерашнего дня доступен для скачивания и патчевания SQL Developer версии 1.5.3
Скачивать целиком здесь. Патчить версию 1.5.1 можно прямо из девелопера: пункт меню Help -> Check for updates.
Я пропатчился - у меня слетели все сохраненные соединения. Правда я их восстановил без проблем. Но осадок остался.

26 нояб. 2008 г.

Буду в Минске.

Итак, примерно с 20 декабря по 3 января собираюсь посетить город-герой Минск. Родина ждет. Очень жаль что не успеваю посетить вот эту встречу BYJUG. Java меня мало занимает, а вот про Flex и RIA в целом с удовольствием бы пообщался.
Если у кого-то есть пожелания и предложения встретиться - пишите, звоните, приходите :)

Составная форма

Вот этот вопрос на sql.ru сподвиг написать пример составной формы. Сам пример можно заценить здесь.
Суть в том, чтобы отдельные части сложных форм писать отдельно, как независимые пэйджи. А потом с помощью htmldb_Get эти части аккумулировать в одном месте. Получается эдакий эффект фрэймов.
Более того, этот приём очень эффективен, если нужно ообновить только какую-то часть страницы, а не перегружаться полностью. Собственно ajax в действии.
Добавлю еще, что если у вас на такой аггрегированной странице какой-нибудь из встроенных PPR репортов использует pagination (переход по страницам отчета) или сортировку, то они не будут работать корректно. Чтобы исправить ситуацию нужно на главной странице переопределить javascript функцию $a_report.

function $a_report(G,D,F,C,A){
lThis=$u_js_temp_drop();
var B=$x("report_"+G+"_catch");
B.id="report_"+G+"_catch_old";
var E="p="+$v("pFlowId")+":"+СЮДА_НУЖНО_ПОДСТАВИТЬ_НОМЕР_ПЭЙДЖА+":"+$v("pInstance")+":FLOW_PPR_OUTPUT_R"+G+"_";
if(!!A){
E+=A+"::RP&fsp_region_id="+G}
else{
E+="pg_R_"+G+":NO&pg_max_rows="+F+"&pg_min_row="+D+"&pg_rows_fetched="+C}
var H=new htmldb_Get(null,null,null,null,null,"f",E);
var I=H.get();
lThis.innerHTML=I;
B.innerHTML=$x("report_"+G+"_catch").innerHTML;
B.id="report_"+G+"_catch";
lThis.innerHTML="";
return
}


Обратите внимание в скрипте на "СЮДА_НУЖНО_ПОДСТАВИТЬ_НОМЕР_ПЭЙДЖА". Там должен быть номер страницы, которая содержит PPR отчет, в котором должен работать pagination. Естественно лучше туда этот номер подставить динамически, например функцией $s.

Напоминаю, PPR отчет - это отчет в котором рефреш страницы и сортировка происходят при помощи ajax, т.е. без полной перерисовки страницы.

23 нояб. 2008 г.

Крэкс, фэкс, пэкс или архитектура приложений под Oracle

Хотел написать полноценную статью, но из-за загруженности решил, что лучше уж напишу заметку, чем вообще ничего. Итак...
Если у вас стоит задача написания нового приложения с использованием базы данных Oracle, то естественно возникает и вопрос: на чем его писать и, соответственно, какую архитектуру приложения выбрать.
Конечно, для некоторых команд этот вопрос может быть заведомо решен - пишем на Java, .Net, Forms... и так далее. Список огромный - каждый выбирает по вкусу, или точнее то, чем владеет. Относительно с недавних пор всё больше разработок ведется на Apex. Отличный инструмент, но и не лишен некоторых недостатков. Ну и совсем свежачок - Flex. Вот на счет последних двух и хотелось написать. Собственно, заклинание из заголовка статьи немного созвучно набору технологий Apex, Flex, Ajax.

Для начала Apex. Инструмент простой, но очень эффективный. В принципе, позволяет создавать web приложения любой сложности. При этом избавляет от значительной части рутинной работы. Архитектура Apex приложений по сути проста – база данных сама генерирует html контент. Т.е. никаких специфических средних звеньев не требуется, если не брать в расчет web сервер (встроенный либо нет). И само приложение всё хранится в таблицах базы данных. А дальше идут недостатки, обусловленные как раз такой архитектурой. Неудобство разработки внутри html приложения, отсутствие нормальной версионности файлов, сложность вклиниться во внутренние механизмы рендеринга страниц – особенно критично в случаях, когда вы строите приложение сильно отличающееся от стандартных шаблонов. Опять же рендеринг создаёт дополнительную нагрузку на базу, хотя я и не сталкивался пока с серьезными проблемами по этой части, но тем не менее.

А теперь Flex. Очень богатые интерфейсные возможности при минимуме усилий. Можно создавать полноценные десктоп приложения. Разработка ведется вполне классическим способом, с поддержкой всевозможных сопутствующих систем версионности и т.д. Короче, конфетка! Но есть и «но». Flex общается с базами данных посредством web или http сервисов. Еще вроде Adobe предлагает Data Services, middle tire компонент для взаимодействия с базами данных, но я этим вопросом вплотную не занимался, потому как мне не интересен вариант использования дополнительного звена между приложением и базой, да ещё и java based.

Но во Flex очень просто реализуется взаимодействие приложения с javascript страницы, в которую он встроен. Причем это взаимодействие работает в обе стороны: javascript может вызывать методы flex приложения, и flex может вызвать любую внешнюю javascript функцию. Собственно в этом вся и соль – встроить Flex приложение внутрь Apex. Сам Apex при этом выполняет функции доставки данных, контроля доступа, управления сессиями, а Flex в свою очередь выполняет функции клиентского приложения.

То есть получается приложение, интерфейс которого полностью сделан во Flex. Такие вещи как авторизация, жизненный цикл сессий и транзакций управляется Apex. Вся логика обработки данных лежит в базе. Apex перестаёт создавать дополнительную нагрузку, поскольку он уже не рендерит страницы (Flex приложение грузится разом).

Чем не идеальная архитектура? И главное, ничего лишнего и всё бесплатно :)
Подумайте, может оно того стоит! Я кстати уже опробовал - мне понравилось.

13 окт. 2008 г.

SQL Developer Data Modeling

Свершилось. Вышла первая Early Adopter версия SQL Developer Data Modeling - инструмента для проектирования er-диаграмм.
Качаем, устанавливаем, пробуем. Ну и пишем отзывы и впечатления.
Моё имхо - не очень. Оно конечно работает, и есть много всяких возможностей, но для меня с ходу показалась неудобной и тормозючей. Вобщем, это не моя мечта :)

8 окт. 2008 г.

ExtJS

Вот здесь есть примеры интеграции ExtJS фреймворка с Oracle Apex. Про сам фреймворк можно почитать например здесь.
Сам бы я хорошо подумал прежде чем его использовать, но наверняка для кого-то это будет очень полезным.

22 сент. 2008 г.

Новости и сплетни

Где-то далеко-далеко началась Oracle Open World 2008. Видимо из-за этого маститые блоггеры почти ничего не пишут уже больше месяца - готовились, видать. Чтож, будем ждать новостей с того берега океана.
А пока еще одна новость - металинк теперь по умолчанию имеет flex интерфейс. Меньше месяца назад я предполагал, что оракл торопится запустить новую версию как раз к открытию OOW 2008, и оказался прав :)

Ну а дальше сплетни из недостоверных источников. Apex 3.2, как известно, будет уметь мигрировать приложения oracle forms. Так вот эта самая миграция будет возможна двумя способами и оба будут весьма ограничены. Один будет генерить обычные апекс-веб-интерфейсы, а второй будет генерить флэш (возможно это будет флэкс?). Вот это для меня честно говоря удивило. Других изменений в этой версии не ожидается.

А вот версия apex 4 должна будет иметь гораздо больше новых вкусных функциональных возможностей. И выпуск этой версии предполагается до конца этого года! Я так думаю будет некоторая задержка, но видимо ждать осталось недолго.

Но повторюсь: последние 2 новости - это всего лишь сплетни, так что ни за что не ручаюсь.

18 сент. 2008 г.

Документация Apex

С сайта оракла пропала вся документация по Apex. Уж не знаю что они там делают, но вообще последнее время бесят страшно! Оракловые вебы - это какое-то сплошное недорозумение.

Для тех кому критично нужно глянуть что-то в доке и нет локальной копии (как у меня), нашел какое-то зеркало здесь.

16 сент. 2008 г.

Apex. NTLM. XE.

.. и розачарованию моему не было предела!
NTLM аутентификация работать в XE не будет. Ровно как и в 11g с использованием Embedded HTTP Server (aka XMLDB).
Вот соответсвующая строчка в документации:

Unlike mod_plsql, the embedded gateway connects to the database as the special user ANONYMOUS, but accesses database objects with the user privileges assigned to the DAD. The database rejects access if the browser user attempts to connect explicitly with the HTTP Authorization header.


Для тех же, кто использует mod_plsql, инструкция по использованию NTLM лежит здесь

15 сент. 2008 г.

Прощай убунту :(

Вобщем, как это ни прискорбно, на домашней станции ubuntu 8.04 была снесена, как опасная для жизни и здоровья. Вот точно говорят: "Лучшее - враг хорошего". Стояла себе 7.10, не кашляла. Всё стабильно работало. При переезде на новый винт решил поменять. Недели 2 наверное мы с ней сражались.. Итого, дома теперь стоят Windows xp :)
Вобщем, порекоммендовать 8.04 никому не могу. Какая-то она неправильная. Видимо, слишком много взяла от windows :D

8 сент. 2008 г.

Apex. Экспорт отчетов.

Как реализовать экспортов отчетов в word, excel и иже своими силами.
Общая идея:
1. Создать таблицу с полем BLOB, куда будут генериться отчеты.
2. Создать OnDemand процесс, который будет из APEX_APPLICATION_PAGE_REGIONS выдергивать запрос для отчета. На основе этого запроса сгенерить xml данные. К этим данным применить xslt stylesheet и результат записывать в созданную до этого таблицу.
3. Написать javascript, который запустит этот процесс, а потом запустит на скачивание сформированный документ.

Ниже приводится "рыба". Понятно, что в итоге можно получить очень гибкую систему, позволяющую иметь полный контроль над выводом отчетов с помощью xslt.
Рабочий пример находится здесь: http://apex.oracle.com/pls/otn/f?p=33753:1:0

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

create table breports(
id number(10) constraint pk_breports primary key,
breport blob,
mimetype varchar2(30),
filename varchar2(255),
charset varchar2(10),
created_by varchar2(30),
created_on date default sysdate
)
/
create sequence s_breports start with 1 increment by 1 maxvalue 9999999999
/


Функции:

-- Вспомогательная функция для конвертации в BLOB
create or replace function clob_to_blob(c in clob ) return blob is
pos pls_integer := 1;
buffer raw( 32767 );
res blob;
lob_len pls_integer := dbms_lob.getlength( c );
begin
dbms_lob.createtemporary(res, true);
dbms_lob.open(res, dbms_lob.lob_readwrite);

loop
buffer := utl_raw.cast_to_raw( dbms_lob.substr( c, 16000, pos));

if utl_raw.length( buffer ) > 0 then
dbms_lob.writeappend( res, utl_raw.length( buffer ), buffer );
end if;

pos := pos + 16000;
exit when pos > lob_len;
end loop;

return res; -- res is open here
end clob_to_blob;
/

-- функция экспорта отчета
create or replace
function export_report(p_app number, p_page number, p_region varchar2) return number as
l_query clob;
l_str varchar2(4000);
l_stylesheet xmltype := xmltype('<?xml version="1.0" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body><table><tr><xsl:for-each select="./ROW[1]/*"><xsl:call-template name="header"/></xsl:for-each></tr><xsl:apply-templates select="ROW"/></table></body></html></xsl:template><xsl:template match="ROW"><tr><xsl:for-each select="./*"><xsl:call-template name="data"/></xsl:for-each></tr></xsl:template><xsl:template name="header"><td><xsl:value-of select="name(.)"/></td></xsl:template><xsl:template name="data"><td><xsl:value-of select="text()"/></td></xsl:template></xsl:stylesheet>');
l_mimetype varchar2(30) := 'application/msword';
l_filename varchar2(30);
l_charset varchar2(30) := 'UTF8';
l_created_by varchar2(30) := v('APP_USER');
l_ln number;
l_null varchar2(30);
begin

select region_source into l_query
from APEX_APPLICATION_PAGE_REGIONS
where application_id = p_app
and page_id = p_page
and region_name = p_region;

select s_breports.nextval into l_ln from dual;
l_filename := 'report_'||to_char(l_ln)||'.doc';

l_str := 'insert into breports (id, breport, mimetype, filename, charset, created_by)
select '||to_char(l_ln)||', clob_to_blob(xmltransform(d,s).getclobval()), '''||l_mimetype||''', '''||l_filename||''', '''||l_charset||''', '''||l_created_by||''' from (select xmlagg(column_value) d from table(xmlsequence(cursor('||l_query||')))) xd, (select xmltype('''||l_stylesheet.getclobval()||''') s from dual) xs';
execute immediate l_str using l_null;
commit;
return l_ln;
exception
when no_data_found
then return 0;
end export_report;


В приложении создадим три айтема уровня приложения: TEMP_ITEM_1, TEMP_ITEM_2, TEMP_ITEM_3
И OnDemand процесс:

declare
l_ret number;
begin
l_ret := export_report(:TEMP_ITEM_1, :TEMP_ITEM_2, :TEMP_ITEM_3);
htp.p(apex_util.get_blob_file_src('P2_BREPORT', l_ret));
end;


Дальше финт ушами: нужно мастером создать форму на основе таблицы BREPORTS.Обозначить первичный ключ ID, источник ключа Existing trigger. Из колонок выбрать только BREPORT и не создавать никаких кнопок типа delete и update... В созданной странице (пусть это будет PAGE 2), нужно зайти в свойства айтема P2_BREPORT (типа File Browse) и изменить свойство Source на BREPORT:MIMETYPE:FILENAME::CHARSET:attachment:Download. Это нужно для работы функции apex_util.get_blob_file_src в OnDemand процессе: там параметр 'P2_BREPORT' - имя айтема File Browse на этой форме.

Теперь на странице с отчетом нужно в header вписать скрипт:

<script language="JavaScript" type="text/javascript">
function exportReport(pApp, pPage, pRegion){
var get = new htmldb_Get(null,$x('pFlowID').value,'APPLICATION_PROCESS=EXPORT_REPORT',1);
get.add('TEMP_ITEM_1', pApp);
get.add('TEMP_ITEM_2', pPage);
get.add('TEMP_ITEM_3', pRegion);
gRet = get.get(null);
get = null;
open(gRet, '_parent');
}
</script>


И последнее, в области отчета создать элемент Display as Text (does not save state) у которого source =

<a href="javascript:exportReport(&APP_ID.,&APP_PAGE_ID., 'Report')">Export to Word</a>

Здесь внимание: 'Report' - это имя region'а c отчетом.

Собственно всё.

5 сент. 2008 г.

apex.oracle.com

Вот как лежит apex.oracle.com :)

4 сент. 2008 г.

Хромированный Apex

Тут на днях наделал шуму выпуск гуглом нового браузера Chrome. Оставлю за кадром свои личные пристрастия к браузером, а отмечу лишь то, ради чего можно установить этот браузер разработчикам приложений на Oracle Apex.

1. Создание ярлыков приложений. Эта функция позволяет создать на рабочем столе ярлык, который запустит апекс приложение без всяких лишних браузеровских меню и панелей. Удобно например создать ярлык для Application Builder'а:


2. Растягивающиеся textarea! Наверное самая "вкусная" фича при разработке в апексе. В Firefox для этого приходилось устанавливать Apex Builder plugin.


3. Встроенный оттладчик html/javascript/css - Chrome Inspector. Собственно местная альтернатива Firebug:


В целом для разработки вполне пригоден без лишней плагиноустановки. Неплохой ход от гугла.

2 сент. 2008 г.

Custom authentication Apex

Долгое время собирался написать сам, но за неимением времени лучше дам ссылку на хорошую заметку, как реализовать свою аутентификацию для приложения Apex. Ничего сложного. Таблица с пользователями и паролями + пакет для управления. Читать здесь.

29 авг. 2008 г.

Вышел патчсет 3.1.2 для Apex

Новость не особо радостная, но всё же. Вышел патчсет для апекса. Доступен как в виде полной инсатляции Apex 3.1.2, так и в виде патчсета для 3.1.1 (MetaLink Patch Number 7313609).

В списке фикснутых багов с ходу не увидел багу, с которой недавно столкнулся, но подробно не исследовал. А именно, что если создать процесс уровня приложения с типом On New Session: After Authentication, то в нем то ли пременная APP_USER не устанавливается, то ли сам процесс не запускается. Времени потестить не было. Но факт, что это штуковина у меня с ходу не завелась :( Или я не умею её готовить? :)

27 авг. 2008 г.

Полный список текстовых сообщений APEX


select * from flows_020100.wwv_flow_messages$

Здесь есть все сообщения Апекс. Чтобы перевести или изменить их, достаточно в Shared Components -> Text Messages создать сообщение для языка вашего приложения с соответсвующим именем wwv_flow_messages$.name и вашим текстом.

Обновилась документация по Apex

Обращаю внимание, что на днях обновилась документация по Apex 3.1. Новый список книг находится вот здесь. Страница на otn пока еще старая.

Кроме того, что доку привели к формату как в 11g, так еще изменили немного структуру. Например Apex API теперь находятся не в User Guide, а имеют отдельный API Reference

20 авг. 2008 г.

Apex. Саморегистрация пользователей.

Задача на первый взгляд простая. Сделать на сайте регистрацию пользователей. Делов то: нарисовал public page c нужными полями да кнопкой, которая всё это дело отправит в хранимую процедуру, которая в свою очередь создаст пользователя в базе.

Вот с последним как раз может возникнуть вопрос: как создать пользователя в apex с помощью pl/sql. Начнем с того, что в приложениях апекс могут использоваться разные схемы аутентификации. От используемой схемы как раз и зависит решение.
Например, если используется аутентификация на основе "Database Accounts", то достаточно будет создать пользователя в базе данных

execute immediate 'create user user_name identified by password';


Никаких привилегий при этом давать пользователю не нужно. После того как апекс проверит существование пользователя и соответсвие пароля для этого пользователя в базе данных, сессия будет продолжаться под пользователем APEX_PUBLIC_USER (в общем случае :)) Недостатки способа - почти никаких, за исключением того что владелец схемы , в которой находится процедура создания пользователя, должна иметь привилегию CREATE USER. Ну и обработка ошибок и контроль существующих аккаунтов основаны на внутренних механизмах Oracle.

Если используется схема аутентификации Application Express, то тогда пара пользователь-пароль будет проверяться по внутреннему репозиторию Apex. Чтобы создать в нем пользователя можно использовать API-функцию APEX_UTIL.CREATE_USER
Но тут возникнет проблема с недостаточными привилегиями, потому как выполняться процедура будет под анонимным пользователем apex (страница регистрации то у нас PUBLIC). Обойти это можно, предварительно залогинив пользователя с административными привилегиями с помощью функции APEX_CUSTOM_AUTH.LOGIN. Только после создания пользователя нужно не забыть сделать APEX_CUSTOM_AUTH.LOGOUT.
В этом варианте есть одна неприятность: из-за выполнения LOGIN забивается весь дополнительный вывод htp, который делается для обработки результатов регистрации. Во всяком случае у меня этот глюк обойти не удалось в своё время. Как при этом обрабатывать ошибки регистрации - я без понятия :)

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

Остальные схемы (SSO, LDAP, DAD..) я не рассматриваю, потому что ни разу не встречал и ничего толком о них пока не знаю.