Skip navigation.

Development

Book Review - Oracle ADF Enterprise Application Development Made Simple (Second Edition)

Shay Shmeltzer - Fri, 2014-05-16 15:35

I got a copy of the new edition of Sten Vesterli's book about enterprise development with ADF, so I wanted to give a quick review update. I reviewed the first edition three years ago - and you can read that review here.

The second edition is not drastically different from the first one, and it shouldn't be. Most of the best practices that Sten pointed out in his original book still apply today. What might have changed a bit over the years are some of the tools used by enterprises to manage their application - and this is what some of  the updates are about - for example in addition to covering Subversion there is a Git section now. In addition Sten incorporate a few more architectural and conceptual bits and pieces that he collected over the past three years working with various customers. 

If you want to get a video summary of the type of topics Sten covers in this books you can watch this seminar he recorded for one of our virtual developer days

This is definitely a book that should be part of the reading material for groups about to embark on Oracle ADF development project - it will save them from some common mistakes and will put them on the right track to a well structured project and team.

To get the book or read a sample chapter click here

It is worthwhile mentioning also that over the past year we at Oracle have been quite actively increasing the amount of material we are producing around those aspects and we centralize them in our ADF Architecture Square on OTN.

If you haven't visited that site or subscribed to the ADF Architecture YouTube channel - it's time you'll do this to. 

Categories: Development

Pushing JDK to hosts using EM12c Custom Procedures

Arun Bavera - Fri, 2014-05-16 15:01
Installing JDK to Hosts using EM12c Custom Procedures
1) Goto Software Library:
clip_image002


2) Create a Folder keep all your Custom Procedures:
clip_image004





3) Right Click on this new Folder created and Create the Directive
clip_image006


4) Update the Directive details:
clip_image008


5) Provide the input parameters and choose the shell to be used for this directive:
clip_image010

6) Create the following script Install_jdk.sh and upload
# REM install_JDK.sh <JDK_Home_directory>
#!/bin/sh
export WorkDirectory=$PWD
echo "WorkDirectory=${WorkDirectory}"
export JDK_HOME=$1
echo "JDK Home=${JDK_HOME}"
echo "Creating directory==${JDK_HOME}"
/bin/sh -c 'mkdir -p $JDK_HOME'
echo "Changing the Permission"
/bin/sh -c 'chmod +x *'
echo "Current directory=$PWD"
echo "Installing JDK at ${JDK_HOME}"
/bin/sh -c 'cd $JDK_HOME;$WorkDirectory/jdk-6u45-linux-x64.bin'

Note: Make sure this file is saved with UNIX Terminators
clip_image012

7) Upload the JDK software from any agent Host as it exceeds 25MB can’t be uploaded from local desktop hosts.
clip_image014
Note: Make sure to choose the Install_jdk.sh script as the main file.

8) Save and Upload your directive.

9) Now you can create your custom Procedure and use this Directive to deploy the JDK to any host managed by the EM12c.

10)Goto Procedure Library:
clip_image016

11) Create new procedure:
clip_image018

12) Provide name and Temp stage directory info on Target host:
clip_image020

13) Choose Add Row to add one Target list row.

14) Provide Procedure Variable, this is Global Variable for the whole procedure:
clip_image022
15) Goto Procedure Steps tab: Choose Insert by choosing the “Default Phase”
clip_image024

16) Call it as “Install_JDK” and type “Directive”

clip_image026

17) Choose the Directive
clip_image028
Note:As of now you have re-chose the directive if there is any changes done to directive, choosing the latest version always not working

18)Goto next and choose “Run Directive” and “Perform Cleanup”
clip_image030

19)Assign the Global variable(JDK_Home) to this local variable JDK_HOME and Finish.

20) Now you are ready to Launch this procedure and deploy the JDK on any host managed by EM12c on any Directory where chosen Named Credentials has proper privileges.
Categories: Development

Zipping the Database Oracle Home for Provisioning

Arun Bavera - Fri, 2014-05-09 10:09

Refer:
  • Meet the basic infrastructure requirements as described in Chapter 2.
  • Ensure that the host is set up for database provisioning entities. For more information about host readiness, see Appendix B.
To create the zip file of an Oracle Home, use the following syntax:

To create the zip file of an Oracle Home, use the following syntax:
<ZIP PATH>/zip -r -S -9 -1 <archiveName.zip> <directory or list of files to be archived> -x <patterns to exclude files>

Taking backup of GCDOMAIN and excluding logs:
tar -cvpzf GC_Domain.tz /u01/app/gc_inst/user_projects/domains -X pat.txt

pat.txt
/u01/app/gc_inst/user_projects/domains/GCDomain/EMGC_ADPMANAGER1
/u01/app/gc_inst/user_projects/domains/GCDomain/servers/EMGC_ADPMANAGER1
/u01/app/gc_inst/user_projects/domains/GCDomain/servers/EMGC_JVMDMANAGER1/logs
/u01/app/gc_inst/user_projects/domains/GCDomain/servers/EMGC_OMS1/logs
*.log*
*.out*
*.lck
*.trc*

Categories: Development

World Cup 2014 APEX Betting app online

Dimitri Gielis - Thu, 2014-05-08 15:06
You remember the old days? 2006 ... APEX aka HTMLDB was still the new kid on the block!

To promote APEX at that time I build an Oracle APEX app that allowed you to see the scores of the World Cup 2006. After some feedback I created a betting piece to it... it gained much traction, it even got translated in Chinese! Here's a picture of that time:



Since then every year with the World Cup and Euro Cup I enable the app again. This year is not different... well it is; the app got an overhaul with some great new functionalities. I'll go deeper in some features in another blog post; but the main features are: authentication via Facebook (thanks to Peter) and you are able to create your own groups of people. So APEX R&D can see for example how it plays against our Canadian friends at Clarifit or our US friends at Enkitec :)

You find the new app at https://wc2014challenge.com


Let us know if you like it (or not) :)
Categories: Development

APEX 4.2 - Knowhow aus der Praxis

Denes Kubicek - Mon, 2014-05-05 09:57
Unser Kurs findet am 26.05.2014 - 28.05.2014 in Bensheim statt. Die Details vom Kurs können hier gefunden werden. Das ist unser letzter Kurs, der sich mit der APEX 4.xx Version befasst. Der nächste Kurs und alle weiteren Kurse werden sich mit der Version 5.xx beschäftigen. Nutzen Sie die Gelegenheit und melden Sie sich an. Unser Gastredner Carsten Czarski wird zwei Themen begleiten:

- Sample Geolocation Showcase
- APEX Mobile

Die Themen sind spannend und wurden grösstenteils überarbeitet und auf die Features von der Version 4.2 angepasst.

Categories: Development

Berdyaev on Dostoevsky

Greg Pavlik - Sun, 2014-05-04 14:36
I just finished reading Nicholai Berdyaev's interpretative study on Dostoevsky. On the one hand, this is a work that will be difficult to digest without reading at least the four major novels: Demons (or The Possessed), Crime and Punishment, The Idiot and Brothers Karamazov - as well, I might add, as the Adolescent (or A Raw Youth, as it is sometimes titled). Berdyaev pursues his themes by reference to both characters and arguments that appear in those works. On the other hand, he does such a fine job of concisely presenting major thematic elements and positions that may be non-obvious to American or english language readers, that I would with some hesitation recommend it as a "preface" to reading Doestoevsky's novels. In the latter case, some substantial portion of the discussion would be lost on the reader, but the context it provides overall would certainly be helpful to those approaching the great author's oeuvre for the first time. In particular, the theme of "spiritual" freedom as a necessary condition for human development seems be a correct reading of Dostoevsky and Berdyaev works this idea out from a number of angles. And happily Berdyaev is quite comfortable criticizing some of Dostoevsky's pointedly bad ideas as well.

There are two things I would note as well - Berdyaev is a fascinating critic and character in the development of Russian philosophy, specifically the religious inspired philosophers that in some way were heirs to Soloviev; Berdyaev operates in the role of a philosophical social commentator as opposed to a primarily theological tradition - in this case he is very different than contemporaries like Sergius Bulgakov or Pavel Florensky. I am most familiar with him through his earlier work, including the Meaning of the Creative Act. This book, of course, echoes Berdyaev's thinking, but he is quite clear in distinguishing his critique from the views of his subject, which makes the book all the more valuable in that it seems to avoid projecting his reading of Dostoevsky into Dostoevsky himself. Of course, others may disagree with this - and perhaps my own reading of both authors is colored by my own interpretation.

However, this certainly weighs on the question of how I would rank Berdyaev's critique of Dostoevsky: while it is not the subtlest discussion I have read, it is one of the simplest and in my view "most correct" readings of the author I have encountered. I would go so far as to suggest that Berdyaev's work deserves a primary place in the secondary literature on Dostoevsky. In fact, I would place it alongside Joseph Frank's monumental intellectual and literary biography as recommended companions to Dostoevsky's novels.

Addendum: I should have mentioned Berdyaev's final assesssment: "So great is the worth of Dostoevsky that to have produced him is by itself sufficient justification for the existence of the Russian people in the world." And that my friends is in my view true.

Bill Cosby the Mathematician

FeuerThoughts - Thu, 2014-05-01 19:30
Leafing my way through the Chicago Reader, I came across this ad:


It took me a moment to sort it out. Can you?
And I don't even know what it is an ad for. Maybe he is coming to Chicago soon for a show? Maybe his greatgrandchild said "Hey, Great Grandpa, look what I learned in school today!" and BC was just so taken with the idea - and the fact that his own clever descendent came up with it, that he decided to run it as an ad.
In any case, generally I hate ads, but I sure like this one.

Ha! Or maybe it is old as can be (as in dating to at least 2011) and I am just catching up:

http://weknowmemes.com/2011/11/sin-b-tan-b-equals-cosby/ 

Well I've never pretended to keep up.


Categories: Development

Strange moving filter predicates from index to table

XTended Oracle SQL - Wed, 2014-04-23 15:41

It seems strange to me:
When all needed columns are in the index, filter predicates are expectedly applied to the index

select a,b from xt_test where a=1 and
(:b is null or b = :b)

-----------------------------------------------------------------------------------------
| Id  | Operation        | Name       | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |            |      1 |        |      1 |00:00:00.01 |       2 |
|*  1 |  INDEX RANGE SCAN| PK_XT_TEST |      1 |      1 |      1 |00:00:00.01 |       2 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("A"=1)
       filter((:B IS NULL OR "B"=:B))

But if I add another column “PAD”, the filter moves to the table filters:

select a,b,pad from xt_test where a=1
and (:b is null or b = :b)

---------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Starts | E-Rows | A-Rows | Buffers |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |      1 |        |      1 |       4 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| XT_TEST    |      1 |      1 |      1 |       4 |
|*  2 |   INDEX RANGE SCAN          | PK_XT_TEST |      1 |     10 |     10 |       2 |
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter((:B IS NULL OR "B"=:B))
   2 - access("A"=1)

As workaround we can use something like that:

select--+ NO_ELIMINATE_JOIN(t) NO_ELIMINATE_JOIN(t2@sel$2) gather_plan_statistics
   a,b,pad
from xt_test t
where t.rowid in ( select t2.rowid
                   from xt_test t2
                   where a=1
                     and (:b is null or b = :b)
                 );

Plan hash value: 1464320522

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Starts | E-Rows | A-Rows |Buffers |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |      1 |        |      1 |      3 |
|   1 |  NESTED LOOPS               |            |      1 |      1 |      1 |      3 |
|*  2 |   INDEX RANGE SCAN          | PK_XT_TEST |      1 |      1 |      1 |      2 |
|   3 |   TABLE ACCESS BY USER ROWID| XT_TEST    |      1 |      1 |      1 |      1 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("A"=1)
       filter((:B IS NULL OR "B"=:B))

Spoiler:: Full test case SelectShow

create table xt_test(a,b,pad,constraint pk_xt_test primary key(a,b))
as select 
      mod(rownum,10) a
     ,rownum         b
     ,rpad(rownum,10) pad
   from dual
   connect by level<=100;
call dbms_stats.gather_table_stats('','XT_TEST');
var b number;
exec :b:=1;
select/*+ gather_plan_statistics */
  a,b,pad
from xt_test 
where a=1 and (:b is null or b = :b);
select * from table(dbms_xplan.display_cursor('','','allstats last'));

select/*+ gather_plan_statistics */
  a,b
from xt_test 
where a=1 and (:b is null or b = :b);
select * from table(dbms_xplan.display_cursor('','','allstats last'));

select--+ NO_ELIMINATE_JOIN(t) NO_ELIMINATE_JOIN(t2@sel$2) gather_plan_statistics
   a,b,pad 
from xt_test t
where t.rowid in ( select t2.rowid 
                   from xt_test t2 
                   where a=1 
                     and (:b is null or b = :b)
                 );
select * from table(dbms_xplan.display_cursor('','','allstats last'));


Update:
I just forgot to mention that there is another workaround – to force concatenation:

SQL> select--+ use_concat(or_predicates(2))
  2     a,b,pad
  3  from xt_test where a=1 and (:b is null or b = :b);

         A          B PAD
---------- ---------- ----------------------------------------
         1          1 1

Plan hash value: 3582916188

----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name       | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |            |      1 |        |     3 (100)|      1 |00:00:00.01 |       2 |      2 |
|   1 |  CONCATENATION                |            |      1 |        |            |      1 |00:00:00.01 |       2 |      2 |
|   2 |   TABLE ACCESS BY INDEX ROWID | XT_TEST    |      1 |      1 |     1   (0)|      1 |00:00:00.01 |       2 |      2 |
|*  3 |    INDEX UNIQUE SCAN          | PK_XT_TEST |      1 |      1 |     0   (0)|      1 |00:00:00.01 |       1 |      1 |
|*  4 |   FILTER                      |            |      1 |        |            |      0 |00:00:00.01 |       0 |      0 |
|   5 |    TABLE ACCESS BY INDEX ROWID| XT_TEST    |      0 |     10 |     2   (0)|      0 |00:00:00.01 |       0 |      0 |
|*  6 |     INDEX RANGE SCAN          | PK_XT_TEST |      0 |     10 |     1   (0)|      0 |00:00:00.01 |       0 |      0 |
----------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("A"=1 AND "B"=:B)
   4 - filter(:B IS NULL)
   6 - access("A"=1)
       filter(LNNVL("B"=:B))

Abyssinian: Jazz at Lincoln Center Full Concert

Greg Pavlik - Mon, 2014-04-21 18:46
It's my opinion that the pinnacle of artistic contribution from the American experience is found in Jazz (proof that art and suffering go hand in hand?). And I remain convinced that one of the most important exponents of Jazz as not just "high art" but truly great art is Wynton Marsalis.

Check out this Jazz-meets-Gospel concert in full. A uniquely American synthesis; uniquely wonderful.

And so it goes

Greg Pavlik - Sat, 2014-04-19 17:28
Between just being flat out busy and frankly finding Twitter a much lazier way to share basic information, this blog has been dormant for too long. In May, it will get a lot more attention - too much is going on in the Big Data space and Hadoop area more specifically to keep so quiet about it. Time to speak up a bit...

Dynamic ADF Forms with the new Dynamic Component (and synch with DB)

Shay Shmeltzer - Fri, 2014-04-11 17:22

I wrote a couple of blogs in the past that talked about creating dynamic UIs based on a model layer that changes (example1 example2). Well in 12c there is a new ADF Faces component af:dynamicComponent that makes dynamic forms even more powerful. This component can be displayed as various UI components at runtime. This allows us to create Forms and tables with full functionality in a dynamic way.

In fact, we use this when you create either a form or a table component in your JSF page dragging over a data control. We now allow you to not specify each field in your UI but just say that you want to show all the fields in the data control.

In the demo below I show you how this is done, and then review how your UI automatically updates when you add fields in your model layer. For example if your DB changed and you used the "Synchronize with DB" and added the field to the VO - that's it no more need to go to every page and add the new field.

Check it out:

<span id="XinhaEditingPostion"></span>

Categories: Development

New Continuous Integration tutorial published

Lynn Munsinger - Mon, 2012-07-02 09:44
Hot off the press – a new continuous integration tutorial. It’s really not just about continuous integration, though! You’ll find it useful even if you aren’t using a continuous integration server like Hudson. It’s useful if you are doing any part of the scenario it documents: Setting up Team Productivity Center for your team and [...]

Advanced ADF eCourse, Part Deux

Lynn Munsinger - Tue, 2012-06-19 15:11
In February, we published the first in a series of FREE(!) online advanced ADF training: http://tinyurl.com/advadf-part1 The response to that course has been overwhelmingly positive as more and more people are moving past the evaluation/prototype stages with ADF and looking for more advanced topics. I’m pleased to relay the good news that the 2nd part [...]

Fun with Hudson, Part 1.1

Lynn Munsinger - Tue, 2012-06-05 09:19
Earlier I posted that I had used the following zip command in the ‘execute shell’ action for my Hudson build job: zip -r $WORKSPACE/builds/$JOB_NAME-$BUILD_NUMBER * -x ‘*/.svn/*’ -x ‘*builds/*’ This zips up the content of the exported source, so that I can send it on to team members who need the source of each build [...]

Hiring a Curriculum Developer

Lynn Munsinger - Tue, 2012-05-15 09:34
If you are an instructional designer with an eye for technologies like ADF, or if you are an ADF enthusiast and excel at creatively producing technical content, then ADF Product Management would like to hear from you. We’re looking for a curriculum developer to join our ADF Curriculum team, which is tasked with ensuring that [...]

Hiring a Curriculum Developer

Lynn Munsinger - Tue, 2012-05-15 09:34
If you are an instructional designer with an eye for technologies like ADF, or if you are an ADF enthusiast and excel at creatively producing technical content, then ADF Product Management would like to hear from you. We’re looking for a curriculum developer to join our ADF Curriculum team, which is tasked with ensuring that [...]

New ADF Insider on Layouts

Lynn Munsinger - Mon, 2012-03-26 13:22
I’ve published an ADF Insider session that helps de-mystify the ADF Faces components and how to work with them (and not against them), when building ADF applications. There’s also some great information on building ADF prototypes. Take a look here: http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/layouts/layouts.html

New ADF Insider on Layouts

Lynn Munsinger - Mon, 2012-03-26 13:22
I’ve published an ADF Insider session that helps de-mystify the ADF Faces components and how to work with them (and not against them), when building ADF applications. There’s also some great information on building ADF prototypes. Take a look here: http://download.oracle.com/otn_hosted_doc/jdeveloper/11gdemos/layouts/layouts.html

Wed, 1969-12-31 18:00