Friday, June 28, 2019

Should the Oracle APEX Community Care About Autonomous Database?



This past week, Oracle announced the availability of Oracle APEX, SQL Developer Web and Oracle REST Data Services on Oracle Autonomous Database.  If you're in the APEX community, should you care?  I say "absolutely yes!", but not for the reasons you might suspect.

Autonomous Database is strategic to Oracle.  Just read the transcript from the recent Oracle quarterly earnings conference call and it will be obvious to you.  Autonomous is an advancement in technology that has significant investment from Oracle and very real benefits for customers.  It's a clear market differentiator - I do truly believe this, it's not merely my marketing spin.  And now, with the addition of Oracle APEX & SQL Developer Web & Oracle REST Data Services, I think this combination of technologies provides even more capabilities to this platform and even greater differentiation.  What other service provides elastic, autonomous capabilities, application design and proven low code application development, out-of-the-box?  Did I mention that this also happens to include the world's most popular database, Oracle Database?

The benefits of low code application development are real.  And Low Code + Autonomous Database is the ideal combination.  Low code is about reducing costs, delivering faster, with greater consistency, and being usable by a broader range of skill sets.  Some of the benefits of Autonomous Database are equivalent - less cost, instant availability, usable by others who may not be world-class experts.  It has been a long multi-year confluence of events that has brought us together here.

The APEX community is the envy of others at Oracle.  Even people who aren't APEX fans recognize the APEX community's passion.  But where did this come from?  Do people really get excited about a tool?  No.  They get excited about what they can do with a tool - how it helps them deliver a solution, and be successful.  A carpenter doesn't get passionate about his dual-slide compound miter saw because it's a cool tool.  He gets satisfaction about what he can actually do with that tool versus a hand saw.  When you get a pay raise or praise or a promotion because of what you've been able to deliver with APEX and ORDS and Oracle Database, that's a reason to get excited!  And I think that is ultimately the real story behind the enviable, tangible energy in the APEX community.  Countless people have had many great successes with this combination of technologies, and success begets success.

Let's say you're in the APEX community, you saw this announcement about APEX on Autonomous, but you're not interested in cloud.  Or, as Andre de Souza so eloquently stated on Twitter, "I know it’s big news, just does not affect 99,9% of current #orclapex developers I’m guessing."  Should you care?  I say yes, and here's why.  The great APEX community that I mention above, which has been so successful with APEX & ORDS & Oracle Database over the years, has become very large across the globe, and with not a lot of help from Oracle.  Make no mistake - Oracle does invest in APEX, millions of dollars every year.  But I still come across Oracle Database customers who have simply never heard of APEX.  This is because there has not been much promotion from Oracle marketing or public relations or even sales.  All of this is about to change.  Why?  Because APEX is on Autonomous Database, and Autonomous Database is strategic to Oracle.  You will probably see more communication and discussion from Oracle about APEX than probably the last 20 years combined.  Low code resonates with customers, APEX is proven, and everyone has application development needs.

How does this benefit someone in the APEX community?  Simple:

  1. Awareness and interest will rise by people who have never heard about APEX before, both existing on-premises customers and net new customers.
  2. There will be greater demand for APEX and database development talent.  If you have experience with APEX, with a proven track record of delivering solutions with APEX, you're a very attractive person.  Perhaps the rate you charge has now gotten a bit higher.  You'll certainly gain upward mobility.
  3. You'll no longer have to introduce someone to APEX for the very first time, or counter the claim that "it's not strategic."
  4. As our friends from Explorer UK say, with APEX, they "develop cloud ready applications".  And you've been doing this for years.  Don't be afraid to make this claim.  When and if you're ready for cloud, you're already out of the gate.  The same APEX apps you developed on-premises run and look and feel exactly the same in the cloud.  Who has been developing cloud-ready apps for years?  You!

So.  Even if you're not into "cloud" but into APEX, this announcement and these capabilities on Autonomous Database has material impact on you and everyone else in the APEX community.  Your skills and experience will become more valued, and we should expect the market and interest and demand to grow.

Everything is not perfect, and we on the APEX team still have a lot of very hard work ahead of us.  But these are exciting times and it's what we've labored on for the past 20 years, to get to this point.  For those who have been with the APEX community for so many years, congratulations!  You've bet on the right horse.  Just fasten your seat belt.

Saturday, February 23, 2019

APEX World 2019: Het gaat weer los!



The very first and still the largest Oracle APEX-focused conference in the world, APEX World 2019, is happening again this year on March 25/26 2019 in Rotterdam, Netherlands.  Incredibly, it's the 10th year for this conference, and like the global Oracle APEX community, it's still growing!

If you've never been to a user group conference, then you should consider attending one this year, and APEX World is an excellent choice.  There is something very organic and authentic about user group conferences.  It is a collection of enthusiasts, professionals, students, partners, business leaders, citizen developers, and full-stack developers, all there for a common purpose.  The APEX community is unique, certainly at Oracle, and probably within the industry too.  You will find this common spirit of sharing and camaraderie ever-present at APEX World.  It helps that the Dutch are naturally kind people, too (and very direct). ;)

This year at APEX World, there are a number of important additions, including:

  • A business seminar "The Future of APEX"
  • A separate track with real customers presenting their real success stories.  This is ideal for someone who is curious about APEX and the large variety of problems being solved with APEX today
  • Numerous deep-dive sessions for those who are experienced APEX developers
  • A special student track
  • Workshops for students from academies/ universities so they can build their first Low Code Oracle APEX app

There is honestly something for everyone.  And the vast majority of sessions will be in English, so there's no reason not to attend.  Did I mention that the Dutch are super nice?

I am honored to attend APEX World 2019, and I will be there, along with product development team superstars Hilary Farrell, Shakeeb Rahman and Jason Straub.  Personally, I relish the opportunity to engage with our many customers and partners, understand what you're doing, understand what your pain points are, and get your advice how we can help you in the future.  The APEX team is invested in your success.  We look forward to seeing you there!



Saturday, December 15, 2018

The job where I learned the most valuable lessons was...

...McDonald's!  Prior to Oracle, I worked for a number of different companies: in IT at a bank and in product development at a couple other large companies.  But the most valuable lessons I ever learned and what has helped me the most in my entire career has been the education I received in in my late teens at McDonald's.

Often times, when people reflect on who shaped them the most in life, it's usually a coach or a high school teacher or a university professor.  In my case, it was Louis J. Stallman, - the general manager of a McDonald's franchise in Wadsworth, Ohio, where I worked at in high school and in the summer breaks between my years at university.

I'm second-generation American, the product of Polish and German immigrants.  I'm the youngest of 7 children (my Mom was also also the 7th child in her family).  My parents grew up during the Depression and passed their life lessons onto us - waste nothing, speak when you're spoken to, and always work & do your best.  My Dad was in the US Army Air Corps and flew on B-29s during World War II.  He was the disciplinarian.  At the time, my friends thought that I grew up in an overly strict household, but I can say today with certainty that this disciplined household provided complete structure.  There was a lucid difference between doing something right and doing something wrong.

When I started at McDonald's in high school, I wasn't sure what to expect.  It probably was a bit more rigid than what most kids were used to, but having grown up in a disciplined family, it was pretty easy to adapt to.  I certainly wasn't perfect - I was the typical crass teenager who thought he knew everything.  But it was a very structured environment and there was always a right and a wrong way to do something.

The general manager of this McDonald's was Louis J. Stallman.  While he was a kind man, he was also a bit of a disciplinarian.  There was no slouching about.  This is where I learned the infamous phrase "if you have time to lean, you have time to clean".  I made a whopping $3.35 an hour and we were put to task and earned every cent of it.  I worked a number of years there, in the summers, over holidays, in some cases even on holidays.  I had the good fortune to interact with a lot of people, some nice, some not so nice.  Lou Stallman coached everyone who interacted with a customer, and when you would fail or omit something, he was always there to remind you.  What I learned from Lou Stallman and what I've carried forward into my professional life:

  1. Greet the customer with a smile, always.
  2. When talking to a customer, look at them directly in the eye.
  3. Talk clearly and repeat back to the customer what they told you.
  4. Treat the customer (and really everyone) with respect and dignity.
  5. Genuinely thank the customer and wish them farewell.

That's it.  Seems obvious, right?  It is, but I see countless people forego these very basic courtesies when interacting with any customer.

I'll greet anyone at any time.  It's the kind thing to do.  Where I live in the USA (Ohio), it's generally considered rude not to greet someone, to put on a smile and say "good morning" while waiting for an elevator or say "hello" while passing them on the street.  I always enjoy going to Oracle HQ in California and greet everyone I pass on the sidewalk - they look at me like I'm from Mars.

In a disconnected, smartphone-crazy world, I find people are a bit afraid to engage someone and look them in the eye while talking to them or listening to them.  There couldn't be a better way to say "you have my full attention" than looking at them directly, without distractions.

When listening to a customer, pay careful attention to what they're asking, and repeat back to them what you think they said.  Maybe they're complaining and need to vent some steam.  Maybe what they really want isn't accurately expressed in the words they're using, so repeat back to them what you think they want.  That's the perfect time to ensure you have a mutual understanding.  And people like to know that someone has truly listened to them.

The customer (and really everyone) should always, always, always be treated with respect and dignity.  At all times.  The customer may not always be right, but they are deserving of respect and dignity.

Always thank the customer.  Always.  You may have killed yourself for your customer and you might think that they owe you something.  But still thank them.  They're the reason why you're able to feed your family.  Competition is everywhere, and an easy way to stand out is through a personal connection.  Something is wrong if you can't extend a simple courtesy to your customer, thanking them for their business.

There you have it - the simple lessons I learned from McDonald's general manager Louis J. Stallman.  They're not technical and they're not difficult to grasp.  But they have broad applicability to almost any job in any field anywhere in the world.  They have served me well and I encourage you to try them yourself.

Friday, November 09, 2018

How do I add an image to a page in Oracle APEX?

Preface:  Many blog posts about Oracle APEX seem to cover a new feature or something rather obtuse & complex.  The sophisticated blog posts have little relevance to someone who is completely new to APEX and Oracle Database.  Having worked with APEX since 1999, it's always difficult for me to put myself in the shoes of a brand new student of APEX.  When I interact with people new to APEX, I try to look at APEX through their eyes, and listen to what they find confusing.  Sometimes, it's completely obvious to me and, at the same time, completely vexing to them.  Thus, this will begin a series of blog posts how to perform very common tasks in APEX.  It will be boring for the experienced user, but hopefully helpful to the APEX developer in training.  And separately, we will also strive to make APEX simpler and easier to understand, so that blog posts like this one become unnecessary in the future.



Gerald Venzl, a highly respected Oracle Database product manager, was recently participating in a hackathon with a team of people, and they were using Oracle APEX as part of their solution.  They produced a QR code for the URL to their app, they saved this QR code image to a local file, and they wanted to include the image on a page in their APEX application.  As Gerald stated, it took more than 30 minutes for this learned and competent group of people to figure out how to do this.  This is not a criticism of Gerald and his colleagues, it's a criticism of APEX.  Gerald and his team were expecting a simple upload to a page item of type Image and they would be done, right?  Well, not so simple.

This blog post is not intended to cover the case where you have images in BLOB columns in a database table (we'll cover that in the future), or the case where the image can already be referenced via a URL.  I am presenting the simple case of you having an image on the file system on your local computer, and you want to reference it in your APEX page.

From a high-level, the steps are:
  1. Upload the file as a static application file.
  2. Using the HTML IMG tag, reference the static application file in your application.


Now, for the more detailed explanation.

Before you can reference an image in your APEX application, it has to be in a location which can be "served" by your Web server.  With APEX, you have access to the back-end Oracle Database, but you don't have access to the Web server file system.  Fortunately, there is an easy way to upload the image into the Oracle Database and have it served by your Web server when used within an APEX application.  These are called Static Application Files.

The steps are really quite simple:
  1. Edit your application in the Application Builder
  2. Click Shared Components
  3. Click Static Application Files
  4. Click Upload File
  5. Choose the file from your local computer
  6. Click the Upload button




In the picture above, this is the list of Static Application Files in the APEX Application Builder, after uploading file Three_Stooges.jpg.  Under the Reference column, there is the string #APP_IMAGES#Three_Stooges.jpg.  This is how you can reference the file when used in an HTML context in your APEX application.  This reference means nothing when used outside of an APEX application.  When someone is running your application, the APEX engine will replace the substitution string #APP_IMAGES# with an absolute URL reference to an embedded REST endpoint which will return the stored image.

To reference this image in your application, you just need to include a reference to it from an HTML IMG tag on your APEX page.  This image reference would have to be entered into the attributes of your APEX application wherever it's appropriate to embed HTML.  This includes the headers and footers of page regions, templates, and even the Source attribute of certain region types.  An easy way to get started is to reference an image in a region of type Static Content.

As an example, edit a page in Page Designer.  In the gallery at the bottom of the page, drag a region of type Static Content onto your page.  In the Source attribute of this region, enter the HTML string to reference the image:

<img src="#APP_IMAGES#Three_Stooges.jpg">

Obviously, reference your file and not the name of the file in my example (Three_Stooges.jpg).  Save your page and run.  That's all there is to it!






One last point.  If you do have access to the web server file system, and you wish to include static file references in your application, then definitely put them on your web server file system and simply serve them from there.  It will always be more efficient to have these served by a web server instead of having to fetch them out of the database.

Sunday, August 19, 2018

Automating service creation in Oracle APEX

Oracle Academy is a division in Oracle whose mission is to advance "computer science education globally to drive knowledge, innovation, skills development, and diversity in technology fields."  The programs that Oracle Academy offers are free to accredited secondary schools, technical/vocational schools, and two and four-year colleges and universities.

Oracle Application Express (APEX) has been hosted by Oracle Academy and used for many years to facilitate the delivery of curriculum for database design and programming, SQL, PL/SQL and even APEX.  To facilitate their business requirements, they had custom extensions written (in part, by our team) into the core APEX product.  But this type of solution becomes difficult to maintain, because every release of APEX requires migration and rewrite of these custom extensions.

A number of months ago, I met with the Oracle Academy team to try and encourage them to move the service creation of APEX workspaces into their own custom interfaces.  I told them that everything is provided to easily and programmatically create APEX workspaces, create database users (schemas), create administrators and developers within each workspace, and even pre-load APEX applications and custom database objects in each workspace, at the time of service creation.

Naturally, they asked for an example script to accomplish all of these tasks, which I authored and shared with them.  Because this type of logic is very relevant for many other purposes, e.g., testing, continuous integration, DevOps, I wish to share these same annotated scripts here.  If you are someone who has been using APEX for 10 years, you won't learn anything new here.  But for those just getting started with APEX, I hope you find it fruitful.

Starting with an empty Oracle database, the requirements are to develop a single script which will:

  1. Create a tablespace (storage) for each workspace
  2. Create and associate multiple database users (schemas) with each workspace
  3. Create an APEX workspace
  4. Create an administrator and developer account in each workspace, restricting the access of each developer to only one of the schemas mapped to the workspace.
  5. Create custom database objects in each schema
And here we go...
set define '^' verify on
set concat on
set concat .

Rem
Rem    Title:  Demo_of_Provisioning.sql
Rem
Rem    Description:  This script will demonstrate use of all of the APIs and SQL statements necessary
Rem                  to create tablespaces, data files, database users, and APEX workspaces.  From this
Rem                  example, it is assumed that the Academy team will be able to develop their own custom
Rem                  provisioning process and no longer rely upon custom extensions to the 
Rem                  Oracle Application Express software.
Rem
Rem    Notes:  It is assumed that this script is run as user SYSTEM.
Rem
Rem
Rem    MODIFIED   (MM/DD/YYYY)
Rem    jkallman    08/19/2018 - Created


column foo1 new_val LOG1
select 'Demo_of_Provisioning_'||to_char(sysdate,'YYYY-MM-DD_HH24-MI-SS')||'.log' as foo1 from sys.dual;
spool ^LOG1

timing start "Create demonstration tablespaces, schemas and workspaces"


--
-- Predefine the path used for tablespace datafile creation.  If you're using Oracle Managed Files
-- or grid infrastructure, then this isn't necessary and you'll remove the 'datafile' portion of 
-- the CREATE TABLESPACE statements
--
define DATAFILE_PATH='/u01/app/oracle/oradata/'


--
-- Step 1:  Create the Tablespaces
--
-- Since Oracle Academy will want to group multiple database users/workspaces into a single tablespace, we'll need to
-- first create the tablespaces, and then the database users in step 2
--
create tablespace OACADEMY_DATA1 datafile '^DATAFILE_PATH.iacademy_01.dbf' 
 size 50M autoextend on next 50M maxsize 2G extent management local 
 autoallocate segment space management auto;

create tablespace OACADEMY_DATA2 datafile '^DATAFILE_PATH.iacademy_02.dbf' 
 size 50M autoextend on next 50M maxsize 2G extent management local 
 autoallocate segment space management auto;



--
-- Step 2:  Create the Database Users (Schemas)
--
-- It's up to you how you wish to group database users/schemas into different tablespaces.  
-- You can do it by total number or free space or ratio of users to tablespaces.  It's all up to you.
--
begin
 -- DB users in DATA1 tablespace
    execute immediate 'create user OACADEMY_DB10 identified by "' || sys.dbms_random.string('X',30) || 
                      '" default tablespace OACADEMY_DATA1 quota unlimited on OACADEMY_DATA1 temporary tablespace TEMP account lock password expire';

    execute immediate 'create user OACADEMY_DB11 identified by "' || sys.dbms_random.string('X',30) || 
                      '" default tablespace OACADEMY_DATA1 quota unlimited on OACADEMY_DATA1 temporary tablespace TEMP account lock password expire';

 -- DB users in DATA2 tablespace
    execute immediate 'create user OACADEMY_DB20 identified by "' || sys.dbms_random.string('X',30) || 
                      '" default tablespace OACADEMY_DATA2 quota unlimited on OACADEMY_DATA2 temporary tablespace TEMP account lock password expire';

    execute immediate 'create user OACADEMY_DB21 identified by "' || sys.dbms_random.string('X',30) || 
                   '" default tablespace OACADEMY_DATA2 quota unlimited on OACADEMY_DATA2 temporary tablespace TEMP account lock password expire';

end;
/



--
-- Step 3:  Create the APEX Workspaces
--
-- Create the APEX workspaces and associate a default schema with each
--
begin
    apex_instance_admin.add_workspace(
     p_workspace_id   => null,
     p_workspace      => 'OACADEMY1',
     p_primary_schema => 'OACADEMY_DB10');
end;
/

begin
    apex_instance_admin.add_workspace(
     p_workspace_id   => null,
     p_workspace      => 'OACADEMY2',
     p_primary_schema => 'OACADEMY_DB20');
end;
/


--
-- Step 4:  Add additional schemas to the existing workspaces
--
--
begin
    apex_instance_admin.add_schema(
     p_workspace      => 'OACADEMY1',
     p_schema         => 'OACADEMY_DB11');
end;
/

begin
    apex_instance_admin.add_schema(
     p_workspace      => 'OACADEMY2',
     p_schema         => 'OACADEMY_DB21');
end;
/


--
-- Show a quick summary of the workspaces and schemas
--
column workspace_name format a50
column schema         format a40
select workspace_name, schema from apex_workspace_schemas;



--
-- Step 5:  Create an administrator account and a developer account in each worskpace
--
--
begin
    -- We must set the APEX workspace security group ID in our session before we can call create_user
    apex_util.set_security_group_id( apex_util.find_security_group_id( p_workspace => 'OACADEMY1'));

    apex_util.create_user( 
        p_user_name               => 'BOB',
        p_email_address           => 'bob@bob.com',
        p_default_schema          => 'OACADEMY_DB10',
        p_allow_access_to_schemas => 'OACADEMY_DB10',
        p_web_password            => 'change_me',
        p_developer_privs         => 'ADMIN:CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL' );  -- workspace administrator

        apex_util.create_user( 
        p_user_name               => 'JUNE',
        p_email_address           => 'june@june.com',
        p_default_schema          => 'OACADEMY_DB11',
        p_allow_access_to_schemas => 'OACADEMY_DB11',
        p_web_password            => 'change_me',
        p_developer_privs         => 'CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL' );  -- developer

    commit;
end;
/

begin
    -- We must set the APEX workspace security group ID in our session before we can call create_user
    apex_util.set_security_group_id( apex_util.find_security_group_id( p_workspace => 'OACADEMY2'));
    
    apex_util.create_user( 
        p_user_name               => 'ALICE',
        p_email_address           => 'alice@alice.com',
        p_default_schema          => 'OACADEMY_DB20',
        p_allow_access_to_schemas => 'OACADEMY_DB20',
        p_web_password            => 'change_me',
        p_developer_privs         => 'ADMIN:CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL' );  -- workspace administrator

    apex_util.create_user( 
        p_user_name               => 'AUGUST',
        p_email_address           => 'august@august.com',
        p_default_schema          => 'OACADEMY_DB21',
        p_allow_access_to_schemas => 'OACADEMY_DB21',
        p_web_password            => 'change_me',
        p_developer_privs         => 'CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL' );  -- developer

    commit;
end;
/

-- 
-- Show a quick summary of the APEX users
--
column workspace_name           format a30
column user_name                format a20
column email                    format a25
column is_admin                 format a10
column is_application_developer format a10
select workspace_name, user_name, email, is_admin, is_application_developer from apex_workspace_apex_users order by 1,2;


--
-- Install custom database objects in each schema by simply running one more SQL scripts.  Note that the
-- script below is something that you author and maintain.  It will do all DML and DDL you have in it,
-- and we simply iterate through the schemas and run the script each time.
-- 
alter session set current_schema = OACADEMY_DB10;
@custom.sql

alter session set current_schema = OACADEMY_DB11;
@custom.sql

alter session set current_schema = OACADEMY_DB20;
@custom.sql

alter session set current_schema = OACADEMY_DB21;
@custom.sql

timing stop
spool off


And to complete the lifecycle, I also authored a simple SQL script which will cleanup everything created above - removing the APEX workspaces, database users and tablespaces.
set define '^' verify on
set concat on
set concat .

Rem
Rem    Title:  Demo_of_Cleanup.sql
Rem
Rem    Description:  This script will cleanup all objects created by script Demo_of_Provisioning.sql
Rem
Rem    Notes:  It is assumed that this script is run as user SYSTEM.
Rem
Rem            **** THIS SCRIPT IS DESTRUCTIVE **** - It will drop tablespaces, data files, workspaces, schemas, etc.
Rem
Rem
Rem    MODIFIED   (MM/DD/YYYY)
Rem    jkallman    08/19/2018 - Created


column foo1 new_val LOG1
select 'Demo_of_Cleanup_'||to_char(sysdate,'YYYY-MM-DD_HH24-MI-SS')||'.log' as foo1 from sys.dual;
spool ^LOG1


timing start "Remove all workspaces, schemas and tablespaces"

--
-- Step 1:  Remove the APEX Workspaces
--
--
begin
    apex_instance_admin.remove_workspace(
        p_workspace      => 'OACADEMY1' );
end;
/

begin
    apex_instance_admin.remove_workspace(
        p_workspace      => 'OACADEMY2' );
end;
/



--
-- Step 2:  Drop the database users
--
--
drop user OACADEMY_DB10 cascade;
drop user OACADEMY_DB11 cascade;
drop user OACADEMY_DB20 cascade;
drop user OACADEMY_DB21 cascade;



--
-- Step 3:  Drop the tablespaces 
--
--
drop tablespace oacademy_data1 including contents and datafiles;
drop tablespace oacademy_data2 including contents and datafiles;

timing stop
spool off

Wednesday, July 04, 2018

In the British APEX Community? Then UKOUG Tech18 is where you need to be!


In 2003, even before Oracle APEX had a real name (even before HTML DB), I had the good fortune of presenting APEX at the UKOUG Tech conference in Birmingham, England.  I was with my good friend Sergio Leunissen, the original Product Manager of APEX.  Tom Kyte had kindly given us a few minutes on stage during his session to present Project Marvel.  We were able to demonstrate marvel.oracle.com, a free, browser-based, hosted, multitenant, declarative (low code) development and runtime environment.  This ultimately became today's https://apex.oracle.com, which gets just around 2,000 new signups every week!

Later that day, I also distinctly remember talking with an Oracle sales rep from the UK.  I had explained that there were plans to include APEX (née Project Marvel) with Oracle Database and not charge any additional fee for it.  He told me he thought it was a big mistake that Oracle wasn't planning on charging a customer for use of APEX, and unless there was a cost associated with it, there would be no perceived value and no one would use it.  Here we are 15 years later.  The industry has changed in extraordinary ways, and APEX and the APEX community continues to grow and expand at an accelerated rate.  And in 2018, when everyone expects tools and frameworks to be "free", I remain convinced that we made the right decision to include APEX with Oracle Database and not make it a for-cost option.

I am looking forward to returning to UKOUG Tech18 this year, where a lot of the original APEX community outreach began for us.  Some of my favorite customers are in the United Kingdom, and I've known and worked with a large number of them for many years.  The fine folks at UKOUG have graciously given me the opportunity to present the APEX Community Keynote on Monday, December 3, 2018.  It will be "Oracle APEX: State of the Union", and this will be a presentation on both what is happening for APEX inside of Oracle and also across the APEX community globally.  We will be in Liverpool Sunday through Wednesday, and we look forward to meeting as many customers as possible.  You have a story to tell and we'd like to hear it, and how we can help.

See you in Liverpool in December 2018!

Friday, June 15, 2018

Jürgen Schuster: APEX Distinguished Community Member



I just got back from the ODTUG Kscope18 conference in Orlando, Florida where, once again, the global APEX community descended.  During the Sunday Symposium at this conference, I had the privilege of honoring Jürgen Schuster, who has been the catalyst and engine for so many positive things in this wonderful APEX community.

For the past few months, I was unsure of what words I could use to introduce this award to Jürgen, which accurately and humbly conveyed the breadth of his impact.  But the words just came to me late one evening in early May, and I used them almost verbatim during the Sunday Symposium.  I would like to share these words here, for everyone else in our global community to appreciate the impact he has had, along with the sacrifices he has personally made.

To quote Jürgen: live APEX and prosper.




ODTUG Kscope18 Conference
Sunday Symposium, June 10, 2018

The APEX Community is awesome, and it's awesome to be here and be a part of this conference. This is my 12th Kscope and I firmly believe that this is where the APEX community really got its start. Additionally, some of my greatest friends in the world are in this room, and I’m really grateful to be here.

There are really so many people who have made this community special:  from the many plug-in developers, people who record training videos, members who write blog posts and books, create presentations with technical content and share them, manage and organize meetups, organize entire conferences or technical days or user group meetings or organize tracks at Kscope!  There are those who create Web sites: builtwithapex.com, translate-apex.com, for example. There are open source sites dedicated to APEX and the Oracle Database. There are testing frameworks and security analysis tools.  And the list goes on and on.

Many of these people who have worked so hard on all of these contributions are here in this room today. But among the many people who have given of their time and talent to the APEX community, there is one person who stands out. And I have two words to describe this person: passionate and selfless.

This person has spent a lot of time and a lot of their own personal money to carry the message of APEX across the globe.  It's pretty extraordinary.

I'm sure everyone is going to know this person when I start citing some of their amazing work.

I’m sure you've seen these coveted APEX stickers before. It was the genius of this person to create a sticker for the APEX community. And instead of using some low-quality, cheap-looking, shoddy sticker, he opted for something classy, high-quality, enduring. At a personal cost of more than $1 per sticker, this person has supplied them and shipped them all over the globe to anyone who asks.  At his own personal expense.

The next challenge? This person, with the help of others in this room, created apex.world - the APEX community site - being your one-stop portal for all things related to the APEX community - Slack channels, jobs, plug-ins, news, newsletters, awards, tweets, and more.  There are more than 3,300 members today on apex.world.  It’s the central starting point for the APEX community.

How many of you know how to create your own podcast and host it on iTunes? I don't. Neither did this person. Out of his own pocket, he paid a professional to educate him and show him everything you need to know to prepare and publish on iTunes. And since that time, he has recorded, edited and published 20 episodes of the Oracle APEX Talkshow.

The contributions go on - ODTUG APEX On Air Webinars, APEX Meetup organizer, he created a web site dedicated to APEX dynamics actions, and on.  And almost all of these contributions has cost him his own money and he’s done it for no real personal gain.

Remember the two words I started with:  passionate and selfless.

The person I’m proudly referring to is Jürgen Schuster, an energetic and passionate freelance consultant from Munich Germany.  We wanted to recognize Jürgen and his many generous contributions to the community.

Please join me in congratulating Jürgen Schuster, as we proudly honor him with the first ever APEX Distinguished Community Member Award.