<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-20567072</atom:id><lastBuildDate>Sun, 28 Apr 2013 18:21:51 +0000</lastBuildDate><category>LOUD</category><category>APEX 4.0</category><category>Collaborate</category><category>Expert APEX book</category><category>jQuery</category><category>MySQL</category><category>XML-DB</category><category>Designer</category><category>Dublin</category><category>VirtualBox</category><category>APEX 4.0; OGH</category><category>APEX</category><category>Oracle</category><category>ORCAN</category><category>DOAG</category><category>Google</category><category>ODTUG</category><category>KScope; APEX</category><category>APEX 4.0; OBUG</category><category>KScope</category><category>APEXposed</category><category>PlugIn</category><category>OBUG</category><category>AnyCharts</category><category>SQL Developer</category><category>EBS</category><category>UKOUG</category><category>Oracle Scene</category><category>BI Publisher</category><category>Forms</category><category>OOW</category><category>XFILES</category><category>Blog</category><category>HTML5</category><title>Roels Blog</title><description /><link>http://roelhartman.blogspot.com/</link><managingEditor>noreply@blogger.com (Roel)</managingEditor><generator>Blogger</generator><openSearch:totalResults>263</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/RoelsBlog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="roelsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-7122288627606441488</guid><pubDate>Sun, 28 Apr 2013 18:21:00 +0000</pubDate><atom:updated>2013-04-28T20:21:51.589+02:00</atom:updated><title>How attending #Kscope13 can change your life ...</title><description>Wow. Doesn't that sound dramatic? It sure does. But in a weird way it also might come true - as I have experienced in the past.&lt;br /&gt;
&lt;div&gt;
The first Kscope conference I attended was five years ago. And&amp;nbsp;purely&amp;nbsp;by&amp;nbsp;coincidence&amp;nbsp;that was in New Orleans as well! That first year I met all the people I knew from the forums, blogs etc. I had never met one of them before in real life. But due to the relatively small size of the conference and the specific open "Kscope culture" (you can just step up to anyone and start talking!), getting in touch with whoever you like is quite easy. So contacting the "guru's" &amp;nbsp;- as I saw those people back then, I know better know; now they're all "just" friends - has never been easier!&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And what did that bring me?&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;After that Kscope I focussed more on sharing my knowledge by blogging, answering questions o the OTN Forum and presenting.&lt;/li&gt;
&lt;li&gt;After a few years Oracle rewarded my efforts with an ACE award (and I got an assignment as ACE Director some time later).&lt;/li&gt;
&lt;li&gt;I wrote a chapter in the Expert Oracle Application Express book - all the authors I have met at ... Kscope.&lt;/li&gt;
&lt;li&gt;I wrote (the major part) of the APEX for Mobile Web Applications book - what all started by someone I met at ... Kscope.&lt;/li&gt;
&lt;li&gt;Currently I run the Dutch branch of the APEX Evangelists company. The two founders I met at ... Kscope.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Thus without Kscope, I would have never&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;started sharing my knowledge in the way I did since then.&lt;/li&gt;
&lt;li&gt;become an Oracle ACE (or ACE Director).&lt;/li&gt;
&lt;li&gt;written a chapter in an "Expert" book - and certainly not a whole book!&lt;/li&gt;
&lt;li&gt;started a company of my own.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://3.bp.blogspot.com/-HurjavOgn7k/UX1oPSb47lI/AAAAAAAAC24/maOLSr2wYfM/s1600/twilight+in+New+Orleans+fa.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://3.bp.blogspot.com/-HurjavOgn7k/UX1oPSb47lI/AAAAAAAAC24/maOLSr2wYfM/s320/twilight+in+New+Orleans+fa.jpg" width="320" /&gt;&lt;/a&gt;In short, attending Kscope did have an&amp;nbsp;enormous&amp;nbsp;effect on my business and personal life. And obviously for the better!&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So if you have never attended a Kscope conference before (or if you have!), come to New Orleans and join us! But be aware it might change your life ....&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;sup&gt;&lt;i&gt;(picture from&amp;nbsp;http://diane-millsap.blogspot.nl/)&lt;/i&gt;&lt;/sup&gt;</description><link>http://roelhartman.blogspot.com/2013/04/how-attending-kscope13-can-change-your.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-HurjavOgn7k/UX1oPSb47lI/AAAAAAAAC24/maOLSr2wYfM/s72-c/twilight+in+New+Orleans+fa.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-9053429825267831773</guid><pubDate>Wed, 24 Apr 2013 10:01:00 +0000</pubDate><atom:updated>2013-04-24T12:01:52.089+02:00</atom:updated><title>Mark your calendars: May 14 ODTUG's Expert Panel on APEX !</title><description>On May 14, the second online ODTUG's Expert Panel will take place.&amp;nbsp;&lt;div&gt;
This time it's all about Oracle Application Express!!&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So tune in on &lt;b&gt;May 14, at 12:00 EDT (that's 5PM in the UK, 6PM CET).&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://3.bp.blogspot.com/-0Z8-H5EHGUo/UXetT-c9lXI/AAAAAAAAC2I/CbLXjD8tBww/s1600/microphone-radio.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-0Z8-H5EHGUo/UXetT-c9lXI/AAAAAAAAC2I/CbLXjD8tBww/s1600/microphone-radio.jpg" /&gt;&lt;/a&gt;The panelists are: Dietmar Aust, Dan McGhan and myself.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Patrick Cimolini will act as the moderator.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
During this session you can ask any APEX related question to one of the three (or all three) panelists. And that can be either via chat or by voice - like a talk-radio show...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can register &lt;a href="https://www3.gotomeeting.com/register/909624086"&gt;here&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Oh, and did i mention it was &lt;b&gt;&lt;i&gt;&lt;u&gt;FREE&lt;/u&gt;&lt;/i&gt;&lt;/b&gt; ??&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Virtually see you there!&lt;/div&gt;
&lt;div&gt;
Roel&lt;/div&gt;
&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2013/04/mark-your-calendars-may-14-odtugs.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-0Z8-H5EHGUo/UXetT-c9lXI/AAAAAAAAC2I/CbLXjD8tBww/s72-c/microphone-radio.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-2184296389088799</guid><pubDate>Tue, 16 Apr 2013 08:22:00 +0000</pubDate><atom:updated>2013-04-16T10:22:05.619+02:00</atom:updated><title>New book: Oracle Application Express for Mobile Web Applications</title><description>&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
Very recently a new book came out: &lt;i&gt;"Oracle Application Express for Mobile Web Applications"&lt;/i&gt;. This book is aimed at developers with some knowledge of APEX and want to know more about building web applications with APEX (of course) especially aimed at mobile devices (iPhone, iPad, and other brands of smartphones and tablets). And although I had promised myself never to get myself involved in writing another book after "&lt;i&gt;Expert Oracle Application Express&lt;/i&gt;" (because it is sooo much work), I did get lured into writing this one by Dan McGhan.&amp;nbsp;&lt;div&gt;
Alas, due to personel circumstances, Dan had to step out of this project, but this vacancy has been filled in more than adequate by Christian Rokitta and David Peake.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Although I didn't receive my own author copies yet, David was so kind to bring his ones over during last week's APEX World in The Netherlands. And here is the picture of the unofficial launch of the book.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-G-LUf9SnF5Q/UW0KBBveX5I/AAAAAAAAC14/R4QvQlMtLEg/s1600/foto.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/-G-LUf9SnF5Q/UW0KBBveX5I/AAAAAAAAC14/R4QvQlMtLEg/s640/foto.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Before I forget, you can order the book on &lt;a href="http://www.amazon.com/gp/product/1430249471"&gt;Amazon&lt;/a&gt;... I hope you like it!&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2013/04/new-book-oracle-application-express-for.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-G-LUf9SnF5Q/UW0KBBveX5I/AAAAAAAAC14/R4QvQlMtLEg/s72-c/foto.JPG" height="72" width="72" /><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-488548327014836853</guid><pubDate>Thu, 21 Feb 2013 18:45:00 +0000</pubDate><atom:updated>2013-02-21T19:45:06.448+01:00</atom:updated><title>Help! APEX is blowing up our memory!</title><description>That's the message I received from a DBA friend who ran into this problem at her customer site. What really happened was that a couple of times a week one of the APEX processes was killed by the operating system due to reaching the limit of 16Gb memory. 16Gb!&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
And this resulted in an ORA-04030 message in the Oracle Database.&lt;/div&gt;
&lt;div&gt;
So I went to that client site and we dove into the database log files, the APEX logging, the access log files&amp;nbsp;and the error log files&amp;nbsp;of the web server. Every time we noticed calls of &lt;code&gt;WWW_FLOW_FILE_MGR.GET_FILE&lt;/code&gt; that seemed to be the problem. But the application wasn't huge, just 25 pages. Nothing complex, all pretty straight forward. So we started to look for the origin of those calls.&lt;br /&gt;
Just like in a lot of applications, this application also had a few images on the top of the screen (like Home, Logout, etc.). Just four or five on every page. However, these images were stored inside the APEX Repository, using the &lt;code&gt;#WORKSPACE_IMAGES#&lt;/code&gt; substitution string. And that results in a call to &lt;code&gt;WWW_FLOW_FILE_MGR.GET_FILE&lt;/code&gt;&amp;nbsp;for every image. So that's five requests for every page, while it could - and should - be only one. And four executions of that procedure every time, while it could - and should - be zero. So I advised to move these images to the web server, so they can be cached and wouldn't result in hitting the database anymore.&lt;br /&gt;
But when this would be the cause of the problem, it made sense it would occur on peak times. But the problem didn't occur on peak times. The last one was that same morning around 4:30AM.&lt;br /&gt;
So we dove further and then we discovered that quite a few of the select statements in the application used &lt;code&gt;#WORKSPACE_IMAGES#&lt;/code&gt;&amp;nbsp;as well! So the procedure would be executed for every row returned by the select statement. So in some particular cases - just happening three times a week or so - the query would return 10,000 of rows. Or even millions. So the procedure would be executed that often. And the best thing is: the image that the select was trying to retrieve ... didn't even exists! So millions of calls to the database to retrieve ... nothing!&lt;br /&gt;
So changing the select statements and moving all images to the web server will reduce the number of calls to that procedure from millions (or 100 of millions) times a week to ... zero (?).&lt;br /&gt;
And the chances are the memory problem is gone to.&lt;br /&gt;
&lt;br /&gt;
So when you run into these kind of problems were APEX seems to consume a lot of memory - or CPU for that matter - take a very good look to your own code first. The chances are that the resource consumption is not because APEX is misbehaving, but your code isn't optimal....&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2013/02/help-apex-is-blowing-up-our-memory.html</link><author>noreply@blogger.com (Roel Hartman)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-6428255164997166683</guid><pubDate>Wed, 12 Dec 2012 19:23:00 +0000</pubDate><atom:updated>2012-12-12T20:23:59.203+01:00</atom:updated><title>Changed rendering (and evaluation) behaviour in APEX 4.2</title><description>Today we ran into a problem in our recently upgraded APEX environment. In one of the pages we had a report defined on a pipelined table function. This function also changed a package global variable. The value of that global variable is used as a source for a page item that shows up in the same region just below the report. This ran fine in 4.1, it runs fine when we set the "Compatibility Mode" to 4.1 as well. But if we set that mode to 4.2...the page item shows...nothing !!!&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
What happened? According to the help on that Compatibility Mode property, items (and regions) in a display point are evaluated before rendering that display point. This is done to find out whether items / regions are displayed or not - to support the grid layout. To dig a little deeper (thanks to Patrick Wolf, who was helping us with this issue): As soon as the region grid is calculated, the same is done for the page item grid in the region which gets painted next. This calculation also has to determine the page item values, because they could be used in a condition of one of the following page items. &lt;b&gt;&lt;u&gt;This is all done before the region source is actually executed&lt;/u&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
So, in our case, the value of the page item - what was based on the result of the pipelined table function - was evaluated before that pipelined table function was actually executed...and therefore returned null. We could easily spot that in the debug output: When we compared the order of evaluations of the region and the items we saw a (huge) difference in 4.1 and 4.2 mode.&lt;br /&gt;
&lt;br /&gt;
So now we know what caused the issue. But how to solve it?&lt;br /&gt;
We created a PL/SQL sub region to the reports region and moved the page item to that subregion. That was not enough to evaluate the page item value after running the report. So we removed the PL/SQL source of that page item and moved it to the source of it's PL/SQL region. Even that didn't work out. But when we set the Item Display Position to "Below Content", we - finally - saw that the item was evaluated and rendered in the right position of the complete page flow....&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;So when you notice - similar - &amp;nbsp;strange behaviour when running your upgraded pages in 4.2, it is worthwhile to check the difference in evaluation and rendering order is the cause of that!&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2012/12/changed-rendering-behaviour-in-apex-42.html</link><author>noreply@blogger.com (Roel Hartman)</author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-4558182501470444213</guid><pubDate>Sun, 25 Nov 2012 10:47:00 +0000</pubDate><atom:updated>2012-11-25T11:48:38.776+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">UKOUG</category><title>Looking forward to UKOUG 2012</title><description>&lt;div style="text-align: left;"&gt;
As every year, the UKOUG conference is planned in the first week of December - and therefore as always nicely clashes with a Dutch national event, called "Sinterklaas" (see &lt;a href="http://en.wikipedia.org/wiki/Sinterklaas"&gt;http://en.wikipedia.org/wiki/Sinterklaas&lt;/a&gt; for the background information on that event!). &amp;nbsp;Luckily my kids are somewhat older now (and "non-believers"), so we can plan our own private event in the weekend afterwards....&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
Nevertheless, I am really looking forward to this years event! It will be my sixth consecutive&amp;nbsp;attendance&amp;nbsp;(and presentation), so I know what to expect: Great content, good atmosphere, lousy weather...&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
As usual I used the schedule planner (which has a great integrated App now as well) to guide me through these three days.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Eos2naG-uB8/ULH1yek86uI/AAAAAAAABH4/4asBuwDBtg8/s1600/UKOUG+Schedule.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-Eos2naG-uB8/ULH1yek86uI/AAAAAAAABH4/4asBuwDBtg8/s400/UKOUG+Schedule.png" width="341" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
I am really looking forward to two sessions in particular (apart from my own at Monday afternoon): &lt;i&gt;"Deploying and Developing Application Express with Oracle Pluggable Databases"&lt;/i&gt; by David Peake and &lt;i&gt;"Oracle APEX - Websockets (or When Push Comes to Shove)" &lt;/i&gt;by John Scott - got raving reviews when he did this at KScope12...&lt;/div&gt;
&lt;div&gt;
And of course the social events are at least as important as the sessions: Sunday night's ACE Dinner in particular (thanks to Debra Lilley for organizing!).&amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2012/11/looking-forward-to-ukoug-2012.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Eos2naG-uB8/ULH1yek86uI/AAAAAAAABH4/4asBuwDBtg8/s72-c/UKOUG+Schedule.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Birmingham, West Midlands, UK</georss:featurename><georss:point>52.486243 -1.890401</georss:point><georss:box>52.331536 -2.206258 52.640950000000004 -1.574544</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-2487961390677253775</guid><pubDate>Mon, 01 Oct 2012 23:12:00 +0000</pubDate><atom:updated>2012-10-02T01:12:16.520+02:00</atom:updated><title>OOW2012 - PL/SQL Enhancements in Oracle 12c </title><description>So what's planned for the upcoming 12c database regarding PL/SQL? What follows is a list of what are presented as the most important changes...&lt;div&gt;
&lt;br /&gt;&lt;div&gt;
&lt;u&gt;Improved PL/SQL - SQL interoperability&lt;/u&gt;&lt;br /&gt;&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;You don't need to specify the type at the schema level when you want to use it SQL, specification at the package level is sufficient and you can bind it to SQL directly;&lt;/li&gt;
&lt;li&gt;Get the performance of SQL with the clarity and reusability of PL/SQL by adding a &lt;b&gt;pragma UDF&lt;/b&gt; to a schema level PL/SQL function - almost as fast as pure SQL;&lt;/li&gt;
&lt;li&gt;You can declare a PL/SQL function in the WITH clause of a subquery: with function x(param) &amp;lt;body&amp;gt; end x; select x(p) from t;&lt;/li&gt;
&lt;li&gt;Using the "with" construct is 3.8x faster than using an old fashioned PL/SQL function, function with pragma is 3.9x faster, pure SQL is 5x faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;u&gt;A new security capability&lt;/u&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Grant access to a PL/SQL unit by granting a role to a PL/SQL unit, where the role contains the required rights for accessing the tables - so a function can only select, update etc from a table where it has been granted access to.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;u&gt;Improved programmers usability&lt;/u&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;New package UTL_CALL_STACK for better display of errors (with functions like dynamic_depth(), unit_line(), subprogram(), concatenate_subprogram(), owner(), current_edition(), lexical_depth());&lt;/li&gt;
&lt;li&gt;You can whitelist units that can reference a particular unit to prevent unwanted calls: add "accessible by (proc1, proc2)" to the unit definition.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2012/10/oow2012-plsql-enhancements-in-oracle-12c.html</link><author>noreply@blogger.com (Roel Hartman)</author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-7800897940789321125</guid><pubDate>Mon, 01 Oct 2012 16:26:00 +0000</pubDate><atom:updated>2012-10-01T18:26:21.509+02:00</atom:updated><title>OOW2012 - The Oracle Database 12c: The Pluggable Database</title><description>To me, one of the biggest announcements this week was not that Larry finally learnt how to use a clicker, but the disclosure of some of the new features of the next version of the Oracle Database. This version is also the "&lt;i&gt;first real multi-tenant database&lt;/i&gt;". So what does this mean?&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;a href="http://2.bp.blogspot.com/-ANWmnIbgA-Q/UGnDlL-6j1I/AAAAAAAAA9g/2z6pljSN-8M/s1600/plug.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://2.bp.blogspot.com/-ANWmnIbgA-Q/UGnDlL-6j1I/AAAAAAAAA9g/2z6pljSN-8M/s200/plug.jpeg" width="200" /&gt;&lt;/a&gt;In the current version of the database the core Oracle data dictionary is mixed up with the tables, packages etc you created yourself. All information is stored in the same obj$, tab$ and source$ tables. In 12c there is an architectural separation between the core Oracle system and your own application. The core Oracle data dictionary is called the &lt;b&gt;Container Database&lt;/b&gt; (CDB). The part of the database that contains your own code is called the &lt;b&gt;Pluggable Database&lt;/b&gt; (PDB). This PDB also contains its own datadictionary with it own obj$, tab$ etc tables. So it is a sort of hierarchy: objects are first located in the PDB, when they're not found there, information from the CDB is retrieved.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
The best thing is, you can plugin many PDB's into one CDB. And so creating a true separation of data and sources between two databases that are plugged in into one CDB. It is obvious that both the CDB and the PDB have a much smaller footprint than a database containing both. So upgrading the Oracle software will be done on the CDB only and will be much faster. Cloning a PDB - containing your application - can be done way faster because you don't need to clone all the core Oracle stuff&lt;/div&gt;
&lt;div&gt;
Implementation under the covers is done using transportable tablespaces with data and metadata. This architecture also implies there are different types of users: local users in a PDB and a common user in the CDB. A PDB can be administered by a privileged local user, the metadata about the PDBs are administered by the common user. And any privileged user can switch between PDBs. Every PDB has a default service with its name. Service names across the CDB hav to be unique within the CDB. And you can define database links between PDBs.&lt;/div&gt;
&lt;div&gt;
You can imagine that creating a new, empty, PDB is 1000 times faster than creating a whole new database...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
From an APEX point of view this implies that you actually can run multiple versions of APEX in one database - as long as every APEX version runs in a separate PDB!&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2012/10/oow2012-oracle-database-12c-pluggable.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-ANWmnIbgA-Q/UGnDlL-6j1I/AAAAAAAAA9g/2z6pljSN-8M/s72-c/plug.jpeg" height="72" width="72" /><thr:total>8</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-7006973963025975537</guid><pubDate>Thu, 27 Sep 2012 23:28:00 +0000</pubDate><atom:updated>2012-09-28T01:28:17.734+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OOW</category><title>OOW 2012 Schedule</title><description>As always it is hard to create a schedule for Oracle Open World. Knowing that there are about 100 concurrent sessions, you'll miss 99% of all the content...&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
Nevertheless, I combined sessions around APEX, Database Development, Cloud etc into an interesting schedule for the upcoming week...spiced up with the social/networking events as usual.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So for what it's worth, here it is (and note my own session as almost the closing session of the event..):&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-LPjv5mPggPU/UGTghYGduFI/AAAAAAAAA9A/ieF8OB7n8k8/s1600/OOWSchedule.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="299" src="http://3.bp.blogspot.com/-LPjv5mPggPU/UGTghYGduFI/AAAAAAAAA9A/ieF8OB7n8k8/s640/OOWSchedule.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2012/09/oow-2012-schedule.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-LPjv5mPggPU/UGTghYGduFI/AAAAAAAAA9A/ieF8OB7n8k8/s72-c/OOWSchedule.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Redwood Shores, Redwood City, CA, USA</georss:featurename><georss:point>37.5364134 -122.2455364</georss:point><georss:box>37.5112309 -122.28501840000001 37.5615959 -122.2060544</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-7549807196137451010</guid><pubDate>Thu, 27 Sep 2012 18:31:00 +0000</pubDate><atom:updated>2012-09-27T20:31:46.723+02:00</atom:updated><title>Bye Logica. Hello APEX-Evangelists!</title><description>17 years ago I started at working at CMG. 17 years! That's a long time, and a lot of things have changed during that period. CMG became LogicaCMG. LogicaCMG became Logica. And recently Logica merged with CGI - and the new name will probably be just CGI in a few months or years. So the company grow from a few thousand people mainly in The Netherlands and the UK to over 70,000 worldwide now. And you can imagine the structure of the organisation changed as well, from a team oriented approach to a more multi layered management structure. And, in my experience, meanwhile the culture of the organisation changed from a employee centred company to a shareholder (a.k.a. "money") centred organisation. So Logica as it is now, is a completely different company is the one I started 17 years ago.&amp;nbsp;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
So, a few months ago, that made me think: Would i spend the rest of my working life - what is still 20 years or so - at this company. And my answer was "No". So what's next? I could work for one of the competitors. but that wouldn't make a big change, wouldn't it? I might find a job at a "regular" company - not being some kind of IT integration company. That could be interesting, but I might find it somewhat boring after a few years. So what's another option? &amp;nbsp;Starting a company for myself &amp;nbsp;- or become independent is!&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-AekJwYrY-4o/UGR5rX63d7I/AAAAAAAAA8w/B4jOMKPlqgw/s1600/2012-09-27+07.52.19.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="476" src="http://3.bp.blogspot.com/-AekJwYrY-4o/UGR5rX63d7I/AAAAAAAAA8w/B4jOMKPlqgw/s640/2012-09-27+07.52.19.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
I talked with a some people that already made that decision earlier and they made me even more enthusiastic as I already was. I also talked to Dimitri and John from APEX Evangelists and there we found a match. &lt;a href="http://www.apex-evangelists.com/"&gt;APEX Evangelists&lt;/a&gt; was looking for a way to grow and saw The Netherlands as an interesting opportunity. So after some talks, emails, etc. we agreed I will start a Dutch branch of APEX Evangelists! And that's official as of today...&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
I am looking forward to expand the AE business in The Netherlands and work closely together with John and Dimitri. So, starting today, you can contact me at roel&amp;lt;at&amp;gt;apex-evangelists&amp;lt;dot&amp;gt;com...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://roelhartman.blogspot.com/2012/09/bye-logica-hello-apex-evangelists.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-AekJwYrY-4o/UGR5rX63d7I/AAAAAAAAA8w/B4jOMKPlqgw/s72-c/2012-09-27+07.52.19.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-2515779597698072880</guid><pubDate>Mon, 30 Jul 2012 14:54:00 +0000</pubDate><atom:updated>2012-07-30T16:54:33.739+02:00</atom:updated><title>APEXposed! 2012. Better than ever....</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-1ThykimFnd4/UBafliHPJaI/AAAAAAAAA3E/WS2Lilf_hYI/s1600/Slide.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="492" src="http://4.bp.blogspot.com/-1ThykimFnd4/UBafliHPJaI/AAAAAAAAA3E/WS2Lilf_hYI/s640/Slide.png" width="640" /&gt;&lt;/a&gt;No need to say more...impressive list of speakers, great city (I heard), and good fun! All other info and sign-up on&amp;nbsp;&lt;a href="http://odtugapextraining.com/"&gt;http://odtugapextraining.com&lt;/a&gt;.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span class="fullpost"&gt;&lt;/span&gt;</description><link>http://roelhartman.blogspot.com/2012/07/apexposed-2012-better-than-ever.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-1ThykimFnd4/UBafliHPJaI/AAAAAAAAA3E/WS2Lilf_hYI/s72-c/Slide.png" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-8125583735884695720</guid><pubDate>Wed, 11 Jul 2012 13:33:00 +0000</pubDate><atom:updated>2012-07-11T15:33:09.774+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>Handling errors in tabular forms - don't forget the commit...</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-pnFXX8UWCqQ/T_2Ag6eFoDI/AAAAAAAAA2Y/bzYq4PTeKdc/s1600/rollback.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-pnFXX8UWCqQ/T_2Ag6eFoDI/AAAAAAAAA2Y/bzYq4PTeKdc/s200/rollback.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
I always found manual tabular forms in APEX a sort of pain in the butt. I tried to avoid them whenever I could. But now and then there is no escape...&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
One reason why I dislike them is, when your submit process throws an error, your page is repainted again with all the fields in the original state. Sigh.. So you have to re-enter all your data and don't make that mistake again.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
The standard solution is to fill a collection with all your data on page load, build your tabular form on top of that collection, save the entered values into the collection and finally save the contents of your collection (or the entered values themselves, as they are equal on this point) to the real tables. So I implemented that.&lt;/div&gt;
&lt;div&gt;
But to my suprise, it didn't work! Debugging, looking at session state, etc nothing helped. Until I got the luminous idea of putting a "commit;" in the process that saves the entered values into the collection. That helped a lot...&lt;/div&gt;
&lt;div&gt;
I always thought that all processes committed automagically, but in fact it seems that all processes (probably the ones that fire on the same process point) are committed all together. Or rollbacked for that matter...&lt;/div&gt;
&lt;div&gt;
Maybe this will help you prevent in making the same mistake!&amp;nbsp;&lt;/div&gt;</description><link>http://roelhartman.blogspot.com/2012/07/handling-errors-in-tabular-forms-dont.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-pnFXX8UWCqQ/T_2Ag6eFoDI/AAAAAAAAA2Y/bzYq4PTeKdc/s72-c/rollback.jpg" height="72" width="72" /><thr:total>3</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-1356929297640556556</guid><pubDate>Tue, 10 Apr 2012 09:44:00 +0000</pubDate><atom:updated>2012-07-17T19:57:33.784+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>5 Cool Things you can do with HTML5 (p4)</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-BMkdAe2Vm9Q/T4PyUDVLahI/AAAAAAAAAzw/HB-Tiv5gnuc/s1600/messagescreens.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://3.bp.blogspot.com/-BMkdAe2Vm9Q/T4PyUDVLahI/AAAAAAAAAzw/HB-Tiv5gnuc/s320/messagescreens.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
The fourth part of this series of posts will cover &lt;b&gt;&lt;u&gt;Notifications&lt;/u&gt;&lt;/b&gt;. When you are a user of GMail and using Chrome, you probably are familiar with those little boxes that popup when you've got new mail. Those type of notifications you can create in your APEX application as well - using HTML5!&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
Alas, at this moment, these type of notifications only work in Chrome. In Firefox you can add &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/html-notifications/" target="_blank"&gt;this extension&lt;/a&gt; so it'll work in that browser as well. The other ones will follow - sooner or later...&lt;br /&gt;
You can also use &lt;a href="http://www.oracle.com/technetwork/developer-tools/apex/notification-v-1-0-157692.zip" target="_blank"&gt;this plugin&lt;/a&gt; that mimics this feature - to be safe on every platform, but that one will appear in your browser, so that's not a &lt;b&gt;desktop &lt;/b&gt;notification.&lt;br /&gt;
&lt;b&gt;But how do you create a real desktop notification?&lt;/b&gt;&lt;br /&gt;
As usual with HTML5, you just need a few lines of code. The code below is executed in a Dynamic Action when a button is pressed:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;function RequestPermission (callback) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;window.webkitNotifications.requestPermission(callback);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;function showNotification(){&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if (window.webkitNotifications){&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (window.webkitNotifications.checkPermission() &amp;gt; 0) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; RequestPermission(showNotification);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; else {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; window.webkitNotifications.createNotification(&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; "#APP_IMAGES#HTML5.jpg", //Put link to your icon here&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; "Notification",&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; "Now you are notified!").show();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;else&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{ alert('Sorry, you have to switch to another browser to use notifications - or use the other button ;-)');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;//Run:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;showNotification();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
Just like geoLocations, the browser has to ask the user for permission to use Desktop Notifications (for a domain). Once the permission has been granted you can call the "show()" method, containing an image, the title and the actual message. Easy and cool, huh!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And you can even get completely wild by creating notifications that contain HTML or adding event listeners to your notifications - for instance doing something when the notification is closed. See &lt;a href="http://www.html5rocks.com/en/tutorials/notifications/quick/" target="_blank"&gt;this &lt;/a&gt;for some more examples.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
See the working APEX example on :&amp;nbsp;&lt;a href="http://apex.oracle.com/pls/apex/f?p=22115:NOTIFICATIONS"&gt;http://apex.oracle.com/pls/apex/f?p=22115:NOTIFICATIONS&lt;/a&gt;.&lt;/div&gt;</description><link>http://roelhartman.blogspot.com/2012/04/5-cool-things-you-can-do-with-html5-p4.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-BMkdAe2Vm9Q/T4PyUDVLahI/AAAAAAAAAzw/HB-Tiv5gnuc/s72-c/messagescreens.gif" height="72" width="72" /><thr:total>3</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-8341319264996977660</guid><pubDate>Fri, 06 Apr 2012 12:01:00 +0000</pubDate><atom:updated>2012-07-17T19:57:01.551+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>5 Cool Things you can do with HTML5 (p3)</title><description>&lt;div class="separator" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;
&lt;img border="0" height="212" src="http://1.bp.blogspot.com/-NveCHo1uiGA/T32cuqVB3xI/AAAAAAAAAzo/26keGyjCcXU/s320/Location-map.jpeg" width="320" /&gt;&lt;/div&gt;
&lt;i&gt;Location, location, location, it's all about location...&lt;/i&gt;
&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
Probably one of the most frequently used HTML5 features is geoLocation. Why? Because it is very easy to use and cool too!&lt;br /&gt;
You can check the corresponding example page on&amp;nbsp;&lt;a href="http://apex.oracle.com/pls/apex/f?p=22115:GEOLOCATION" target="_blank"&gt;http://apex.oracle.com/pls/apex/f?p=22115:GEOLOCATION&lt;/a&gt;.&lt;br /&gt;
So how does that work?&lt;br /&gt;
In fact it is just a few lines of code. First include the Google Javascript API (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;). &lt;br /&gt;
The next step (on Page Load) is to actually get the current position of the browser device by&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if (navigator.geolocation) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; navigator.geolocation.getCurrentPosition(showLocation, handleError);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;} else {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; error('GeoLocation is not supported in this browser');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
Where &amp;nbsp;&lt;b&gt;showLocation&lt;/b&gt;&amp;nbsp;specifies the callback method that retrieves the location information. This method is called asynchronously with an object corresponding to the&amp;nbsp;&lt;b&gt;Position&lt;/b&gt;&amp;nbsp;object which stores the returned location information. So you can use this function to actually draw the map and place the marker. And&amp;nbsp;&lt;b&gt;ErrorHandler&lt;/b&gt;&amp;nbsp;is an optional parameter that specifies the callback method that is invoked when an error occurs in processing the asynchronous call. This method is called with the&amp;nbsp;&lt;b&gt;PositionError&lt;/b&gt;&amp;nbsp;object that stores the returned error information. So when somethings goes wrong you can show an alert with your own message.&lt;br /&gt;
Depending on the security settings of the browser, your user might see a message like "apex.oracle.com wants to track your physical location". The user has to accept or deny access to this information. In the privacy settings of your browser you can see what sites have access to your location.&lt;br /&gt;
&lt;br /&gt;
And for actually determining your position, Google uses either your IP-address - so that might be quite inadequate when you use proxies - or the GPS in your (mobile) device. For the latter type of device you can also use&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;navigator.geolocation.watchPosition(showLocation, handleError);.&lt;/span&gt;&amp;nbsp;Then that function will be called every time the Geo of your device changes. So you can draw a map of where the user of your app has been during the period the app is active (like &lt;a href="http://runkeeper.com/" target="_blank"&gt;Runkeeper&lt;/a&gt;&amp;nbsp;does).&lt;br /&gt;
&lt;br /&gt;
You can see the full W3C API description &lt;a href="http://dev.w3.org/geo/api/spec-source.html" target="_blank"&gt;here&lt;/a&gt;.</description><link>http://roelhartman.blogspot.com/2012/04/5-cool-things-you-can-do-with-html5-p3.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-NveCHo1uiGA/T32cuqVB3xI/AAAAAAAAAzo/26keGyjCcXU/s72-c/Location-map.jpeg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-3147723078800277661</guid><pubDate>Wed, 04 Apr 2012 13:05:00 +0000</pubDate><atom:updated>2012-07-17T19:56:12.789+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>5 Cool Things you can do with HTML5 (p2)</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Ujdw7Gnzvq8/T3w5x-J65LI/AAAAAAAAAzg/9Ah2aPixuIA/s1600/Webstorage.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://1.bp.blogspot.com/-Ujdw7Gnzvq8/T3w5x-J65LI/AAAAAAAAAzg/9Ah2aPixuIA/s320/Webstorage.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
As promised in the&lt;a href="http://roelhartman.blogspot.co.uk/2012/04/5-cool-things-you-can-do-with-html5-p1.html"&gt; previous post in this series&lt;/a&gt;, this one will be about Web Storage.&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
Before the HTML5 era, you could store information on the client (browser) using a cookie. But that has two disadvantages (or limitations). First of all, a cookie's size is limited to 4096 bytes (but that differs over the different browsers and versions) and secondly - even more important - is that a cookie is always sent with every HTTP request, resulting in more data being sent over the wire. And that reduces scalability and decreases performance.&lt;/div&gt;
&lt;div&gt;
Using HTML5 you can use another type of storage, or even two types: sessionStorage and localStorage. In most browsers the storage is limited to 2.5Mb, but some go up to 5Mb or even unlimited. See &lt;a href="http://dev-test.nemikor.com/web-storage/support-test/" target="_blank"&gt;this page&lt;/a&gt; for all limits per browser. And it is important to know that sessionStorage lives as long as your browser/tab is open - and is deleted on close, while localStorage stays on the client - even after a shutdown of the machine.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
In a storage only key-value pairs are stored - so it's a sort of NOSQL ;-) . You can add or replace a value in your store using&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;localStorage.setItem("test", "12345");&lt;/span&gt; or shorter : &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;localStorage.test="12345";&lt;/span&gt; You can even leave the quotes out, while all values are stored as text anyway.&lt;/div&gt;
&lt;div&gt;
And similar, you can retrieve a value using&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;localStorage.getItem("test");&lt;/span&gt; or &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;localStorage.test;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
One more thing: you can only access contents of the storage in a page when the storage is created from the same domain - so no cross domain sharing of data!&lt;/div&gt;
&lt;div&gt;
You see the contents of the storage from a domain, by opening up the Javascript console and issue the localStorage command and inspect the contents of the object.&lt;i&gt;&amp;nbsp;&lt;/i&gt;Or, in Chrome, open up the Developer Tools (Ctrl-Shift-I) and check the Resources tab. The users of the&lt;a href="http://apex.oracle.com/pls/apex/f?p=APEX_DEVELOPER_ADDON:ABOUT:0:::::" target="_blank"&gt; APEX Developer Addon&lt;/a&gt; will see that this (nice!) tool uses the localStorage feature as well...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You see the full W3C defintion on Web Storage&amp;nbsp;&lt;a href="http://dev.w3.org/html5/webstorage/#the-storage-event"&gt;here&lt;/a&gt;.
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;u&gt;How could this be useful in an APEX environment?&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
When you want to welcome a user back, with a message like "Nice to see you back, we haven't seen you since &amp;lt;some date/time&amp;gt;", you can store that last date in the database. But then a user needs a login, otherwise you wouldn't recognize him. If you store that information in the localStorage, you can use that to say hello again - assuming he didn't remove the localStorage and he uses the same browser ;-)&lt;/div&gt;
&lt;div&gt;
A more sophisticated use could be, when you think of a webshop. A lot of people do "window shopping" on the net: filling up their virtual baskets with stuff...but never proceed to the counter. If you issue some kind of submit or AJAX call, every time a user adds something to his basket, you get a lot of network traffic and database processing for...what? For nothing actually. So when you keep this shopping on the client side, and submit the contents of the localStorage.basket to the database if &amp;nbsp;and only if the user presses the [proceed to checkout] button, you maximize the use of your resources. Positive impact on scalability and performance!&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
See a working example on :&amp;nbsp;&lt;a href="http://apex.oracle.com/pls/apex/f?p=22115:LOCALSTORAGE" target="_blank"&gt;http://apex.oracle.com/pls/apex/f?p=22115:LOCALSTORAGE&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Next post will be about ... GeoLocation!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</description><link>http://roelhartman.blogspot.com/2012/04/5-cool-things-you-can-do-with-html5-p2.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Ujdw7Gnzvq8/T3w5x-J65LI/AAAAAAAAAzg/9Ah2aPixuIA/s72-c/Webstorage.jpg" height="72" width="72" /><thr:total>6</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-3008766752640958894</guid><pubDate>Mon, 02 Apr 2012 14:03:00 +0000</pubDate><atom:updated>2012-07-17T19:55:32.025+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>5 Cool Things you can do with HTML5 (p1)</title><description>Recently I did a presentation with the title "&lt;i&gt;5 cool things you can do with HTML 5&lt;/i&gt;". I even did that presentation 3 times within a week: OUG Ireland had the premiere, then OUG Norway and OGH APEX Day as the last one of the week. I've planned the same - or similar - presentation for the upcomig Collaborate&amp;nbsp;and OUG Bulgaria conferences.&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As the most stuff I present is demo (the slide deck is just 5 pages), people frequently ask whether I could write blogpost on one of the subjects. So why not create a sequence of 5 posts....that should make sense.&lt;/div&gt;
&lt;div&gt;
So this is that first of five posts. I hope, not promise, to finish it within a week or two...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;u&gt;Cool thing 1 - Input Types&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-gz8rIGymC7I/T3ibUcjBycI/AAAAAAAAAzU/FcH2m5v4EC8/s1600/IMG_0190.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-gz8rIGymC7I/T3ibUcjBycI/AAAAAAAAAzU/FcH2m5v4EC8/s320/IMG_0190.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;
With HTML5, you can use both new Input Types as well as additional Attributes. New Input Types are &amp;nbsp;URL, email, number, search and more - see&amp;nbsp;&lt;a href="http://www.w3schools.com/html5/html5_form_input_types.asp"&gt;http://www.w3schools.com&lt;/a&gt; for a complete list. The definition is very straightforward. In your HTML, replace type="text" with type="email". So the definition is something like :&amp;nbsp;&amp;lt;input type="email" &amp;nbsp;value="" size="30"&amp;gt;.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
In a regular, desktop, browser that change doesn't seem to do anything, but if you visit that page using a mobile browser, you definitely notice the difference: (On an iPad/Phone/Pod) the virtual keyboard changes and will contain a "@" sign. And something similar happens for URL's (a ".com" key will appear) and numeric fields. And that's all without any coding!&lt;/div&gt;
&lt;div&gt;
But in an APEX environment you can't natively use these kind of fields - unless you write all the code the retrieve and store the information yourselves. Luckily there is a plugin available (on&amp;nbsp;&lt;a href="http://apex-plugin.com/"&gt;http://apex-plugin.com/&lt;/a&gt;) that bridges that gap. And even better...in APEX 4.2 these item types will be 100% native available!&lt;/div&gt;
&lt;div&gt;
Apart from the new input types, you can also use the new attributes as defined on &lt;a href="http://www.w3schools.com/html5/tag_input.asp"&gt;http://www.w3schools.com&lt;/a&gt;. Two of those new attributes are particulary cool : Placeholder and Required. The "placeholder" attribute specifies a short hint that describes the expected value of an input field (e.g. a sample value or a short description of the expected format).&amp;nbsp;The hint is displayed in the input field when it is empty, and disappears when the field gets focus.&lt;br /&gt;
The "required" attribute - not surprisingly - specifies that an input field must be filled out before submitting the form. You can set these attributes using the "HTML Form Element Attributes" property of any (text) field. And when you combine that with a CSS3 style setting using a pseudo class ":required" selector, like&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; :required {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; border-color: #88a;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; -webkit-box-shadow: 0 0 3px rgba(0, 0, 255, .5);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
you get the red boxes around the input field.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Custom data attributes&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
Another new HTML5 feature is the support for custom attributes inside HTML elements. In the old world you could add an item using:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;input&amp;nbsp;type="text"&amp;nbsp;id="Roel"&amp;nbsp;value="Roel Hartman"&amp;nbsp;book="Expert Oracle APEX" twitter="RoelH"&amp;nbsp;/&amp;gt;&lt;/span&gt;&lt;br /&gt;
So you could use any custom attribute name you can come up with. In HTML5 however, you should prefix your custom attributes with "data-". So the HTML for the example above should be:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;input&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;type="text"&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;id="Roel"&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;value="Roel Hartman"&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;data-&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;book="Expert Oracle APEX" data-t&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;witter="RoelH"&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;/&amp;gt;&lt;/span&gt;
&lt;br /&gt;
Having done that, you can easily access your custom attributes in Javascript:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$("#Roel").data().twitter;
&lt;/span&gt;&lt;br /&gt;
And you can also create, change or remove the data-values by something similar to:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$("#Roel").data().testing="Test123";&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;(or using the &lt;i&gt;setAttribute, getAttribute &lt;/i&gt;and &lt;i&gt;removeAttribute&lt;/i&gt; methods).&lt;br /&gt;
&lt;br /&gt;
The last thing I would like to mention is the "speech" option, see a previous blogpost (&lt;a href="http://roelhartman.blogspot.co.uk/2012/01/wouldnt-you-like-to-talk-to-your-apex.html"&gt;http://roelhartman.blogspot.co.uk/2012/01/wouldnt-you-like-to-talk-to-your-apex.html&lt;/a&gt;) for more info on that one!&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can see them all in action (and whether your browser supports it or not) on :&amp;nbsp;&lt;a href="http://apex.oracle.com/pls/apex/f?p=22115:INPUTTYPES"&gt;http://apex.oracle.com/pls/apex/f?p=22115:INPUTTYPES&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The next post will cover &lt;b&gt;Web Storage&lt;/b&gt;!&lt;/div&gt;</description><link>http://roelhartman.blogspot.com/2012/04/5-cool-things-you-can-do-with-html5-p1.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-gz8rIGymC7I/T3ibUcjBycI/AAAAAAAAAzU/FcH2m5v4EC8/s72-c/IMG_0190.jpg" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>7431 Diepenveen, The Netherlands</georss:featurename><georss:point>52.2915271 6.1485912</georss:point><georss:box>52.2526791 6.0696272 52.330375100000005 6.2275552</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-4336849066951152899</guid><pubDate>Fri, 17 Feb 2012 13:42:00 +0000</pubDate><atom:updated>2012-02-17T14:52:34.031+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">BI Publisher</category><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>Create a PDF document containing dynamic images</title><description>For a current project we had the requirement to publish a more or less "glossy" PDF document containing all information about a certain object. One of the bits of information was...an image.&amp;nbsp;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
The first trial we used the&amp;nbsp;APEX_WEB_SERVICE.BLOB2CLOBBASE64 function to convert a Blob to clob with base64 encoding. In the RTF Template (used in Word with the BI Publisher plugin) you can reference it using this code :&lt;/div&gt;
&lt;div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;fo:instream-foreign-object content-type="image/jpg"&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;xsl:value-of select=".//PHOTO"/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/fo:instream-foreign-object&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
(where PHOTO is the alias of the clob column).&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
This works....until you're using a slightly bigger picture than a tiny thumbnail. In that case you hit the 32K limit per report column. Although Marc Sewtz (from the APEX Development Team) sort of "promised" to lift this limit in his blogpost of Jun 13 2008 (!) (&lt;a href="http://marcsewtz.blogspot.com/2008/06/one-question-about-pdf-printing-feature.html"&gt;http://marcsewtz.blogspot.com/2008/06/one-question-about-pdf-printing-feature.html&lt;/a&gt;), it is still the current limit.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
The workaround - or other approach - is to call an image with a http request in the report definition. Therefore you have to create your own "display_image" procedure that downloads the image. Be sure to grant execute on this procedure to APEX_PUBLIC_USER or ANONYMOUS (depending on your configuration), and modify the WWV_FLOW_EPG_INCLUDE_MOD_LOCAL function when you're using the EPG&amp;nbsp;(see &lt;a href="http://daust.blogspot.com/2006/04/xe-calling-stored-procedures.html"&gt;http://daust.blogspot.com/2006/04/xe-calling-stored-procedures.html&lt;/a&gt;).&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Next, change your query with a call to that procedure:&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;apex_application.get_g_base_href||&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;'#OWNER#.DISPLAY_IMAGE?P_OBJECT_ID'||ID as IMAGE_URL&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
In your RTF Template you have to embed a dummy image and set the "Alt-Text" (via Size in the Image menu) to url:{IMAGE_URL}.&lt;br /&gt;
&lt;br /&gt;
The first result was : It works for HTML output and Excel output...but not for Word (RTF) or PDF. Why this difference? No idea!&lt;br /&gt;
My setting was like this:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-8tqCzCXAWus/Tz5Wgv0RQ8I/AAAAAAAAAyg/mZ7peAxoMCg/s1600/Doesntwork.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/-8tqCzCXAWus/Tz5Wgv0RQ8I/AAAAAAAAAyg/mZ7peAxoMCg/s400/Doesntwork.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
So the "POPULAIRE_NAAM" was visible on the report, but the image wasn't. And everything else below - all 8 ROWSETS - were visible as well. FYI: The grey border above with the text "Geen afbeelding beschikbaar" is an image itself, so it's not some image missing from this blogpost ;-)&lt;br /&gt;
After a lot of trial and error and Googling around, I called to the OTN Forum for help (see thread here : &lt;a href="https://forums.oracle.com/forums/thread.jspa?threadID=2347610&amp;amp;tstart=0"&gt;https://forums.oracle.com/forums/thread.jspa?threadID=2347610&amp;amp;tstart=0&lt;/a&gt;). After a few hours Carsten Czarski of Oracle Germany pointed to an elaborated example he put on the web - a long time ago, looking at the screen prints : &lt;a href="http://www.oracle.com/webfolder/technetwork/de/community/apex/tipps/pdf-dyn-images/index.html"&gt;http://www.oracle.com/webfolder/technetwork/de/community/apex/tipps/pdf-dyn-images/index.html&lt;/a&gt;. Because it was in German, it never popped up in my Google search..while all the components where in there! So I created a very very simple example to mimic his case. And then the image did show up!&lt;br /&gt;
So what did I do wrong?&lt;br /&gt;
&lt;br /&gt;
It seems that the [for-each ROWSET1_ROW] loop must be defined &lt;b&gt;&lt;u&gt;before&lt;/u&gt;&lt;/b&gt; the image (although in my case that rowset always contains just one entry). It didn't matter for the "POPULAIRE_NAAM" field, but it did for the image (in Word/PDF, not in HTML/Excel).&lt;br /&gt;
So the correct setting is:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Ohc0OnmbAo0/Tz5Yk1VcXAI/AAAAAAAAAyo/EQMvqjN-4B0/s1600/Works.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://3.bp.blogspot.com/-Ohc0OnmbAo0/Tz5Yk1VcXAI/AAAAAAAAAyo/EQMvqjN-4B0/s400/Works.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
and now the PDF can contain images of any size....&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</description><link>http://roelhartman.blogspot.com/2012/02/create-pdf-document-containing-dynamic.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-8tqCzCXAWus/Tz5Wgv0RQ8I/AAAAAAAAAyg/mZ7peAxoMCg/s72-c/Doesntwork.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-791469337467008898</guid><pubDate>Mon, 23 Jan 2012 12:39:00 +0000</pubDate><atom:updated>2012-01-23T13:41:29.986+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>Create a calendar item returning week numbers</title><description>&lt;a href="http://1.bp.blogspot.com/-8WxOdsUPpT0/Tx1UUFGGcWI/AAAAAAAAAyM/WSCZtOPHlgA/s1600/calendar.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://1.bp.blogspot.com/-8WxOdsUPpT0/Tx1UUFGGcWI/AAAAAAAAAyM/WSCZtOPHlgA/s200/calendar.jpg" width="200" /&gt;&lt;/a&gt;When you use the built-in jQuery UI datepicker in your APEX page, you choose from a number of different format masks...but something with "week" is not one of them. And guess what I needed for recent project...&lt;br /&gt;
But, the good news is, you can (rather easy) use the jQuery framework to tweak the result that's returned from the datepicker.&lt;br /&gt;
Just create a Dynamic Action that fires on load of the page, and add these line of Javascript:&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;//Show the week number as the first column&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$( ".datepicker" ).datepicker( "option", "showWeek", true );&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;//Set Monday as the first day of the week&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$( ".datepicker" ).datepicker( "option", "firstDay", 1 );&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;//Return yyyy-ww instead of the actual date&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$(".datepicker").datepicker("option", "onSelect",&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function(value, date)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { var week=$.datepicker.iso8601Week (&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Date(date.selectedYear,&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date.selectedMonth,&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date.selectedDay));&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).val(date.selectedYear+'-'+(week&amp;lt;10?'0':'')+week);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;);&lt;/span&gt;&lt;br /&gt;
That's it. Of course you have to replace the jQuery selector - $(".datepicker") - with the one that matches your selection.&lt;br /&gt;
You can also substitute the function that generates the week number with your own one. And, yes, you could turn this into a plug-in if you like... (maybe I will when I've got the time, but no guarantee).</description><link>http://roelhartman.blogspot.com/2012/01/create-calendar-item-returning-week.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-8WxOdsUPpT0/Tx1UUFGGcWI/AAAAAAAAAyM/WSCZtOPHlgA/s72-c/calendar.jpg" height="72" width="72" /><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-5089828346484270523</guid><pubDate>Tue, 10 Jan 2012 13:28:00 +0000</pubDate><atom:updated>2012-01-10T14:30:21.435+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><category domain="http://www.blogger.com/atom/ns#">APEX</category><title>Wouldn't you like to talk to your APEX app?</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eZkYL18p54g/Tww9QpU1aTI/AAAAAAAAAyA/8TsFnMUpkcc/s1600/742microphone.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://3.bp.blogspot.com/-eZkYL18p54g/Tww9QpU1aTI/AAAAAAAAAyA/8TsFnMUpkcc/s200/742microphone.gif" width="80" /&gt;&lt;/a&gt;&lt;/div&gt;
Of course you are familiar with Martin Giffy D'Souza's blog &lt;a href="http://www.talkapex.com/"&gt;talkapex.com&lt;/a&gt;&amp;nbsp;(if you're not, check it out - it's really worthwhile). But wouldn't it be nice to not only talk &lt;b&gt;about &lt;/b&gt;APEX, but also &lt;b&gt;to &lt;/b&gt;APEX?&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
The only thing you need is a recent version of Chrome (11 or up) and a microphone. And then...just by entering "x-webkit-speech" to the HTML Form Element Attributes of your input item, you have speech-enabled your application!&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-KL6FWK3At8s/Tww7JtcoRDI/AAAAAAAAAxo/9vsw7jFK2e0/s1600/speech001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="119" src="http://2.bp.blogspot.com/-KL6FWK3At8s/Tww7JtcoRDI/AAAAAAAAAxo/9vsw7jFK2e0/s320/speech001.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
All "speech enabled" items will get a little mic at the end. When you click on it, you can say what you like. Oh yeah..and it works for number and date fields as well!&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-JZhLiEL6fn8/Tww7YqozQGI/AAAAAAAAAxw/LDpy_ytDQ74/s1600/speech02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://4.bp.blogspot.com/-JZhLiEL6fn8/Tww7YqozQGI/AAAAAAAAAxw/LDpy_ytDQ74/s320/speech02.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
One remark : Whatever you enter will go through Google's voice recognition ... so Big Brother is listening in on you!&lt;/div&gt;
&lt;div&gt;
Try it out yourself on :&amp;nbsp;&lt;a href="http://apex.oracle.com/pls/apex/f?p=HTML5:SPEAK"&gt;http://apex.oracle.com/pls/apex/f?p=HTML5:SPEAK&lt;/a&gt;&lt;/div&gt;</description><link>http://roelhartman.blogspot.com/2012/01/wouldnt-you-like-to-talk-to-your-apex.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-eZkYL18p54g/Tww9QpU1aTI/AAAAAAAAAyA/8TsFnMUpkcc/s72-c/742microphone.gif" height="72" width="72" /><thr:total>3</thr:total><georss:featurename>7431 Diepenveen, The Netherlands</georss:featurename><georss:point>52.2915271 6.1485912</georss:point><georss:box>52.2526791 6.0696272 52.330375100000005 6.2275552</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-2759516843536575735</guid><pubDate>Wed, 28 Dec 2011 11:11:00 +0000</pubDate><atom:updated>2011-12-30T12:13:12.664+01:00</atom:updated><title>APEX app running native on iPhone - the details</title><description>&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-8snkW1UxyBo/Tvr5t5itfTI/AAAAAAAAAxU/LaPhJxXhlsk/s1600/pg1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="112" src="http://1.bp.blogspot.com/-8snkW1UxyBo/Tvr5t5itfTI/AAAAAAAAAxU/LaPhJxXhlsk/s400/pg1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
A (rather long) time ago, I wrote a blog post showing a demo of &lt;a href="http://roelhartman.blogspot.com/2011/11/apex-application-running-native-on.html" target="_blank"&gt;an APEX application running native on an iPhone&lt;/a&gt;. Now, finally, the moment is there to explain how I did it ;-)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The key part of this demo, is the use of &lt;a href="http://phonegap.com/" target="_blank"&gt;PhoneGap&lt;/a&gt;. PhoneGap "wraps" any HTML5 code, thereby giving you access to the native API's of your device. This solution is also used by the upcoming &lt;a href="http://www.oracle.com/technetwork/developer-tools/adf/overview/adf-mobile-096323.html" target="_blank"&gt;ADF Mobile&lt;/a&gt; solution, but can already be used now for any HTML5 web application..including your APEX application.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Start with downloading the PhoneGap sources from their site and install it in your development environment (I used Apple's Xcode) - see the documentation on the PhoneGap site on the how-to.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Within Xcode, you'll get an index.html, which is the starting point of your application. In this, simplified, example, my index.html only contains the following code:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;title&amp;gt;&lt;span class="s1"&gt;APEX DEMO&lt;/span&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;meta &lt;/span&gt;&lt;span class="s3"&gt;name&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;"viewport"&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="s3"&gt;content&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;"&lt;span class="s2"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&amp;lt;meta &lt;span class="s3"&gt;charset&lt;/span&gt;=&lt;span class="s4"&gt;"utf-8"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p3"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;&amp;nbsp; &lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;body &lt;/span&gt;&lt;span class="s3"&gt;onload&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;&lt;span class="s4"&gt;"window.location.href='&lt;a href="http://apex.oracle.com/pls/apex/f?p=ROELSMOBILEAPP';"&gt;&lt;span class="s5"&gt;http://apex.oracle.com/pls/apex/f?p=ROELSMOBILEAPP';&lt;/span&gt;&lt;/a&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
So the only thing it does, is a redirect to my APEX application. Nothing more, nothing less.&lt;/div&gt;
&lt;div class="p1"&gt;
In the page template of the APEX application I included the&amp;nbsp;phonegap-1.2.0.js script file (currently 1.3.0 is the latest version).&amp;nbsp;&lt;/div&gt;
&lt;div class="p1"&gt;
Before any features can be used, PhoneGap has to be started. In my example, I added a Dynamic Action on Page 0, that runs on Page Load, with as contents&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;document.addEventListener("deviceready",onDeviceReady,false);&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
And from that point on, any PhoneGap feature can be used. In the example in the blogpost mentioned above, I added a button on a form page, that executes the following snippet of Javascript:&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;var contact = navigator.contacts.create();&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;var name = new ContactName();&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;name.givenName = $v('P9_CUST_FIRST_NAME');&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;name.familyName = $v('P9_CUST_LAST_NAME');&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;contact.name = name;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;contact.save(onSaveSuccess,onSaveError);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;function onSaveSuccess( contact )&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;navigator.notification.alert("Contact saved on your device");&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;function onSaveError(contactError)&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;alert("Error = " + contactError.code);&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1" style="font-family: Times, 'Times New Roman', serif;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
And that's it! When pressing the button, the contact - just the first and last name - is added to your contact list on your device. Of course you can add addresses, telephone numbers etc as well. And use other native device functionalities, like the camera or the compass as well. &amp;nbsp;See the &lt;a href="http://docs.phonegap.com/en/1.3.0/index.html" target="_blank"&gt;API documentation&lt;/a&gt; for all the details.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
The only "problem" will be, that this native iPhone "application" - which is just the index.html file - will never be accepted in the Apple store, just because it hasn't enough content to act on it's own. So you have to build an app with more content, and use your APEX application just to fill in some "gaps". But there are of course more ways to get data from your database to your native application, like web services.&amp;nbsp;&lt;/div&gt;
&lt;div class="p1"&gt;
Please, let me know whenever you get an app in the store with some APEX content!&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Happy PhoneGapping!&lt;/div&gt;
&lt;/div&gt;
&lt;span class="fullpost"&gt;&lt;/span&gt;</description><link>http://roelhartman.blogspot.com/2011/12/apex-app-running-native-on-iphone.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-8snkW1UxyBo/Tvr5t5itfTI/AAAAAAAAAxU/LaPhJxXhlsk/s72-c/pg1.png" height="72" width="72" /><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-4731436953941523257</guid><pubDate>Fri, 09 Dec 2011 19:21:00 +0000</pubDate><atom:updated>2011-12-09T20:36:29.661+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">UKOUG</category><title>UKOUG2011 Retrospective</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/--aPwsD5Vgw0/TuJfoRGR_II/AAAAAAAAAw8/kAtCt2IZMYU/s1600/we-were-wrong.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/--aPwsD5Vgw0/TuJfoRGR_II/AAAAAAAAAw8/kAtCt2IZMYU/s320/we-were-wrong.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;
Looking back at this weeks UKOUG Conference, a few things strike my mind. At first, there was no snow this time! A lot of wind to make my flight back quite wobbly, but no snow - like last year - that would make travelling very hard (up to almost impossible).&lt;br /&gt;
Second, there were - again - lots of good sessions to choose from. Several time slots had two or even three sessions I would like to attend. And another pro - as strange as it may sound from an APEX geek - there are not that many APEX sessions. That gives me the chance - or the obligation - to look into other corners of the Oracle ecosystem. So I actually did learn something!&lt;br /&gt;
And I saw some "ok" sessions, some good ones and a few excellent ones - like Doug's SPM, Connor's Partitioning and Slavik's SQL Injection. But... there was only one really impressive one: Cary's keynote. In a very emotional and personal way, he took the audience by the hand - telling some touching real life stories about his private life and work. &lt;i&gt;You were right&lt;/i&gt;, Cary, to take this next step. Thanks a lot!</description><link>http://roelhartman.blogspot.com/2011/12/ukoug2011-retrospective.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/--aPwsD5Vgw0/TuJfoRGR_II/AAAAAAAAAw8/kAtCt2IZMYU/s72-c/we-were-wrong.jpg" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Birmingham, West Midlands, UK</georss:featurename><georss:point>52.486243 -1.890401</georss:point><georss:box>52.331536 -2.206258 52.640950000000004 -1.574544</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-6690587630580352320</guid><pubDate>Fri, 18 Nov 2011 14:42:00 +0000</pubDate><atom:updated>2011-11-18T16:17:07.391+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DOAG</category><title>I've been to DOAG!</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-NbHVV9Uj3J8/TsZvFEGI5lI/AAAAAAAAAw0/RNsupKq9xmI/s1600/doag.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-NbHVV9Uj3J8/TsZvFEGI5lI/AAAAAAAAAw0/RNsupKq9xmI/s320/doag.jpg" width="212" /&gt;&lt;/a&gt;&lt;/div&gt;
This week I attended my first DOAG (German Oracle User Group) Conference. The conference was hosted in a part of the&amp;nbsp;Nürnberg Conference Centre. The venue was excellent : All sessions where in the same area on three different levels - so everything was in a short walking distance. The conference rooms itself where very good as well: a stage, just slightly higher than the audience, perfect lighting, good sound and screen quality and a wireless mic.&amp;nbsp;Everything a presenter - and an attendee as well - needs!&lt;br /&gt;
Something else that DOAG does better (not necessary healthier) than most other conferences: you can have food, snacks and drinks all day long. Not only during "coffee break" or lunch you can have slices of pizza, hot dogs or sweet cakes, but really all day long. And the quality of lunch and dinner was excellent as well: three courses and plenty stuff to choose from. &lt;br /&gt;
Then onto the content itself. There were 20 concurrent sessions, all started right at the hour (with a bell sign!), in al lot of different tracks, like: Database, Datawarehouse, BI, Development, Java, MySQL etc. Apart from some sidesteps now and then, I mainly focussed on the APEX Development area (no surprises here). I was very curious what the German speaking community does with APEX, as I wasn't familiar with most speakers. And I guess I am being spoilt by conferences like KScope, as a lot of the content couldn't adhere to those (high) standards. But the audience seemed to like it, so it probably complies with the overall expectations... (And I should more often go to sessions where I know nothing about!)&lt;br /&gt;
And what about my own presentation? I think it went pretty well, although I ended somewhat early. I rushed a bit though the first part, because a slot lasts "only" 45 minutes, so I had some time left in the end. But I think it came across quite well. Not that I got that many questions during my presentations (usually Germans don't interrupt the speaker) and just a few at the end - maybe due to the fact they thought they had to ask their question in English, which wasn't necessary of course. But in the next few days I got more questions during or between other sessions ;-).&lt;br /&gt;
Another minor thing, while I can understand German pretty well (about 95%), I really do prefer English for these kind of tech conferences... But still I might come back next year!!&lt;br /&gt;
So, next on the agenda, in a few weeks...UKOUG in Birmingham!</description><link>http://roelhartman.blogspot.com/2011/11/ive-been-to-doag.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-NbHVV9Uj3J8/TsZvFEGI5lI/AAAAAAAAAw0/RNsupKq9xmI/s72-c/doag.jpg" height="72" width="72" /><thr:total>1</thr:total><georss:featurename>Nuremberg, Germany</georss:featurename><georss:point>49.45052 11.08048</georss:point><georss:box>49.285357499999996 10.764623 49.6156825 11.396336999999999</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-6420169812291940404</guid><pubDate>Wed, 09 Nov 2011 20:21:00 +0000</pubDate><atom:updated>2011-11-09T21:25:47.237+01:00</atom:updated><title>APEX Application running native on an iPhone</title><description>This video shows how native an APEX application can run on iPhone. And yes, it is really an APEX application you see. And the whole movie is just one take.&lt;br /&gt;
You can see how a customer from the standard APEX Demo Application - "re-templated" to an Mobile APEX Application - is stored as a regular contact on your iPhone. 
&lt;br /&gt;
&amp;nbsp; 
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/VpG6GVFtn6Y?rel=0" width="300"&gt;&lt;/iframe&gt;</description><link>http://roelhartman.blogspot.com/2011/11/apex-application-running-native-on.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/VpG6GVFtn6Y/default.jpg" height="72" width="72" /><thr:total>7</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-1852028838464429285</guid><pubDate>Tue, 08 Nov 2011 09:20:00 +0000</pubDate><atom:updated>2011-11-08T10:33:09.501+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">KScope</category><title>The "blind auditions": Evaluating Kscope12 abstracts...</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-SChgbYsmfSE/Trjycf6Ik1I/AAAAAAAAAwk/gnS8Y0DuN_U/s1600/7449716-rubber-stamp-marked-with-excellent.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-SChgbYsmfSE/Trjycf6Ik1I/AAAAAAAAAwk/gnS8Y0DuN_U/s1600/7449716-rubber-stamp-marked-with-excellent.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span class="fullpost"&gt;Last week (and both weekends) I evaluated all the abstracts for &lt;a href="http://kscope12.com/" target="_blank"&gt;ODTUG KScope12&lt;/a&gt; in two tracks: APEX and Developer's Toolbox. In the APEX track 76 abstracts where submitted, Developer's Toolbox has just a few more, 82. All the abstracts will be evaluated by a team of (around) 8 people, so it doesn't all depend on my rating ;-)&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;For the first time, the abstracts where anonymous. So you don't know who wrote the abstract when rating it. In some cases, you can guess (and some had their own name in the abstract or summary, so that's easy). But I have to say, it makes it more difficult to evaluate. Because, for some people it doesn't really matter what the abstract says, you know it will be good anyhow (and for other ones, it is just the other way round). But luckily we have to rate the presenters as well - as far as you know them.&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;We had to rate every abstract between 0 and 5, where 5 is a top one. My totals are: little under 20% I rated as 5, almost 40% got a 4, 30% received a 3 and the rest is 2 or lower.&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt; The hottest subject in the APEX track is, without any doubt, mobile development. Seems like a lot of presenters are anxiously awaiting the next APEX release. In Developer's Toolbox, the subjects are more diverse, but, to my surprise, analytic functions are a trending topic! Not that these are new, but there seems to be a more general adoption and interest in this feature.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="fullpost"&gt;And what did I learn from these "blind auditions"?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;That it is very hard to write a good abstract. And when you submit one, there always a line saying: Don't copy your abstract as a summery (or the other way round). They have two different goals. The abstract should convince the evaluator to select your presentation, while the summary should convince the conference attendee to attend your session. So you should give away more in the abstract - but please, not pages long - and maybe just make people curious in the summary part.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;But seeing all these great abstracts, I am really sure that Kscope12 will be even better than this years!&lt;/span&gt;</description><link>http://roelhartman.blogspot.com/2011/11/blind-auditions-evaluating-kscope12.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-SChgbYsmfSE/Trjycf6Ik1I/AAAAAAAAAwk/gnS8Y0DuN_U/s72-c/7449716-rubber-stamp-marked-with-excellent.jpg" height="72" width="72" /><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-20567072.post-7235043145078811887</guid><pubDate>Tue, 08 Nov 2011 08:54:00 +0000</pubDate><atom:updated>2011-11-08T09:54:03.982+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Blog</category><title>I revamped my blog</title><description>&lt;a href="http://3.bp.blogspot.com/-R3DLkmX992Y/Trjtn0XBVmI/AAAAAAAAAwc/ZiIL1ZT202g/s1600/Screen%2BShot%2B2011-11-08%2Bat%2B09.50.11.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="148" src="http://3.bp.blogspot.com/-R3DLkmX992Y/Trjtn0XBVmI/AAAAAAAAAwc/ZiIL1ZT202g/s200/Screen%2BShot%2B2011-11-08%2Bat%2B09.50.11.png" width="200" /&gt;&lt;/a&gt;I revamped my blog recently by enabling the latest Blogger feature: &lt;b&gt;&lt;i&gt;Dynamic Views&lt;/i&gt;&lt;/b&gt;.&amp;nbsp; You can pick your own view using the "&lt;i&gt;Magazine&lt;/i&gt;" menu on top.&lt;br /&gt;
I hope you like it. I do ;-).</description><link>http://roelhartman.blogspot.com/2011/11/i-revamped-my-blog.html</link><author>noreply@blogger.com (Roel Hartman)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-R3DLkmX992Y/Trjtn0XBVmI/AAAAAAAAAwc/ZiIL1ZT202g/s72-c/Screen%2BShot%2B2011-11-08%2Bat%2B09.50.11.png" height="72" width="72" /><thr:total>1</thr:total><georss:featurename>7431 Diepenveen, The Netherlands</georss:featurename><georss:point>52.2915271 6.1485912</georss:point><georss:box>52.2526791 6.0696272 52.330375100000005 6.2275552</georss:box><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /></item></channel></rss>
