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

10 сент. 2008 г.

We are the champions

В минувшую субботу принял участие в любительском волейбольном турнире за кубок улицы Кубикова :) Вот как этот кубок выглядит:


Надо сказать погода выдалась жаркая, а играть пришлось с 9 утра до 6 вечера. Так что к окончанию турнира я был выжат как лимон. Еще бы, так прыгать :)


Но усилия были не напрасны! Наша команда, а назывались мы Hauzové, заняла первое место!

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..) я не рассматриваю, потому что ни разу не встречал и ничего толком о них пока не знаю.

13 авг. 2008 г.

FlexBuilder на Linux

FlexBuilder 3 на Linux тормозит!
Создал давече на своей рабочей станции виртуальную машину с гигом памяти. Поставил туда xubuntu, дабы ресурсы сэкономить. Установил FlexBuilder. И получил среду, в которой что-то разработать нервов никаких не хватит!
Работает из рук вон медленно. Немного ситуацию подправил параметрами запуска eclipse'а.
В файле <FLEX_HOME>/Adobe_Flex_builder.sh в последней строчке, где запускается эклипс, прописать параметры в соотвествии со следующей рекоммендацией:




Общая память машины Параметры
512MB : -vmargs -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=64m
1024MB: -vmargs -Xms512m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=128m


Пробовал стартовать всё это добро на fluxbox'е ради экономии ресурсов, но быстро отказался. Сам флуксбокс конечно шустрее работает. Но заметной разницы в работе эклипса-флэксбилдера я не заметил.

Но лихо беде начало! Пробуем запустить лёгкое флэкс приложение в firefox с установленным девятым флэш-плеером, и получаем полную жопу. Холостое движение мышкой в области флэшки вызывает такие судороги системных ресурсов, что становится больно на это смотреть.

Я расстроен. На следующей неделе наверное попытаюсь всё это пустить мимо виртуальной машины, дома на убунте. Если памяти прикуплю конечно.

31 июл. 2008 г.

Flex наступает 2

Неожиданно скорое продолжение получает мой предыдущий пост о перспективах для разработчиков приложений под Oracle и, в частности, о нарастующей роли Flex'а в этой области.
На сколько я понял, вчера Oracle предложили попользовать новую версию сайта своей тех.поддержки, попросту новый Metalink. Я самого письма не видел - если не трудно, поделитесь кто-нить его текстом.

Вообще, я целиком и полностью за RIA приложения. Возможности интерфейсов на самом деле впечатляющие. А если вы пробовали еще и написать что-нибудь на Flex, то тем сильнее понимаете все его преимущества.



Итак, беглый осмотр нового металинка и... С виду неплохой дизайн. SCM работает вполне шустренько.И, о боже :) не работает ни один скролл (правда только в firefox, в IE всё в порядке)! Заметные задержки при открытии выпадающих списков. Ладно - в целом ничего, ничего критичного за исключением скроллов. Идем дальше.

Закладка Knowledge. Видимо реализована отдельным flex модулем, судя по скорости загрузки. Опять же заметные тормоза на прорисовке меню. Дальше переходим к какой-нибудь статье. Опять тормоза. Видимо подгрузка снова отдельного модуля Knowledge Browser? Поиск - тормоза на эффектах выползания результатов. Короче на лицо злоупотребление ненужными эффектами.

Очевидно, что есть попытка использовать deep linking, но опять же работает кое-где и кое-как. Запомнить линк на найденную статью сходу не получилось - запоминает только результат поиска.

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

Дальше здесь и здесь в отзывах задается вполне резонный вопрос: зачем flash для сайта тех.поддержки? Это вызывает дополнительные трудности при доступе из-за политик безопасности организаций и т.д.
Опять же привязка к версии flash player'а.
Тем более этов выглядит странно, что Oracle выкладывает заведомо неполноценную версию. Торопятся к Oracle Open World 2008? Так имхо как-то не совсем удачно.

Вообще flex сам по себе позволяет избежать постоянного рендеринга страниц и предоставляет серьезную отзывчивость интерфейсов. Т.е. теоритически, получив немного большие тормоза на первоначальной загрузке, пользователь должен насладиться всем богатсвом и удобством флекс приложения в действии. А весят эти приложения в общем-то не так и много. Так что не знаю, стоит ли заморачиваться по поводу траффика. Не жрут его они много сами по себе.

Еще замечу, что пока еще действующая apex-реализация металинка тоже не выделяется удобством пользования и скоростью работы. Видимо, что-то в "консерватории" не так :)

Вобщем, первые впечатления - легкое недоумение "зачем?" и тихая радость "будущее не за горами" :)

28 июл. 2008 г.

Flash графики в Apex на полную мощность



Речь пойдет о построении графиков и диаграмм в Oracle Apex 3.1. Дело в том, что Apex для построения флэш графиков использует стороннюю компоненту AnyChart. Но для стандартных графиков используется AnyChart версии 3, в то время как intaractive reports строят графики с помощью AnyChart версии 4. Так вот эта самая четвертая версия выгодно отличается своим внешним видом от своей предшественницы.
Для сравнения галлерея AnyChart 3 и галлерея AnyChart 4 (или уже 5?). Замечу еще, что для AnyChart 4 требуется Flash Player версии 9 и выше, в то время как для AnyChart 3 достаточно Flash Player 8.
Итак, что мы имеем: Apex 3.1 с двумя встроенными компонентами для построения графиков и диаграмм. И к этому всему достаточно бедный интерфейс для их создания в самом апексе, да и то для устаревшей версии.

Будем исправлять ситуацию.
Для начала создадим Application Process типа OnDemand с именем GETDATA следующего содержания:

begin
htp.p('<anychart>
<settings>
<animation enabled="True"/>
</settings>
<charts>
<chart plot_type="CategorizedVertical">
<data_plot_settings default_series_type="Bar" enable_3d_mode="true" z_padding="0.2" z_aspect="0.8">
<bar_series point_padding="0" group_padding="0.2">
<tooltip_settings enabled="True"/>
</bar_series>
</data_plot_settings>
<chart_settings>
<title enabled="true">
<text>Multi-Series: Columns Clustered by Z-Axis</text>
</title>
<axes>
<y_axis>
<scale mode="Overlay"/>
<labels>
<format>{%Value}{numDecimals:0}</format>
</labels>
</y_axis>
</axes>
</chart_settings>
<data>
<series name="Series 1">
<point name="P1" y="22"/>
<point name="P2" y="34"/>
<point name="P3" y="16"/>
<point name="P4" y="32"/>
<point name="P5" y="68"/>
</series>

<series name="Series 2">
<point name="P1" y="23"/>
<point name="P2" y="45"/>
<point name="P3" y="46"/>
<point name="P4" y="86"/>
<point name="P5" y="45"/>
</series>

<series name="Series 3">
<point name="P1" y="25"/>
<point name="P2" y="56"/>
<point name="P3" y="67"/>
<point name="P4" y="32"/>
<point name="P5" y="27"/>
</series>

<series name="Series 4">
<point name="P1" y="33"/>
<point name="P2" y="29"/>
<point name="P3" y="56"/>
<point name="P4" y="49"/>
<point name="P5" y="77"/>
</series>
</data>
</chart>
</charts>
</anychart>
');
end;


Этот процесс всего лишь возвращает данные в виде xml, сформатированном для компоненты AnyChart. Формат xml можно подсмотреть в документации. Я для простоты взял готовый xml оттуда же. А в принципе, как раз на этом шаге можно моделировать график, исходя из своей фантазии и возможностей AnyChart, пользуясь исключительно знакомым pl/sql.

Дальше на странице, где будем "рисовать" график в поле HTML Header добавим:

<script type="text/javascript" src="/i/flashchart/js/AnyChart.js"></script>


И последнее. Создадим на странице HTML Region, в источнике которого пропишем:

<div id="chart1">
<script type="text/javascript" language="javascript">
var chart = new AnyChart('/i/flashchart/swf/AnyChart.swf');
var get = new htmldb_Get(null,$x('pFlowId').value,'APPLICATION_PROCESS=GETDATA',1);
gRet = get.get(null);
get = null;
chart.setData(gRet);
chart.write(chart1);
</script>
</div>


Вуаля! Посмотреть результат проделанного можно здесь - должно быть примерно то же самое что и на картинке в самом начале поста.

PS
Буду очень рад любым комментариям и поправкам к статье.

24 июл. 2008 г.

Очередной хостинг с Apex

Я уже упоминал о двух хостингах с апексом. Вот еще один. Имхо он даже повыгоднее revion'а получается. Здесь допустим за 50$ в месяц получается 250 метров тэйблспэйсов против 100 на ревионе.

22 июл. 2008 г.

Apex internal

Редко пользуюсь, поэтому всё время вылетает из головы следующая вещь. Если вы пользуетесь Oracle XE и сделали апгрэйд апекса до версии 3.1, то в форме логина, для того чтобы войти как администратор апекса, в поле Workspace нужно ввести INTERNAL. Пользователь соответсвенно ADMIN. Пароль тот, который задавали при установке Apex.

Кстати, недавно в блогах проскакивала новость, что вовсю идет работа над Apex 4.0. Что там будет "эдакого" пока неизвестно.

30 июн. 2008 г.

Неужели в самом деле..

Oracle SQL Developer Statement of Direction утверждает, что в следующем релизе SQLDeveloper'а мы получим инструмент для визуального проектирования ER диаграмм базы данных в виде опционального расширения! Что не может не радовать! Я надеюсь это расширение не будет платным. Я как-то не встречал пока такой фунциональности в бесплатных продуктах. Справедливости ради замечу, что уже существует плагин к SQLDeveloper'у для создания ER диаграмм, но он вроде как платный. И я его не пользовал - ничего сказать не могу.
Будем ждать.

27 июн. 2008 г.

Немного хип-хопа ;)

Пятница, расслабляемся под хип-хоп

Noize MC


Гидропонка

DAD Report

Вот сделал отчет для SQLDeveloper'a с полной информацией по зарегистрированным DAD в XMLDB для Oracle 10g.
Отображает глобальные аттрибуты, имена DAD-ов, их маппинги и полный список аттрибутов.

25 июн. 2008 г.

SQLDeveloper. Бывают совпадения :)

Не скажу с какой версии, но появился в SQLDeveloper такой интересный пункт Manage Database. Увидеть его можно вызвав контекстное меню на значке соединения в дереве. Полезного конечно там для себя ничего не нашел. Но этот отчет я уже где-то видел:


Сравните с первой картинкой вот из этого поста. Похоже правда? :) Цифры на одной и той же базе получаются тоже одинаковые, что радует :)

Кстати, в этой новой вкладке кнопка Shutdown доступна только если соединение с опцией SYSDBA, что естественно.
Ну и по-моему в будущих версиях SQLDeveloper'а нужно ждать развития этой функциональности.. Хотя базу рестартовать лично я буду исключительно из sqlplus.

24 июн. 2008 г.

PL/SQL HTTP сервис

Заметка о том, как вызвать процедуру PL/SQL через URL и получить результат в HTTP. Постараюсь быть кратким. Используется Oracle 10 XE с установленным XMLDB. Все подробности по этой опции в документации. Отмечу лишь, что для настройки нужно обладать ролью XDBADMIN.

Итак. Для начала смотрим на каком порту слушает XMLDB:
select DBMS_XDB.GETHTTPPORT() from dual;

Можно установить любой другой порт по желанию:
exec dbms_xdb.sethttpport(8080);

Синтаксис URL будет следующий: http://host:port/dad/procedure?parameter=value

Создадим DAD:
begin
dbms_epg .create_dad('dad', '/dd/*');
end;
/

здесь первый параметр - имя DAD (внутреннее, для последующего использования в настройках), второй - путь (используется в URL при запуске). Вобщем не обязаны быть похожими.

Впринципе уже можно пробовать запускать какую-нибудь процедуру типа helloworld:
create or replace procedure helloworld as
begin
htp.p('hello world');
end helloworld;
/


через URL http://localhost:8080/dd/HELLOWORLD

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

Следующий шаг - это сделать так, чтобы при запуске URL избежать запроса авторизации, а запустить процедуру с привилегиями предопределенного пользователя. Для этого нужно выполнить
begin
dbms_epg.set_dad_attribute('dad','database-username','TT');
end;
/

Первый параметр - имя DAD, второй - имя аттрибута DAD (оставить без изменений), третий - имя нужного пользователя.

И авторизуем DAD:
begin
dbms_epg.authorize_dad('dad', 'TT') ;
end;
/


Еще понадобиться выполнить следующий код:
declare
l_xml_config sys.xmltype;
anonymous_already_set exception;
pragma exception_init(anonymous_already_set,-30936);
begin
select insertchildxml(xdburitype('/xdbconfig.xml').getxml(),'/xdbconfig/sysconfig/protocolconfig/httpconfig','allow-repository-anonymous-access',
xmltype('true'),
'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"') into l_xml_config from dual;
dbms_xdb.cfg_update(l_xml_config);
commit;
exception
when anonymous_already_set then
null;
end;
/


Это нужно для того, чтобы разрешить XMLDB анонимные соединения. Потому что несмотря на то, что мы указываем имя пользователя DAD по-умолчанию, физически соединение происходит под ANONYMOUS.

Свинство и SQLDeveloper

Обнаружил багу при создании отчетов в SQLDeveloper: при сохранении pl/sql отчета любого типа (например plsq-dbms_output) из кода вырезаются все точки с запятой! Ну не бред ли!?? Причем в какой-то из предыдущих версий у меня еще всё работало. Но последние 2 попробовал - один хрен.
Обидная бага такая! Очень неудобно отлаживать почти готовые репорты.
Обходится криво: делаете экспорт отчета в xml файл, в этом файле расставляете обратно точки с запятыми и делаете импорт отчета обратно. Но при пересохранении отчета в мастере SQLDeveloper'а опять похерится. Правда хорошо, что хоть файл не трогает.

2 июн. 2008 г.

Перспективы для разработчиков или Flex наступает

Вот набрел на интересную статью: Гибридизация Java. Имхо очень актуально для разработчиков, под Oracle в том числе.
Тем более в свете последних событий..
Oracle Forms скорее мертв, чем жив;
ADF - воздержусь, хотя почитателей наверняка много;
Apex - работает и много усилий не требует, но опять же ограничения.
Интересующиеся знают, что почти весь metalink.oracle.com написан на апексе и asktom.oracle.com Примеров конечно больше, но эти , имхо, показательны в плане позиции Apex внутри Oracle.
Но тут на Oracle OpenWorld в ноябре 2007 презентуется ряд продуктов разработанных на Flex: Новый Enterprise Manager (интересно, когда мы его увидим в действии), часть металинка, а именно Software Configuration Manager (уже можно пробовать, если есть доступ), часть BI Publisher'a...
Правда заставляет задуматься? :) Видимо наступление RIA приложений не за горами. С нетерпением жду.. пошел читать Flex :)

30 мая 2008 г.

Прикольный viewer

Нашел вот случайно Highslide JS. Понравилось. При случае включу в какое-нибудь Apex приложение. И стоит недорого, что приятно!

29 мая 2008 г.

Знакомство с чешской полицией

Вот и произошло сегодня первое за 2 года пребываения в Чехии знакомство с полицией. Повод не самый ужасный: у меня украли с машины задний номерной знак (эспэзетко на местном). Я знал, что когда-нибудь это произойдет, ибо номера нужно прикручивать!
Вобщем, алгоритм действий такой: звоните в полицию (158), там вам говорят адрес ближайшего полицейского участка. Идете в участок. Там без лишних проволочек заполняют протокол. Потом вместе с полицией съездили на "место проишествия", т.е. к дому, где осталась машина с неприкрытым задним знаком. Они сфоткали фас, анфас авто. Потом выдали мне бумагу, что заявление принято, и я отправился в магистрат получать новый номер. В магистрате нужно при себе иметь большой и малый тех.паспорт, побыт, 450 крон, там заполнить заявление и приложить подтверждение из полиции. Потом сдаешь оставший номер и получаешь взамен новых два :) Весь процесс занял около 3 часов. Кстати, в полиции тоже нужен техничак и побыт.

28 мая 2008 г.

SQL Developer. А вы знаете, что...

А вы знаете, что SQLDeveloper поддерживает переменные подстановки? Если когда-нибудь пытались выполнить запрос, в котором присутсвует амперсанд, то наверняка знаете.
Что интересно, они ведут себя почти так же как и в SQL*Plus. Я заметил лишь различие в поведении закомментированных переменных. (Кстати сказать, отключается запрос на подстановку значения тоже с помощью команды SET DEFINE OFF)

И еще одна полезность, которая унаследована от SQL*Plus: login.sql
В плюсе это файл, который запускается каждый раз когда происходит соединение с базой. (Это не всегда было так, но не суть..)
Точно так же в SQLDeveloper'е в настройках можно задать файл, который будет запускаться каждый раз при соединении с базой. Смотреть Tools -> Preferences -> Database (Run connection startup script on each new database connection).

Сюда, например, можно запихнуть пресловутый alter session set time_zone = '+nn:00' для избежания ошибки ORA-01882: timezone region not found при выборке через db link.

Маленький трюк: Включить чекбокс и задать файл на самом деле у меня оказалось мало. Чтобы эта функция "активизировалась" еще нужно создать новый Connection. Потом его можно удалить.

Nick Cave

Сходил жеж в субботу на концерт Ника Кейва. Это было просто супер! Словами такие эмоции описать сложно, потому и не буду пытаться. Обязательно схожу еще раз, когда приедет.
Кстати, живьём новый альбом слушается гораздно мощнее, чем в записи. Вжувую это просто БОМБА!

Пару слов по организации концерта. Мне всё понравилось! Бывает жеж такое :) Можно попытаться сравнить с похожими мероприятиями допустим в Минске, но ничего не выйдет. Здесь я пришел и отдохнул. Никаких очередей на вход-выход, никто не бегает в форме и не следит чтоб не курили... Большое количество "буфетов". Пиво кстати 35 крон стоило.
Ну и публика.. очень разные люди. Ну просто совершенно разные!

Из минусов - 2 дня после концерта болела шея :) Кто на концертах отрывается - тот поймет.

23 мая 2008 г.

Ширина колонки в отчетах Apex

Казалось бы - что может быть проще задать фиксированную ширину столбца в отчете Apex. А не тут то было. Понятно было сразу, что нужно изменять свойство CSS Style для колонки, но как? Просто задать width:100px; результатов не даёт. Решение искал долго, пока не наткнулся на оракловских форумах на такое значение: display:block;width:100px;overflow:hidden;.
Работает!

13 мая 2008 г.

Текущее состояние дел

Давно не писал про житьё-бытьё. Главное событие на сегодняшний момент - закончилась эпопея с полицией. Наконец вся семья получила в паспорта долгосрочное пребывание (dlouhodoby pobyt) до марта следующего года. Так что до конца этого года надеюсь полицию не увидеть, ибо задолбался. Сегодня с 4х утра на ногах, до сих пор не жрамши :(

Еще закончилась моя работа над одним из проектов в третьей фирме. Т.е. я опять вернулся в свою родную контору. У нас тут офис отремонтировали - стало вполне даже уютненько. Набрали народу нового. Теперь у меня за спиной несколько человек сидит, чего я не люблю. Да ну и хрен с ними..
Из последнего проекта очередной раз извлёк, что датабазника (т.е. меня :)) нужно звать на начальной стадии проекта, а не когда идет внедрение затыкать дырки. В этом проекте лажи со стороны программистов было мало - молодцы, основная лажа была в архитектуре. Причем как вы понимаете эти недочеты уже исправлять было поздно. Вобщем, сопровождать это добро мне не хотелось бы, но работать оно будет.

Пока нового проекта нет, потому погрузился в изучение новых для меня горизонтов..

А еще немного о том, как провожу свободное время, пишет моя жена.
Вот мы ездили в Пругонице
Здесь "отдыхаем" по поводу пасхи :)
А это мы ездили в Кутну Гору и Костнице. Кстати сказать, меня Костнице очень даже впечатлили, хотя я не предполагал что так будет. Много всяких мыслей в голову приходит после такой экскурсии. Правда ничего толкового :)
Ну и там еще всякие мероприятия, поездки, пиво и т.п.

За сим откланиваюсь

12 мая 2008 г.

Новый JDeveloper

Вышел новый Oracle JDeveloper 11g. Если не ошибаюсь, то 1-го мая, так что можно сказать с пылу с жару. Вот качаю попробовать. Не то чтобы я его активно использовал, но иногда приходится, даже несмотря на моё не самое хорошее отношение к Java.

5 мая 2008 г.

Опять про Родину..

Думал домой в июне съездить на машине, а не тут то было! Родное государство как всегда усложняет жизнь на ровном месте. Читать здесь. Таким образом, нужно дополнительных 1500 евро для залога на автомобиль. И ситуация с возвратом при выезде, как я понял, до сих пор неоднозначна. Матерных слов не хватает!!! Поеду поездом.

Просмотр графики в убунте

Я уже писал как-то про просмотр графики в линуксе. До недавнего момента использовал для просмотра gqview а для редактирования КДЕшный showphoto. Назвать сие решение удобным язык не поворачивается. И вот на днях искания привели меня к GTHUMB. Это почти то что нужно! Ворочать картинки можно пачками, а не по одной. Менять размер тоже. Листает файлы шустро, интерфейс во всех отношениях приятный (предосмотр, сортировка и т.п.) И даже есть функция уменьшения эффекта красных глаз. НО, есть одно но. Эта самая функция какая-то корявая!!! Поколупаться пока времени особо не было, но с ходу ей пользоваться не получилось. Потому showphoto пока не сносил - в нем это реализовано просто отлично! Нормально работает. Изначально тестил на неправильной фотке - там глаза вообще никакой софт не берет. Для исправления красных глаз нужно просто кликнуть по зрачку. Оценка все 5 баллов! То что мне было нужно, факт!

29 апр. 2008 г.

"Поправка на ветер"

Трик с графическим ползунком, который использовался в постах здесь и здесь немного нужно подкорячить для новой версии SQLDeveloper'a (EA3), где он отказался воспринимать дробные числа. А именно нужно округлить или обрезать числа:
'SQLDEV:GAUGE:0:100:0:90:'||to_char(trunc(used))
Ну и немного изменился внешний вид:


Вообще, из обновок в EA3 сразу заметна новая закладка Files в дополнение к старым Connections и Reports. Т.е. навигация по скриптам на дисках стала реально удобней. Плюс ко всему видно, что есть поддержка CVS, и это радует, вот:

К нам едет Серж Танкян!

Забирал сегодня билет на Ника Кейва и увидел вывеску - 5 июня в Остраве выступает Серж Танкян со своим новым альбомом, о котором я уже писал. Эхъ, жаль что пропущу!

25 апр. 2008 г.

Карта табличного пространства в SQL Developer

Очень уж мне нравится карта табличного пространства, которую умеет делать Enterprise Manager. Я как-то больше не встречал инструментов с такой функциональностью. А жаль - очень удобно визуально посмотреть на сколько фрагментированы таблицы и сколько они пожирают пространства.
Для себя я реализовал похожую функциональность средствами SQLDeveloper'a в виде псевдографического отчета. К сожалению с лёту не вышло заставить его подгружать графику и показывать всплывающие подсказки на екстентах (хотя идеи как это сделать есть). Есть некоторые недочеты о которых я знаю: не отображаются header'ы и не помечаются свободные блоки. Это дело будущих версий. Возможно, где-то нехватило знаний, и отчет не будет универсальным (например, я исходил из минимального размера экстента в 8 блоков) - тут тоже надо будет поработать с документацией. Однако, начало положено.
Итак, первый отчет предоставляет информацию использованию табличных пространств. Child отчет снизу показывет сегменты выбранного пространства, отсортированные по убыванию выделенного им пространства:


Вторая закладка в этом отчете показывает общую карту экстентов:


При помощи фунуции drill-down можно перейти к более полезному отчету


Второй отчет показывает всё тот же список сегментов. Но теперь выделив интересующий сегмент можно внизу увидеть на карте его экстенты (помечены X):


Вот xml первого отчета, а вот второго.

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

Ubuntu 8.04

Вышла очередная stable версия убунты! Вот чешу репу - апгрейтиться чтоль...
Подробности здесь.

24 апр. 2008 г.

Митинг

Шел сегодня сутра на работу и встретил вот такое зрелище:








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

Меня порадовал сам факт! Люди почувствовали несправедливость и высказали это публично. А как подумаешь про Родину.... чтоб там хотя бы так люди высказывали своё несогласие - мирным митингом перед рабочим четвергом. Эхъ...

21 апр. 2008 г.

Управление пользователями в SQLDeveloper

Неоднократно замечал, что некоторые считают, что в SQLDeveloper нельзя управлять пользователями и их привилегиям. На самом деле это не так!
Во-первых есть встренная форма для создания и редактирования пользователей, до которой можно добраться вызвав контекстное меню на узле дерева Other Users и выбрав Create user. Или в этой же ветке выбрать пользователя и в контестном меню нажать Edit user.
Хотя прямо скажу - я не любитель расставлять галочки. Но может быть кому-то так удобней. Во всяком случае из этой формы можно почерпнуть DDL скрипт на создание пользователя. Вот как это выглядит:


Во-вторых на закладке Reports среди среди прочего есть несколько отчетов по пользователям, хотя меня они тоже не особо впечатлили:


Ну и последнее, ради чего и затевался пост, это возможноть создавать собственные довольно продвинутые расширения для SQLDeveloper. Причем создавать можно и формы, наподобие той, которая упоминалась в первом пункте, и отчеты с дополнительной функциональностью, как например отчет по текущим сессиям с возможностью включения трассировки и kill session (пункт меню Tools -> Monitor Sessions)

Я для себя создал такой отчет по привилегиям пользователей, который включает в себя основной отчет - список пользователей и их аттрибуты и четыре подчиненных отчета:
1. Роли выбранного пользователя
2. Объектные привилегии
3. Системные привилегии
4. DDL скрипт на создание пользователя
Причем привилегии и роли отображаются как выданные напрямую непосредственно пользователю, так и полученные пользователем через другую роль.

В основном отчете добавлено 2 дополнительных пункта меню:
1. Clone user - для создания нового пользователя с точно таким же набором привилегий, как и выделенный пользователь.
2. Drop user - для удаления пользователя.
Скачать можно с OTN. Вот прямой линк на xml. Установка проста: сохранить xml у себя. На папке с отчетами в SQLDeveloper кликнуть на пункт контекстного меню Import, выбрать сохраненный файл и готово.
Вот сие творение:


18 апр. 2008 г.

Видео Тото

Немного прикольного видео с ТОтохой, сняли уже недели 2-3 как, но тока счас вот собрались выложить. смотреть как всегда со звуком!





ЗЫ
Оно вообще случайно здесь оказалось, но пускай будет! А предназначалось изначально для Аниного блога

В Прагу приезжает Nick Cave

24 мая в Прагу приезжает Nick Cave. Концерт в поддержку нового альбома "Dig, Lazarus, Dig!!!" состоится в T-Mobile Arena. Билеты можно заказать здесь.
Прошлый концерт полтора года назад я, к сожалению, пропустил. Надеюсь на этот схожу!
Присоединяемся!!!

17 апр. 2008 г.

Маленькие радости SQLDeveloper'a

Вот как можно приукрасить стандартный отчет об использовании табличных пространств:


Трюк весьма прост:
select tablespace,
'SQLDEV:GAUGE:0:100:0:90:'||to_char(used) usage,
allocated_mb,
used_mb,
free_mb,
used,
data_files from (
select nvl(b.tablespace_name,
nvl(a.tablespace_name,'UNKNOWN')) Tablespace,
kbytes_alloc Allocated_MB,
kbytes_alloc-nvl(kbytes_free,0) Used_MB,
nvl(kbytes_free,0) Free_MB,
round(((kbytes_alloc-nvl(kbytes_free,0))/kbytes_alloc)*100,2) Used,
data_files Data_Files
from ( select sum(bytes)/1024/1024 Kbytes_free,
max(bytes)/1024/1024 largest,
tablespace_name
from sys.dba_free_space
group by tablespace_name ) a,
( select sum(bytes)/1024/1024 Kbytes_alloc,
tablespace_name,
count(*) data_files
from sys.dba_data_files
group by tablespace_name )b
where a.tablespace_name (+) = b.tablespace_name
)
order by 1

15 апр. 2008 г.

George Winston

Вот, выкачал се альбом George Winston - Night Divides The Day.
Это The Doors сыгранное на фортепиано! Классно - почитателям doors слушать обязательно!
На ютубе, к сожалению, не нашел экзампл. Так что, кому не лень возиться с рапидой, качать здесь и здесь.
А вот для затравки разворот с диска:

10 апр. 2008 г.

SQL Developer

Опс! Буквально позавчера SQLDeveloper обновился до EA3. Качать здесь.
Я пока не спешу, потому что у меня неясности с работой - еще не знаю где буду работать в следующем месяце. Возможно опять прийдется переселяться, так что пока тут всё работает - трогать не буду :)
Замечу лишь, что из беглого просмотра New Features заинтересовали поддержка CVS и отчеты AWR.

7 апр. 2008 г.

Махина

В субботу приобрел себе махину. Заняло это времени целый день. Сам поиск начался уже давно. Я, как приверженец японских машин, выбирал из следующих вариантов:
1. Toyota Carina
2. Suzuki Baleno
3. Nissan Primera
В поисках подходящих экземпляров более-менее регулярно прочесывался инет. Судя по описанию, варианты неплохие были, но, как правило, где-то вне Праги. Кое-как насобиралось пять вариантов к осмотру: 2 тойоты, 2 ниссана и на закуску 1 сузуки.
Сузуки был оставлен на закуску, потому как без кондиционера.
Вобщем одна тайото была забраковано мной лично на первоначальном этапе просмотра - это был ужос.
Потом последовал ниссан универсал. Этот вариант заслуживает отдельного внимания, потому что приключилась с ним забавная история. Его продавал какой-то частник чех. Договоились с ним, что он подгонит сутра свой товар на мной указаный автосервис. Сервис тот естественно изначально русский. Осмотр проходил вроде нормально. Был осмотрен кузов на предмет битости, прослушан мотор.. Оставалось поднять на подъемнике. Подъемник был занят, и требовалось подождать минут пять. И тут чех ни с того ни с сего мне говорит: "Я раздумал вам продавать эту машину." Прыгает в свой ниссан, я пытаюсь его как-то словами остановить, он мне еще что-то лепечет, про то, что не нравится ему как смотрят его машину... и уезжает. Всё произошло в мгновение ока. Никто ниче так и не понял. Чел видать чего-то испугался. Чудик!
Дальше на базаре на черном мосту нашлись последние 2 варианта. Тойота и Ниссан. Оба хэтчи. Я с первого взгляда запал на Тойоту, хотя битость была на лицо даже моим ламерским взглядом! Но увы, приехавший автоэксперт Сергей забраковал её по полной.
Надо сказать, что купленный в конечном итоге ниссан тоже немного с дегтем. Однако дефекты на мой взгляд несущественные и надеюсь будут исправлены в ближайшее время.
Представляю вам Nisssan Primera 2.0 (P11), hatchback, РКПП, год выпуска 1997, цвет vínová metalíza (красные машины не люблю органически :), пробег 142 тыщи по тахометру (в реальности тыщ на сто больше - поездила машинка)

еще пара фоток в Анином блоге

3 апр. 2008 г.

Anna Ternheim - Lovers Dream

Припев очч нравиццо



Стоит посмотреть и остальные клипы!

27 мар. 2008 г.

Трассировка сессий в Oracle

Кратко о включении трэйсов (начиная с 10g):
Куда складываются трэйсы можно увидеть коммандой sqlplus'a:
show parameter user_dump_dest

"Пометить" свой трэйс можно так:
alter session set tracefile_identifier ="alp";

Включить трэйс для текущей сессии:
dbms_monitor.session_trace_enable();
Чтобы в трэйс включались переменные подстановки:
dbms_monitor.session_trace_enable(BINDS => true);
Для чужой сессии нужно знать SID и SERIAL# (смотрится в V$SESSION):
dbms_monitor.session_trace_enable(SID, SERIAL);

Запрос для извлечения полного пути к трэйсу:
select
u_dump.value || '/' ||
db_name.value || '_ora_' ||
v$process.spid ||
nvl2(v$process.traceid, '_' || v$process.traceid, null )
|| '.trc' "Trace File"
from
v$parameter u_dump
cross join v$parameter db_name
cross join v$process
join v$session
on v$process.addr = v$session.paddr
where
u_dump.name = 'user_dump_dest' and
db_name.name = 'db_name' and
v$session.sid = :SID and
v$session.serial# = :SERIAL
/


Не забываем выключать трэйсы с помощью аналогичных disable процедур.
Ну и вообще, смотрим документацию на пакет dbms_monitor.
Можно включать трассировку, например, для всех ссессий с определенным MODULE или ACTION и т.д.

Для обработки трэйсов применяем trcsess для консолидации нужной информации из выбранных трэйсов (удобно при shared соединениях или пулах коннектов). И затем tkprof.

26 мар. 2008 г.

The National - Ada

Вот такое у меня настроение:

25 мар. 2008 г.

Отсылка сообщений в google talk из Oracle

Ответ на комментарий в этом посте.
Прикрутить к Oracle python отсылку соообщений можно легко (начиная с 10g).
В зависимости от операционной системы содадим либо shell скрипт, либо bat. Для примера я использовал Oracle XE на Windows XP. Создаем сначала python скрипт с параметром для текста сообщения:

import sys,os,xmpp
cl=xmpp.Client('gmail.com',debug=[])
cl.connect()
cl.auth('your_name','your_password')
cl.send(xmpp.protocol.Message('your_friend@gmail.com', sys.argv[1]))
cl.disconnect()

Создаем простенький bat-файл (send2gtalk.bat)

c:\Python25\python.exe c:\tmp\send2gtalk.py %1


Дальше в sqlplus выполняем:
exec dbms_scheduler.create_program('SEND2GTALK', 'EXECUTABLE', 'C:\tmp\send2gtalk.bat', 1, FALSE);
exec dbms_scheduler.define_program_argument('SEND2GTALK', 1, 'MESSAGE_TEXT', 'VARCHAR2');
exec dbms_scheduler.enable('SEND2GTALK');
exec dbms_scheduler.create_job('JOB_SEND2GTALK', program_name=>'SEND2GTALK');
exec dbms_scheduler.set_job_argument_value('JOB_SEND2GTALK', 1, '"test text"');
exec dbms_scheduler.run_job('JOB_SEND2GTALK');


Всё. Для отсылки сообщения нужно вызывать последние две команды:
exec dbms_scheduler.set_job_argument_value('JOB_SEND2GTALK', 1, '"test text number 2"');
exec dbms_scheduler.run_job('JOB_SEND2GTALK');


Примечание для Oracle Xe: В оракл XE по-умолчанию служба шедулера выключена. Поэтому для работы нужно стартануть сервис OracleJobSchedulerXE.

21 мар. 2008 г.

Авария



Вот такая вот авария вчера случилась на трассе Прага-Брно. В снежную бурю в общей сложности наколотилось пару сотен аут. В пробке застряли около 20 000 человек.
Такие вот злые шутки бывает шутит Март. И прогнозы на выходные совершенно не радужные..

Понаехало итальяшек.. :)

Вот любопытная статья.
Кратко по-русски:
В Марте в Прагу везут на экскурсии итальянских подростков. У тех видать как раз каникулы. Надо сказать, сам сталкивался на улицах с этими чудиками - лично меня раздражают. Ходят толпами, ведут себя невоспитанно.. и на вид тупые :D. Короче, подростки - че с них возмешь.
Так вот у них развлекалово есть - тырить что ни попадя в магазинах и сувенирных лавках. Собственно об этом и статья. Тырят они не ради самих вещей, и ради адреналина. Хули - подросток не задумывается, что то, что он стырил, потом с кого-то взыщут.
Ну и естественно, максимально, что им грозит - небольшой штраф..
Вот если бы отводили в подсобку, да пару раз в фанеру прописывали, может быть и не хотелось бы такого адреналину, а так - пустое. Тырили и будут тырить. Ну и чехи естественно стонут. И касается это не только магазинов, но и ресторанов и гостиниц, где те также наводят непорядки. Полиция ниче сделать не может...
Вот так вот..

19 мар. 2008 г.

Firefox в Убунте

У файрфокса в линуксах есть одна неприятная особенность - не работают горячие клавиши при включенной русской раскладке. Совершенно случайно наткнулся на решение: Russian hotkeys bugfix

17 мар. 2008 г.

Oracle XE и SQL Developer

Установил впервые себе на винду Oracle 11g XE. Раньше ничего кроме Enterprise или на крайняк Standart не устанавливал.
Впечатления - прикоооольно :) Такая игруха для начинающих! Ну или для тех кому возиться лень с более серьезными дистрибутивами. Запустил инсталятор - всё поставилось, сконфигурилось, пользуйте! Ярлычки старт-стоп базы.. И даже ярлычок бэкап имеется! Чума кароче!
Апекс сразу установлен и включен, правда версии 2.1. Но ничего, тут написано как апгрейтнуть до 3.1, что сразу и было сделано. Чтобы добраться до Application builder'a нужно сначала создать нового пользователя и зайти под ним - только тогда появится ссылка на него.
Подлый SQL Developer при соединении с XE выдал ORA-12705. Чтобы избавится, в файл sqldeveloper.conf нужно добавить строку AddVMOption -Duser.region=US.
Вобщем, для себя XE решил оставить. Пописать для души иногда хочется - а XE позволяет это сделать быстро и удобно.

14 мар. 2008 г.

Удаление архивлогов

Просто для себя памятка по удалению архивлогов (склероз).
Пример:
rman target=sys@database
list archivelog until time 'sysdate-30';
delete archivelog until time 'sysdate-30';

7 мар. 2008 г.

SQL Developer

Ой, 20 февраля вышел долгожданный релиз SQL Developer 1.5. А пацаны то не в курсе!
Поскольку это для меня нынче один из основных инструментов для разработки на ряду с sqlplus и gvim, то я очень рад. Ибо предыдущая версия 1.2.1 уже местами надоела. Надеюсь появилось что-нибудь новое и полезное. Пошел качать....

3 мар. 2008 г.

Радио

Последнее время слушаю на работе RadioParadise. Название конечно какое-то странное, но репертуар подобран очень даже со вкусом. Рекоммендуется к прослушиванию!

The Stranglers - Golden Brown

Вспомнилась еще одна очень хорошая группа, и просто замечательная песня:

29 февр. 2008 г.

Python - отправка сообщений в google talk

Короткий пример на питоне отправки сообщений в гуглток:

import sys,os,xmpp
cl=xmpp.Client('gmail.com',debug=[])
cl.connect()
cl.auth('your_name','your_password')
cl.send(xmpp.protocol.Message('your_friend@gmail.com','your_message'))
cl.disconnect()


Для работы нужно 2 библиотеки:
xmpppy
dnspython
Для их установки нужно всего-лишь скопировать папки xmpp и dns из соответсвующих архивов в любую из папок, которую в питоне выдаст скрипт
import sys
sys.path

Много алертлогов

Вот в этом сообщении описывалось как в *nix среде получить отдельный alert.log на каждый день.
Это удобно для анализа сообщений и не даёт со временем разрастаться файлу до неприличных размеров.
Теперь представим, что у нас много баз. И в каждый алертлог нужно периодически посматривать. В идеале получается, сутра по приходу на работу, пару раз в течении дня и перед уходом с работы. Сейчас вот имею 3 сервера под соляркой, на каждом по 3 экземпляра - итого 9. А еще ожидается в ближайщем будущем кластер из двух нод. Просмотр логов превращается в мучение.
Быстрое решение №1.
Идея копировать логи по запросу к себе на машину. Если машина под каким-нить linux'ом - scp и нет проблем. Если под виндой...
Устанавливаем WinSCP. В директории куда инсталировали будет файл winscp.com - это command line интерфейс.
Теперь создаем файл (params) примерно такого вида:
open oracle:oracle_password@host:22
get /u01/app/oracle/admin/LIVEDEV/bdump/alert_CFDLIVEDEV.log
get /u01/app/oracle/admin/PARAMDEV/bdump/alert_CFDPRMDEV.log

open oracle:oracle_password@host:22
get /u01/app/oracle/admin/LIVETEST/bdump/alert_CFDLIVETEST.log
get /u01/app/oracle/admin/PRMTEST/bdump/alert_CFDPRMTEST.log
get /u01/app/oracle/admin/ARCHTEST/bdump/alert_CFDARCHTEST.log
...

Здесь команда open устанавливает соединение с host под пользователем oracle с паролем oracle_password.
Команда get копирует указаный файл на локальынй компьютер в текущую дерикторию.

И последнее, создаем run.bat файл в той же директории что и params
rm alert*
"c:\Program Files\WinSCP3\WinSCP.com" /script=params

который удалит все алертлоги из текущей директории и скопирует свеженькие с серверов.

Решение №2
По идее то же самое можно сделать с помощью cygwin. Вобщем, нужно написать скрипт содержащий scp команды и запустить его (в Windows с помощью cygwin). Только в стандартном scp нельзя задать пароль. Поэтому нужно повозиться с созданием публичного ключа и регистрацией его в ssh на серверах. И работать это будет до смены ip адреса локальной машины. Ну или вводить пароль вручную :)

SQL Formatter

Плагин к текстовому редактору vim для форматирования SQL кода
http://www.vim.org/scripts/script.php?script_id=492

Красивая песня

27 февр. 2008 г.

alert.log

Чтобы каждый день файл alert.log был новым, нужно существующий переименовать. А оракл при новом сообщении создаст чистый alert.log
В *nix для того, чтобы автоматически файл переименовывался, в таблицу планировщика (crontab -e) нужно добавить строку
mm hh * * * mv PATH/alert_DB_NAME.log `date +PATH/alert_DB_NAME_\%d_\%m_\%y.log`

Где mm - минуты, hh - часы, когда будет запускаться переименовывание файла. Ну и путь понятно нужно ставить соответсвующий. В результате к имени файла будет добавлена дата.

21 февр. 2008 г.

Анекдот

Алексей Васильич недавно анекдот прислал:
Два чеха в Праге смотрят выпуск новостей. Репортаж из Ирака, на экране руины и горы трупов.

- Послушайте, пан, как нам сильно повезло!
- В чём? Что мы в НАТО и в Евросоюз вступили?
- Нет. В том, что в 1968 году СССР ещё не был демократическим государством.


Надо бы его чехам рассказать :)

Егор Летов

19 февраля умер Егор Летов. :(

18 февр. 2008 г.

htmldb_Get

Вот здесь самое внятное описание апексовой javascript функции hmldb_Get.

Girl

В продолжение предыдущего поста...
Хорошая песня, хорошее исполнение

Elect The Dead


Это за кадром съемок клипа Sky Is Over из сольника Сержа Танкяна "Elect The Dead". Серж выпустил отличнейший сольник! Уже пару месяцев слушаю в плеере. Что там говорить - класс! Вот, что говорят об альбоме его создатели. Внимание на майку Сержа ;)
Отличная музыка!
Sky Is Over
Lie Lie Lie
Empty Walls
Saving Us
...

13 февр. 2008 г.

Бэм vs Павлов

Ходили сегодня на обед в окрестностях Старомака. Обед как обед. А вот по дороге до ресторана увидели Павла Бэма. Это мэр Праги. Шел себе в пинжачке, спешил куда-то.. Один! Конечно, чего ему бояться. Ведь он не запрещает продажу пива в летних кафе. А вот пана Павлова смею заверить - в Праге горожане пьют пиво! Именно пиво, а не то, что продается в минских летних кафе. И пьют именно в кафе и ресторанах, потому что их много, и они доступны. Хотя как жеж я его заверю - он сам кого хочешь заверит :(

12 февр. 2008 г.

Корпоратив

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

11 февр. 2008 г.

a la punto

Утилита для переключения раскладок клавиатуры русская-английская наподобие виндового Punto Switcher для linux - xneur. Вообще, к ней есть какие-то графические утилиты настройки. Но, имхо, они нафик не нужны, потому что после установки я изменил только одну настройку - переключил в ручной режим управления, так как в автоматическом режиме такие программы просто достают переключением не вовремя.
Запускать программу просто - Alt+F2, в строке набрать xneur, всё. Для автозапуска нужно прописать в Сессии.
В работе программы замечена интересная особенность: если свернуть или закрыть окна всех иксовых приложений, то она начинает что-то упорно делать, нагружая процессор. Правда успокаивается сей же час, как только начинаешь работать с каким-нить приложением - то есть не напрягает. Но сам факт! Пока не исследовал, че она там делает.

Просмотр картинок в Убунте

В Гноме по-умолчанию в качестве просмотрщика картинок установлен eog (Eye Of Gnome). Ничего против него я не имею, только очень уж медленно он листает картинки. Поэтому eog был успешно снесен, а вместо него пока стал gqview. Просматирвает изображения на порядок быстрее. Из неудобств - нельзя скрыть левую панель со списком файлов так, чтобы осталась видна панель инстументов, нет функции уменьшения эффекта красных глаз.
Поиск подходящего просмотрщика будет продолжен..

8 февр. 2008 г.

2007 год

Тут справедливо заметили, что за 2007-й год в блоге наблюдается дыра. А вот и ДА! Есть такое дело. Не писалось как-то..
Так что, вкратце перескажу что происходило в этот период...
Итак, к началу 2007 года я находился в дружественной Чехии 7 месяцев. За эти 7 месяцев я научился в господах говорить "ДВЕ пива" вместо привычного "два пива", играть в "Дальнобойщиков" и управляться с типом XMLTYPE в Oracle. Жизнь текла медленно и неторопливо, но не за горами светило рождение сына. Вопрос финансов начинал становится ребром, да и с текущим проектом была полная ..опа. (Кстати, этот проект и по сей день находится там). Поэтому после недолгих разговоров с руководством и хождения по собеседованиям было принято решение сменить работу.
14 февраля 2007 года происходит знаменательное событие - у нас с Аней рождается сын Антон. Рожали мы вместе в минском областном роддоме. Всё прошло хорошо.
С 1-го марта 2007 я являюсь сотрудником фирмы Český Web a.s. Это небольшая фирма (около 30 человек на момент моего прихода), занимающаяся в основном разработкой небольших веб-ориентированных приложений под заказ клиентов из Чехии и Словакии. Нафига им специалист по Oracle - очень долго для меня это было загадкой. И это при том, что деньги они платят весьма неплохие. Про специфику моей теперешней работы я расскажу как-нибудь отдельно.
Всю весну я провел отдельно от семьи :( Аня воспитывала Тотоху самостоятельно в Минске. В июне я приезжал в Минск. В тот приезд мы втроём успели полежать с недельку в детском инфекционном диспансере - прикольное место. Тотоха словил какой-то вирус, что ночью очень сильно поднялась температура. Скорая нас отвезла в больницу. Вот так мы там и очутились. Ну а потом просто лежали, да профилактировались.. поскольку никто толком не знал шо цэ було.
Потом до конца лета мы всей семьёй жили в Праге. А... я в самом начале лета очередной раз поменял квартиру. Теперь мы живем в двухкомнатом быте с кухонным углом. Т.е. часть одной комнаты отведена под кухню. Вобщем квартира нравится. Район отличный. В ближайшее время надеюсь менять не прийдется.
Ну, осенью от меня семья опять уезжала в Минск, потом приезжала, потом опять уезжала... Это всё было связано с канителью вокруг получения долгосрочных виз по воссоединению семьи. В конечном итоге в декабре Аня и Тото получили таки большие визы и теперь мы уже более-менее надолго живем-поживаем вместе.
Вот такой вот выдался год.