Sunday, March 18, 2012

Installfest: Oracle 11g XE on Amazon Linux Micro Instance

This is just a quick (as in "I really, really mean it quick") note on installing Oracle 11g XE on Amazon EC2 on a vanilla Amazon Linux AMI as a micro instance. Cloudy...

Why Amazon Linux? It's easy and it's pre configured with most of what you need. Both cloud wise and for other things. It also gets good reviews as a production OS.

No, Oracle 11g XE on Amazon Linux this is not supported by Oracle. But then again, you will receive no official support on Oracle 11g XE by Oracle on any OS...

I have not validated if every step described below is necessary, by I reasoned that the standard install steps will stand, even if they upgrade the default Amazon Linux AMI.

If you have no experience with Linux or Amazon EC2, I think you will be better off with a more verbose installation guide than this is!

Create the Instance
If I am unclear (or just a tad abbreviated), just follow this documentation at any time.
  • Launch new instance, and choose "Basic Amazon Linux AMI YYYY.MM"
  • Choose instance type micro, set or create key pairs and set or create security group (everything else, just keep default)
Your are done creating the instance.

Connect to the Instance
I use PuTTY, for alternatives or a more elaborate description of how to connect with PuTTY, see this documentation. I assume you have PuTTY suite (with PuTTYGen) installed.

You also have to check that port 22 is open for the security group associated with the image.
  • Start PuTTYGen
  • Load the .pem file created from then key pair in use with the instance (switch to "all files" to see it)
  • Click Save Private Key, and Yes
  • Exit PuTTYGen
  • Start PuTTY
  • Copy Public DNS from EC2 Console
  • Paste Public DNS into Host Name in PuTTY Configuration
  • On left side, go to Connection -> SSH -> Auth and browse to the location of the previously generated ppk-file
  • Back to Session, give it a name  in "Saved Sessions" and Save
  • Click Open and Yes in the dialog
  • Connect as ec2-user
You are done connecting to your new instance.

Configure EC2 Tools
This you can do on your host machine, or the newly created instance. I will describe how for the newly created instance (less work for me, but also less secure for you!).
  • Log in as ec2-user
Configure root user:
  • sudo su - root
  • passwd <new password>
  • exit
  • su - root
  • <new password>
  • id
EC2 Tools are installed by default, but you have to let it know which credentials to use. Copy the pk and cert files into /root directory, and modify .bash_profile:
  • su - root
  • vi ./.bash_profile
  • export EC2_PRIVATE_KEY=/root/pk-<your pk>.pem
  • export EC2_CERT=/root/cert-<your pem>.pem
  • export EC2_URL=https://ec2.<region>.amazonaws.com
I use eu-west-1 as region. You should now be able to issue
  • ec2-describe-availability-zones
And receive a list of zones.

Configure Instance Storage
First, create and attach a new volume (30Gb) to the instance:
  • su - root 
  • ec2-describe-instances 
  • Take a not of the instance id and availability zone 
  • ec2-create-volume --size 30 --availability-zone <zoneSameAsTheInstance>
  • Take a note of the volume created
  • ec2-attach-volume <yourVolumeId> -i <yourInstanceId> -d <yourDeviceName>
  • Like this: ec2-attach-volume vol-xxxxxx -i i-xxxxxx -d /dev/sdf
  • ec2-describe-volumes
Format volume and make it stick on reboot:
  • mkfs -t ext3 /dev/sdf
  • tune2fs -m0 /dev/sdf
  • mkdir /u01
  • mount /dev/sdf /u01
  • vi /etc/fstab
  • Add the following line:
  • /dev/sdf    /u01        auto    defaults,noatime 0 0
Increase swap file (using the root device):
  • dd if=/dev/zero of=/home/swapfile bs=1024 count=2097152
  • mkswap /home/swapfile
  • vi /etc/fstab
  • Add the following line:
  • /home/swapfile swap swap defaults 0 0
This is a bit of a cheat, because the default swap disk will still attach, you cat alter that later.

Set host name for the server:
  • vi /etc/sysconfig/network
  • HOSTNAME=<yourHostName>
  • :wq
  • vi /etc/hosts
  • Add  <yourHostName> to the line containing 127.0.0.1
  • :wq
Restart to check if everything is OK:
  • shutdown -r now
At this stage I created a new AMI based on the current configuration (with the new 30Gb volume still attached). You never know :-)

Configure Instance for Oracle 11g XE
Since we can't use yum oracle-validated on the Amazon Linux, we will have to do this the hard way.

Create oracle user++:
  • su - root
  • groupadd oinstall
  • groupadd dba
  • useradd -g oinstall -G dba,oinstall oracle
  • passwd oracle
  • chown oracle:oinstall /u01
Get the latest packages:
  • yum install binutils-2.*
  • yum install compat-libstdc++-33*
  • yum install elfutils-libelf-0.*
  • yum install elfutils-libelf-devel-*
  • yum install gcc-4.*
  • yum install gcc-c++-4.*
  • yum install glibc-2.*
  • yum install glibc-common-2.*
  • yum install glibc-devel-2.*
  • yum install glibc-headers-2.*
  • yum install ksh-2*
  • yum install libaio-0.*
  • yum install libaio-devel-0.*
  • yum install libgcc-4.*
  • yum install libstdc++-4.*
  • yum install libstdc++-devel-4.*
  • yum install make-3.*
  • yum install sysstat-7.*
  • yum install unixODBC-2.*
  • yum install unixODBC-devel-2.*
Check the parameter settings:
  • /sbin/sysctl -a | grep fs.suid_dumpable
  • /sbin/sysctl -a | grep fs.aio-max-nr
  • /sbin/sysctl -a | grep fs.file-max
  • /sbin/sysctl -a | grep kernel.shmall
  • /sbin/sysctl -a | grep kernel.shmmax
  • /sbin/sysctl -a | grep kernel.shmmni
  • /sbin/sysctl -a | grep kernel.sem
  • /sbin/sysctl -a | grep net.ipv4.ip_local_port_range
  • /sbin/sysctl -a | grep net.core.rmem_default
  • /sbin/sysctl -a | grep net.core.rmem_max
  • /sbin/sysctl -a | grep net.core.wmem_default
  • /sbin/sysctl -a | grep net.core.wmem_max
Compare it to:
  • fs.suid_dumpable = 1
  • fs.aio-max-nr = 1048576
  • fs.file-max = 6815744
  • kernel.shmall = 2097152
  • kernel.shmmax = 536870912
  • kernel.shmmni = 4096
  • kernel.sem = 250 32000 100 128
  • net.ipv4.ip_local_port_range = 9000 65500
  • net.core.rmem_default = 262144
  • net.core.rmem_max = 4194304
  • net.core.wmem_default = 262144
  • net.core.wmem_max = 1048586
In my image, I had to add the following lines to sysctl.conf:
  • vi /etc/sysctl.conf
  • # Added by a Monkey
  • fs.suid_dumpable = 1
  • fs.aio-max-nr = 1048576
  • fs.file-max = 6815744
  • kernel.shmmni = 4096
  • kernel.sem = 250 32000 100 128
  • net.ipv4.ip_local_port_range = 9000 65500
  • net.core.rmem_default = 262144
  • net.core.rmem_max = 4194304
  • net.core.wmem_default = 262144
  • net.core.wmem_max = 1048586
Well, obviously not the first bullet point ;)

Configure the rest for oracle in security limits:
  • vi /etc/security/limits.conf
Added:
  • oracle              soft    nproc   2047
  • oracle              hard    nproc   16384
  • oracle              soft    nofile  1024
  • oracle              hard    nofile  65536
  • oracle              soft    stack   10240
Apply the changes:
  • /sbin/sysctl -p
Done so far!

Downloading and Installing Oracle 11g XE
Create download directory:
  • su - oracle
  • mkdir /u01/download
  • cd /u01/download
I couldn't get wget to download XE, so I had to resort to a cheat:
  • Log into oracle.com on your HOST machine with a REAL browser
  • Find download on oracle.com
  • Accept licence agreement
  • Click link to download
  • Capture and copy request (network tab in Chrome will give you that):
    http://download.oracle.com/otn/linux/oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip?AuthParam=<somestring>
  • Paste it into ssh session:
  • wget http://download.oracle.com/otn/linux/oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip?AuthParam=<someString>  -O oracle-xe-11.2.0-1.0.x86_64.rpm.zip
  • And the file will be downloaded
I had some initial problems with this, and had to go back to the browser, retrace my steps for yet another download and get a new request from the browser. Worked the second time, don't know why. Maybe because I downloaded with wget while downloading at the same time from my aws instance..?

Installing is much easier:
  • su - root
  • unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
  • cd /u01/download/Disk1
  • rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm
  • /etc/init.d/oracle-xe configure
  • Accept the defaults (unless you know what you are doing!)
And you are done installing Oracle 11g XE! If you want to test APEX, just open port 8080 in the security group in the AWS EC2 Console, and use the public dns for the instance to reach it.

Configure Oracle User Environment
Just a touch if you are going to use oracle user in ssh later:
  • su - oracle
  • cat /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
  • <copy the lines below into the .bash_profile>
  • export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
  • export ORACLE_SID=XE
  • export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
  • export PATH=$ORACLE_HOME/bin:$PATH
  • cd
  • vi .bash_profile
  • <paste the lines above>
  • :wq
Tying it Up
At this point, you should restart to verify that everything works, create a new AMI based on the current state of the instance, enable ssh connect with oracle user, reconfigure swap space, etc, etc.

Remember not to use EBS storage for anything you really care for, data should be backed up in a safe manner (as you normally would do anyway).

Monday, March 5, 2012

The Tale of the Read Only Input Text Item

It always starts out easy:
"If variable x has value y, it is forbidden to update values in column z."
Easy! ADF is well suited for the task. Some Groovy based business rules on the entity, and it just works. Simple, declarative, transparent and instantly enforced everywhere the entity is in use. Neat, isn't it?

In addition, the input item in the faces view reflects the change, and renders the input item as plain text.
"We want to keep the input box. Just disable the input text field."
Easy! On the af:inputText, just move the EL-expression from the ReadOnly property to the Disabled property, and set the ReadOnly property to false.
"We can't read the text. Set the text color to black."
Easy! Create and set a StyleClass with the ADF Skin Editor, or even some InlineStyle magic. Looks good in both Firefox and Chrome!
"We can't read the text in Internet Explorer, gray on gray is not a good combination."
Ah, I see... And I can't do much about it the "easy" way. IE won't let you set color of text on disabled elements.

Can I perhaps do something with the ReadOnly attribute to solve the issue? Nope, ReadOnly renders as plain text as soon as you touch it.

Google to the rescue.

Oh. Lots of other people with the same issue. OTN yields nothing but similar problem descriptions, all pointing to the fact that not being able to set the text color on disabled items is an IE issue.

Aino Andriessen has written a blog post describing a workaround to the same issue. Using a plain jsf input text lets you set the ReadOnly attribute, and still keeping the box intact. Yay! But blog post is from 2006, is this really all there is?

Add plain jsf input text and set Rendered property to a mutual exclusive expression with the updateable af:intputText.

Starting to get real clunky now, but it works. I even got the style class to match, and the number formatting right...
"Where is the context menu on the disabled fields?"
Doh! Take a deep breath. Context menu on plain jsf items? Just add an af:showPopupBehavior to the h:inputText elements and you are good to go! No? Ah, phases and what not, big runtime exception telling me I do not know what I am doing. Again.

Running out of time now. Stepping back to the Disabled and ReadOnly properties of the original af:inputText element. Hmm. I wonder.

Add some jQuery magic! The page already has jQuery included to do some fancy color highlight/fade thingys. Set DisabledProperty and let jQuery handle the rest after page load:
$('input[id^=<yourTableId>][id*=<yourColumnId>][disabled]').attr('readonly', 'true').removeAttr('disabled');

Simply put, it finds all input items in a given column of my table, and removes disabled attribute, and sets it to read only. I'm a genius!
"Works great the first time, but not after we push this button!"
Argh! Not so genius after all. PPR will of course ruin my newly crafted lifeline. jQuery live won't trigger correctly for some reason.

Getting really stressed out now. Explaining to the users that I do not know how to display a read only input box is not an appealing option!

Are there any javascript hooks like "I am now done refreshing your model driven table"? Diving into the ADF Javascript API. Looks like I can register a listener on the event triggering the refresh. Luckily there are just two ways for the user to invoke ppr refresh of this particular table, which means I can use af:clientEvent along with addBusyStateListener as described by Frank Nimphius in ADF Code Corner 027.
"It works now! Finally..."
Yes!

It started out simple, declarative and very maintenance friendly, but ended up as a slippery beast of a thing. All because I could not make ADF keep the box when setting ReadOnly on the af:inputText...
"By the way, we want to update the z column always. Just revert the last few changes."
*_*

Monday, February 27, 2012

ADF Architectural Pointers

No, I haven't got any ADF best practices, only pointers to some who may have. The fine thing with best practices, is that everyone thinks it's such a neat idea. That generally leads to a lot of best practices, so you can choose the one that suits you. Or adapt one. Or just invent a new..

A healthy approach to best practices is Caution and Skepticism, or better yet: down right Hostility. Oh, I am also not very fond of the term best practices. Best practices more than imply that if you do not do it "my way", you are most likely doing it wrong!

Maybe patterns would be a better term? But patterns, in my head, needs to be something both general and battle proven. Guidelines maybe?

A Big Topic
From grand architectural designs to parameter naming conventions. From application module tuning and pruning to functional UI patterns. I will concentrate on application architecture for now. This post is more about giving pointers than answers. I have done some research on the subject, and I will try to sum up some of my findings.

A Place To Start
Try an Oracle official page called Oracle Application Development Framework Best Practices. There is just one teeny weeny problem; following the links from that page will lead you to most of the text ever written (and all videos recorded) about ADF by Oracle. A positive take is that if you go through all that material, you probably will have earned an ADF black belt and be quite fluent ADF'ing. In my opinion, the most useful stuff is contained within the Oracle ADF Insider webcasts, even though this is more technical know-how than best practices.

Application Architecture
I think there is surprisingly little material on the matter, considering the big push from Oracle on ADF. This might have to do with the release of ADF 11g, that capsized most of what you knew of ADF 10g, but that is actually quite a few years ago now...

There are a few sources out there, Oracle with Steve Muench gave a rare insight into Fusion Applications Teams best practices at OOW 2009. Bear in mind that this is a very (actually it's a capital v and double r type of very) large project. For a more recent contribution you can have a look at Angels in the Architecure by Chris Muir, which gives great insight (the presentation with images available from the OOW2011 content catalog).

Again I would also recommend Sten Vesterli's book Oracle ADF Enterprise Application Development - Made Simple (especially end of chapter 3, and beginning of chapter 6). Always nice to see lessons from someone outside of Oracle on the subject.

If you want more on technical stuff like naming conventions, you can also take a sneak peek at Oracle JHeadstart 11g for ADF Developer's Guide (chapter 2 and 3).

Looking Elsewhere
ADF Enterprise Methodology Group (ADF EMG) is a natural place to raise any questions you have regarding application architecture. The group description is:
The ADF Enterprise Methodology Group is for discussing high level design issues for ADF projects, beyond how to get things to work via the OTN forums.
Although the forum is active, the best practices content is not exactly what I would call current.

The group was founded (and is administered) by people with an interest in more than just the technical wizardry. They are most likely people, who at some point, actually had a responsibility for architectural decisions. Ever been there before? ;)

Look, It's a Shed!
My first real ADF 11gR2 application is what Chris Muir would call a shed. It is a nice shed, but a shed nonetheless. By and large, it was for all the right reasons (ADF noob, small application with little or no dependencies). It serves the purpose.

I have this nagging feeling that things will grow, and that is where you definitely need some thoughts on how to deal with the larger picture. You know, like best practices or patterns or guidelines or some such...

To be continued...

Wednesday, February 15, 2012

Run, Forrest, Run!

So, you started developing in JDeveloper. You deployed your ADF application. You redeployed your improved application. You also waited. Waited a lot... Is it really that slow?

I have a laptop (actually I have a new laptop, since I refused to run JDeveloper on the old one), it has Windows 7 64bit, Intel i7 CPU, 16Gb RAM and two raid-0 7200rpm disks (SSD would be better, but hey...). It also has a power supply the size of my desk. My point is; the machine is by no means slow.

Quite frankly, I was stunned at the time it took to redeploy ADF applications using the integrated Weblogic server. Turns out, there was a "good" reason for this, as I ran head long into a bug (that has been there for some time I gather).

Do NOT Use the Default Connection Type
When creating a new Application Module in JDeveloper, you will have two default configurations. Both of which uses Connection Type JDBC Datasource. The datasource name will look something like this: java:comp/env/jdbc/>yourconnectionname&lt;

Change the Connection Type to JDBC URL and you will see a world of difference when redeploying. This applies to both 11gR1 and R2. Andrejus Baranovskis has documented the work-around in this blog post.

When developing for a production application, you will most likely use a named datasource using jndi lookup, and also define it on your local Weblogic server, and this slow undeploy issue will not be a problem.

Give it What it Needs
On windows, you are by default running 32bit java on limited resources. Speed things up by switching to 64bit java and increasing the available memory for both JDeveloper and the integrated Weblogic. Spyros Doulgeridis has a detailed explanation on how to do this in this blog post.

Looks a bit difficult, especially if you are not familiar with the config files involved, but it is well worth the effort. I have not noticed any differences in behavior using 64bit java as opposed to the default jdk, but it is worth keeping your eyes open to this.

I like to keep my laptops JAVA_HOME separate from any server software installed, so I did not update JAVA_HOME according to the blog post. As a result I encountered  "Could not reserve enough space for object heap" on wls startup. This was due to the fact that the integrated wls still used the original 32bit java. Changing this line in setDomainEnv.cmd from:
set JAVA_HOME=%JAVA_HOME%
to:
set JAVA_HOME=C:\Software\Java\jdk1.6.0_25
solved the issue.

To Refresh, or Not Refresh
But do you really have to redeploy all the time? At least in 11.1.2 there are a number of changes you can do to an application without the need for redeploy. A simple refresh of the browser will suffice.

There is a trick to this (of course), Jobinesh has written about it in this blog post. You have to rebuild your projects for the changes  to propagate. I find this to be true. Sometimes. In my experience issues with refresh are especially evident when dealing with sessions and security. Some changes will work fine, others will not. Take notes as to when you have to redeploy, and when a simple rebuild/refresh will suffice. (As you can see from my lacking elaboration, I clearly did not take notes...)

It Leaks
Incidentally, you do not want to deploy too often. Repeated redeployments will eventually lead to health critical and danger of OutOfMemoryError messages from your integrated weblogic server. It will also become very unresponsive to deal with. A restart of the integrated wls will solve the problem.

It is the little things that is not written on the label that really gets to you. Well, now you know :-)

To be continued...

Tuesday, February 7, 2012

Preparing to Work With ADF

So, you have started something in Oracle ADF without the safety of a tutorial. How do you even begin thinking about planning how to start developing? Welcome to this short five step program that will have you flying off the cliff in no time ;-)

Before You Even Start!
Move the properties window in JDeveloper! Did you see the nice categorized look of the object properties in the Quick Start Guide by Grant Ronald? If you want that look (and trust me, you do), move the properties window inside the bottom middle window.

One
I am a dinosaur. I enjoy reading books on real paper, so I buy those. I also like CTRL+F, so I get the electronic versions too. Anyway you do it, you have to have at least some essential books. They are important for more reasons than their actual technical content, they will help you realize just how much code you are going write. That is correct, you thought it was all declarations and xml files? Prepare to be amazed at the amount of "cheating" you have to resort to.

Recommended books:
There are other books too, but these are the important ones for a real ADF project. If you are a complete ADF noob, start off with Grant Ronalds "Quick Start Guide to Oracle Fusion Development: Oracle JDeveloper and Oracle ADF", and follow up with (the slightly dated) "Oracle JDeveloper 11g Handbook: A Guide to Fusion Web Development".

I really, really wish I could have had the book by Nick Haralabidis earlier, would have saved me a ton of head scratching! Ah, well...

Two
The official docs. Keep them close. The most important are Fusion Developer's Guide, and Web User Interface Developer's Guide. A whopping 2960 pages pure enlightenment. I would also recommend installing the whole document library locally: http://docs.oracle.com/docs/cds/E24382_01.zip. If possible, insist on working connected to the Internet. JDeveloper is not as helpful as it could have been (it tries to reach oracle.com from the Help Center) when offline.

Three
Get your online resources ready. In my experience when you start developing, you will spend about half your time fiddling with JDeveloper, and the rest on various online sources. Prepare early by picking some winners:
  • Google.com
    Hmm, yes, not really a big surprise. The thing is, Google has indexed a lot of pages, even some with ADF related content. To locate the good stuff, you have to be specific. Learn the lingo: vo, eo, am, etc. If you can, use method names or names of the standard classes (EntityImpl, ViewObjectImpl, ApplicationModuleImpl, etc). Also use faces component names ("af:outputText"), or names from the javascript api.
  • forums.oracle.com
    This is where most of the technical stuff gets sorted out. It is a very active forum (and apparently Oracle product managers are spending some time there). I do not use Oracle's own search, but use a targeted Google search instead ("<your search term> site:forums.oracle.com").
  • Sample code
    There are some resources besides the official tutorials; Oracle ADF Code Corner and corresponding blog by Frank Nimphius, Steven Muench's Not Yet Documented Examples (Look at the top of the page for more sample code resources),  Andrejus Baranovskis' sample list and some bits by Nick Haralabidis. AMIS also has some nice examples sprinkled in between their blog posts.
  • youtube.com
    Yes, this is the way we are used to be entertained, so why not educated too? Pay special attention to ADF Insider Channel and Shay Shmeltzer's feed.
As I said, you will spend a fair amount of time searching the net, and you have to beware what you find. Often old and outdated resources are ranked high in Google, and if you are on 11.1.2, clunky solutions from 10g is not really what you want.

Four
Get the source code! Supported Oracle ADF customers can request the source code from Oracle Support. It might not be the first natural thing to occur to you (it would, if you were a "proper" java developer), and at this stage in your "project" it is not first and foremost because of the debugging possibilities.

With the source code you are able to see parameter names (and not just types) in the code editor, Quick JavaDoc actually works, and "Go to Declaration" actually goes to a place with code in it.

+1 to ADF. When developing in Forms or APEX you are calling black boxes, in ADF you are actually able to see what happens.

Five
Depending on how advanced you intend your first sample application to be, you might want to have a look at two utility classes used extensively in the ADF community. They go by the names ADFUtils and JSFUtils. In a real project, you definitely want them! Nick Haralabidis also mentions them in his book.

You will frequently see them in sample code, but where do they actually live? If you download the official Oracle Fusion Order Demo Application, and look into the StoreFrontModule workspace, under the Application Sources of the StoreFrontUI project, you will be rewarded.

...And off you go!

To be continued...

Monday, January 30, 2012

The Art of Self-preservation

This post is aimed at all those poor souls that find themselves facing Oracle ADF coming from a PL/SQL background (Forms, APEX or plain old database development).
Normal First Reactions
Despair. Most of us have felt it in the beginning, and it is considered perfectly normal. The feeling of constant despair will diminish slightly over time, but relapses will be frequent.

You will feel as if you have stepped 20 odd years back in time; yes, it has to be this hard to make even the simplest CRUD application.

You will have to pass some fairly elevated hurdles; yes, you have to learn (or at least have some knowledge of) Java, JSF, Expression Language, Groovy, CSS, HTML, Javascript and last but absolutely not least ADF itself.

Start in the Right End
You (or more likely your superior) bought the sales pitch, and thought you arrived to a mature, complete development framework specifically suited to leverage your existing Oracle investments. What you got was the biggest jigsaw puzzle ever, and all the corners missing. To even attempt fiddling around with the pieces, you have to have some basic skills.

ADF is a Java framework (although Java developers would call it xml-based). Java is core. You have to learn the stuff. You will not get far without Java. It is that simple. After all, the kids all learn it at school these days, how hard can it be? The answer is like always; 10% talent, 90% practice, it will take time to be good at it.

As a starting point, I recommend Head First Java. Not only is it educational, it will also help you to realize just how bad all other introductory programming books actually are.

The Next Step
As Java frameworks go, ADF is pretty big. Full JEE stack with lots of bells and whistles, and an abundance of XML-files. The good news is that you can achieve some pretty sophisticated behavior by declaration, the bad news is that you have to know where to turn the knobs. There are a lot of knobs.

First you have to learn the grand picture of the framework;
  • The model, aka the meat, or business components
  • The other model. Err? This is the binding layer, or view backend model or some such
  • The controller thingy with task flows
  • The view, as in GUI, and not to be confused with the view object in the first model. Argh...
Grant Ronald will help you on the way with his book Quick Start Guide to Oracle Fusion Development: Oracle JDeveloper and Oracle ADF. Do not let the lengthy title put you off, Mr. Ronald understands where you are coming from, and will gently nudge you in the right direction.

Ready Yet?
Well, that depends. Do you want to create tutorial applications, or the real thing? You should not balk at tutorials, that is not what I am saying. It is just that real business users have never had any clue how to best work with <insert technology/framework here>, they just have needs (of which, you are of course grateful, as it gives you work).

Users do not want to have plain CRUD anymore, they want to have an extremely functional and visually appealing working environment delivered at lightning speed. Business users will push you to the edge, they are both educated within their domain, and most likely used to some seriously fast client server applications.

Nervous?

Relax...
Stay sane just a bit longer. Take a deep breath, there will eventually be a light at the end of the tunnel. Let us hope it is not an oncoming train ;-)

Shay Shmeltzer has a more elaborate (and infinitely better) approach on how to get started with ADF in this blog post.

To be continued...

Thursday, January 26, 2012

Updated Statement of Direction

...Of sorts. Actually, I did not even know I had one until now. But here goes:
My long absence from this blog are based on all the right reasons. Family. Life. You know, the things that matters. And some reasons slightly off. Like ADF. Yup, Oracle Application Development Framework. Just writing it out loud like that is probably going to make Dimitri's blog feed processor choke all over again, and get this blog instantly blacklisted from anything slightly PL/SQL related for all time.

The Old Road
My fascination with APEX has not diminished by far, and I hope to revisit extremelyproductivefundevelopingsmoothookingdatacentricapplications-land in the future. But for now, the "other" framework is more than enough.

The New Direction
Being a consultant will make you do strange things from time to time. This is one of those. Am I a Java-programmer? No. Do I know JSF? No. Am I a Groovy programmer? No. Am I at least proficient at Expression Language? No. How about ADF-skills? Well, some. I guess. Luckily, Oracle says I only need a week, or at least a day to become an expert. Hmm. I had to pass on OOW last year, due to a project using ADF... Catch 22 all over again.

I cannot say I am that sorry, actually. Learning new stuff (i.e. banging my head against a wall), and really trying to understand it (i.e. repeatedly), is part of my nature.

It was a professional change long overdue.

The Blog
I will continue to post my progress with ADF (or lack thereof) here, feel free to divert this blog from your favorite feed reader... Oh, and some APEX stuff will probably still make it here from time to time.

You can go wash your eyes now :D