ODTUG Aggregator ODTUG Blogs http://localhost:8080 Sat, 19 Aug 2017 16:25:42 +0000 http://aggrssgator.com/ Bulk loading a template APEX application in a single workspace http://apextips.blogspot.com/2017/08/bulk-loading-template-apex-application.html I recently had a need to import the same application multiple times - 30+, so each person accessing the workspace could use their own application to play around with. And the user list was supplied to me in the format of an Excel spreadsheet. So, first in the Excel sheet, I had to make a new column to derive some sort of unique value - what better than the first letter of their first name and the surname. Like John Smith -&gt; JSMITH.<br /><br />So, first I made a new column with the value as a formula, which was: =LEFT(A2,1). That would give me "J" for "John.<br /><br />Then, for the actual account ID I come up with the formula&nbsp;=UPPER(CONCAT(C2, B2)) Where C2=J and B2 = SMITH, giving me JSMITH.<br /><br />With that list, I can copy it over to my trusty text editor in order to manipulate to create an array.<br /><br />The first part I wanted to do was create all the users, so for that I can use raw PL/SQL, and come up with a block of code like so:<br /><br /><pre>declare<br /><br /> type t_users is table of varchar2(200)<br /> index by PLS_INTEGER;<br /> l_all_users t_users;<br /> l_ws_id NUMBER;<br /><br /> procedure append_list(<br /> p_emps in out t_users,<br /> p_new_person in varchar2<br /> )<br /> as<br /> begin<br /> p_emps(p_emps.count + 1) := p_new_person;<br /> end append_list;<br /><br />begin<br /><br /> l_ws_id := apex_util.find_security_group_id('WORKSPACE_NAME');<br /> apex_util.set_security_group_id(l_ws_id);<br /><br /> append_list(l_all_employees, 'USER1');<br /> append_list(l_all_employees, 'USER2');<br /><br /> for i in 1..l_all_employees.count<br /> loop<br /><br /> apex_util.create_user(<br /> p_user_name =&gt; l_all_employees(i),<br /> p_web_password =&gt; l_all_employees(i),<br /> p_developer_privs =&gt; 'CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL',<br /> p_change_password_on_first_use =&gt; 'N',<br /> p_allow_app_building_yn =&gt; 'Y',<br /> p_allow_sql_workshop_yn =&gt; 'Y',<br /> p_allow_team_development_yn =&gt; 'Y'<br /> );<br /> end loop;<br /><br />end;<br />/<br /></pre><br />Run that, and you should find all the users now have accounts in the workspace - I just assigned the password value as the same as the username to keep things simple.<br /><br />So, the next part was loading the applications. APEX comes with the API APEX_APPLICATION_INSTALL, so if we look at the <a href="https://docs.oracle.com/database/apex-5.1/AEAPI/Import-Script-Examples.htm#AEAPI560">documentation</a>, we can see a simple import script as:<br /><br /><pre>begin<br /> apex_application_install.generate_application_id;<br /> apex_application_install.generate_offset;<br /> apex_application_install.set_application_alias( 'F' || apex_application_install.get_application_id );<br />end;<br />/<br /> <br />@f645.sql</pre><br />So, we need to run an anonymous block, and then the actual application export script - which we can't put inside an anonymous block.<br /><br />So, there comes in the scripting functionality of SQLcl. It support running JavaScript, so from the first step, I can make an Array of all the users, but this time in JavaScript. Then we can just loop over that structure and set the statement to run - which we do two separate statements, 1. the anonymous block; and 2. the application import script:<br /><br /><pre>function runCmd(cmd){<br /> sqlcl.setStmt(cmd);<br /> sqlcl.run();<br />}<br /><br />var people = [<br /> 'USER1',<br /> 'USER2'<br />];<br /><br />for (var i = 0; i &lt; people.length; i++){<br /><br /> print ('Loading application for: ' + people[i]);<br /><br /> runCmd([<br /> "declare",<br /> " l_ws_id number;",<br /> "begin",<br /> " l_ws_id := apex_util.find_security_group_id('WS_NAME');",<br /> " apex_util.set_security_group_id(l_ws_id);",<br /> " apex_application_install.generate_application_id;",<br /> " apex_application_install.generate_offset;",<br /> " apex_application_install.set_application_alias( 'F' || apex_application_install.get_application_id);",<br /> " apex_application_install.set_application_name( '" + people[i] + " - Workshop Application' );",<br /> "end;",<br /> "/"<br /> ].join("\r\n")<br /> );<br /><br /> runCmd('@f237.sql');<br /><br /> print ('......next -&gt;');<br />}<br /></pre><br />Then, I just connect to my database in SQLcl and run that script (named appLoader.js)<br /><br /><pre>conn user/pass@DEV<br />script appLoader.js<br /></pre><br />note: I could have just run everything (creating the user account and importing the app) in the SQLcl script, but this is just the process I followed as I was trying to figure things out :)<br /><br /> trent tag:blogger.com,1999:blog-8785176694082881912.post-6121579965740993363 Fri Aug 18 2017 16:52:00 GMT-0400 (EDT) Revising jQuery with Oracle APEX http://www.grassroots-oracle.com/2017/08/revising-jquery-with-oracle-apex.html A few years ago I managed to bust out a book that explored my experiences using jQuery within Oracle APEX to solve various problems, many originally explored when building some "backend" apps for use on tablets.<br /><br />For those who've read my book, thank you and I hope it was useful to you.<br />(I also hope you read the <a href="http://www.grassroots-oracle.com/2015/12/book-pro-jquery-in-oracle-apex.html" target="_blank">revised chapter 9</a> on calling PL/SQL from JavaScript.)<br />Please let me know what you thought of it with a review on <a href="https://www.amazon.com/Pro-jQuery-Oracle-Application-Express/dp/1484209621" target="_blank">Amazon</a>.<br /><br />The reason I bring this up is because I was asked on Twitter whether I would do a revision of my book for APEX 5.1.<br /><blockquote class="twitter-tweet" data-lang="en"><div dir="ltr" lang="en"><a href="https://twitter.com/swesley_perth">@swesley_perth</a> do you plan to write 2nd edition of your book "Pro jQuery in Oralce Application Express" to incorporate apex5.1 feature?</div>— Kevin Zhang (@kzhangkzhang) <a href="https://twitter.com/kzhangkzhang/status/897905128572833792">August 16, 2017</a></blockquote>I'm not sure if you've noticed, but my extra-curricular output has been down this year, despite my best intentions. That's not my answer, but it does weigh into what I think about the answer to that question.<br /><br />Half of that book was written prior to APEX 5.0 being released. While a lot of the content is agnostic to the version of APEX you have, I must admit my techniques have evolved since the advent of the <a href="http://www.grassroots-oracle.com/search/label/Page%20Designer" target="_blank">Page Designer</a>.<br /><br />That's not to say learning how to apply jQuery within APEX isn't useful. Having these fundamentals are still very much applicable, and useful to know when constructing dynamic actions; and even when defining CSS. But I think because it's much quicker to navigate through your dynamic actions in the Page Designer, I think there is less need to bundle logic within a JavaScript block.<br /><br />I'm not sure revising this particular book for a later version of APEX would add value.<br /><br /><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-CErem6Q_oWM/WZWsNOyQaUI/AAAAAAAART8/XXtFcyFWwuoAzUOAXaWnQGIbb6imhlpowCLcBGAs/s1600/image_1651_2-Titan-Rhea.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="492" data-original-width="580" height="169" src="https://1.bp.blogspot.com/-CErem6Q_oWM/WZWsNOyQaUI/AAAAAAAART8/XXtFcyFWwuoAzUOAXaWnQGIbb6imhlpowCLcBGAs/s200/image_1651_2-Titan-Rhea.jpg" width="200" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><a href="http://www.sci-news.com/space/science-cassini-saturn-titan-rhea-enceladus-01651.html" target="_blank">NASA Cassini</a></td></tr></tbody></table>My video course had no particular theme and just explored various APEX techniques, hence the name. My book wasn't much different, and if I was going to do something again in future, it would possibly be along the same lines. Or something <br />even more applied. I do have ideas.<br /><br />But I've been enjoying an awful lot of science in the time being. So much going on in space news!<br />It will be sad to see Cassini finish... Don't be surpised, I already have a post in mind for that amazing project. Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-6705213459899933120 Thu Aug 17 2017 10:49:00 GMT-0400 (EDT) In Memory Session State - Simple Example http://www.grassroots-oracle.com/2017/08/in-memory-session-state-simple-orclapex-example.html Not too long ago I encountered an <a href="http://www.grassroots-oracle.com/2016/12/in-memory-session-state-use-case.html">interesting behaviour with session state</a>, turns out not long after Dick Dral posted a <a href="https://dickdral.blogspot.com.au/2016/11/wrestling-with-session-state.html">very similar article</a>&nbsp;that I had not yet seen.<br /><br />Recently I encountered an even easier scenario.<br /><br />I had a bunch of columns where I wanted to use the same prefix across all headers, but I wanted to define the value once, referring to it many times. I'm betting on the fact someone may change their mind.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-yNvQ2JBQb7k/WNDFo61JDnI/AAAAAAAAQuo/9VlTmmHzR3IsttzbbpaQSPLZlzGNaLA2wCLcB/s1600/im_refresh.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://4.bp.blogspot.com/-yNvQ2JBQb7k/WNDFo61JDnI/AAAAAAAAQuo/9VlTmmHzR3IsttzbbpaQSPLZlzGNaLA2wCLcB/s1600/im_refresh.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Interactive Report with pivoted data</td></tr></tbody></table><br />So I created a hidden item called P222_PREFIX and gave it a static source of "Ch".<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-DFCb5Pa-nSY/WNDFo4YdZBI/AAAAAAAAQuk/O64feoPTZvUqtZGNe80ZswGaPF8qerZOwCLcB/s1600/im_default.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://3.bp.blogspot.com/-DFCb5Pa-nSY/WNDFo4YdZBI/AAAAAAAAQuk/O64feoPTZvUqtZGNe80ZswGaPF8qerZOwCLcB/s1600/im_default.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Page item source</td></tr></tbody></table><br />If I substitute this item as part of the column heading for each column, it will use the value found session state - not the database value, but the value based on the defined source, placed only in memory for the&nbsp;duration of page rendering.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-F13t_l0Lw6I/WNDFoswdVEI/AAAAAAAAQug/IfTC4elAEUoRN8HubA7iyQthL6Va5MUSQCLcB/s1600/im_column.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://3.bp.blogspot.com/-F13t_l0Lw6I/WNDFoswdVEI/AAAAAAAAQug/IfTC4elAEUoRN8HubA7iyQthL6Va5MUSQCLcB/s1600/im_column.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Column heading</td></tr></tbody></table><br />So while the output may appear as desired after the page renders, if the region is partially refreshed by hitting "Go" on an interactive report or just triggering region refresh, the prefix will disappear because there is no value for P222_PREFIX in session state once the page finishes rendering.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-cKO5HniFC0Q/WNDFpYZoO9I/AAAAAAAAQus/xtVRyB5Lxe4YU5ZgutHfnbL-X76VPkNLgCLcB/s1600/im_render.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://2.bp.blogspot.com/-cKO5HniFC0Q/WNDFpYZoO9I/AAAAAAAAQus/xtVRyB5Lxe4YU5ZgutHfnbL-X76VPkNLgCLcB/s1600/im_render.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Desired output</td></tr></tbody></table><br />To fix the problem we add a computation on the hidden item to set the value, instead of using a static source. This ensures the value is in session state for current <i>and </i>later usage.<br /><br />An alternative solution to the task at hand might be to use <a href="http://www.talkapex.com/2014/02/apex-shortcuts/" target="_blank">Shortcuts</a>. Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-405565638920809450 Thu Aug 17 2017 10:09:00 GMT-0400 (EDT) How do I share a URL to my APEX application? http://joelkallman.blogspot.com/2017/08/how-do-i-share-url-to-my-apex.html What is the URL for my APEX application? &nbsp;If I want to provide a URL to my APEX application to others, what URL do I give them?<br /><br />Great questions! &nbsp;I see this done incorrectly all the time inside of Oracle. &nbsp;A person new to <a href="https://apex.oracle.com/" target="_blank">Application Express</a> (APEX) will create an application or install a Productivity Application, run it, copy the full URL, and include the full URL in an email. &nbsp;I encountered this today in an email, for me to complete a Global Tax Survey via an APEX application (let the good times roll!). &nbsp;The URL provided was:<br /><br /><div style="text-align: center;"><b><span style="font-family: Courier New, Courier, monospace; font-size: large;">https://server/ords/f?p=23828:2:113570213685366:::::</span></b></div><br />Wow, that sure looks complex! &nbsp;However, it's unnecessarily complex.<br /><br />The syntax for the entry points into the APEX engine is <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/understanding-url-syntax.htm#HTMDB03019" target="_blank">well documented</a>. &nbsp;Interpreting the above URL and the colon-separated arguments, it means:<br /><br /><ul><li>23828 - Application ID</li><li>2 - Page ID</li><li>113570213685366 - APEX Session ID</li><li>::::: - null values for the rest of the arguments in the URL</li></ul><br />However, let's evaluate each one of these values in reverse order and assess their necessity:<br /><br /><ul><li>::::: - Utterly not necessary. &nbsp;The argument values will default to null anyway.</li><li>113570213685366 - Also utterly not necessary. &nbsp;Assuming the application requires authentication, the APEX Session ID is specific to you, and only you, and only at a specific moment in time. &nbsp;You'll notice that if you give this URL to someone else, they'll be prompted to authenticate, and then get an entirely new APEX Session ID. &nbsp;Why include it if it's going to change anyway?</li><li>2 - There is a Home URL to every application, so if you're including the starting Page ID in the URL, then it's redundant to include the Page ID again. &nbsp;It's not necessary. &nbsp;Additionally, if this is not the same Page ID which is specified in the Home URL, and you have <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/establishing-user-identity-through-authentication.htm#HTMDB25773" target="_blank">Deep Linking</a> disabled (the default), your end users are going to end up accessing your application via the Home URL anyway. &nbsp;This is another reason not to include the Page ID in the URL which you share with others.</li><li>23828 - This is the only value that is absolutely necessary. &nbsp;This is the ID of the application you wish to share.</li></ul><div><br /></div><div>Thus, the URL that I received in email could have been provided simply as:</div><div><br /></div><div style="text-align: center;"><span style="font-family: Courier New, Courier, monospace; font-size: large;"><b>https://server/ords/f?p=23828</b></span></div><br /><div style="text-align: center;"><br /></div>I don't fault new users to APEX for doing this. &nbsp;It's not obvious. &nbsp;But now, hopefully it is! Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-3768634094358625857 Thu Aug 17 2017 09:17:00 GMT-0400 (EDT) Build the Oracle APEX application: the framework http://dgielis.blogspot.com/2017/08/build-oracle-apex-application-framework.html Over the years while developing <a href="https://apex.oracle.com/">Oracle APEX</a> application, I noticed in every application I was following the same steps. It was a routine I followed over and over. For example: in every application I created a global page (page 0), enabled Feedback, ran the Advisor multiple times a week, used certain naming conventions etc.<br /><br />A few years ago I wrote those steps in our <a href="https://www.apexrnd.be/">APEX R&amp;D</a> development guide, so within our team we would be consistent. Just like the <a href="https://github.com/dgielis/blog/blob/master/apexrnd_database_bp.pdf">database best practices</a>, I thought it would be a good idea to share the <a href="https://github.com/dgielis/blog/blob/master/apexrnd_apex_bp.pdf">APEX best practices</a> with you as well. There are about 9 pages, here's a screenshot of the first page:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-TIxgIMEWM6w/WZSR6YyMbcI/AAAAAAAAIxs/Uw1Bmq7xXiUPj1cmDiZpR9H_6fFANYfJQCLcBGAs/s1600/07i_apexrnd_apex_bp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1185" height="640" src="https://1.bp.blogspot.com/-TIxgIMEWM6w/WZSR6YyMbcI/AAAAAAAAIxs/Uw1Bmq7xXiUPj1cmDiZpR9H_6fFANYfJQCLcBGAs/s640/07i_apexrnd_apex_bp.png" width="473" /></a></div>I don't like too many rules, but a few are good to have, especially when you get new people on board or when the customer is working together with you. As I said in my previous post where I described our database guidelines, the guidelines in itself is not meant to be "this is best and you have to follow", it's more something to start from which you can adapt.<br /><br />Based on those guidelines, we created a "starter application", so you get a head start in your project. The app in itself wasn't spectacular in itself, it contained the global page, feedback, some administrator pages which give statistics of your app, some application items, error handling package etc.<br /><br />If you know what you have to build, it wouldn't even take that long to build it from scratch. I just don't like to do repetitive things, I far rather concentrate on the real solution, so anything that can help, I will embrace :) I also won't hesitate to take some components or solutions from other projects and reuse those. But just one piece of advice, <strong>always check if what you've been doing before, is still valid today and "the best" way of doing it -for your current problem-</strong>. For example if you developed something in APEX 4.2, maybe in APEX 5.x there's a build-in package to do that. Or the other way, that a feature of APEX became deprecated (e.g. apex_plsql_job) and you should use a database feature (dbms_scheduler).<br /><br />In 2015 I also gave a presentation at some Oracle conferences how I developed in APEX 4.2 vs 5.0, which you find <a href="https://www.slideshare.net/DimitriGielis/apex-5-demo-and-bp">here</a>.<br /><br />So I could use my starter app for this project, but just as with Quick SQL (to create your database objects), there's a new feature in Oracle APEX 5.2 that will make the starter app irrelevant, so I will cover the new way of doing something in 2017 and further.<br /><br />The new way of building an application, is to start from a "Blueprint". The concept is very similar to my workflow previously, but now it's built-in the APEX Builder and it's more powerful as it allows to customize the features you want to include in your app.<br /><br />Blueprint is at the time of writing only available in Preview mode (since March 2017) through <a href="https://apex.oracle.com/">apex.oracle.com</a> and will probably undergo some more changes. I see a lot of potential in this feature. It's not only the wizard you can use, rumors are you can also use JSON syntax to define your app.<br /><br />Here's the video I recorded where I give a bit of background and you see me using Blueprint:<br /><br /><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/bccne14Qu10" width="560"></iframe> <br /><br />At the time of writing Blueprint isn't finished yet. Not sure what the end result will be, but although there's still a lot of room for improvement, it already looks spectacular. As you could see in the video, I will use it as my starting point for my multiplication table project. I've exported the app of <a href="https://apex.oracle.com/">apex.oracle.com</a> and imported in my <a href="https://cloud.oracle.com/en_US/database/exadata-express/pricing">Oracle Exadata Express</a> environment. Next I'll make changes to this app and customize further.<br /><br />Blueprint is (or will become) the fastest and most low code way to build an Oracle APEX application.<br /><br /><i><b>Update August 19th:</b> on <a href="https://apex.oracle.com/">apex.oracle.com</a> a new version of Blueprint is available with even more options than you see in the video.</i><br /><br /> Dimitri Gielis tag:blogger.com,1999:blog-21122514.post-4497734918985659530 Thu Aug 17 2017 06:11:00 GMT-0400 (EDT) Oracle Exadata Express an Integration Story http://www.jmjcloud.com/blog/oracle-exadata-express-an-integration-story <h2 class="wsite-content-title">Introduction</h2> <div class="paragraph"><span style="color:rgba(0, 0, 0, 0.87)">The integration landscape is changing... again!</span></div> <blockquote><span style="color:rgb(81, 81, 81)">From Gartner:<br />&#8203;The application integration technology market is adapting to digital business requirements. A mix of mature ESB suites and emerging iPaaS- and iSaaS- based offerings provides broader options for application leaders to modernize integration infrastructure toward a hybrid integration platform.</span></blockquote> <span class='imgPusher' style='float:left;height:0px'></span><span style='display: table;width:auto;position:relative;float:left;max-width:100%;;clear:left;margin-top:0px;*margin-top:0px'><a><img src="http://www.jmjcloud.com/uploads/7/8/4/7/78474242/exadata-express-get-started-min_orig.png" style="margin-top: 0px; margin-bottom: 10px; margin-left: 0px; margin-right: 20px; border-width:0; max-width:100%" alt="Picture" class="galleryImageBorder wsite-image" /></a><span style="display: table-caption; caption-side: bottom; font-size: 90%; margin-top: -10px; margin-bottom: 10px; text-align: center;" class="wsite-caption"></span></span> <div class="paragraph" style="display:block;"><span style="color:rgba(0, 0, 0, 0.87)">Enter Exadata Express APEX and ORDS, a PaaS service with the capabilities to be an integration hub with a scalable web development platform thrown in!<br /><br />&#8203;As the saying goes "there are many ways to skin a cat". There are also many ways to do Cloud Integration. We are told that the 'proper' way of doing integration is to use fully baked SOA software solutions such as Oracle's SOA Suite, Mule, Jitterbit, Dell Boomi etc. Sometimes this kind of software is absolutely the right choice, but all too often it is overkill. Many small to medium sized businesses (and even large corporations) just need a secure, reliable and platform agnostic method of integrating data. Oracle's Exadata Express with ORDS, the Oracle Database and the APEX_WEB_SERVICE API provide all of this at a fraction of the cost. Did I mention you get a scalable web development platform thrown in?</span><br /><br /><span style="color:rgba(0, 0, 0, 0.87)">To illustrate this right sized integration approach, I want to take you through a use case that involves our company JMJ Cloud. Having worked for Oracle Consulting for 18 years, I am familiar with the concept of eating one's own dog food. In view of this, using Oracle tools to integrate our internal systems seemed like the right thing to do. The thought of paying thousands of dollars a month to do this, however, did not make much sense. We opted instead for Exadata Express and it turns out that eating your own dog food is tastier than you might think! </span></div> <hr style="width:100%;clear:both;visibility:hidden;"></hr> <h2 class="wsite-content-title">Background</h2> <div class="paragraph"><span style="color:rgba(0, 0, 0, 0.87)">As a burgeoning Oracle technology, consulting company we have some core needs for the software that runs our business:</span><ul><li><span style="color:rgba(0, 0, 0, 0.87)">Capturing consultants time</span></li><li><span style="color:rgba(0, 0, 0, 0.87)">Handling our financials, invoicing, paying vendors etc.</span></li><li><span style="color:rgba(0, 0, 0, 0.87)">Project and task management</span></li><li><span style="color:rgba(0, 0, 0, 0.87)">Software code packaging and deployment</span></li><li><span style="color:rgba(0, 0, 0, 0.87)">Tracking new opportunities and recruits</span>&#8203;</li></ul> <span style="color:rgba(0, 0, 0, 0.87)">Our current portfolio consists of QuickBooks On-Line for financials, Atlasssian's Service Desk for managing new work with our clients and Atlasssian's Jira Software for managing agile projects. For everything else, we build our own application's using APEX running on Exadata Express. For the remainder of this post, I will focus on two key integrations that bring us a significant benefit for a relatively low investment.</span></div> <h2 class="wsite-content-title"><span style="color:rgba(0, 0, 0, 0.87)">Capturing Time (Service Desk to Exadata Express)</span></h2> <div class="paragraph"><font color="#2a2a2a">About half of our work comes through our customers entering tickets or work orders via a Portal in Service Desk. Our consultants perform&nbsp;work against these tickets and&nbsp;</font><span style="color:rgb(42, 42, 42)">log their time into an APEX application we built on Exadata Express. As tickets come in, w</span><font color="#2a2a2a">e integrate them in real time to Exadata Express allowing our consultants to enter their time against a specific ticket. This allows us to provide our customers with an APEX portal showing them a detailed breakdown of hours billed by ticket.</font></div> <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="http://www.jmjcloud.com/uploads/7/8/4/7/78474242/jira-to-exadata-express-min_1_orig.png" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div> <div class="paragraph"><br />The diagram shows the flow of this real-time integration:<ul><li>A ticket is entered by customer in Service Desk.</li><li>A WebHook in Jira calls a REST Service in ORDS in real time, passing the Ticket ID.</li><li>The ORDS REST service uses&nbsp;APEX_WEB_SERVICE in Exadata Express to call back to a REST Service in Jira. Doing this allows use to pull just the information we need from the ticket and save it to a table in Exadata Express.</li><li>The consultant logs in to the APEX time entry application and selects&nbsp;the ticket to enter their time against.</li><li>Finally, the customer can login to their APEX portal to see time entered against each ticket.</li></ul></div> <h2 class="wsite-content-title">Capturing Costs (QuickBooks Online to Exadata Express )&nbsp;</h2> <div class="paragraph">QuickBooks Online is used to record supplier invoices and our business purchases captured on corporate credit cards. &nbsp;While Quickbooks has reporting functionality, it isn't as rich or configurable as that available within Exadata Express. &nbsp;<br /><br />We schedule a feed of all invoices and expenses to Exadata every 15 minutes. &nbsp;This allows us to build sophisticated reports on our costs. &nbsp;In addition, we make contractor invoices visible with their Apex portal so they can confirm that they have been entered and see when a payment has been made.</div> <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="http://www.jmjcloud.com/uploads/7/8/4/7/78474242/qb-to-exadata-express_orig.png" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div> <div class="paragraph"><br /><span style="color:rgb(81, 81, 81)">&#8203;The diagram shows the flow of this scheduled integration:</span><ul style="color:rgb(81, 81, 81)"><li>Supplier invoices and expenses are entered directly into QuickBooks or imported&nbsp;from bank or credit card statements.</li><li>A scheduled job in Exadata Express is created using the CLOUD_SCHEDULER built-in package to run&nbsp;every 15 minutes.</li><li>The job calls&nbsp;REST web services in QuickBooks Online using APEX_WEB_SERVICE, returning new or updated costs in a JSON document.&nbsp;</li><li>The JSON document is processed into Exadata Express and becomes available for reporting.</li><li>Managers analyze expenses and third-party invoices with the APEX management portal.</li><li>Consultants&nbsp;can log into their&nbsp;APEX portal to confirm that their invoices have been received, entered and see the invoice payment status.</li></ul></div> <h2 class="wsite-content-title">Exadata Express Highlights</h2> <span class='imgPusher' style='float:left;height:0px'></span><span style='display: table;width:auto;position:relative;float:left;max-width:100%;;clear:left;margin-top:0px;*margin-top:0px'><a><img src="http://www.jmjcloud.com/uploads/7/8/4/7/78474242/published/cloudgs-exadata-express-min.png?1502502951" style="margin-top: 10px; margin-bottom: 10px; margin-left: 0px; margin-right: 10px; border-width:0; max-width:100%" alt="Picture" class="galleryImageBorder wsite-image" /></a><span style="display: table-caption; caption-side: bottom; font-size: 90%; margin-top: -10px; margin-bottom: 10px; text-align: center;" class="wsite-caption"></span></span> <div class="paragraph" style="display:block;"><ul><li>Host REST web services via ORDS (with OAUTH2 security built in)</li><li>Call out to SOAP and REST services using APEX_WEB_SERVICE</li><li>Schedule integrations using CLOUD_SCHEDULER</li><li>Build beautiful and performant web applications using APEX</li><li>Cloud Integration&nbsp;and PaaS for Everyone</li><li>Cost effective ($175 / month)</li></ul></div> <hr style="width:100%;clear:both;visibility:hidden;"></hr> <h2 class="wsite-content-title">Please Oracle!</h2> <div class="paragraph"><ul><li>Be a little quicker to upgrade APEX as new versions are introduced.</li><li>Enable DBMS_CRYPTO, rolling your own HMAC-SHA1 via PL/SQL is about as much fun as it seems when you don't have the ability to call Java Stored Procedures. &nbsp; We'll be blogging how we did this as part of an upcoming post on Exadata Express and OAUTH authentication.</li></ul></div> <h2 class="wsite-content-title">Conclusion</h2> <div class="paragraph">Cloud integration is a brave new world. Using the right tool for the job, however, is a constant that has been around since common sense. Exadata Express and its cousin (Schema as a Service) are the right tools for the majority of Cloud Integration and PaaS extension jobs we are being asked to do.</div> http://www.jmjcloud.com/blog/oracle-exadata-express-an-integration-story Thu Aug 17 2017 01:00:00 GMT-0400 (EDT) Oracle Datenbank (mit APEX) auf Docker - so geht's! https://blogs.oracle.com/apexcommunity_deutsch/oracle-datenbank-mit-apex-auf-docker-so-gehts <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/33ba2d6366fdac48ffb6b3b75ff8e4b8/oracle_on_docker.png" style="width: 150px; height: 150px; float: left; margin: 5px;" />Die Oracle Datenbank ist traditionell auf vielen Plattformen verf&uuml;gbar. Neben dem Betriebssystem als Plattform, gibt es auch verschiedene g&auml;ngige Virtualisierungsl&ouml;sungen; und in j&uuml;ngster Zeit wird die Container-Technologie <strong>Docker</strong> mehr und mehr popul&auml;r.&nbsp;Docker unterscheidet sich vom Konzept der virtuellen Maschinen dadurch, dass nicht immer ein eigenes Betriebssystem aufgebaut wird. Vielmehr basieren mehrere Docker Container auf gemeinsam genutzten Ressourcen, so dass die M&ouml;glichkeiten des Host-Systems wesentlich besser ausgenutzt werden.</p> <p>Vor allem Entwickler k&ouml;nnen Docker hervorragend nutzen, um eine Application-Express-Umgebung nicht nur schnell bereitzustellen, sondern auch (f&uuml;r Tests) zu klonen oder einfach zur&uuml;ckzusetzen. In allen F&auml;llen ist wird nur der Docker-Container mit der Datenbank und Application Express - und nicht etwa ein ganzes Betriebssystem (mit allen Hintergrundprozessen) gestartet.</p> <p><strong>Ralf Durben</strong>&nbsp;von der ORACLE Deutschland B.V. &amp; Co KG hat <a href="https://apex.oracle.com/pls/apex/germancommunities/dbacommunity/tipp/6241/index.html">in diesem Community Tipp</a> zusammengestellt, wie man ein Docker Image mit der Oracle-Datenbank erstellt und nutzt. Es wird nicht nur darauf eingegangen, wie man die fertigen Oracle-Datenbank Images aus dem&nbsp;<em>Docker Store</em>&nbsp;verwendet, sondern auch, wie man sich selbst sein eigenes, individuelles Docker-Image erzeugen kann.</p> <p>Dieser Tipp ist ein Muss (nicht nur) f&uuml;r jeden Application Express Entwickler, der hin und wieder eine Entwicklungs- oder Testumgebung aufsetzen muss - gleich reinschauen!</p> Carsten Czarski https://blogs.oracle.com/apexcommunity_deutsch/oracle-datenbank-mit-apex-auf-docker-so-gehts Wed Aug 16 2017 10:49:00 GMT-0400 (EDT) #orclapex Europe tour http://www.apex-at-work.com/2017/08/oracle-orclapex-europe-tour.html <span lang="EN-US" style="mso-ansi-language: EN-US;">From Tuesday, the 29. of August until the 02. September, I will meet the best experts around Oracle.</span><br /><div class="MsoNormal"><br /></div><div class="MsoNormal"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-OvnP48f-uDs/WZQx45fRIII/AAAAAAAAByQ/5YPrGFEXlvYqqZcqIdZHXDLqLfUB_9f8QCLcBGAs/s1600/europe.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="880" data-original-width="1280" height="275" src="https://1.bp.blogspot.com/-OvnP48f-uDs/WZQx45fRIII/AAAAAAAAByQ/5YPrGFEXlvYqqZcqIdZHXDLqLfUB_9f8QCLcBGAs/s400/europe.png" width="400" /></a></div><br /><div class="MsoNormal"><br /></div><div class="MsoNormal"><br /></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">But first some background:</span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">Last year I was in Sweden and held a presentation at a meetup in Stockholm about APEX. I met Mathias Magnusson an Oracle specialist who is organizing all kinds of Oracle usergroup events in Sweden. I was lucky to meet him again a</span><span lang="EN-US" style="mso-ansi-language: EN-US;"><span lang="EN-US" style="mso-ansi-language: EN-US;">t DOAG 2017 </span>and introduced him to Joel Kallman. During the discussion came the idea to make an APEX day in Sweden. Mathias prepared everything and invited some well-known experts who may join the party as speakers. In the email, he also was asking Heli Helskyaho. She is one of the world most known speaker about Oracle related technology at the moment.</span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">She liked the idea to join in and asked if we could combine it. One event in Helsinki (Finland) and one in </span><span lang="EN-US" style="mso-ansi-language: EN-US;"><span lang="EN-US" style="mso-ansi-language: EN-US;">Stockholm (Sweden)</span>. And that is not all. Mathias put the date of the event shortly before the POUG in Poland. Conclusion: My Oracle #orclapex Europe tour was set up.</span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">Out of my perspective the Nordic APEX days should look like this:&nbsp;</span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">We need to show the people what APEX can do and how it is used in production. If an Oracle employee or a consultant is talking about how great the tool is then maybe not everyone will believe it. So, I asked the experts from Deutsche Bahn (SmallSolutions-Team) to join the party and they did!</span></div><div class="MsoNormal"><br /></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">So, this is what happens now:</span></div><style>ol { counter-reset: li; /* Initiate a counter */ list-style: none; /* Remove defaolt numbering */ *list-style: decimal; /* Keep using defaolt numbering for IE6/7 */ font: 15px 'trebuchet MS', 'lucida sans'; padding: 0; margin-bottom: 4em; text-shadow: 0 1px 0 rgba(255,255,255,.5); } ol ol { margin: 0 0 0 2em; /* Add some left margin for inner lists */ } .rectangle-list li{ position: relative; display: block; padding: .4em .4em .4em .8em; *padding: .4em; margin: .5em 0 .5em 2.5em; background: #ddd; color: #444; text-decoration: none; transition: all .3s ease-out; } .rectangle-list li:hover{ background: #eee; } .rectangle-list li:before{ position: absolute; left: -2.5em; top: 50%; margin-top: -1em; background: #fa8072; height: 2em; width: 2em; line-height: 2em; text-align: center; font-weight: bold; } .rectangle-list li:after{ position: absolute; content: ''; border: .5em solid transparent; left: -1em; top: 50%; margin-top: -.5em; transition: all .3s ease-out; } .rectangle-list li:hover:after{ left: -.5em; border-left-color: #fa8072; } .rectangle-list-sp-master li:before{ content: counter(li); counter-increment: li; } .bw li:before{ content: "-"; } </style><ol class="rectangle-list"><ol class="bw"><li>Monday I will fly to Helsinki with <a href="https://twitter.com/richardrieb" target="_blank">Richard</a> from Deutsche Bahn. Last preparations with Matthias and Richard (SmallSolutions-Team) for the event.</li></ol><ol class="bw"><li>Having the Oracle/Miracle APEX-Day in Helsinki (Finland): <a href="http://www.apex-at-work.com/2017/08/oracle-orclapex-europe-tour.html" target="_blank">Oracle / Miracle APEX - Day</a></li><ol><li>Including nice talks with Heli, Carsten, Shakeeb and hopefully a lot of APEX interested end users.</li></ol></ol><ol class="bw"><li>After the day we will take the cruiser ship over night to Stockholm including some drinks and talks and "Finnish Tango".</li></ol><ol class="bw"><li>Having the SWEOUG APEX day in Stockholm (Sweden): <a href="https://www.sweoug.se/apex2017" target="_blank">#SweougApex17</a></li><ol><li>Including nice talks with Patrick, Mathias and hopefully a lot of APEX interested end users. Hopefully a couple of beers in the evening.</li></ol></ol><ol class="bw"><li>Next morning take the plain to Berlin and preparing with <a href="https://twitter.com/ronnyrosenkohl" target="_blank">Matthias</a> (Small Solutions-Team) for POUG</li></ol><ol class="bw"><li>Meet the students at Berlin main station and take the rented bus to POUG in Kraków.</li></ol><ol class="bw"><li>Getting to know the student group including some activities during the bus trip.</li></ol><ol class="bw"><li>Hotel check-in and dinner with the students</li></ol><ol class="bw"><li><a href="http://poug.org/en/edycja/high-five-poug/" target="_blank">POUG conference</a> starts: <a href="https://twitter.com/search?q=%23poug17" target="_blank">#POUG17</a></li><ol><li>Including to meet the best Oracle database experts and get the students to meet them and drink a few beers with Kamil.</li></ol></ol><ol class="bw"><li>POUG Party</li></ol><ol class="bw"><li>POUG conference second day</li></ol><ol class="bw"><li>Evening dinner and taking the bus home</li></ol></ol><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">Let me say it in short words:</span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;"><span style="mso-spacerun: yes;"></span>3 conferences, holding 3 presentations, meeting lots of experts and meeting even more new faces!</span></div><div class="MsoNormal"><br /></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">In case you are curios and want to get to know the flair from the conferences then follow me at Twitter: <a href="https://twitter.com/tobias_arnhold" target="_blank">@tobias_arnhold / #APEXgoesEurope / #pougtrip / #SewougApex17 / #orclapex</a></span></div><div class="MsoNormal"><br /></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">I will write as I have never written before. :)</span></div> Tobias Arnhold tag:blogger.com,1999:blog-6481483192141562388.post-1172879500762894372 Wed Aug 16 2017 08:17:00 GMT-0400 (EDT) Atom: Select Variables Faster http://vmorneau.me/atom-tip-select-variables-faster/ <div class="kg-card-markdown"><img src="http://vmorneau.me/content/images/2017/08/atom.png" alt="Atom: Select Variables Faster"><p>Some languages like HTML and CSS have syntactical standards promoting the use of the hyphen/dash symbol (<code>-</code>).</p> <p>Let's consider a variable <code>l_my_variable</code> in PL/SQL.<br> In JavaScript I would name it <code>myVariable</code>.<br> In CSS I would name it <code>my-variable</code>.</p> <p>In Atom if you double click on this CSS class, only a part of the class will be selected:</p> <p><img src="http://vmorneau.me/content/images/2017/08/atom-variable1.gif" alt="Atom: Select Variables Faster"></p> <p>So you have to manually select the whole thing...</p> <p><strong>Atom has a setting called <em>Non Word Characters</em> which is definable per language:</strong></p> <p><img src="http://vmorneau.me/content/images/2016/03/2016-03-16-08_58_48-Settings---C__Users_vince_OneDrive_Documents_GitHub_inf3105_MORV07038909-TP2---A.png" alt="Atom: Select Variables Faster"></p> <p>Let's remove the hyphen/dash in there <code>/\()&quot;':,.;&lt;&gt;~!@#$%^&amp;*|+=[]{}?...</code></p> <p><img src="http://vmorneau.me/content/images/2016/03/2016-03-16-08_59_24-Settings---C__Users_vince_OneDrive_Documents_GitHub_inf3105_MORV07038909-TP2---A.png" alt="Atom: Select Variables Faster"></p> <p>Now when double clicking on the same variable it will select the whole thing:</p> <p><img src="http://vmorneau.me/content/images/2017/08/atom-variable2.gif" alt="Atom: Select Variables Faster"></p> <hr> <p>It's not much but it's saves me a few clicks.</p> <p>Can you think of a better use for the <em>Non Word Characters</em> setting?</p> </div> Vincent Morneau 598c4c62be76f57a06cbbf85 Wed Aug 16 2017 08:06:05 GMT-0400 (EDT) Apex Plugin: Password Strength Estimator https://jeffkemponoracle.com/2017/08/16/apex-plugin-password-strength-estimator/ <p>I needed a simple password strength prompt for users when they need to create or change their password on my website. After a bit of Googling I found the &#8220;<a href="https://github.com/dropbox/zxcvbn" target="_blank" rel="noopener">Low-Budget Password Strength Estimator</a>&#8221; which is supposedly used by Dropbox, so you know it&#8217;s good :)</p> <p>This simple javascript library runs entirely within the client&#8217;s browser, and when presented with a candidate password, gives a score from 0 (very poor) to 4 (very good). It can also return extra feedback, including a warning message for poor passwords, as well as suggestions for making a password more secure.</p> <p><img data-attachment-id="4082" data-permalink="https://jeffkemponoracle.com/plugins/preview-verypoor/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2016/03/preview-verypoor.png?w=1108" data-orig-size="652,175" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="preview-verypoor" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2016/03/preview-verypoor.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2016/03/preview-verypoor.png?w=1108?w=652" class="alignnone size-full wp-image-4082" src="https://jeffkemponoracle.files.wordpress.com/2016/03/preview-verypoor.png?w=1108" alt="preview-verypoor" srcset="https://jeffkemponoracle.files.wordpress.com/2016/03/preview-verypoor.png 652w, https://jeffkemponoracle.files.wordpress.com/2016/03/preview-verypoor.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2016/03/preview-verypoor.png?w=300 300w" sizes="(max-width: 652px) 100vw, 652px" /></p> <p>So I&#8217;ve created a very simple Dynamic Action plugin (<a href="https://apex.oracle.com/pls/apex/f?p=ZXCVBN&amp;c=JK64" target="_blank" rel="noopener">try the demo here</a>) that allows you to add this functionality to any item on your page. You can specify a minimum length for the password, and can override the default messages for each score. You can also select whether or not the feedback warnings or suggestions are shown.</p> <p><img data-attachment-id="4101" data-permalink="https://jeffkemponoracle.com/2017/08/16/apex-plugin-password-strength-estimator/preview-poor/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-poor.png?w=1108" data-orig-size="651,195" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="preview-poor" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-poor.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-poor.png?w=1108?w=651" class="alignnone size-full wp-image-4101" src="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-poor.png?w=1108" alt="preview-poor" srcset="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-poor.png 651w, https://jeffkemponoracle.files.wordpress.com/2017/08/preview-poor.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2017/08/preview-poor.png?w=300 300w" sizes="(max-width: 651px) 100vw, 651px" /></p> <p>It seems to catch a lot of poor passwords, including ones comprising common words and names, and ones involving a simple sequence or repetition.</p> <p><img data-attachment-id="4103" data-permalink="https://jeffkemponoracle.com/2017/08/16/apex-plugin-password-strength-estimator/preview-good/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-good.png?w=1108" data-orig-size="654,137" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="preview-good" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-good.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-good.png?w=1108?w=654" class="alignnone size-full wp-image-4103" src="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-good.png?w=1108" alt="preview-good" srcset="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-good.png 654w, https://jeffkemponoracle.files.wordpress.com/2017/08/preview-good.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2017/08/preview-good.png?w=300 300w" sizes="(max-width: 654px) 100vw, 654px" /></p> <p><img data-attachment-id="4099" data-permalink="https://jeffkemponoracle.com/2017/08/16/apex-plugin-password-strength-estimator/preview-strong/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-strong.png?w=1108" data-orig-size="653,136" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="preview-strong" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-strong.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-strong.png?w=1108?w=653" class="alignnone size-full wp-image-4099" src="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-strong.png?w=1108" alt="preview-strong" srcset="https://jeffkemponoracle.files.wordpress.com/2017/08/preview-strong.png 653w, https://jeffkemponoracle.files.wordpress.com/2017/08/preview-strong.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2017/08/preview-strong.png?w=300 300w" sizes="(max-width: 653px) 100vw, 653px" /></p> <p>Obviously it&#8217;s only really useful for password entry fields; but don&#8217;t use it on your Login page!</p> <p><strong>Download from: <a href="https://github.com/jeffreykemp/jk64-plugin-passwordstrength" target="_blank" rel="noopener">https://github.com/jeffreykemp/jk64-plugin-passwordstrength</a></strong></p><br />Filed under: <a href='https://jeffkemponoracle.com/category/oracle/apex/'>APEX</a>, <a href='https://jeffkemponoracle.com/category/oracle/'>Oracle</a> Tagged: <a href='https://jeffkemponoracle.com/tag/apex/'>APEX</a>, <a href='https://jeffkemponoracle.com/tag/passwords/'>passwords</a>, <a href='https://jeffkemponoracle.com/tag/plug-ins/'>plug-ins</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffkemponoracle.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffkemponoracle.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffkemponoracle.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffkemponoracle.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffkemponoracle.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffkemponoracle.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffkemponoracle.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffkemponoracle.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffkemponoracle.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffkemponoracle.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffkemponoracle.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffkemponoracle.wordpress.com/4084/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffkemponoracle.wordpress.com/4084/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffkemponoracle.wordpress.com/4084/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=jeffkemponoracle.com&#038;blog=12972578&#038;post=4084&#038;subd=jeffkemponoracle&#038;ref=&#038;feed=1" width="1" height="1" /> Jeffrey Kemp http://jeffkemponoracle.com/?p=4084 Wed Aug 16 2017 00:26:06 GMT-0400 (EDT) Storage Server: datasets, snapshots and performance http://vanbortel.blogspot.com/2017/08/storage-server-datasets-snapshots-and.html Datasets, snapshots and performance This is a long post, but with lots of pictures. Kind of a management overview ;) Datasets and snapshots Datasets As may have become clear from a previous post, I have one volume, with a (a -to date- single) dataset (ds1). This was not the result of experience, or deep thought, it was just copied from Benjamin Bryan who did an entry on ZFS hierarchy. Makes Frank tag:blogger.com,1999:blog-12361937.post-386277296708742267 Tue Aug 15 2017 14:47:00 GMT-0400 (EDT) ¿Quieres ser un Desarrollador? Tres Desarrolladores nos cuentan su historia http://feedproxy.google.com/~r/DescubriendoElMundoDeOracle/~3/BnZtkpR9LAM/quieres-ser-un-desarrollador-tres.html <div align="center" class="m-7048237444012417096msolistparagraph" style="text-align: left;">En el presente artículo quiero compartir con toda la comunidad las entrevistas que llevé a cabo a dos colegas amigos Mónica Godoy y Daniel Bozzolo junto con mi experiencia siendo desarrolladora.</div><div class="m-7048237444012417096msolistparagraph">Nuestro objetivo, principalmente es motivar a la juventud y a aquellos que quieran incursionar en el mundo del desarrollo, a tener una visión de lo que fue para cada uno de nosotros llegar a convertirnos en desarrolladores.</div><div class="m-7048237444012417096msolistparagraph">Para ello vamos a contestar las siguientes preguntas:</div><ul><li>¿Quién o qué influyó en tu vida para llegar a ser un desarrollador?</li><li>¿Cuáles serían para ti los primeros pasos a seguir para convertirse en uno?</li></ul><ul><li>¿Qué consejos darías para alguien que quiere iniciarse en este camino?</li></ul>Seguir leyendo <a href="http://www.toadworld.com/platforms/oracle/b/weblog/archive/2017/07/21/quieres-ser-un-desarrollador-tres-desarrolladores-nos-cuentan-su-historia" target="_blank">AQUI</a> <img src="http://feeds.feedburner.com/~r/DescubriendoElMundoDeOracle/~4/BnZtkpR9LAM" height="1" width="1" alt=""/> Clarisa J. Maman Orfali tag:blogger.com,1999:blog-1315583943401206186.post-3063844037209612418 Tue Aug 15 2017 12:27:00 GMT-0400 (EDT) ¿Quieres ser un Administrador de Bases de Datos? Cuatro Expertos DBA nos cuentan su historia http://feedproxy.google.com/~r/DescubriendoElMundoDeOracle/~3/qMHr-bbVsUA/quieres-ser-un-administrador-de-bases.html <div style="text-align: justify;"><span style="text-align: left;">¿Sabemos lo que realmente significa ser un Administrador de Bases de Datos? En un mundo globalizado cada vez más tecnológico, esta especialidad ha cobrado un rol muy importante. Recuerdo que cuando me inicie en las tecnologías Oracle, mi primer contacto fue con la administración de las bases de datos. Fueron varios años de intenso estudio y muchas horas de práctica, todo en forma autodidactica y pude experimentar en aquel entonces lo que esta especialidad realmente significaba, porque desde mi punto de vista, el hecho de ser un administrador de bases de datos es como confiarle a una persona o grupo de personas lo más preciado que tenemos como negocio, más específicamente me refiero a los datos y la información de nuestra empresa y hoy habiendo pasado por ese rol y siendo propietaria de negocio estoy totalmente convencida de lo importante que es contar con un administrador de bases de datos en nuestro equipo.&nbsp;</span></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Por ello, en esta oportunidad te traigo la historia de cuatro administradores de bases de datos reconocidos en el mundo Oracle y cómo ellos han logrado iniciar su carrera y establecerme hoy día como expertos en esa área.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">El propósito de este artículo es que, si tú sientes, que quieres ser administrador de bases de datos y no sabes por dónde empezar, que nuestros expertos puedan responder algunas preguntas típicas y muchas veces muy solicitadas para que te aporten una visión más personal de su recorrido profesional y dispongas de las herramientas básicas para iniciarte en el mismo camino.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Sin más preámbulo, tengo el gusto de presentar la historia de: Ronald Vargas Quesada, Joel Perez, Rita Nuñez y Gisela Velazco. Desde ya quiero agradecerle a cada uno por acceder tan amablemente a compartir su historia, y es muy importante para mí expresar que no solo son excelentes profesionales sino que también excelentes personas que continuamente están ayudando a la comunidad con su conocimiento técnico y su gran experiencia.</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Empecemos este recorrido junto a Ronald, Joel, Rita y Gisela y conozcamos un poco más de su historia:</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">Seguir leyendo <a href="http://www.toadworld.com/platforms/oracle/b/weblog/archive/2017/08/14/quieres-ser-un-administrador-de-bases-de-datos-cuatro-expertos-dba-nos-cuentan-su-historia" target="_blank">AQUI</a></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;">&nbsp;</div><img src="http://feeds.feedburner.com/~r/DescubriendoElMundoDeOracle/~4/qMHr-bbVsUA" height="1" width="1" alt=""/> Clarisa J. Maman Orfali tag:blogger.com,1999:blog-1315583943401206186.post-3333630558225094999 Tue Aug 15 2017 12:25:00 GMT-0400 (EDT) Set up domain and launch page http://dgielis.blogspot.com/2017/08/set-up-domain-and-launch-page.html This post is part of a series of posts: <a href="http://dgielis.blogspot.be/2017/08/from-idea-to-app-or-how-i-do-oracle.html">From idea to app or how I do an Oracle APEX project anno 2017</a><br /><h2>Domain name</h2>When you launch an app or service, you probably want a domain name. I register all my domain names with <a href="https://www.godaddy.com/">Godaddy</a>. I'm a long time customer with them and I find them really reliable, not that expensive and they have good support. But I find it hard to come up with "the right" domain name. For example for our project I wrote on a piece of paper all different domain names: multiplicationtable.com, multiplicationstable.com, multiplications.edu, multiplicationtable.online, multiplicationtable.guru etc.<br /><br />What domain would be perfect for our application? At one side you have to think about Google, a descriptive domain helps in your ranking, but on the other hand you want it to be easy to type and remember. Finally I decided to register <a href="http://mtable.online/">mtable.online</a> as my first choice multiplicationtable.com was taken. If you know a better domain that is still available, feel free to add in the comments field :)<br /><h2>Link domain name to Oracle APEX app</h2>Once you have the domain name you want to link it to your Oracle APEX application.<br /><br />In a future post I will cover Reverse Proxy and SSL, but for now, as I want you to see what is happening, I just configured in Godaddy to redirect to my Oracle Exadata Express url.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-kEgVf2zT0tg/WZIH9aktTVI/AAAAAAAAIv0/IRwBBd_bNXMdIYo0D9bP342KPc6TjKtRACEwYBhgL/s1600/06i_godaddy_domain_forward.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1038" data-original-width="1600" height="412" src="https://1.bp.blogspot.com/-kEgVf2zT0tg/WZIH9aktTVI/AAAAAAAAIv0/IRwBBd_bNXMdIYo0D9bP342KPc6TjKtRACEwYBhgL/s640/06i_godaddy_domain_forward.png" width="640" /></a></div><br />I don't want to let the world wait to know about our project, so I want to setup a landing or launch page. This page serves as a home while we are building our application. People can already register, so once we are live, we can let them know about it.<br /><h2>How do you build a landing or launch page</h2>Either you have an idea about how you want the page to look like, or what I do as well, is look at other sites or templates created by others. For example for the <a href="https://www.apexofficeprint.com/">APEX Office Print</a> website we bought a template as starting point and integrated it in our APEX app.<br /><br />I get often inspiration from following sites:<br /><ul><li><a href="https://html5up.net/">HTML5 UP</a></li><li><a href="https://themeforest.net/">ThemeForest</a></li><li><a href="https://wrapbootstrap.com/">WrapBootstrap</a></li><li><a href="https://instapage.com/">Instapage</a></li></ul>If you know some graphic design people, they can obviously help too :) It's easy(ier) to recognize good design, but it's hard(er) to create it yourself.<br /><br />I like <a href="https://www.sitepoint.com/what-is-minimalism/">minimalist design</a> or "less is more". If you look at the <a href="https://apexrnd-a481992.db.em2.oraclecloudapps.com/apex/f?p=102:1">multiplication table project launch page</a>, only the bare minimum is on the page: a title, a graphic, a text item to leave your email and a button (and a text to let everybody know it was built with <a href="https://apex.oracle.com/">Oracle APEX</a>.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-1MzHgKyKiBw/WZIH-fySncI/AAAAAAAAIv8/ns4fSKaPZpYo66NsdlH5AfZ6f-H99lnxwCEwYBhgL/s1600/06i_mtable_online.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="1600" height="454" src="https://2.bp.blogspot.com/-1MzHgKyKiBw/WZIH-fySncI/AAAAAAAAIv8/ns4fSKaPZpYo66NsdlH5AfZ6f-H99lnxwCEwYBhgL/s640/06i_mtable_online.png" width="640" /></a></div><br />You find some more examples of minimalism <a href="https://www.awwwards.com/websites/minimal/">here</a> or just Google for it and you find plenty. Typically you will see a background picture and a text. If you find a template you like, you can look at the HTML and CSS and copy this in your own APEX page.<br /><br />The font you use is really important and can make a huge difference. <a href="https://fonts.google.com/">Google Fonts</a> are a good starting place to pick a font. In our project I used the <a href="https://fonts.google.com/specimen/Raleway?query=Rale">Raleway font</a>.<br /><br />In the last month (that I know) two other people showed how to build a landing page in APEX: <a href="https://twitter.com/smaisel14">Stefanie</a> used a <a href="https://www.blogger.com/(https://apex.oracle.com/pls/apex/f?p=16300:1)">background picture</a> and <a href="http://richarddacre.postach.io/post/apex-login-page-video-background">Richard</a> used a <a href="https://apex.oracle.com/pls/apex/f?p=48107:101">video as background</a>.<br /><h2>How long to build a landing page</h2>When I look again at our launch page, I would probably tell you it would take me less than 30 minutes to build it in Oracle APEX. If you <em>know</em> what you will build, yes, but if I told you it took me well over 6 hours to build this landing page, would you believe me? It's the truth!<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-1MzHgKyKiBw/WZIH-fySncI/AAAAAAAAIv8/ns4fSKaPZpYo66NsdlH5AfZ6f-H99lnxwCEwYBhgL/s1600/06i_mtable_online.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="1600" height="454" src="https://2.bp.blogspot.com/-1MzHgKyKiBw/WZIH-fySncI/AAAAAAAAIv8/ns4fSKaPZpYo66NsdlH5AfZ6f-H99lnxwCEwYBhgL/s640/06i_mtable_online.png" width="640" /></a></div><br />So where did I spend all my time then?<br /><br />I first started to search for a design. I didn't really want to copy something from a previous project, but rather wanted to get a fresh new design, so I started to search, and search and search more. Finally I gave up on the idea and followed my own thoughts to do it very minimal and as close as possible to universal theme that comes with APEX.<br /><br />So I added the regions, items and a button on the page:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-rNa-305H5do/WZIIE3Pv40I/AAAAAAAAIwA/lf1Ckys43zEcAZfY87dsiAC5xp1lYLn0QCEwYBhgL/s1600/06i_apex_page_designer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="836" data-original-width="1600" height="334" src="https://4.bp.blogspot.com/-rNa-305H5do/WZIIE3Pv40I/AAAAAAAAIwA/lf1Ckys43zEcAZfY87dsiAC5xp1lYLn0QCEwYBhgL/s640/06i_apex_page_designer.png" width="640" /></a></div><br />This goes fast (if you know a bit of APEX). As I wanted the image on the left of the items and the items going down a bit, I used two regions next to each other.<br /><br />I looked at the result and didn't like it, so I added some CSS and searched for another font. This was a lot of trial and error till I was happy with the result.<br /><br />Once that was done, I looked how responsive it was. On a smaller screen, I didn't find it looked good enough, so I added a media query and custom CSS, so it would look better.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-LhLxaNPDCT4/WZIH-GRl8AI/AAAAAAAAIv4/NhzZGSfeK646Dfm8J5JsQNinCXiwqy0JwCEwYBhgL/s1600/06i_media_query.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="840" data-original-width="1600" height="334" src="https://1.bp.blogspot.com/-LhLxaNPDCT4/WZIH-GRl8AI/AAAAAAAAIv4/NhzZGSfeK646Dfm8J5JsQNinCXiwqy0JwCEwYBhgL/s640/06i_media_query.png" width="640" /></a></div><br />Oh, before I forget, whenever you build an app in Oracle APEX, include the plugin <a href="https://github.com/Dani3lSun/apex-plugin-builtwithlove">built with love using Oracle APEX</a>.<br /><br />Next up, I had to include a validation (to check if the email already exists), a process and a branch. Now here's a story too... I first started with adding a dynamic action on the Subscription button that would insert a record, but during testing I found I lost the value required and is email validation that you get for free when you submit your page, so I changed it to be a normal process.<br /><br />Finally I changed on the page that duplicate submissions are not allowed.<br /><br />So the end result is we have one very simple page in APEX, using standard components (regions, items, button), 1 plugin (built with APEX), Universal Theme and a bit of custom CSS. Dimitri Gielis tag:blogger.com,1999:blog-21122514.post-6866471803952738402 Mon Aug 14 2017 16:56:00 GMT-0400 (EDT) The start of the end for Apex 4.2 http://www.explorer.uk.com/the-start-of-the-end-for-apex-4-2/ <p>In October 2017 (just 3 months’ time), Premier Support for Oracle Application Express 4.2 will end.  This ultimately marks the end of the APEX 4 era and coincides with the fifth anniversary of the 4.2 launch.</p> <p>A lot has changed in those 5 years: we have had two more major versions of APEX &#8211; with the latest being APEX 5.1.2. In addition, browsers have come on a long way too. I use Chrome for everyday development; for me it is quicker than other browsers, the developer tools are exceptional and I like the array of extensions available which makes development that much easier.</p> <p>After re-reading the 4.2 release notes it states that Chrome 21 and above is supported; however, this week whilst working on a customer’s 4.2 application, I have noticed that compatibility with Chrome 60 is not 100% anymore.</p> <p>Yep, I am using Chrome 60, which is 39 versions higher then when APEX 4.2 was launched.</p> <p>The problems occur when I click the Apply Changes on a Page Template</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-4.png" rel="lightbox[5827]"><img class="aligncenter size-full wp-image-5828" src="http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-4.png" alt="" width="707" height="340" srcset="http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-4.png 707w, http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-4-300x144.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></a></p> <p>The issue is related to increased security in the Chrome browser. A Page Template typically contains many snippets of JS, HTML &amp; CSS code &#8211; therefore Chrome has detected “unusual code” in the way the APEX 4.2 page is rendered and decided to block the page submit. There is a thread on the subject <a href="https://stackoverflow.com/questions/43249998/chrome-err-blocked-by-xss-auditor-details" target="_blank" rel="noopener noreferrer">here</a>.</p> <p>For completeness, I tried the same thing with APEX 5.1 and it worked correctly. This is expected as Oracle APEX 5.1 <a href="http://docs.oracle.com/database/apex-5.1/HTMRN/toc.htm#HTMRN-GUID-6E817104-6C58-4FA8-861D-F884AA3369B0" target="_blank" rel="noopener noreferrer">supports the current and prior major release of Google Chrome, Mozilla Firefox, Apple Safari, Microsoft Internet Explorer and Microsoft Edge</a>.</p> <p>I now have to switch browsers to work on Page Templates in APEX 4.2; however, I do wonder at what point other browsers will “catch-up”, it will then become very difficult to work on APEX 4.2 page templates.</p> <p>Chrome dominates the browser market share &#8211; therefore with so many developers potentially affected, I also wonder what other area Google will modify its engine further, which impacts further on older versions of APEX.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2017/08/image003-1.png" rel="lightbox[5827]"><img class="aligncenter size-full wp-image-5829" src="http://www.explorer.uk.com/wp-content/uploads/2017/08/image003-1.png" alt="" width="847" height="290" srcset="http://www.explorer.uk.com/wp-content/uploads/2017/08/image003-1.png 847w, http://www.explorer.uk.com/wp-content/uploads/2017/08/image003-1-300x103.png 300w, http://www.explorer.uk.com/wp-content/uploads/2017/08/image003-1-768x263.png 768w" sizes="(max-width: 847px) 100vw, 847px" /></a></p> <p>Browser dependency is already a big deal for Oracle Forms deployments whereby the JAVA NPAPI plugin Oracle Forms relies on <a href="https://java.com/en/download/faq/chrome.xml" target="_blank" rel="noopener noreferrer">can no longer be deployed in Chrome</a>. Firefox also <a href="https://support.mozilla.org/en-US/kb/npapi-plugins" target="_blank" rel="noopener noreferrer">ended their NPAPI support in version 52</a> (two versions ago at time of writing). Explorer have consolidated the issues with Oracle Forms in a two-part blog <a href="http://www.explorer.uk.com/the-future-of-oracle-forms/" target="_blank" rel="noopener noreferrer">here</a> and <a href="http://www.explorer.uk.com/the-continued-future-of-oracle-forms/" target="_blank" rel="noopener noreferrer">here</a> which, if you are currently using Oracle Forms, it is an essential read. Explorer are seeing more and more businesses moving away from Oracle Forms and we are redeveloping their applications in APEX &#8211; <a href="http://www.explorer.uk.com/case-studies/" target="_blank" rel="noopener noreferrer">just read our case studies</a>.</p> <p>Luckily, for our client on APEX 4.2 &#8211; they will be upgrading to APEX 5.1 in the coming months and this will be one of many application upgrades performed by Explorer.<br /> Most of the time upgrading to APEX 5.1 using the applications “legacy” theme works very well with only minor changes required. This application is no different with some minor layout issues to resolve on a single page.</p> <p>Bear in mind that using a legacy theme will not give the users the makeover they are expecting &#8211; remember a lot has changes from the “Productivity Applications -26” theme. Noticeably the introduction of <a href="https://twitter.com/shakeeb" target="_blank" rel="noopener noreferrer">Shakeeb</a> and the <a href="https://apex.oracle.com/ut" target="_blank" rel="noopener noreferrer">Universal Theme 42</a>.</p> <p>Moving to the Universal theme not only gives a modern, responsive and accessible interface to your application but also gives developers modal dialogs and live template options &#8211; more power to the users.</p> <p>APEX 5.1 is also <a href="http://www.explorer.uk.com/oracle-cloud-services/" target="_blank" rel="noopener noreferrer">a perfect fit for the Oracle Cloud</a>. You will be on a supported platform, using the latest, fasted and greatest version of APEX. Premier Support for APEX 5.1 extends until Dec 2021 so for now, there is plenty of years ahead.</p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/the-start-of-the-end-for-apex-4-2/">The start of the end for Apex 4.2</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> Explorer Development UK http://www.explorer.uk.com/?p=5827 Mon Aug 14 2017 09:38:58 GMT-0400 (EDT) Tabs with Auto Height http://vmorneau.me/tabs-with-auto-height/ <div class="kg-card-markdown"><p>I really like the <strong>Tabs Container</strong> template in Universal Theme. It promotes a great structure for your content, while being good looking.</p> <p>You can have as many tabs as you want in the <strong>Tabs Container</strong> which means many different content heights.</p> <p>By default, Universal Theme picks the tallest tab and applies that height to all tabs within the same container. In most cases, I prefer each tab to have it's own height, even it that makes the content bounce vertically.</p> <p>Below, the left shows the normal behavior, the right shows the proposed solution.</p> <p><img src="http://vmorneau.me/content/images/2017/08/tabs-auto-height.gif" alt="tabs-auto-height"></p> <p><strong>Live Demo:</strong> <a href="https://apex.oracle.com/pls/apex/f?p=40526:1">https://apex.oracle.com/pls/apex/f?p=40526:1</a></p> <p>Here's a the required CSS to make tabs adjust automatically:</p> <pre><code class="language-css">.t-TabsRegion-items { min-height: auto!important; } </code></pre> <p><em>Note: <code>!important</code> is needed because APEX injects the height directly to the component with inline CSS. We need to override that. Sorry!</em></p> <hr> <p>Enjoy these APEX CSS tricks? Let me know and I'll post more.</p> <p><a href="http://vmorneau.me/css">Head here to see them all.</a></p> </div> Vincent Morneau 598cca15be76f57a06cbbfee Mon Aug 14 2017 08:51:13 GMT-0400 (EDT) Create the Oracle database objects http://dgielis.blogspot.com/2017/08/create-oracle-database-objects.html This post is part of a series of posts: <a href="http://dgielis.blogspot.be/2017/08/from-idea-to-app-or-how-i-do-oracle.html">From idea to app or how I do an Oracle APEX project anno 2017</a><br /><br />In a <a href="http://dgielis.blogspot.be/2017/08/create-user-stories-and-supporting-erd.html">previous post</a> we defined the ERD of the multiplication table application we're going to build. Now I want to go into detail how I create the Oracle database objects like tables, foreign keys, sequences, triggers, etc.<br /><br />Before I tell you what I do today, let me first walk you through my history so you understand why I'm using it.<br /><h2>Data Modeling Tools</h2><a href="https://en.wikipedia.org/wiki/Comparison_of_data_modeling_tools">Data Modeling Tools</a> allow you to visually create your tables, relationships, etc. If you work with Oracle for 10 or more years, you probably know <a href="http://www.oracle.com/technetwork/developer-tools/designer/overview/index-082236.html">Oracle Designer</a>. This tool has been really popular, but today it's legacy and not maintained anymore by Oracle. Oracle moved forward with <a href="http://www.oracle.com/technetwork/developer-tools/datamodeler/overview/index.html">SQL Developer Data Modeler</a>. Although I've been using those tools in the beginning, today I typically don't use them anymore, except for generating a visual diagram (ERD) of my tables, but that is now part of <a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html">SQL Developer</a>, so I don't have a data modeling tool installed anymore. The main reason for me was, it took me so much time to add the entities, that it was too slow for my process. As written earlier, I typically draw my entities on a whiteboard or piece of paper, after that I want to get going with real tables and data as fast as I can to verify the model.<br /><br />If you have a big team and somebody is solely responsibility for modeling, I see a benefit of using a modeling tool or if you like the process of visually creating a model. There're probably more advantages using a modeling tool, so if you use it and like it, don't change because of this blog post, I just share how I typically do a project.<br /><h2>Manual</h2>So if I didn't use a modeling tool, what did I do? I created the tables manually. I hear you think, yeah right, and that is faster? It was for me, because I had a certain workflow. I used strict naming conventions: 3 letters for the project, singular table names, meaningless id column in every table etc. Here's an overview screen:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-XBMQOkd0Ups/WY9GwFKpETI/AAAAAAAAIvU/B4wqUJDoqMwjFAkX4_rBSRXemam4C1V6ACLcBGAs/s1600/05i_naming_conventions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="692" data-original-width="1414" height="312" src="https://4.bp.blogspot.com/-XBMQOkd0Ups/WY9GwFKpETI/AAAAAAAAIvU/B4wqUJDoqMwjFAkX4_rBSRXemam4C1V6ACLcBGAs/s640/05i_naming_conventions.png" width="640" /></a></div><br />You find the complete guide of my naming conventions&nbsp;<a href="https://github.com/dgielis/blog/blob/master/apexrnd_database_bp.pdf">here</a>.<br />Those naming conventions were the base, but per project or customer we could adapt to their standards. The principle was that I created tables with only the relevant columns, a meaningful unique key and a comment.<br /><br />Next I used a script that would generate all the primary keys and foreign key relationships, sequences, triggers, audit columns and everything else that I could automate for the particular project. You find the base of the script I used till two years ago <a href="https://github.com/dgielis/blog/blob/master/mtl_erd_pkg.sql">here</a>&nbsp;and a screenshot of a part of the script:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-b5pD90Q3RtE/WY9HaFjFK8I/AAAAAAAAIvc/VxDPY5veijwcoB8GAChQYjgGd8FqIsTTwCLcBGAs/s1600/05i_create_erd_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="932" data-original-width="1198" height="496" src="https://2.bp.blogspot.com/-b5pD90Q3RtE/WY9HaFjFK8I/AAAAAAAAIvc/VxDPY5veijwcoB8GAChQYjgGd8FqIsTTwCLcBGAs/s640/05i_create_erd_script.png" width="640" /></a></div><br />The only reason I could do this, was because I used strict naming conventions e.g. table_id column (fk) would be a reference to the id column of a table (pk). By doing this, I could really iterate fast on creating and adapting tables, it worked great for me.<br />The final step was to create a visual ERD of it in SQL Developer (or other tool) as it was easier to communicate with the team and we always include it as part of the documentation.<br /><br />As I'm writing in the past, you probably figured that I stopped using this method. The reason is simple, because there came something I like even more :)<br /><br />But before we move on, a final word on naming conventions; it's not which naming conventions you use that is important, it's more about being consistent within your project and make it easier for you to understand your model and have faster knowledge transfer. So whatever naming conventions you use is fine, there's not something like "this is the best" in my view.<br /><h2><a href="https://apex.oracle.com/en/quicksql/">Quick SQL</a></h2>So now we come to today... this little tool is what I use to create a script for my database objects.<br /><br />I can't explain Quick SQL better than what you find on the <a href="https://apex.oracle.com/en/quicksql/">site</a>:<br /><br /><blockquote>Quick SQL enables you to rapidly design and prototype data models using a markdown-like shorthand syntax that expands to standards-based Oracle SQL. You can easily create master detail relationships, check constraints, and even generate sample data.</blockquote><br /><a href="https://apex.oracle.com/en/quicksql/">Quick SQL</a> is a packaged app which comes with Oracle APEX, so you have it, without knowing :)<br /><br />So back to our multiplication project; the first thing I did was installing the packaged app in our APEX workspace. Go to App Builder &gt; Create &gt; Packaged App &gt; Quick SQL. Next run the app and this is the screen you will see:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-VdSwBEIDHN8/WY9EVFuCEOI/AAAAAAAAIvA/X3ujds2jMZskR_OVEloSBf1hZfV4aVcjQCLcBGAs/s1600/05i_quick_sql_start.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1037" data-original-width="1600" height="414" src="https://2.bp.blogspot.com/-VdSwBEIDHN8/WY9EVFuCEOI/AAAAAAAAIvA/X3ujds2jMZskR_OVEloSBf1hZfV4aVcjQCLcBGAs/s640/05i_quick_sql_start.png" width="640" /></a></div><br />Next you start typing your tables and columns and some additional syntax to specify constraints etc. The power of Quick SQL is that it not only generates the tables, but it has built-in naming conventions, generates indexes, constraints, triggers, views and even sample data.<br /><br />Here's a video of me creating the script for our multiplication table project:<br /><br /><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/yRERah3Wga4" width="560"></iframe><br /><br />The next thing I do is generate with SQL Developer the ERD, so I visually see it. Just follow the wizard in SQL Developer you find in File - Data Modeler - Import - Data Dictionary:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-DWz67NUM2DI/WY9EV7ee6HI/AAAAAAAAIvI/uz31SvWeGCYBHRDLBhQQ83UJ8zNp9ON0QCLcBGAs/s1600/05i_sql_dev_rev_eng.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1089" data-original-width="1600" height="434" src="https://3.bp.blogspot.com/-DWz67NUM2DI/WY9EV7ee6HI/AAAAAAAAIvI/uz31SvWeGCYBHRDLBhQQ83UJ8zNp9ON0QCLcBGAs/s640/05i_sql_dev_rev_eng.png" width="640" /></a></div><br />While reviewing the visual ERD, I saw I made a small mistake in Quick SQL. I didn't specify timezone with local timestamp (tswltz), but just timezone with timestamp (tstz). In the application for my son I used a date for that column, that is why I called that column start_date and end_date, but the more logical name is start_time and end_time, so I changed that too. I want to use timestamp with local timezone as this app is probably going to be used around the world, so it would be nice if you could see the time you actually played in your own timezone.<br /><br />Here's the final version of the script in Quick SQL:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-epuAFg_unLg/WY9EVHrU2qI/AAAAAAAAIu8/aywc9wSX23wl9Eid5Q8hgbsN4MATmzZRwCLcBGAs/s1600/05i_quick_sql.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="981" data-original-width="1600" height="392" src="https://3.bp.blogspot.com/-epuAFg_unLg/WY9EVHrU2qI/AAAAAAAAIu8/aywc9wSX23wl9Eid5Q8hgbsN4MATmzZRwCLcBGAs/s640/05i_quick_sql.png" width="640" /></a></div><br />It's very easy to make changes in Quick SQL, and in settings I just included the drop statements and re-ran the entire script in SQL Dev and I was done :)<br /><br />I really like&nbsp;<a href="https://apex.oracle.com/en/quicksql/">Quick SQL</a>&nbsp;and I hope it gets even more improved in the future. It would be really nice to version control the scripts and be able to generate the differences for the tables (alter statements instead of create statements) or do reverse engineering of a specific schema. Another improvement I hope to see in the future, is the ability to define unique constraints on multiple columns (or it might be already there, but that I don't know how to use it?).<br /><br />The visual ERD is below:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-JeBdydGq_5g/WY9EVHei3vI/AAAAAAAAIvE/dMriS1w48eYe-EKIuvXzKwQ9CTysdF0IACLcBGAs/s1600/05i_erd_sql_dev_mod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="972" data-original-width="1600" height="388" src="https://1.bp.blogspot.com/-JeBdydGq_5g/WY9EVHei3vI/AAAAAAAAIvE/dMriS1w48eYe-EKIuvXzKwQ9CTysdF0IACLcBGAs/s640/05i_erd_sql_dev_mod.png" width="640" /></a></div><br />In this post we went from the paper ERD to real Oracle objects. Now we are ready to build our app. Dimitri Gielis tag:blogger.com,1999:blog-21122514.post-4858028962525596421 Sat Aug 12 2017 14:49:00 GMT-0400 (EDT) IR – Single records view in multiple columns https://martinbnielsen.wordpress.com/2017/08/12/ir-single-records-view-in-multiple-columns/ <p>The APEX Interactive reports (IR) are great for providing easy data (view)  access for end user. Under the &#8220;Attributes&#8221; section for the IR region, the &#8220;Single record View&#8221; can be enabled, providing a more detailed view of 1 specific (selected) record:</p> <div data-shortcode="caption" id="attachment_167" style="width: 785px" class="wp-caption alignnone"><img data-attachment-id="167" data-permalink="https://martinbnielsen.wordpress.com/2017/08/12/ir-single-records-view-in-multiple-columns/screen-shot-2017-08-12-at-13-33-47/" data-orig-file="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png" data-orig-size="3120,1420" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2017-08-12 at 13.33.47" data-image-description="" data-medium-file="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=775&#038;h=353" data-large-file="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=584" class="alignnone wp-image-167" src="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=775&#038;h=353" alt="" width="775" height="353" srcset="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=775&amp;h=353 775w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=1550&amp;h=706 1550w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=150&amp;h=68 150w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=300&amp;h=137 300w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=768&amp;h=350 768w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-33-47.png?w=1024&amp;h=466 1024w" sizes="(max-width: 775px) 100vw, 775px" /><p class="wp-caption-text">Single record View &#8211; Standard</p></div> <p>If you want a better overview, this can easily be achieved by adding the following CSS (Themeroller, CSS file&#8230;). Please adjust the widths/padding to your own needs:</p> <pre>.a-IRR-singleRow-row { display: inline; } .a-IRR-singleRow-name { width:200px; } .a-IRR-singleRow-name, .a-IRR-singleRow-value { padding:8px; } .a-IRR-singleRow-value { min-width: 300px; }</pre> <p>Then users will see the single record view like this instead (showing multiple columns &#8211; depending on your screen size):</p> <div data-shortcode="caption" id="attachment_166" style="width: 775px" class="wp-caption alignnone"><img data-attachment-id="166" data-permalink="https://martinbnielsen.wordpress.com/2017/08/12/ir-single-records-view-in-multiple-columns/screen-shot-2017-08-12-at-13-34-00/" data-orig-file="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png" data-orig-size="3130,508" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2017-08-12 at 13.34.00" data-image-description="" data-medium-file="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=765&#038;h=125" data-large-file="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=584" class="alignnone wp-image-166" src="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=765&#038;h=125" alt="" width="765" height="125" srcset="https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=765&amp;h=125 765w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=1530&amp;h=248 1530w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=150&amp;h=24 150w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=300&amp;h=49 300w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=768&amp;h=125 768w, https://martinbnielsen.files.wordpress.com/2017/08/screen-shot-2017-08-12-at-13-34-00.png?w=1024&amp;h=166 1024w" sizes="(max-width: 765px) 100vw, 765px" /><p class="wp-caption-text">Single record view &#8211; after CSS modification</p></div> <p>Happy APEX developing</p> <p>Martin</p><br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/martinbnielsen.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/martinbnielsen.wordpress.com/165/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=martinbnielsen.wordpress.com&#038;blog=58840080&#038;post=165&#038;subd=martinbnielsen&#038;ref=&#038;feed=1" width="1" height="1" /> martinbnielsen http://martinbnielsen.wordpress.com/?p=165 Sat Aug 12 2017 07:42:10 GMT-0400 (EDT) Search Navigation Menu http://apex-plugin.com/oracle-apex-plugins/item-plugin/search-navigation-menu_521.html Item based plug-in for searching on navigation menu. http://apex-plugin.com/oracle-apex-plugins/item-plugin/search-navigation-menu_521.html Fri Aug 11 2017 10:34:16 GMT-0400 (EDT) Peeking at Collapsed Navigation Menu Entries http://vmorneau.me/peeking-at-collapsed-navigation-menu-entries/ <div class="kg-card-markdown"><p>Universal Theme's navigation sidebar has two states: <strong>expanded</strong> or <strong>collapsed</strong>. When collapsed, you only see the icons. Sometimes, icons are not enough.</p> <p>I wanted to peek at the text behind the icon without having to reach for the hamburger menu at the top.</p> <p><img src="http://vmorneau.me/content/images/2017/08/peek-collapse.gif" alt="peek-collapse"></p> <p><a href="https://apex.oracle.com/pls/apex/f?p=85494:1">See demo. <em>Please first collapse the sidebar manually.</em></a></p> <p>Here's how to achieve that using CSS only.</p> <pre><code class="language-css">.js-navCollapsed .t-TreeNav .a-TreeView-node--topLevel&gt;.a-TreeView-content.is-hover .a-TreeView-label { visibility: visible; left: 48px; padding: 0 16px; width: auto; background-color: #0459a1; /* This would be your primary color */ } .apex-side-nav.js-navCollapsed .t-Body-nav , .apex-side-nav.js-navCollapsed .t-Body-nav .t-TreeNav { z-index: 999; /* Make it appear on top of the page content */ } </code></pre> <hr> <p>Okay, it's not perfect on mobile, but it's still a nice trick for desktop...</p> <p>And please adjust according to your design guidelines.</p> <hr> <p>Enjoy these APEX CSS tricks? Let me know and I'll post more.</p> <p><a href="http://vmorneau.me/css">Head here to see them all.</a></p> </div> Vincent Morneau 598c83f7be76f57a06cbbfed Thu Aug 10 2017 23:52:55 GMT-0400 (EDT) Set up an APEX development environment http://dgielis.blogspot.com/2017/08/set-up-apex-development-environment.html This post is part of a series of posts: <a href="http://dgielis.blogspot.be/2017/08/from-idea-to-app-or-how-i-do-oracle.html">From idea to app or how I do an Oracle APEX project anno 2017</a><br /><br />A development environment can mean different things to different people. You can read the definitions on <a href="https://www.blogger.com/(https://en.wikipedia.org/wiki/Deployment_environment)">Wikipedia</a>, <a href="http://searchsoftwarequality.techtarget.com/definition/development-environment">TechTarget</a>, <a href="https://www.techopedia.com/definition/16376/development-environment">Techopedia</a> to name a few.<br /><br />For me, it means on one side you need an environment where you can develop in. In case of an Oracle APEX project this means, you need at least an Oracle schema and an APEX workspace linked to the Oracle schema in which you can create your APEX application. Now if we take this a step further, it means you need an Oracle Database and APEX installed, which includes a webserver and ORDS (Oracle REST Data Services). And again one level higher it means you need a machine (that is most likely connected to the internet).<br /><br />On the other side you have everything around it: some tools you use, something to plan and track the development, something to store your code (version control), something where you can collaborate with other team members. If we include this we talk more about software development in general which touches on application life cycle management (moving to Test, QA, Production).<br /><br />Lets first focus om the first part; the infrastructure. Unless we get millions of concurrent users, I don't think our multiplication table project needs much infrastructure :)<br /><br />I will walk over the different options we have when doing an APEX project.<br /><h2>On-premise</h2>You basically have your own machines and installed all software on there and you manage everything yourself. Many of my customers still have an on-premise infrastructure. Unless you see our laptops as on-premise, at my own company we never had on-premise, we've always been in the cloud. While running in the cloud you still have different options of the level of responsibility and flexibility you have yourself. We use cloud services from <a href="https://aws.amazon.com/">Amazon</a>, <a href="https://azure.microsoft.com/%E2%80%8E">Microsoft Azure</a>, <a href="https://www.digitalocean.com/">Digital Ocean</a> and the <a href="https://cloud.oracle.com/">Oracle Cloud</a>. More on that further on.<br /><h2><a href="https://apex.oracle.com/">apex.oracle.com</a></h2>This is the fastest way to get started, we just sign up for an account on apex.oracle.com and get an APEX workspace and underlying Oracle schema. <a href="https://apex.oracle.com/">Apex.oracle.com</a> also contains the latest version of Oracle Application Express (APEX) as the development team uses this service to roll-out and test new features and versions first. If you don't have an account yet, I recommend to create one. I've requested a workspace for this project too (takes less than 2 minutes), which you can see here:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-COC8InnGMPM/WYySRI5yVrI/AAAAAAAAIuY/JMYKntkYEE0AwvFoWlBbTq9RU8q3PvKIACEwYBhgL/s1600/04i_sign_up_apex_oracle_com2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="707" data-original-width="1230" height="366" src="https://3.bp.blogspot.com/-COC8InnGMPM/WYySRI5yVrI/AAAAAAAAIuY/JMYKntkYEE0AwvFoWlBbTq9RU8q3PvKIACEwYBhgL/s640/04i_sign_up_apex_oracle_com2.gif" width="640" /></a></div><br />Now we can use this service to develop and test, but we can't keep our application here forever, as we only have 25MB of space and you're not supposed to run production applications here. It's also not possible to connect to this service from SQL Developer or other tools, so it's a bit limiting. But in a future post "Build the Oracle APEX application: the framework" you will see why I still setup this workspace and I recommend everybody to have at least one workspace on <a href="https://apex.oracle.com/">apex.oracle.com</a> :)<br /><h2>Oracle pre-built Developer VM</h2>Another fast way of being up and running is to download the <a href="http://www.oracle.com/technetwork/community/developer-vm/index.html">Oracle pre-built Developer VM</a> for Virtual Box. Everything is already setup for us, but we would need to put it somewhere on a server where it can be accessible through the internet by more people. I typically don't use this solution to do my development, only to test something locally.<br /><h2>Free Oracle Database Cloud Service</h2>This service from Oracle has been announced a few months ago, but is not yet available at the time of writing. The rumours are you get 1GB of data, have APEX 5.1 or higher, you're running in the Oracle Cloud and can run production applications there. This solution would have been ideal for our multiplication table project!<br /><h2>Cloud with <a href="https://github.com/OraOpenSource/OXAR">OXAR</a></h2>If you're searching to build a low cost infrastructure based on Oracle XE (the free Oracle database), you really should use one of <a href="http://www.oraopensource.com/">OraOpenSource</a> projects, called <a href="https://github.com/OraOpenSource/OXAR">OXAR</a> (read "Oscar"). It sets up an entire machine by itself, it's completely scripted. The only thing you have to do is download the Oracle software (XE, ORDS, APEX), get a low cost virtual machine (for example at <a href="https://www.digitalocean.com/">Digital Ocean</a> or <a href="https://aws.amazon.com/">Amazon</a>), clone the OXAR git repository on that machine, edit the config file to point to the downloaded files and run the build.sh script. That is it! Even the most popular print engine for Oracle APEX, <a href="https://www.apexofficeprint.com/">APEX Office Print (AOP)</a>, comes installed with it :)<br /><br />The biggest benefit of an Oracle XE infrastructure, it's a very cheap solution, the downside is that Oracle XE is still Oracle DB 11g with many restrictions, so we can't use some 12c features (like JSON in DB, ...). Rumours are there will be an Oracle XE 12c version coming out in the future. Maybe even more important to know; there's no Oracle support for this database. Although at first sight you might not need it, it also implies you can't download Oracle APEX patches, as you don't have a CSI number. If you have a CSI number for another infrastructure and downloaded the APEX patches, you can obviously patch your APEX in Oracle XE. If not you would need to download and reinstall the full version of APEX every time, which becomes time consuming.<br /><br />So lets look at our multiplication table project, we can definitely use OXAR for this as it fits within the <a href="https://docs.oracle.com/cd/E17781_01/install.112/e18803/toc.htm#XEINW118">XE limits</a>. I subscribed at <a href="https://www.digitalocean.com/">Digital Ocean</a> for a CentOS Droplet for 10 USD/month and ran OXAR on there. It took me about 1 hour to be up and running (mostly the OXAR script was running by itself).<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-P6WIF_B8nLM/WYySQvyR2rI/AAAAAAAAIuQ/9eWL2r9FPYE9DkRUvBGqRN34NmVduzIjACEwYBhgL/s1600/04i_digital_ocean_oxar2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="662" data-original-width="1222" height="346" src="https://3.bp.blogspot.com/-P6WIF_B8nLM/WYySQvyR2rI/AAAAAAAAIuQ/9eWL2r9FPYE9DkRUvBGqRN34NmVduzIjACEwYBhgL/s640/04i_digital_ocean_oxar2.gif" width="640" /></a></div><br /><h2>Docker</h2><a href="https://www.docker.com/">Docker</a> has gained a lot of popularity in the last years (since 2013/2014). Docker is a tool designed to make it easier to create, deploy, and run applications by using containers. Oracle provides official <a href="https://github.com/oracle/docker-images">Docker Images</a> for many of their products, see also the <a href="https://store.docker.com/images/oracle-database-enterprise-edition">Docker store</a>. If you're new to Docker, you can read more <a href="https://docs.docker.com/get-started/#prerequisites">here</a>. I also like <a href="https://dzone.com/articles/5-key-benefits-docker-ci">this article</a> which covers the main benefits of Docker. You can also watch <a href="https://www.youtube.com/watch?v=OBTw43HudVU">this video</a> how to build and deploy an Oracle Database Docker Image to the Oracle Container Cloud Service. So far I've used Docker only for test instances.<br /><br />I typically use the <a href="https://github.com/Dani3lSun/docker-db-apex-dev">docker image</a> of <a href="https://danielhochleitner.de/">Daniel Hochleitner</a> (aka Mr. APEX Plugin). Daniel itself says his docker image isn't very "dockerish" because installing all components in one container is not the concept how it should work, so the benefits of microservices, security, single components and things like that are lost in a cloud environment with this particular docker image. But the nice thing about this image, just like OXAR, it includes all you need: ORDS, APEX, Tomcat, AOP, ... For me this image is ideal to test something quickly. A docker container has less overhead than a full VM and you still have some benefits of Docker.<br /><br />Some pictures while building and creating the container:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-20U0ooeeaBQ/WYySQjT7pCI/AAAAAAAAIuM/tOPSXMSJ1QUOK-CK7a4N4J8A4k5sudeFwCEwYBhgL/s1600/04i_setting_up_docker_oracle2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="357" data-original-width="1350" height="168" src="https://2.bp.blogspot.com/-20U0ooeeaBQ/WYySQjT7pCI/AAAAAAAAIuM/tOPSXMSJ1QUOK-CK7a4N4J8A4k5sudeFwCEwYBhgL/s640/04i_setting_up_docker_oracle2.gif" width="640" /></a></div><br />For the multiplication table project I won't use this option. But I did want to cover it, as it might be a good solution for you, especially if your company is already into containers. Oh and did you know Docker has a competitor too? It's called <a href="https://github.com/rkt/rkt">rkt</a>, we will probably hear more about that in the coming years.<br /><h2>Hosting companies</h2>Next to Oracle, there're a number of <a href="https://apex.oracle.com/pls/apex/f?p=411:4:::NO:::">hosting companies</a> that provide Oracle APEX hosting, but I've no experience using them for my own projects, but it might be an option for yours. I know some AOP cloud customers that connect from their SkillBuilders, Revion and AppsHosting account.<br /><h2>Cloud</h2>As previously mentioned in the on-premise section, there're a number of options you have. You can just go with a (virtual) machine, or a machine that is pre-configured, a complete managed machine and database etc. They also call it infrastructure as a service (IaaS), platform as a service (PaaS) or software as a service (SaaS) or data as a service (DaaS). For an Oracle APEX project it's most important you have the Oracle database. Oracle put the last few years a lot of focus on the cloud, here you find the <a href="https://cloud.oracle.com/database">Oracle Database Cloud</a> offering. There're also alternatives by many other providers for example Amazon AWS: <a href="https://aws.amazon.com/ec2/">EC2</a> (virtual machine), <a href="https://aws.amazon.com/rds/oracle/">RDS</a> (managed database) etc. In the next section we go in more detail with one of the Oracle's offering.<br /><h2><a href="https://cloud.oracle.com/en_US/database/exadata-express/pricing">Oracle Exadata Express Cloud Service</a></h2>I'm a real fan of one of Oracle's cloud solutions named <a href="https://cloud.oracle.com/en_US/database/exadata-express/pricing">Oracle Exadata Express Cloud</a>. I find this a great solution for many of my Oracle APEX projects. For 152 euro (excl. vat) you get an Oracle 12c pluggable database with many Enterprise Edition features turned on and ORDS and APEX 5.1 installed. This service is also fully managed by Oracle, so Oracle is taking care of all the patching, keeping it up and running, performant and secure. They let you know when a maintenance will happen and let you know when it's complete. Here's an example of a few days ago:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-MR-P7EJKvtE/WYyQextwTOI/AAAAAAAAIuA/CzMy8DC03Zg-kNlwHnzyRnntDPCYJQGsACLcBGAs/s1600/04i_exadata_express_maintenance.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1096" data-original-width="1600" height="438" src="https://2.bp.blogspot.com/-MR-P7EJKvtE/WYyQextwTOI/AAAAAAAAIuA/CzMy8DC03Zg-kNlwHnzyRnntDPCYJQGsACLcBGAs/s640/04i_exadata_express_maintenance.png" width="640" /></a></div><br /><br />On top of this, it's running on Exadata hardware. To build this solution myself would require a lot of money. Oh and it can connect to our <a href="https://www.apexofficeprint.com/">APEX Office Print</a> cloud service, so you can do PDF printing and exporting to Excel too :)<br /><br />But that is not all... you get more, you get a complete development infrastructure, meaning part 1 and part 2 I touched on at the start of this blog. So you can manage the full development life cycle with this service. You have a Git repository, can do the planning, capture issues, do automated builds etc.<br /><br />Here's a quick screen cast logging in to Exadata Express and looking at the different pieces we covered:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-fHTLrqcI25A/WYySQkiqRhI/AAAAAAAAIuU/mowtVs4MR7sooxEROsukZoauyup5J8XhwCEwYBhgL/s1600/04i_oracle_exadata_cloud2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="848" data-original-width="1323" height="410" src="https://4.bp.blogspot.com/-fHTLrqcI25A/WYySQkiqRhI/AAAAAAAAIuU/mowtVs4MR7sooxEROsukZoauyup5J8XhwCEwYBhgL/s640/04i_oracle_exadata_cloud2.gif" width="640" /></a></div><br />On the management part of the development process; doing the builds, tracking the issues etc. you can definitely set this up yourself, and there are many options you have, from open source to probably most known, the <a href="https://www.atlassian.com/">Atlassian</a> stack with Jira, Confluence, Bamboo etc. but this comes with a cost too. At <a href="https://www.apexrnd.be/">APEX R&amp;D</a> we use different tools depending the project and customer. Two years ago, for AOP we started with Team Development which is part of Oracle APEX to define the features, gather feedback and define the releases. But we extended with other tools now like Trello and <a href="https://bitbucket.org/product">Bitbucket</a> which stores our Git repository and we started to use the issue features there too. In some other projects we use <a href="https://www.atlassian.com/software/jira">Jira</a> or <a href="http://www.redmine.org/">Redmine</a>.<br /><br />There're so many tools to manage your development life cycle, at some point you just have to make a choice. At the end of the day most tools are good, it comes down to personal preference. Whenever our project involves Oracle Exadata Express, my choice will be to use the tools that come with the <a href="https://cloud.oracle.com/developer_service">Oracle Developer Cloud Service</a>, as that is included and I don't need to setup anything else anymore. From a maintenance and cost perspective I find it really appealing.<br /><br />On different Oracle conferences this year, I've given a <a href="https://www.slideshare.net/DimitriGielis/moving-your-apex-app-to-the-oracle-exadata-express-cloud">presentation</a> how to move your APEX app to the Oracle Exadata Express Cloud.<br /><br />Is this solution perfect yet? No, there's still room for improvement. For example I would love to have some more EE features available (RAS, Flashback data archive for example), an easier way to point to a custom URL and a customizable backup strategy. Oracle is improving every month and for many projects the current feature set is more than enough.<br /><br />As the multiplication project has both an educational side to show you how I do APEX projects and is also a real use case, I'll use the Oracle Exadata Express service.<br /><br />Ok, this post is getting close to 2000 words... if you read till here, great! I hope I gave you an insight in the different options you have to build your APEX infrastructure.<br /><br />If you have any questions or remarks, don't hesitate to add them as comments to this post. Dimitri Gielis tag:blogger.com,1999:blog-21122514.post-478988704441792023 Thu Aug 10 2017 13:19:00 GMT-0400 (EDT) Thanks, LISTAGG. I owe ya one. http://montylatiolais.blogspot.com/2017/08/thanks-listagg-i-owe-ya-one.html <a href="https://3.bp.blogspot.com/-Y-DX0sP7bPA/WYyA-VSfp4I/AAAAAAAAGYE/8FpT6ygYTxAnLAEF8wzrKzSbyPkIBRmKwCLcBGAs/s1600/flag_banner.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="80" data-original-width="120" height="133" src="https://3.bp.blogspot.com/-Y-DX0sP7bPA/WYyA-VSfp4I/AAAAAAAAGYE/8FpT6ygYTxAnLAEF8wzrKzSbyPkIBRmKwCLcBGAs/s200/flag_banner.jpg" width="200" /></a>My son is in Boy Scouts and their fundraising campaign involves the placement of U.S. Flags on certain holidays. In it's infancy it was all handled via spreadsheets. You can do that when you're only talking a limited number of flags.<br /><br />I, of course, wrote an APEX app for it.<br /><br />It's what you do when you do what we do.<br /><br />Since this wasn't a paid gig, I re-purposed the "Sample Database App". Everything was coming along. The desktop functionality was in place and looking grand. The mobile functionality one needed in the field was taking shape. I got to a mobile list view that needed to list the address and under it the details of the individual flags on that property....could be one...could be many. Not difficult but I wanted an elegant solution that wouldn't add rows to my list view.<br /><br />Let's look briefly at the source code...<br /><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;">&nbsp; &nbsp;select f.flag_id,</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c.address,</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.flag_nbr,</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.flag_desc,</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.active</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;">&nbsp; &nbsp; &nbsp;from customers c,</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flags f</span><br /><span style="font-size: xx-small;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; where&nbsp;</span><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">c.customer_id = f.customer_id</span></span><br /><br />Nothing to get excited about here.<br /><br />Looking at the Advanced Formatting options for the List View...<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-w3jKVzTli5o/WYyDv98J94I/AAAAAAAAGYQ/t3l8EOzPREE2ibnmS2cG4MNqxq4AdNftwCEwYBhgL/s1600/listagg3.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="189" data-original-width="386" height="97" src="https://4.bp.blogspot.com/-w3jKVzTli5o/WYyDv98J94I/AAAAAAAAGYQ/t3l8EOzPREE2ibnmS2cG4MNqxq4AdNftwCEwYBhgL/s200/listagg3.PNG" width="200" /></a></div><br /><br /><br /><br /><br /><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: xx-small;"><br /></span>&nbsp; <br />Hmm. This could potentially add blank lines. What I really needed to do is aggregate the list of flags for that property. What I really need is something like this...<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-laKp78H-Pco/WYyDv3R9NOI/AAAAAAAAGYY/JHLFYd470DE6Cu7E8ti2RtY_gmSeEQ6LgCEwYBhgL/s1600/listagg4.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="93" data-original-width="372" height="50" src="https://2.bp.blogspot.com/-laKp78H-Pco/WYyDv3R9NOI/AAAAAAAAGYY/JHLFYd470DE6Cu7E8ti2RtY_gmSeEQ6LgCEwYBhgL/s200/listagg4.PNG" width="200" /></a></div><br /><br /><br /><br /><br />Enter LISTAGG. I assume we've all used listagg to do this very thing but I didn't want the result to simply be a concatenated string of "Flag1, Flag2, Flag3, FlagN"...or did I? &nbsp;A few well placed P's here and there and I got exactly what I wanted.<br /><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-IqyNpj6UrUs/WYyDv1HLmnI/AAAAAAAAGYU/8Sc1mi9hjeAIsZgF00Yyeflny2Hnr_68wCEwYBhgL/s1600/listagg5.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="254" data-original-width="766" height="105" src="https://4.bp.blogspot.com/-IqyNpj6UrUs/WYyDv1HLmnI/AAAAAAAAGYU/8Sc1mi9hjeAIsZgF00Yyeflny2Hnr_68wCEwYBhgL/s320/listagg5.PNG" width="320" /></a></div><br /><br /><br /><br /><br /><br /><br /><div><br /></div>and here's the big reveal..."Move that Bus!"<br /><br /><a href="https://3.bp.blogspot.com/-kM3-crPfsjc/WYx-VephjOI/AAAAAAAAGX4/9jemzhPazxw1bNaaPWfdhy2_hRFFxgD_ACLcBGAs/s1600/listagg_081017.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="563" data-original-width="505" height="320" src="https://3.bp.blogspot.com/-kM3-crPfsjc/WYx-VephjOI/AAAAAAAAGX4/9jemzhPazxw1bNaaPWfdhy2_hRFFxgD_ACLcBGAs/s320/listagg_081017.PNG" width="287" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />Exactly what I needed. LISTAGG provided me a way, for display purposes, to effectively pivot the data. The takeaway here is don't rule out things like LISTAGG because at first glance they don't appear to deliver what you need. In this case the concatenated string I received just needed a little TLC.<br /><br /><br />...our journey continues<br /><br /><br /><br /><br /> Monty Latiolais tag:blogger.com,1999:blog-4670514573534452370.post-7970835740142388121 Thu Aug 10 2017 11:53:00 GMT-0400 (EDT) Welcome to Ghost http://vmorneau.me/welcome/ <div class="kg-card-markdown"><img src="https://casper.ghost.org/v1.0.0/images/welcome.jpg" alt="Welcome to Ghost"><p>Hey! Welcome to Ghost, it's great to have you :)</p> <p>We know that first impressions are important, so we've populated your new site with some initial <strong>Getting Started</strong> posts that will help you get familiar with everything in no time. This is the first one!</p> <h3 id="thereareafewthingsthatyoushouldknowupfront">There are a few things that you should know up-front:</h3> <ol> <li> <p>Ghost is designed for ambitious, professional publishers who want to actively build a business around their content. That's who it works best for. If you're using Ghost for some other purpose, that's fine too - but it might not be the best choice for you.</p> </li> <li> <p>The entire platform can be modified and customized to suit your needs, which is very powerful, but doing so <strong>does</strong> require some knowledge of code. Ghost is not necessarily a good platform for beginners or people who just want a simple personal blog.</p> </li> <li> <p>For the best experience we recommend downloading the <a href="https://ghost.org/downloads/">Ghost Desktop App</a> for your computer, which is the best way to access your Ghost site on a desktop device.</p> </li> </ol> <p>Ghost is made by an independent non-profit organisation called the Ghost Foundation. We are 100% self funded by revenue from our <a href="https://ghost.org/pricing">Ghost(Pro)</a> service, and every penny we make is re-invested into funding further development of free, open source technology for modern journalism.</p> <p>The main thing you'll want to read about next is probably: <a href="http://vmorneau.me/the-editor/">the Ghost editor</a>.</p> <p>Once you're done reading, you can simply delete the default <strong>Ghost</strong> user from your team to remove all of these introductory posts!</p> </div> Ghost 598c4bba720f5279c44f14f0 Thu Aug 10 2017 08:04:15 GMT-0400 (EDT) Using the Ghost editor http://vmorneau.me/the-editor/ <div class="kg-card-markdown"><img src="https://casper.ghost.org/v1.0.0/images/writing.jpg" alt="Using the Ghost editor"><p>Ghost uses a language called <strong>Markdown</strong> to format text.</p> <p>When you go to edit a post and see special characters and colours intertwined between the words, those are Markdown shortcuts which tell Ghost what to do with the words in your document. The biggest benefit of Markdown is that you can quickly apply formatting as you type, without needing to pause.</p> <p>At the bottom of the editor, you'll find a toolbar with basic formatting options to help you get started as easily as possible. You'll also notice that there's a <strong>?</strong> icon, which contains more advanced shortcuts.</p> <p>For now, though, let's run you through some of the basics. You'll want to make sure you're editing this post in order to see all the Markdown we've used.</p> <h2 id="formattingtext">Formatting text</h2> <p>The most common shortcuts are of course, <strong>bold</strong> text, <em>italic</em> text, and <a href="https://example.com">hyperlinks</a>. These generally make up the bulk of any document. You can type the characters out, but you can also use keyboard shortcuts.</p> <ul> <li><code>CMD/Ctrl + B</code> for Bold</li> <li><code>CMD/Ctrl + I</code> for Italic</li> <li><code>CMD/Ctrl + K</code> for a Link</li> <li><code>CMD/Ctrl + H</code> for a Heading (Press multiple times for h2/h3/h4/etc)</li> </ul> <p>With just a couple of extra characters here and there, you're well on your way to creating a beautifully formatted story.</p> <h2 id="insertingimages">Inserting images</h2> <p>Images in Markdown look just the same as links, except they're prefixed with an exclamation mark, like this:</p> <p><code>![Image description](/path/to/image.jpg)</code></p> <p><img src="https://casper.ghost.org/v1.0.0/images/computer.jpg" alt="Using the Ghost editor"></p> <p>Most Markdown editors don't make you type this out, though. In Ghost you can click on the image icon in the toolbar at the bottom of the editor, or you can just click and drag an image from your desktop directly into the editor. Both will upload the image for you and generate the appropriate Markdown.</p> <p><em><strong>Important Note:</strong> Ghost does not currently have automatic image resizing, so it's always a good idea to make sure your images aren't gigantic files <strong>before</strong> uploading them to Ghost.</em></p> <h2 id="makinglists">Making lists</h2> <p>Lists in HTML are a formatting nightmare, but in Markdown they become an absolute breeze with just a couple of characters and a bit of smart automation. For numbered lists, just write out the numbers. For bullet lists, just use <code>*</code> or <code>-</code> or <code>+</code>. Like this:</p> <ol> <li>Crack the eggs over a bowl</li> <li>Whisk them together</li> <li>Make an omelette</li> </ol> <p>or</p> <ul> <li>Remember to buy milk</li> <li>Feed the cat</li> <li>Come up with idea for next story</li> </ul> <h2 id="addingquotes">Adding quotes</h2> <p>When you want to pull out a particularly good excerpt in the middle of a piece, you can use <code>&gt;</code> at the beginning of a paragraph to turn it into a Blockquote. You might've seen this formatting before in email clients.</p> <blockquote> <p>A well placed quote guides a reader through a story, helping them to understand the most important points being made</p> </blockquote> <p>All themes handles blockquotes slightly differently. Sometimes they'll look better kept shorter, while other times you can quote fairly hefty amounts of text and get away with it. Generally, the safest option is to use blockquotes sparingly.</p> <h2 id="dividingthingsup">Dividing things up</h2> <p>If you're writing a piece in parts and you just feel like you need to divide a couple of sections distinctly from each other, a horizontal rule might be just what you need. Dropping <code>---</code> on a new line will create a sleek divider, anywhere you want it.</p> <hr> <p>This should get you going with the vast majority of what you need to do in the editor, but if you're still curious about more advanced tips then check out the <a href="http://vmorneau.me/advanced-markdown/">Advanced Markdown Guide</a> - or if you'd rather learn about how Ghost taxononomies work, we've got a overview of <a href="http://vmorneau.me/using-tags/">how to use Ghost tags</a>.</p> </div> Ghost 598c4bba720f5279c44f14ef Thu Aug 10 2017 08:04:14 GMT-0400 (EDT) Organising your content with tags http://vmorneau.me/using-tags/ <div class="kg-card-markdown"><img src="https://casper.ghost.org/v1.0.0/images/tags.jpg" alt="Organising your content with tags"><p>Ghost has a single, powerful organisational taxonomy, called tags.</p> <p>It doesn't matter whether you want to call them categories, tags, boxes, or anything else. You can think of Ghost tags a lot like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.</p> <h2 id="basictagging">Basic tagging</h2> <p>When you write a post, you can assign tags to help differentiate between categories of content. For example, you might tag some posts with <code>News</code> and other posts with <code>Cycling</code>, which would create two distinct categories of content listed on <code>/tag/news/</code> and <code>/tag/cycling/</code>, respectively.</p> <p>If you tag a post with both <code>News</code> <em>and</em> <code>Cycling</code> - then it appears in both sections.</p> <p>Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.</p> <h2 id="theprimarytag">The primary tag</h2> <p>Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default. So you can add the most important tag which you want to show up in your theme, but also add a bunch of related tags which are less important.</p> <p><mark><strong>News</strong>, Cycling, Bart Stevens, Extreme Sports</mark></p> <p>In this example, <strong>News</strong> is the primary tag which will be displayed by the theme, but the post will also still receive all the other tags, and show up in their respective archives.</p> <h2 id="privatetags">Private tags</h2> <p>Sometimes you may want to assign a post a specific tag, but you don't necessarily want that tag appearing in the theme or creating an archive page. In Ghost, hashtags are private and can be used for special styling.</p> <p>For example, if you sometimes publish posts with video content - you might want your theme to adapt and get rid of the sidebar for these posts, to give more space for an embedded video to fill the screen. In this case, you could use private tags to tell your theme what to do.</p> <p><mark><strong>News</strong>, Cycling, #video</mark></p> <p>Here, the theme would assign the post publicly displayed tags of <code>News</code>, and <code>Cycling</code> - but it would also keep a private record of the post being tagged with <code>#video</code>.</p> <p>In your theme, you could then look for private tags conditionally and give them special formatting:</p> <pre><code>{{#post}} {{#has tag=&quot;#video&quot;}} ...markup for a nice big video post layout... {{else}} ...regular markup for a post... {{/has}} {{/post}} </code></pre> <p>You can find documentation for theme development techniques like this and many more over on Ghost's extensive <a href="https://themes.ghost.org/">theme documentation</a>.</p> </div> Ghost 598c4bba720f5279c44f14ee Thu Aug 10 2017 08:04:13 GMT-0400 (EDT) Managing Ghost users http://vmorneau.me/managing-users/ <div class="kg-card-markdown"><img src="https://casper.ghost.org/v1.0.0/images/team.jpg" alt="Managing Ghost users"><p>Ghost has a number of different user roles for your team</p> <h3 id="authors">Authors</h3> <p>The base user level in Ghost is an author. Authors can write posts, edit their own posts, and publish their own posts. Authors are <strong>trusted</strong> users. If you don't trust users to be allowed to publish their own posts, you shouldn't invite them to Ghost admin.</p> <h3 id="editors">Editors</h3> <p>Editors are the 2nd user level in Ghost. Editors can do everything that an Author can do, but they can also edit and publish the posts of others - as well as their own. Editors can also invite new authors to the site.</p> <h3 id="administrators">Administrators</h3> <p>The top user level in Ghost is Administrator. Again, administrators can do everything that Authors and Editors can do, but they can also edit all site settings and data, not just content. Additionally, administrators have full access to invite, manage or remove any other user of the site.</p> <h3 id="theowner">The Owner</h3> <p>There is only ever one owner of a Ghost site. The owner is a special user which has all the same permissions as an Administrator, but with two exceptions: The Owner can never be deleted. And in some circumstances the owner will have access to additional special settings if applicable — for example, billing details, if using Ghost(Pro).</p> <hr> <p>It's a good idea to ask all of your users to fill out their user profiles, including bio and social links. These will populate rich structured data for posts and generally create more opportunities for themes to fully populate their design.</p> </div> Ghost 598c4bba720f5279c44f14ed Thu Aug 10 2017 08:04:12 GMT-0400 (EDT) Making your site private http://vmorneau.me/private-sites/ <div class="kg-card-markdown"><img src="https://casper.ghost.org/v1.0.0/images/locked.jpg" alt="Making your site private"><p>Sometimes you might want to put your site behind closed doors</p> <p>If you've got a publication that you don't want the world to see yet because it's not ready to launch, you can hide your Ghost site behind a simple shared pass-phrase.</p> <p>You can toggle this preference on at the bottom of Ghost's General Settings</p> <p><img src="https://casper.ghost.org/v1.0.0/images/private.png" alt="Making your site private"></p> <p>Ghost will give you a short, randomly generated pass-phrase which you can share with anyone who needs access to the site while you're working on it. While this setting is enabled, all search engine optimisation features will be switched off to help keep the site off the radar.</p> <p>Do remember though, this is <em>not</em> secure authentication. You shouldn't rely on this feature for protecting important private data. It's just a simple, shared pass-phrase for very basic privacy.</p> </div> Ghost 598c4bb9720f5279c44f14ec Thu Aug 10 2017 08:04:11 GMT-0400 (EDT) Advanced Markdown tips http://vmorneau.me/advanced-markdown/ <div class="kg-card-markdown"><img src="https://casper.ghost.org/v1.0.0/images/advanced.jpg" alt="Advanced Markdown tips"><p>There are lots of powerful things you can do with the Ghost editor</p> <p>If you've gotten pretty comfortable with <a href="http://vmorneau.me/the-editor/">all the basics</a> of writing in Ghost, then you may enjoy some more advanced tips about the types of things you can do with Markdown!</p> <p>As with the last post about the editor, you'll want to be actually editing this post as you read it so that you can see all the Markdown code we're using.</p> <h2 id="specialformatting">Special formatting</h2> <p>As well as bold and italics, you can also use some other special formatting in Markdown when the need arises, for example:</p> <ul> <li><s>strike through</s></li> <li><mark>highlight</mark></li> <li>*escaped characters*</li> </ul> <h2 id="writingcodeblocks">Writing code blocks</h2> <p>There are two types of code elements which can be inserted in Markdown, the first is inline, and the other is block. Inline code is formatted by wrapping any word or words in back-ticks, <code>like this</code>. Larger snippets of code can be displayed across multiple lines using triple back ticks:</p> <pre><code>.my-link { text-decoration: underline; } </code></pre> <p>If you want to get really fancy, you can even add syntax highlighting using <a href="http://prismjs.com/">Prism.js</a>.</p> <h2 id="fullbleedimages">Full bleed images</h2> <p>One neat trick which you can use in Markdown to distinguish between different types of images is to add a <code>#hash</code> value to the end of the source URL, and then target images containing the hash with special styling. For example:</p> <p><img src="https://casper.ghost.org/v1.0.0/images/walking.jpg#full" alt="Advanced Markdown tips"></p> <p>which is styled with...</p> <pre><code>img[src$=&quot;#full&quot;] { max-width: 100vw; } </code></pre> <p>This creates full-bleed images in the Casper theme, which stretch beyond their usual boundaries right up to the edge of the window. Every theme handles these types of things slightly differently, but it's a great trick to play with if you want to have a variety of image sizes and styles.</p> <h2 id="referencelists">Reference lists</h2> <p><strong>The quick brown <a href="https://en.wikipedia.org/wiki/Fox" title="Wikipedia: Fox">fox</a>, jumped over the lazy <a href="https://en.wikipedia.org/wiki/Dog" title="Wikipedia: Dog">dog</a>.</strong></p> <p>Another way to insert links in markdown is using reference lists. You might want to use this style of linking to cite reference material in a Wikipedia-style. All of the links are listed at the end of the document, so you can maintain full separation between content and its source or reference.</p> <h2 id="creatingfootnotes">Creating footnotes</h2> <p>The quick brown fox<sup class="footnote-ref"><a href="http://vmorneau.me/advanced-markdown/#fn1" id="fnref1">[1]</a></sup> jumped over the lazy dog<sup class="footnote-ref"><a href="http://vmorneau.me/advanced-markdown/#fn2" id="fnref2">[2]</a></sup>.</p> <p>Footnotes are a great way to add additional contextual details when appropriate. Ghost will automatically add footnote content to the very end of your post.</p> <h2 id="fullhtml">Full HTML</h2> <p>Perhaps the best part of Markdown is that you're never limited to just Markdown. You can write HTML directly in the Ghost editor and it will just work as HTML usually does. No limits! Here's a standard YouTube embed code as an example:</p> <iframe width="560" height="315" src="https://www.youtube.com/embed/Cniqsc9QfDo?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Foxes are red <a href="http://vmorneau.me/advanced-markdown/#fnref1" class="footnote-backref">↩︎</a></p> </li> <li id="fn2" class="footnote-item"><p>Dogs are usually not red <a href="http://vmorneau.me/advanced-markdown/#fnref2" class="footnote-backref">↩︎</a></p> </li> </ol> </section> </div> Ghost 598c4bb9720f5279c44f14eb Thu Aug 10 2017 08:04:10 GMT-0400 (EDT) Setting up your own Ghost theme http://vmorneau.me/themes/ <div class="kg-card-markdown"><img src="https://casper.ghost.org/v1.0.0/images/design.jpg" alt="Setting up your own Ghost theme"><p>Creating a totally custom design for your publication</p> <p>Ghost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be easily adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.</p> <p>There are a huge range of both free and premium pre-built themes which you can get from the <a href="http://marketplace.ghost.org">Ghost Theme Marketplace</a>, or you can simply create your own from scratch.</p> <p><a href="http://marketplace.ghost.org"><img src="https://casper.ghost.org/v1.0.0/images/marketplace.jpg" alt="Setting up your own Ghost theme"></a></p> <blockquote> <p>Anyone can write a completely custom Ghost theme, with just some solid knowledge of HTML and CSS</p> </blockquote> <p>Ghost themes are written with a templating language called handlebars, which has a bunch of dynamic helpers to insert your data into template files. Like <code>{{author.name}}</code>, for example, outputs the name of the current author.</p> <p>The best way to learn how to write your own Ghost theme is to have a look at <a href="https://github.com/TryGhost/Casper">the source code for Casper</a>, which is heavily commented and should give you a sense of how everything fits together.</p> <ul> <li><code>default.hbs</code> is the main template file, all contexts will load inside this file unless specifically told to use a different template.</li> <li><code>post.hbs</code> is the file used in the context of viewing a post.</li> <li><code>index.hbs</code> is the file used in the context of viewing the home page.</li> <li>and so on</li> </ul> <p>We've got <a href="http://themes.ghost.org/docs/about">full and extensive theme documentation</a> which outlines every template file, context and helper that you can use.</p> <p>If you want to chat with other people making Ghost themes to get any advice or help, there's also a <strong>#themes</strong> channel in our <a href="https://slack.ghost.org">public Slack community</a> which we always recommend joining!</p> </div> Ghost 598c4bb9720f5279c44f14ea Thu Aug 10 2017 08:04:09 GMT-0400 (EDT) Latin America Oracle Developer Tour 2017 http://desenvolvedorapex.blogspot.com/2017/08/latin-america-oracle-developer-tour-2017.html Olá pessoal,<br /><br />o <b>Oracle Developer Tour Latinoamérica 2017</b> está confirmado para os dias <b>9 e 10 de novembro de 2017</b> em <b>Brasília </b>no auditório do TCU.<br /><br />O evento faz parte de um tour que percorrerá diversos países da América Latina. Acesse o site: <a href="http://www.odtlatam.com/" target="_blank">www.odtlatam.com</a> para maiores detalhes.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-_SyMrN-dmKo/WYs_80-m2DI/AAAAAAAAAwc/jpEct00LQ0U2LQeopJlCpq9T7pCigF9PACLcBGAs/s1600/Imagem1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="332" data-original-width="908" height="146" src="https://3.bp.blogspot.com/-_SyMrN-dmKo/WYs_80-m2DI/AAAAAAAAAwc/jpEct00LQ0U2LQeopJlCpq9T7pCigF9PACLcBGAs/s400/Imagem1.jpg" width="400" /></a></div><br />As inscrições abrirão em breve, entretanto a <b>submissão de propostas de apresentação está disponível</b> até o dia 1º de setembro no seguinte link:&nbsp;<a href="https://apex.oracle.com/pls/apex/f?p=callforpapers_odt" target="_blank">https://apex.oracle.com/pls/apex/f?p=callforpapers_odt</a><br /><br />Aguardo suas propostas de apresentação e conto com a presença de todos no evento no dia 9 e 10 de novembro!<br /><br />Abraço Anderson Ferreira tag:blogger.com,1999:blog-5150514048465222719.post-3264554718147992533 Wed Aug 09 2017 16:27:00 GMT-0400 (EDT) diegopaf http://apex-plugin.com/oracle-apex-plugins?sobi2Task=sobi2Details&catid=1&sobi2Id=520 How you can avail great things about RSS Feed's for Your Site? http://postrss.com/wp-content/uploads/2015/12/reklama.jpg Sites can take good thing about an RSS feed concerning producing traffic considerably, along with aid keep that web traffic. The RSS feed instantly includes fresh properly improved web content to your site. This is beneficial to the web traffic retention rate considering that it offers the most effective kind of upgraded content for your website visitors. http://s23.postimg.org/yc9shpam3/cover2.jpg Preserving a niche site can be challenging, particularly when it pertains to supplying helpful, upgraded and pertinent content. This is a method to truly have a continuous upgrade to your internet site with fresh content so that it will be seen regularly. http://s30.postimg.org/pd6rf21sx/social_media_suggestions2.jpg Sorts of RSS Feed's Forms of data that can be offered in RSS feeds can encompass a information feed from a big news web page or a weblogs feed. These were In particular practical offered that they're routinely upgraded, normally day by day. An write-up feed Added benefits informing visitors when new small article content and One more content material of desire to your readership is offered. The feed is Commonly a summary or intro from which audience can look at even more if most popular. Routine feeds can encompass schools along with other businesses that offer important interaction like convention periods, events, and various data. Online Discussion board feeds can notify visitors when any individual has resolved amid his / her posts or when a topic of importance is covered. Specials and Low cost feeds are in some cases provided by retail and on-line retailers to reveal The newest income and discounts. Relieve of Procedure That after it really is founded, accumulating and employing an RSS feed is obtained without needing to in fact update it you is really a in addition. Whenever an on-line internet search engine directs readers to your web site, it will eventually Also history the RSS feed updates. Other RSS Feed Positive aspects With an RSS feed, it truly is Furthermore possible to, all the more, increase the amount of unique website visitors that concern your website by syndicating the updates. This strategy can Web some again-backlinks on other web pages, to improve the whole off-web site Web optimization rating. Also, it might Furthermore assist to accumulate some more one of a kind people from the direct links from other web-sites and blogs. RSS Feeds can Recycle Traffic Since the website aggregates what are acknowledged as vital authority web sites by way of an RSS feed, your website could exceptionally very well find yourself staying an authority internet site collector. This is incredibly useful for individuals who choose to discover authority internet sites on the certain topic. To learn more visit our Web page http://postrss.com RSS| http://apex-plugin.com/oracle-apex-plugins?sobi2Task=sobi2Details&catid=1&sobi2Id=520 Tue Aug 08 2017 21:45:15 GMT-0400 (EDT) Oracle Technology Network Tour Latinoamérica 2017 - Brasil http://desenvolvedorapex.blogspot.com/2017/08/oracle-technology-network-tour.html Olá pessoal,<br /><br />no último sábado (05/Ago/2017) ocorreu em São Paulo o "<b>Latin America OTN Tour 2017</b>" também conhecido como <b>GUOB Tech Day</b>.<br /><br />O evento é organizado pelo Grupo de Usuário Oracle do Brasil onde são apresentados temas de interesse da comunidade Oracle.<br /><br />Pela primeira vez ocorreu em uma universidade (Uninove) e quebrou o <b>recorde de palestras</b> e de palestrantes do Brasil. Foram <b>5 salas simultâneas</b>! Maiores detalhes no site: <a href="http://guobtechday2017.eventize.com.br/">http://guobtechday2017.eventize.com.br</a><br /><br />Fiz duas apresentações sobre a tecnologia Oracle Application Express:<br />1) <b>Boas práticas para desenvolver aplicações web seguras com Oracle Application Express 5&nbsp;</b>(<a href="https://drive.google.com/open?id=0BzGiicXqTxwqbkJwWnctQVd0Tlk" target="_blank">clique aqui para download</a>)<br />2) <b>Explorando Packaged Apps no Oracle Application Express 5 </b>(<a href="https://drive.google.com/open?id=0BzGiicXqTxwqb0g2Unl2azBZSzQ" target="_blank">clique aqui para download</a>)<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-sUSharE2kN0/WYonSm-fISI/AAAAAAAAAwE/Gy5e3YMdA0USb_LsfS-Yx3jMxitOoABlgCLcBGAs/s1600/OTN%2BTour%2B17%2B-%2BAnderson%2BSala%2B5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1224" data-original-width="918" height="320" src="https://2.bp.blogspot.com/-sUSharE2kN0/WYonSm-fISI/AAAAAAAAAwE/Gy5e3YMdA0USb_LsfS-Yx3jMxitOoABlgCLcBGAs/s320/OTN%2BTour%2B17%2B-%2BAnderson%2BSala%2B5.jpg" width="240" /></a></div><div class="separator" style="clear: both; text-align: center;"><b>(Oracle Apex dominando a sala 5)</b></div><div class="separator" style="clear: both; text-align: center;"><br /></div>Além disso, a equipe do OTN da Oracle solicitou que eu gravasse um vídeo sobre o OTN Tour e sobre o Oracle Developer Tour que ocorrerá em novembro. Segue link para o vídeo:&nbsp;<a href="https://www.youtube.com/watch?v=Yz3_Ef8vKls&amp;t=3s">https://www.youtube.com/watch?v=Yz3_Ef8vKls&amp;t=3s</a><br /><br />Com o aumento da quantidade de palestras simultâneas, estava receoso de que o número de participantes de minhas palestras fosse pequeno, entretanto o <b>número de participantes foi bom</b>. Isso mostra que o uso do Oracle Apex está aumentando a cada dia.<br /><br />Foi uma excelente oportunidade de trocar conhecimentos e ampliar o network. Obrigado ao GUOB pela oportunidade!<br /><br />Aguardo vocês nos próximos eventos. Anderson Ferreira tag:blogger.com,1999:blog-5150514048465222719.post-2926744193719177170 Tue Aug 08 2017 17:10:00 GMT-0400 (EDT) Something big is coming http://www.explorer.uk.com/something-big-is-coming/ <p>“Something big is coming” @OracleCloud tweeted on 20 July 2017 along with a 12-second video that featured:</p> <ul> <li>The words: SOMETHING BIG IS COMING</li> <li>The date: 26.7.17</li> <li>The brand: ORACLE</li> </ul> <p>All set to a roaring soundtrack and a rumbling fade-out animation between slides.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-3.png" rel="lightbox[5820]"><img class="aligncenter wp-image-5821 size-full" src="http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-3.png" alt="" width="600" height="524" srcset="http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-3.png 600w, http://www.explorer.uk.com/wp-content/uploads/2017/08/image001-3-300x262.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a></p> <p><a href="https://twitter.com/OracleCloud/status/888055326515310592" target="_blank" rel="noopener noreferrer">https://twitter.com/OracleCloud/status/888055326515310592</a></p> <p>What could it be? …we debated in the Development department here at Explorer as we started a countdown timer.</p> <p>Now that APEX 5.1 is released, our “eagerly awaiting from Oracle” list (we have many lists) is down to just a couple of items.</p> <p>In second place is the prospect of a release of Oracle Express Edition 12c which we understand Oracle are “on with” with no announcement of a potential release date.</p> <p>However, in first place and top of the list is Oracle’s Free Cloud offering.</p> <p>We had everything crossed it was going to be that &#8211; and I was determined to sign up on day 1. After all, the tweet came from @OracleCloud so it would’ve been the bookies favourite.</p> <p>On 26.7.17, the announcement came and I would never have guessed; it was not the release of the Oracle free cloud offering, but instead was a 38-second video announcing the partnership between</p> <p>Oracle and Bloodhound SSC. Ah ha &#8211; the clues in the earlier video all make sense now.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2017/08/image002-2.png" rel="lightbox[5820]"><img class="aligncenter wp-image-5822 size-full" src="http://www.explorer.uk.com/wp-content/uploads/2017/08/image002-2.png" alt="" width="606" height="594" srcset="http://www.explorer.uk.com/wp-content/uploads/2017/08/image002-2.png 606w, http://www.explorer.uk.com/wp-content/uploads/2017/08/image002-2-300x294.png 300w" sizes="(max-width: 606px) 100vw, 606px" /></a></p> <p>For those of your unfamiliar with Bloodhound SSC; it is a UK project to build a jet and rocket powered car that will break the 1000mph barrier and set a new world land speed record with first runs set for October. The current world record of 763mph is held by ThrustSSC, which I actually saw paraded through the streets of Coventry on its way to its final destination at the Coventry Transport Museum in 2001.</p> <p>After reading more on the <a href="http://www.bloodhoundssc.com/news/bloodhound-land-speed-record-project-inspires-global-uptake-stem-subjects-and-races-towards" target="_blank" rel="noopener noreferrer">Bloodhound SSC website</a>, the partnership with Oracle Cloud is really interesting when it comes to monitoring of the cars performance.</p> <p><em>“Oracle will provide technology to help Bloodhound collect, analyse and broadcast data from more than 500 sensors installed on the Bloodhound SSC (Super Sonic Car) to classrooms around the world.”</em></p> <p>For us this is an interesting prospect and we would love to see the data in a tool like <a href="https://www.oracle.com/solutions/business-analytics/data-visualization.html" target="_blank" rel="noopener noreferrer">Oracle Data Visualization</a>, <a href="http://www.oracle.com/webfolder/technetwork/jet/index.html" target="_blank" rel="noopener noreferrer">Oracle JET Charts</a> or even in an <a href="https://apex.oracle.com/" target="_blank" rel="noopener noreferrer">APEX</a> Dashboard &#8211; an Interactive Grid would be ideal for representing and charting the data.</p> <p>As a department, we have previously looked at similar projects. We have downloaded data from the SpaceX projects &#8211; plotting data of altitude against velocity to track the take-off and return of their recyclable rocket. This used an Oracle APEX application using a Jet Chart region. In another scenario, <a href="https://twitter.com/CSykes_Dev" target="_blank" rel="noopener noreferrer">Craig</a> has also created APEX applications to manage weather data sourced from Raspberry Pi powered weather stations located at schools around the UK. More on this and I.o.T on his presentation <a href="http://www.explorer.uk.com/apex-meet-rest-web/" target="_blank" rel="noopener noreferrer">here</a>.</p> <p>Still &#8211; we await the free cloud offering from Oracle. So why are we so excited about it? Details are thin but from what we hear, we are expecting:</p> <ul> <li>Sign up &amp; use for free</li> <li>Suitable for production use</li> <li>Upgrade if you need more processing power/data storage</li> <li>Runs APEX 5.1</li> <li>APEX Application Store (think Google Play for APEX) where you can download applications in to your workspace or upload your own.</li> </ul> <p>A free, production ready, cloud service really is a game-changer; so you can see why we are all so excited.</p> <p>We have already started to brainstorm many ideas to get the most out of it when it arrives. There is lots of potential and we have many exciting ideas.<br /> The obvious use for the Oracle Cloud service is moving your infrastructure to the Cloud. Have you considered it for your business? Even without the free cloud launch, many Oracle Cloud options are already available that will suit your needs. For example, Explorer have already moved Raspberry Pi and their weather station application to the Oracle Cloud.</p> <p>If you would like to find out more, please contact us for a chat on Oracle Cloud options.</p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/something-big-is-coming/">Something big is coming</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> Explorer Development UK http://www.explorer.uk.com/?p=5820 Tue Aug 08 2017 05:45:54 GMT-0400 (EDT) List of the tools I use and why I use them http://dgielis.blogspot.com/2017/08/list-of-tools-i-use-and-why-i-use-them.html This post is part of a series of posts: <a href="http://dgielis.blogspot.be/2017/08/from-idea-to-app-or-how-i-do-oracle.html">From idea to app or how I do an Oracle APEX project anno 2017</a><br /><br />I initially thought to only list the software tools I use, but tools are more than software alone. As a developer I find it important you have everything you need to be successful. For me that means a clean desk, a whiteboard, paper and some writing material (as explained in my <a href="http://dgielis.blogspot.be/2017/08/create-user-stories-and-supporting-erd.html">previous post</a>) and top notch hardware. Here's a picture of my desk:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-f50jYQju1Mg/WYjZ6Fy2KJI/AAAAAAAAItc/pNTxjhRjQVYxzvOnPw6NQqonLEdpMD5jgCLcBGAs/s1600/03i_hardware.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="480" src="https://4.bp.blogspot.com/-f50jYQju1Mg/WYjZ6Fy2KJI/AAAAAAAAItc/pNTxjhRjQVYxzvOnPw6NQqonLEdpMD5jgCLcBGAs/s640/03i_hardware.jpg" width="640" /></a></div><br />So lets move on to the software part now, but before reading further, lets start with a quote I came up with ;)<br /><br /><blockquote><span style="font-size: medium;">The tools don’t make the developer</span> - Dimitri Gielis</blockquote><br />or another quote I like a lot, sent in by <a href="https://twitter.com/luotnira">Alan Rintoul</a>:<br /><br /><blockquote><span style="font-size: medium;">The single most important component of a camera is the twelve inches behind it </span>– Ansel Adams</blockquote><br />When doing development, it's not about the tools, it's about mindset. Tools can help achieve a goal, but which tool to use depends on you and how you work with them. I love to hear what and how other people are using tools to get the job done. <a href="http://www.talkapex.com/">Martin D'Souza</a> showed in <a href="https://www.youtube.com/watch?v=mi1JlFHf-sk&amp;list=PL3S33P01ea05kaQsc16rGVbqZe-M0JOIm&amp;index=2&amp;t=2s">this podcast</a> how he works with Atom (text editor) and why you should use it. I loved the podcast, Martin is a very smart guy and good developer, but you can look at this podcast in two different ways. You can look at it and say, I'm going to use Atom now, and work with Atom the same as you did in Notepad, or you can look at the principles he explains why he went with Atom and apply it to your editor of choice (which might be Atom, Sublime or another). I recently switched to Visual Studio Code as my main editor, because for me it worked better in the job I have to do a lot (read large JSON files, work with Markdown and Git). Does it mean everybody should switch? Not at all, whatever works for you.<br /><br />So having said that, I thought it would be nice to list the (software) tools I use and order them by how frequently I use them. There're apps I use multiple times a day (daily), some I use multiple times a week (weekly) or just a few times a month (monthly). While compiling this list I also saw I still have apps installed I don't use that frequently at all. The below list contains only desktop applications I installed on my laptop, next to those programs I also use some webapps like <a href="https://www.bitbucket.org/">Bitbucket</a> and <a href="https://trello.com/">Trello</a> to name a few, but I'll cover those in future posts as part of different sections. Same applies for plugins or command line apps.<br /><br />Note: I've a Mac laptop with macOS, so the below applications might not exist for Windows.<br /><h2>Daily</h2><ul><li><strong><a href="https://support.apple.com/mail">Mail</a></strong>: for my emails I use Mail that is included in OSX. I also use <a href="https://www.google.com/gmail/">Google Mail</a> for other mailboxes.</li><li><strong><a href="https://www.apple.com/safari/">Safari</a> (<a href="https://www.google.com/chrome/index.html">Chrome</a>, <a href="https://www.mozilla.org/nl/firefox/new/">Firefox</a>)</strong>: I typically develop in Safari or Chrome. Safari is a bit more battery friendly, but Chrome has beter developer tools and plugins. Firefox I use when I need just another browser to see if something behaves the same.</li><li><strong><a href="https://code.visualstudio.com/">Visual Studio Code</a></strong>: My favorite editor, I plan to do a quick video how I work with Visual Studio Code and will update this post when done <a href="https://www.blogger.com/blogger.g?blogID=21122514#">placeholder for video</a></li><li><strong><a href="https://apex.oracle.com/">Oracle APEX</a></strong>: the obvious development tool of choice :) (technically not a desktop app, but belongs here anyway)</li><li><strong><a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html">SQL Developer</a></strong>: My favorite editor to have a window in my Oracle databases. I plan to record a quick video how I work with SQL Developer and will update this post when done <a href="https://www.blogger.com/blogger.g?blogID=21122514#">placeholder for video</a></li><li><strong><a href="https://tapbots.com/tweetbot/mac/">TweetBot</a></strong>: a few times a day I check <a href="https://twitter.com/dgielis">my Twitter account</a> or the news of <a href="https://twitter.com/search?q=%23orclapex&amp;src=tyah">#orclapex</a></li><li><strong><a href="https://slack.com/">Slack</a></strong>: at my company or with friends we use Slack to communicate with each other when we are remote. There's also an <a href="https://apex.world/">orclapex team</a> where many people of the Oracle APEX community are in</li><li><strong><a href="https://1password.com/">1Password</a></strong>: with this little tool I can have all different and secure passwords, accessible with a click</li><li><strong><a href="https://www.dropbox.com/">Dropbox</a>, <a href="https://www.google.be/drive">Google Drive</a>, <a href="https://www.icloud.com/">iCloud</a></strong>: most important documents are in the cloud with one of those services</li><li><strong><a href="https://www.pushbullet.com/">Pushbullet</a></strong>: sents me notifications of the server on all my devices</li></ul><h2>Weekly</h2><ul><li><strong><a href="https://iterm2.com/">iTerm2</a></strong>: my window to the server or whenever I need a terminal</li><li><strong><a href="https://www.sourcetreeapp.com/">SourceTree</a></strong> (Git): here I've all my connections to Git repositories and I can quickly see when and what was changed</li><li><strong><a href="http://www.oracle.com/technetwork/developer-tools/sqlcl/overview/index.html">SQLcl</a></strong>: mostly used when I want to run scripts, or used behind the scenes with automation</li><li><strong><a href="https://nodejs.org/en/">Node.js</a></strong>: mostly used by other programs like Visual Studio Code or <a href="https://www.apexofficeprint.com/">APEX Office Print</a> during development</li><li><strong><a href="https://gulpjs.com/">Gulp</a></strong>: I use it to automate some things, for example when I save a Markdown file in Visual Studio Code it will automatically build an html file for me</li><li><strong><a href="https://www.vmware.com/">VMware</a></strong>: when I need to have a Windows machine or want to test something in my <a href="https://github.com/OraOpenSource/OXAR">OXAR</a> VM</li><li><strong><a href="https://www.microsoft.com/BE/Office-365%E2%80%8E">MS Office 365</a>: Word, Excel, Powerpoint</strong>: I use to create or edit documents for example with track changes or I'm using it to create templates for APEX Office Print</li><li><strong><a href="https://www.gotomeeting.com/">GotoMeeting</a>, Skype, Zoom, Webex, TeamViewer, Google</strong>: when connecting to customers, friends, we use any of those meeting tools</li><li><strong><a href="https://manytricks.com/moom/">Moom</a></strong>: a little window manager for OSX, which allows me to quickly see two windows next to each other</li></ul><h2>Monthly</h2><ul><li><strong><a href="https://www.apple.com/keynote/">Keynote</a></strong>: to build or deliver my presentations</li><li><strong><a href="https://www.docker.com/">Docker</a></strong>: to quickly get a <a href="https://github.com/Dani3lSun/docker-db-apex-dev">test system</a> or software up and running</li><li><strong><a href="https://www.cockos.com/licecap/">LICEcap</a></strong>: to create animated gifs</li><li><strong><a href="https://www.telestream.net/screenflow/">Screenflow</a></strong>: to create videos</li><li><strong><a href="https://panic.com/transmit/">Transmit</a></strong>: to transfer files to another system</li></ul><h2>Installed, but not using that often</h2><ul><li><strong><a href="https://textexpander.com/">TextExpander</a></strong>: snippets manager, this one I actually plan to use more</li><li><strong><a href="https://developer.apple.com/xcode/">XCode</a></strong>: used when building native iOS apps or compiling Cordova apps</li><li><strong><a href="https://www.virtualbox.org/">VirtualBox</a></strong>: when testing <a href="http://www.oracle.com/technetwork/community/developer-vm/index.html">Oracle Developer VMs</a></li><li><strong><a href="https://paw.cloud/">Paw</a></strong>: a REST manager, but I'm using Visual Studio Code plugin for that now</li><li><strong><a href="https://theunarchiver.com/">The Unarchiver</a></strong>: when getting files from customers to unpack them</li><li><strong><a href="https://winmail.help/letter-opener-for-macos-mail/download">Letter Opener for macOS Mail</a></strong>: some people send windows mails, without this tool I can't read it on OSX</li><li><strong><a href="https://www.duetdisplay.com/nl/">Duet</a></strong>: enables my iPad as second screen, only used when travelling</li><li><strong><a href="https://www.kaleidoscopeapp.com/">Kaleidoscope</a></strong>: to compare two files (if they are not in Git)</li><li><strong><a href="https://app.classeur.io/#!/">Classeur</a></strong>: used when writing in Markdown for my Blog, but replaced it with Visual Studio Code</li><li><strong><a href="https://www.barebones.com/products/bbedit/">BBEdit</a>, <a href="https://atom.io/">Atom</a>, <a href="https://www.sublimetext.com/">Sublime Text</a></strong>: replaced with Visual Studio Code</li><li><strong><a href="https://www.omnigroup.com/omniplan">OmniPlan</a></strong>: used for planning</li><li><strong><a href="https://itunes.apple.com/us/app/patterns-the-regex-app/id429449079?mt=12">Patterns</a></strong>: to try regular expressions</li><li><strong><a href="https://macdown.uranusjr.com/">MacDown</a></strong>: used to create Markdown files, for example most of the AOP documentation was written in here, but using Visual Studio Code now</li><li><strong><a href="https://www.libreoffice.org/">LibreOffice</a></strong>: used in combination with AOP</li><li><strong><a href="https://www.apple.com/pages/">Pages</a>, <a href="https://www.apple.com/numbers/">Numbers</a></strong>: to exchange or read older files I wrote in Pages or Numbers</li><li><strong><a href="https://mjml.io/">MJML</a></strong>: to write responsive emails</li></ul>The above are just some tools that help me doing my job. Over time I changed tools and will most likely use others in the future. So depending when you read this (after 2017) things might have changed.<br /><br />Feel free to share your favorite tools in the comments section. Dimitri Gielis tag:blogger.com,1999:blog-21122514.post-5958994980561813550 Mon Aug 07 2017 17:33:00 GMT-0400 (EDT) Moving to the Cloud: A Developer’s Perspective http://www.explorer.uk.com/moving-to-the-cloud-a-developers-perspective/ <p>I have been recently working with a charity who had developed a production APEX application and hosted it on <a href="https://apex.oracle.com/en/" target="_blank" rel="noopener noreferrer">apex.oracle.com</a>. While this environment is brilliant for quickly creating a full APEX workspace and accessing from anywhere in the world, it is definitely not supposed to be used to host a production application (the environment can be upgraded to the latest version of APEX and even taken down with no notice so no SLA is given). You also have no direct Database access and have to manage everything through the APEX development tools.</p> <p>The reason that we were contacted was that the apex.oracle.com environment had been upgraded from 4.2 to 5.0, breaking the customer’s application.  We had to fix the application hosted on apex.oracle.com, enhance the application with new features and then migrate the application and data to a new <a href="https://cloud.oracle.com/en_US/database" target="_blank" rel="noopener noreferrer">Database Cloud service</a>.</p> <p>We didn’t want to develop on the live environment, so we built a local Oracle environment to develop on and recreated the Database schema.  Migrating the application from apex.oracle.com to our local instance was easy using the in-built APEX import and export utilities, as was migrating the fixed and enhanced application back to apex.oracle.com.</p> <p>Once the application was fixed, the next piece of work was to move the whole thing to an Oracle Cloud environment.  The process for getting this up and running is as easy as visiting the <a href="https://cloud.oracle.com/en_US/database/pricing" target="_blank" rel="noopener noreferrer">Oracle Cloud Website</a> and picking the plan that suits you.  Once this was provisioned, we could migrate our schema, data and application to the Cloud in exactly the same way as we did for the on-premise environment.  Nothing has changed to how the Database operates in the Cloud and there are no extra steps &#8211; we just run the Database import, use the APEX import wizard and we’re good to go. I’m not afraid to say that when I see Oracle state that it’s the same technology in the Cloud as it is on-premise I was always sceptical, but it really is true in my experience!</p> <p>We now have three environments with the application installed:</p> <ul> <li>Oracle Cloud (DBaaS) – Our production environment allowing users all over the world to log in to a single application and access their data.</li> <li>On-Premise – Our development and testing environments.</li> <li>Apex.oracle.com &#8211; where the legacy application is still running.  This will be kept online to allow any users who haven’t made the switch to the new environment to still be able to access their information.</li> </ul> <p>We are in a position where we can develop and test new features and push them out to both online environments using exactly the same method (the simple APEX application import wizard).  We can also export our cloud applications and easily import them into new on-premise test environments whenever we need to, all without any downtime. We can just as easily go the opposite direction, and migrate any new versions of the application from the on-premise development environment onto the live Cloud environment.</p> <p>As a developer I didn’t have to learn anything new to migrate to and work in the Cloud, I just changed the URL I was using to access the application builder.  The transition is seamless, and with the web based development environment that has been around in APEX for years, I’m more comfortable and confident than ever that “Cloud” is a really valuable platform for developers the world over.</p> <p>With talk of a free entry-level Oracle Cloud service possibly on the horizon and the ease of migrating APEX applications to the cloud, this could be a huge step towards wider adoption from Oracle developers for building Cloud native applications.</p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/moving-to-the-cloud-a-developers-perspective/">Moving to the Cloud: A Developer’s Perspective</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> Explorer Development UK http://www.explorer.uk.com/?p=5831 Mon Aug 07 2017 08:33:36 GMT-0400 (EDT) SQLDeveloper 4.2 problem with some bind variables values http://oraclequirks.blogspot.com/2017/08/sqldeveloper-42-problem-with-some-bind.html Byte64 tag:blogger.com,1999:blog-18037024.post-4555919329668816889 Mon Aug 07 2017 05:11:00 GMT-0400 (EDT) Create user stories and supporting ERD http://dgielis.blogspot.com/2017/08/create-user-stories-and-supporting-erd.html This post is part of a series of posts: <a href="http://dgielis.blogspot.be/2017/08/from-idea-to-app-or-how-i-do-oracle.html">From idea to app or how I do an Oracle APEX project anno 2017</a><br /><br />In the first post we defined our high level idea of our application. Now what are the real requirements? what does the app has to do? In an <a href="https://en.wikipedia.org/wiki/Agile_software_development">Agile software development</a> approach we typically create user stories to define that. We write sentences in the form of:<br /><blockquote>As a <strong>&lt; type of user &gt;</strong>, I want <strong>&lt; some goal &gt;</strong> so that <strong>&lt; some reason &gt;</strong></blockquote><h2>Goal of defining user stories</h2>The only relevant reason to write user stories is to have a discussion with the people you're building the application for. To developers those stories give an overview of what is expected before the development is started in a language that all parties understand.<br /><br />Some people might like to write a big requirements document, but for me personally I just don't like that (neither to read or to write). I really want to <strong>speak</strong> to the people I'm going to build something for, to get in their body and skin and really understand and feel their pain. If somebody gives me a very detailed requirements document, they don't give me much freedom. Most people don't even know what is technically possible or what could really help them.<br /><a href="https://3.bp.blogspot.com/-Rb1Z7DybkSw/WYgSX4EW01I/AAAAAAAAItE/z8k0QdIidIQ0vT5qDbcFiM_Y3VnyRi7cwCLcBGAs/s1600/02i_henry_ford.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="248" data-original-width="200" height="200" src="https://3.bp.blogspot.com/-Rb1Z7DybkSw/WYgSX4EW01I/AAAAAAAAItE/z8k0QdIidIQ0vT5qDbcFiM_Y3VnyRi7cwCLcBGAs/s200/02i_henry_ford.jpg" width="161" /></a><br /><br />I like this quote of Henry Ford which illustrates the above:<br /><br /><br /><blockquote class="tr_bq"><span style="font-size: medium;">If I had asked people what they wanted, they would have said faster horses.</span></blockquote><br /><br /><br /><br /><br /><br /><br />Now having said that, you have to be really careful with my statement above... it really depends the developer if you can give them freedom or not. I know many developers who are the complete opposite of me and just want you to tell them exactly what and how to build. Same applies to people who have a bright idea, they do know what would help them. I guess it comes down to, use each others strength and be open and supportive during the communication.<br /><h2>User stories for our project</h2>In our multiplication table project we will write user stories for three different types of users: the player (child), the supervisor (parent/teacher) and the administrator of the app.<br /><ul><li>As a player, I want to start a session so that I can practice<br /> </li><li>As a player, I want to practice multiplications so that I get better at multiplying<br /> </li><li>As a player, I want to see how I did so that I know if I improved, stayed the same or did worse<br /> </li><li>As a player, I want to compare myself to other people so that I get a feeling of my level</li></ul><ul><li>As a supervisor, I want to register players so that they can practice<br /> </li><li>As a supervisor, I want to start the session so that player can practice<br /> </li><li>As a supervisor, I want to choose the difficulty level so that the player gets only exercises&nbsp;based on their learning needs </li><li>As a supervisor, I want to get an overview of the players progress and achievements<br /> </li><li>As a supervisor, I want to get an overview of the players mistakes<br /> </li><li>As a supervisor, I want to print a certificate so the player feels proud of it's achievement</li></ul><ul><li>As an administrator, I want to see the people who registered for the app<br /> </li><li>As an administrator, I want to add, update and remove users so that the database can be maintained<br /> </li><li>As an administrator, I want to see statistics of the site so that I know if it's being used<br /> </li><li>As an administrator, I want to notice feedback and suggestions from the users of the app</li></ul>The above is not meant to be a static list, in contrary, whenever we think of something else, we will come back to the list and add more sentences. So far I took the role as administrator and parent, my son as child and my father as teacher to come to this list. I welcome more peoples ideas, so feel free to add more user stories in the comment field of things you think of. More info on user stories and how to write them you find <a href="https://www.mountaingoatsoftware.com/agile/user-stories">here</a>.<br /><h2>More on Agile, Scrum, Kanban, XP</h2>Before we move on with what I typically do after having discussed the requirements with the people, I want to touch on some buzz-words. I guess most companies claim they do <a href="https://en.wikipedia.org/wiki/Agile_software_development">Agile software development</a>. Most popular Agile software development frameworks are Scrum, Kanban and XP. I'm by far an expert in any of those, but for me it all comes down to make the team more efficient to deliver what is really needed.<br /><br /><a href="https://www.apexrnd.be/">My company</a> and I are not following any of <a href="https://www.testingexcellence.com/difference-between-scrum-kanban-xp-agile/">those frameworks</a> to the letter, instead we use a mix of all. We have a place where we note all the things we have to do (backlog), we developed iteratively and ship versions frequently (sprints), we have coding standards, we limit the work in progress (WIP) etc.<br /><br />When we are doing consulting or development we adapt to how the customer likes to work. It also depends a bit the size of the project and team that is in place.<br /><br />So my advice is, do whatever works best for you and your team. The only important thing at the end of the day is that you deliver (in time, on budget and what is needed) :)<br /><h2>Thinking in relational models</h2>So when I really understand the problem, my mind starts to think in an entity relational diagram or in short ERD. I don't use any tool just yet, a few pieces of paper is all I need. I start writing down words, draw circles and relations, in fact those will become my tables, columns and foreign keys later on. For me personally drawing an ERD really helps me moving to the next step of seeing what data I will have and how I should structure it. I read the user stories one by one and see if I have a table for the data to build the story. I write down the ideas, comments and questions that pop-up and put it on a cleaner piece of paper. This paper is again food for discussion with the end-users.<br /><br />Here are the papers for the multiplication table project:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-yL7XgoeGSa8/WYgSX1WFRkI/AAAAAAAAItM/FrpMMHvXsCwEfMCiCOyQe4buSvHirWRhwCLcBGAs/s1600/02i_multiplication_table_erd1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="480" src="https://3.bp.blogspot.com/-yL7XgoeGSa8/WYgSX1WFRkI/AAAAAAAAItM/FrpMMHvXsCwEfMCiCOyQe4buSvHirWRhwCLcBGAs/s640/02i_multiplication_table_erd1.JPG" width="640" /></a></div><br />Our ERD is not that complicated I would say; we basically need a table to store the <strong>users</strong> who will connect to the site/app. I believe in first instance it will most likely be parents or teachers who are interested in this app. Every user has the "user" role, but some will have the administrator role, so the app can be managed. We could also use a flag in the user table to specify who's an admin, but I like to have a separate table for <strong>roles</strong> as it's more flexible, for example if we wanted to make a difference between a teacher and parent in the future. Once you are in the app you create some <strong>players</strong>, most likely your children. Those players will play <strong>games</strong> and every game consists out of some details, for example which multiplication they did.<br /><br />While reading the user stories, we also want some rankings. In the above ERD I could create the players own ranking, or the ranking of the players of a user (supervisor), but it's not that flexible. That is why I added the concept of <strong>teams</strong>. A player can belong to one or more teams, so I could create a specific team where my son and I belong too, so we can see each others rank in that team, but I can also create a team of friends. The team concept makes it even flexible for teachers, so they can create their classes and add players to a specific class.<br /><br />I also added a note that instead of a custom username/password, it might be interesting to add a social login like Facebook, just so the app is even easier to be accessed. As I know in Oracle APEX 5.2 social authentication will be included, I will hold off to build it myself for now, but plan to upgrade our authentication scheme once Oracle APEX 5.2 comes out.<br /><br />So my revised version of the ERD looks like this:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-I04ZvcNAKxQ/WYgSX4EvNJI/AAAAAAAAItI/pSIYt9LXhOQ0R6sWkZoENGfwdDg5Qxi2QCLcBGAs/s1600/02i_multiplication_table_erd2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="480" src="https://4.bp.blogspot.com/-I04ZvcNAKxQ/WYgSX4EvNJI/AAAAAAAAItI/pSIYt9LXhOQ0R6sWkZoENGfwdDg5Qxi2QCLcBGAs/s640/02i_multiplication_table_erd2.JPG" width="640" /></a></div><br />I hope this already gives some insight in the first steps I do when starting a project.<br /><br />In the above post I didn't really go into the tools to support the Agile software development (as I didn't use it yet), that is for another post.<br /><br />If you have questions, comments or want to share your thoughts, don't hesitate to put a comment to this post. Dimitri Gielis tag:blogger.com,1999:blog-21122514.post-4496850456356244289 Mon Aug 07 2017 03:19:00 GMT-0400 (EDT) APEX Login Background Image Cover http://www.grassroots-oracle.com/2017/08/apex-login-background-image-cover.html For a while I've wanted to play with cover photos on login pages, and when <a href="https://twitter.com/keeganwalker_/status/888055494472028160" target="_blank">Keegan asked a similar question on Twitter</a>, I was curious enough to ultimately have a play.<br /><br />Someone mentioned relevant a reference to CSS-Tricks <a href="https://css-tricks.com/perfect-full-page-background-image/" target="_blank">Perfect Full Page Background Image</a>, but after quickly <a href="https://www.youtube.com/watch?v=cPoGrqv4JYQ" target="_blank">finding the video</a> Keegan must have screenshotted in her tweet, I realised us APEX developers need to use the following instead of 'html' as our <a href="http://www.grassroots-oracle.com/2016/03/about-css-selectors.html" target="_blank">selector</a>.<br /><code>.t-PageBody--login .t-Body</code><br /><br />Plugin extraordinaire <a href="https://github.com/Dani3lSun" target="_blank">Daniel</a> suggests<br /><blockquote class="tr_bq">using 16:9 1920x1080 for standard UT use css media queries for different screen sizes with a pool of 2 / 3 images</blockquote>The example I applied uses a CSS media query to <i>not </i>use a background image for smaller screens, as it may look too busy.<br /><pre style="brush: css;">&lt;style&gt;<br />@media (min-width:400px) &nbsp;{ /* anything but mobile */<br />&nbsp; .t-PageBody--login .t-Body {<br />&nbsp; &nbsp; background: url(#IMAGE_PREFIX#cover_images/&amp;P101_IMAGE.) no-repeat center center fixed;<br />&nbsp; &nbsp; -webkit-background-size: cover;<br />&nbsp; &nbsp; -moz-background-size: cover;<br />&nbsp; &nbsp; -o-background-size: cover;<br />&nbsp; &nbsp; background-size: cover;<br />&nbsp; }<br />}<br />&lt;/style&gt;</pre>I defined this CSS within a region so I could apply a 'dev only' <a href="http://www.grassroots-oracle.com/2010/06/oracle-apex-build-options.html" target="_blank">build option</a>.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-1Wf8Ag4xph4/WYe2kNgylAI/AAAAAAAARHk/IPsZxkybhVo0Wesu-xOLzPCzvnReNqTbQCLcBGAs/s1600/space_region.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="512" data-original-width="318" src="https://3.bp.blogspot.com/-1Wf8Ag4xph4/WYe2kNgylAI/AAAAAAAARHk/IPsZxkybhVo0Wesu-xOLzPCzvnReNqTbQCLcBGAs/s1600/space_region.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Style within Region</td></tr></tbody></table>This also means the image location and file name are easily parameterised. So your images could be located anywhere, and you could programmatically decide which image to display. And/or use <a href="http://cssmediaqueries.com/" target="_blank">media queries</a> to determine which image should display on the relevant device.<br /><br />As an experiment, I wondered if I could rotate through a number of images, so each time someone visited the login page, they would see one image from a pool of many. So I defined an item with the following calculation:<br /><code>'beauty'||floor(dbms_random.value(1,8))||'.jpg'</code><br /><br />We can confirm an evenly distributed calculation by running that computation many times and counting the results.<br /><pre class="brush:sql">select count(*), val from (<br />&nbsp; select floor(dbms_random.value(1,8)) val<br />&nbsp; from dual connect by level &lt; 10000<br />) group by val<br /><br />COUNT(*) VAL<br />1413 1<br />1445 6<br />1412 2<br />1420 5<br />1411 4<br />1415 3<br />1483 7</pre>This would randomly select from a small suite of photos in the folder. I've used a selection I've collected from <a href="http://apod.nasa.gov/" target="_blank">APOD</a>.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-TPZHkvVTsco/WYe2kPhXSjI/AAAAAAAARHg/z16B6JSh3RYoR0TVBD3cVOz7BsCLUWv1gCLcBGAs/s1600/space_files.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="183" data-original-width="155" src="https://4.bp.blogspot.com/-TPZHkvVTsco/WYe2kPhXSjI/AAAAAAAARHg/z16B6JSh3RYoR0TVBD3cVOz7BsCLUWv1gCLcBGAs/s1600/space_files.png" /></a></div><br />And voila, an inspirational login page.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-QY4VLXRu19w/WYe2krYj_5I/AAAAAAAARHo/kOW3JrpZL3MsxfIluXXy-yLVMhA0eCahQCLcBGAs/s1600/space_login.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="625" data-original-width="797" height="313" src="https://1.bp.blogspot.com/-QY4VLXRu19w/WYe2krYj_5I/AAAAAAAARHo/kOW3JrpZL3MsxfIluXXy-yLVMhA0eCahQCLcBGAs/s400/space_login.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">APEX Login with background cover image</td></tr></tbody></table>I think an improvement would be to show a consistent image while attempting to login. A brief experiment suggests only running the computation when P101_IMAGE is null, and only clearing login fields (not the entire page cache) during page processing.<br /><br />This could be the final bling you need after <a href="http://dgielis.blogspot.com.au/2015/03/apex-50-pimping-login-page.html" target="_blank">pimping your login page</a>.<br /><br />Don't forget, you can style the <a href="http://www.grassroots-oracle.com/2015/12/customising-apex-50-workspace-login.html" target="_blank">backend login</a>, too.<br /><br />Once again, thank you #orclapex community for making this a breeze. Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-2306381858810671679 Mon Aug 07 2017 02:41:00 GMT-0400 (EDT) On the Road With Oracle Cloud http://www.dbaexpert.com/blog/on-the-road-with-oracle-cloud/ <p>I feel like I barely made it alive this week. My crazy life started out on Sunday evening as I delivered a webinar for the New Zealand and Australia Oracle User Group on Backing Up Your Oracle Databases to the Cloud. Because the target audience was in Australia and New Zealand, my webinar was scheduled for 7PM on Sunday. Immediately next day afternoon, I delivered another presentation for Database Trends and Applications on Database Replication for Zero downtime Migrations, High Availability and Disaster Recovery presentation leveraging <a href="http://quest.com/shareplex">SharePlex</a>. I haven&#8217;t delivered a speech on SharePlex and Data Replication since 2000 at IOUG in Orlando. The turnout for this event was great!</p> <p>Next day, I flew to San Francisco to deliver the full-day Hands-On-Lab workshop on Oracle Cloud on Wednesday. This is our featured workshop that we deliver for the Oracle Cloud SIG on behalf of the <a href="http://ioug.org">IOUG &#8211; Independent Oracle Users Group</a> sponsored by the Northern California Oracle User Group. There was lot of content that had to be updated and lot of new content on Oracle Ravello Cloud and Bare Metal Cloud Services that had to be added.</p> <p>On Thursday, I delivered the keynote at the <a href="http://nocoug.org/">Northern California Oracle Users Group (NoCOUG)</a> on Why You Need to Consider Upgrading to Oracle Database 12c Release 2 (Oracle 12.2) to Securely and Easily Migrate to Oracle Cloud. This was my first time presenting for NoCOUG and the turnout was great. After my keynote, I also sat on the Expert Panel on Oracle Cloud fielding questions from the audience. </p> <p>I do not think I want to repeat a week like this again. On a positive note, I did get to meet a lot of experts from our industry. If you would like to download a copy of any or all of the presentations, please feel free to visit our V<a href="http://viscosityna.com">iscosity North America</a> website. I feel like this crazy presentation life style is becoming more and more of a norm for me these days. I do enjoy doing the research and geeking out with fellow Oracle technologists.</p> <p>Posted by Charles Kim, Oracle ACE Director</p> admin http://www.dbaexpert.com/blog/?p=1178 Sat Aug 05 2017 18:12:53 GMT-0400 (EDT) From idea to app or how I do an Oracle APEX project anno 2017 http://dgielis.blogspot.com/2017/08/from-idea-to-app-or-how-i-do-oracle.html For a long time I had in mind to write in great detail how I do an Oracle APEX project from A to Z. But so far I never took the time to actually do it, until today :)<br /><br />So here's the idea; I love building projects that help people and I love to share what I know, so I will combine both. I will write exactly my thoughts and things I do as I'm moving along with this project, so you have full insight what's happening behind the scenes.<br /><h2>Background</h2>Way back, in the year 1999, I build an application in Visual Basic to help children study the multiplication tables. My father was a math teacher and taught people who wanted to become primary school teachers. While doing the visits of the primary schools, he saw the problem that children had difficulties to automate the multiplications from 1 till 10, so together we thought about how we could help them. That is how the Visual Basic application was born. I don't have a working example anymore of the program, but I found some paper prints from that time, which you see here:<br /><br /><a href="https://1.bp.blogspot.com/-kosIFKEobyY/WYXvmxSyZ2I/AAAAAAAAIss/Rz47RlGFhDkRY2YNgNoIjwt_A5DHgcSNACLcBGAs/s1600/de_tafels_1.jpg" imageanchor="1"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://1.bp.blogspot.com/-kosIFKEobyY/WYXvmxSyZ2I/AAAAAAAAIss/Rz47RlGFhDkRY2YNgNoIjwt_A5DHgcSNACLcBGAs/s320/de_tafels_1.jpg" width="320" /></a><a href="https://4.bp.blogspot.com/-2wkrtoGfpYA/WYXvm9feHQI/AAAAAAAAIsk/VWSTq_LBmFMOT6oJcK3_XHQw6DSh7HVEwCLcBGAs/s1600/de_tafels_2.jpg" imageanchor="1"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://4.bp.blogspot.com/-2wkrtoGfpYA/WYXvm9feHQI/AAAAAAAAIsk/VWSTq_LBmFMOT6oJcK3_XHQw6DSh7HVEwCLcBGAs/s320/de_tafels_2.jpg" width="320" /></a><br /><br />We are now almost 20 years later and last year my son had difficulties memorizing the multiplication tables too. I tried sitting next to him and help him out, but when things don't go as smooth as you hope... You have to stay calm and supportive, but I found it hard, especially when there are two other children crying for attention too or you had a rough day yourself... In a way I felt frustrated because I didn't know how to help further in the time I had. At some point I thought about the program I wrote way back then and decided to quickly build a web app that would allow him to train himself. And to make it more fun for him, I told him I would exercise too, so he saw it was doable :)<br /><br />At <a href="http://www.kscope16.com/">KScope16</a> I showed this web app during Open Mic Night; it was far from fancy, but it did the job.<br />Here's a quick demo:<br /><br /><a href="https://4.bp.blogspot.com/--JBUzNQ9om4/WYXvm0tww_I/AAAAAAAAIso/IfHqvVZINysq8n5HP_4S3u7MEOjIuSflACLcBGAs/s1600/multiplication_tables_2016.gif" imageanchor="1"><img border="0" data-original-height="455" data-original-width="586" src="https://4.bp.blogspot.com/--JBUzNQ9om4/WYXvm0tww_I/AAAAAAAAIso/IfHqvVZINysq8n5HP_4S3u7MEOjIuSflACLcBGAs/s1600/multiplication_tables_2016.gif" /></a><br /><br />Some people recognized my story and asked if I could put the app online. I just build the app quickly for my son, so it needs some more work to make it accessible for others.<br />During my holidays, I decided I should really treat this project as a real one, otherwise it would never happen, so here we are, that is what I'm going to do and I'll write about it in detail :)<br /><h2>Idea - our requirement</h2>The application helps children (typically between 7 and 11 years old) to automate multiplications between 1 and 10. It also helps their parents to get insight in timings and mistakes of their children's multiplications.<br /><h2>Timeline</h2>No project without deadline, so I've set my go-production date to August 20th, 2017. So I've about 2 weeks, typically one sprint in <a href="https://www.apexrnd.be/">our</a> projects.<br /><h2>Following along and feedback</h2>I will <a href="https://twitter.com/dgielis">tweet</a>, <a href="https://dgielis.blogspot.com/">blog</a> and create some <a href="https://www.youtube.com/user/dgielis">videos</a> to show my progress. You can follow along and reach me on any of those channels. If you have any questions, tips or remarks during the development, don't hesitate to add a comment. I always welcome new ideas or insights and am happy to go in more detail if something is not clear.<br /><h2>High level break-down of plan for the following days</h2><ul><li><a href="http://dgielis.blogspot.be/2017/08/create-user-stories-and-supporting-erd.html">Create user stories and supporting ERD</a><br /> </li><li><a href="http://dgielis.blogspot.be/2017/08/list-of-tools-i-use-and-why-i-use-them.html">List of the tools I use and why I use them</a><br /> </li><li><a href="http://dgielis.blogspot.be/2017/08/set-up-apex-development-environment.html">Set up the development environment</a><br /> </li><li><a href="http://dgielis.blogspot.be/2017/08/create-oracle-database-objects.html">Create the Oracle database objects</a><br /> </li><li><a href="http://dgielis.blogspot.be/2017/08/set-up-domain-and-launch-page.html">Set up a domain name</a><br /> </li><li>Set up reverse proxy and https<br /> </li><li><a href="http://dgielis.blogspot.be/2017/08/set-up-domain-and-launch-page.html">Create a landing page and communicate</a><br /> </li><li><a href="http://dgielis.blogspot.be/2017/08/build-oracle-apex-application-framework.html">Build the Oracle APEX application: the framework</a><br /> </li><li>Refine the APEX app: create custom authentication<br /> </li><li>Refine the APEX app: adding the game<br /> </li><li>Refine the APEX app: improve the flow and navigation<br /> </li><li>Refine the APEX app: add ability to print results to PDF<br /> </li><li>Set up build process<br /> </li><li>Check security<br /> </li><li>Communicate first version of the app to registered people<br /> </li><li>Check performance<br /> </li><li>Refine the APEX app: add more reports and statistics<br /> </li><li>Check and reply to feedback<br /> </li><li>Set up automated testing<br /> </li><li>A word on debugging<br /> </li><li>Refine the APEX app: making final changes<br /> </li><li>Set up backups<br /> </li><li>Verify documentation and lessons learned<br /> </li><li>Close the loop and Celebrate :)<br /> </li></ul><div>So now, let's get started ...</div> Dimitri Gielis tag:blogger.com,1999:blog-21122514.post-8604531865314560898 Sat Aug 05 2017 12:30:00 GMT-0400 (EDT) How to debug/trace APEX session http://apexbyg.blogspot.com/2017/08/how-to-debugtrace-apex-session.html <div dir="ltr" style="text-align: left;" trbidi="on">In most cases you don't have access to production environment and reproducing of a production bug can be a real problem.<br /><br />If you don't use <a href="http://www.oraopensource.com/logger/" target="_blank">logger</a>&nbsp;(which I strongly recommend) or you don't have a <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/managing-feedback.htm#HTMDB28140" target="_blank">feedback page</a>&nbsp;you can always use APEX's native debugging tool.<br /><br />There's a easy way to use native <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/utilizing-debug-mode.htm#HTMDB10003" target="_blank">APEX debu</a>g&nbsp;and you can turn it on:<br /><ul style="text-align: left;"><li>with 5th&nbsp;<a href="http://docs.oracle.com/database/apex-5.1/HTMDB/utilizing-debug-mode.htm#HTMDB30195" target="_blank">URL parameter</a>&nbsp;that can be set to YES or to some value between LEVEL0 to LEVEL9 (there's no LEVEL3 and LEVEL7). YES equals LEVEL4 (more on debug levels <a href="http://apexbyg.blogspot.hr/2013/02/apex-debug-levels.html" target="_blank">here</a> and <a href="http://docs.oracle.com/database/apex-5.1/AEAPI/Constants-2.htm#AEAPI29184" target="_blank">here</a>). You can use this only for applications that have debugging property turned on (under application properties).&nbsp;</li><li>programatically with <a href="http://docs.oracle.com/database/apex-5.1/AEAPI/APEX_DEBUG.htm#AEAPI29182" target="_blank">apex_debug</a> package.</li></ul><div>But on production environment you probably want to track a specific user session. To turn it on for specific user session you can use <a href="http://docs.oracle.com/database/apex-5.1/AEAPI/SET_DEBUG-Procedure.htm#AEAPI-GUID-9E5FC479-1B37-4B77-B992-E82720CB95FE" target="_blank">apex_session</a> package (new from APEX 5.1).</div><div><br /></div><div>To find out what session you want to track you can ask your end user to read you a third parameter in URL (don't do that 🙂) right after application and page id or you can track it yourself by querying APEX dictionary view apex_wokspace_sessions:</div><div><div><pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, &quot;lucida console&quot;, &quot;liberation mono&quot;, &quot;dejavu sans mono&quot;, &quot;bitstream vera sans mono&quot;, &quot;courier new&quot;, monospace, sans-serif; font-size: 13px; margin-bottom: 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">select *<br /> from apex_workspace_sessions <br /> where workspace_name = &amp;WORKSPACE_NAME <br /> and user_name = &amp;USERNAME;</pre></div><div style="margin: 0px;">After that you can call apex_session.set_debug to turn on debugging for this specific user session:</div></div><div><br /></div><div><div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><pre class="lang-js prettyprint prettyprinted" style="background-color: #eff0f1; border: 0px; color: #393318; font-family: consolas, menlo, monaco, &quot;lucida console&quot;, &quot;liberation mono&quot;, &quot;dejavu sans mono&quot;, &quot;bitstream vera sans mono&quot;, &quot;courier new&quot;, monospace, sans-serif; font-size: 13px; margin: 0px 0px 1em; max-height: 600px; overflow: auto; padding: 5px; width: auto; word-wrap: normal;">begin <br /> apex_session.set_debug(p_session_id =&gt; &amp;SESSION, p_level =&gt; 4); <br /> commit; <br />end;<br />/</pre></div></div><div>Other solution is to use APEX builder (if you have access). To turn it on in APEX builder go to the Monitor Activity &gt; Active Sessions find the session and change session attribute Debug Level</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-Uj8uKwiMiKE/WYQvDtt2DeI/AAAAAAAAElU/_1Acu8j29lMmHEiLW-wv5qR8bMnzR9B3QCLcBGAs/s1600/Screen%2BShot%2B2017-08-04%2Bat%2B10.23.20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="812" data-original-width="934" height="347" src="https://2.bp.blogspot.com/-Uj8uKwiMiKE/WYQvDtt2DeI/AAAAAAAAElU/_1Acu8j29lMmHEiLW-wv5qR8bMnzR9B3QCLcBGAs/s400/Screen%2BShot%2B2017-08-04%2Bat%2B10.23.20.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Then you can ask your end user to try to reproduce an application bug and after that you can query apex_debug_messages dictionary view to check for errors or you can use APEX Builder to do the same (Application &gt; Utilities &gt; Debug Messages).</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">You can use same package (apex_session) to turn on SQL tracing (procedure set_trace). Tracing can be turned on also with <a href="http://docs.oracle.com/database/apex-5.1/HTMDB/enabling-sql-tracing-and-using-tkprof.htm#HTMDB10004" target="_blank">URL parameter</a>.&nbsp;</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div>Enjoy!</div><div><br /></div><div><i style="background-color: white; color: #666666; font-family: &quot;trebuchet ms&quot;, trebuchet, verdana, sans-serif; font-size: 13.2px;">Tested on APEX&nbsp;5.1.2.00.09</i></div></div> Marko Gorički tag:blogger.com,1999:blog-1003209687173038896.post-4631088484934417455 Fri Aug 04 2017 04:44:00 GMT-0400 (EDT) ODTUG Kscope17 Social Media Lounge Interviews http://www.kscope18.odtug.com/p/bl/et/blogaid=740&source=1 ODTUG Kscope17 Social Media Lounge interview videos are now live on the ODTUG YouTube! Read the short recaps and watch the interviews with ODTUG Kscope17 Conference Committee Members, ODTUG Board Members, Oracle Professionals, Oracle ACEs, ACEd, ACE Associates, and ACE Alumni. ODTUG http://www.kscope18.odtug.com/p/bl/et/blogaid=740&source=1 Thu Aug 03 2017 14:07:33 GMT-0400 (EDT) ODTUG Kscope17 Social Media Lounge Interviews http://www.odtug.com/p/bl/et/blogaid=740&source=1 ODTUG Kscope17 Social Media Lounge interview videos are now live on the ODTUG YouTube! Read the short recaps and watch the interviews with ODTUG Kscope17 Conference Committee Members, ODTUG Board Members, Oracle Professionals, Oracle ACEs, ACEd, ACE Associates, and ACE Alumni. ODTUG http://www.odtug.com/p/bl/et/blogaid=740&source=1 Thu Aug 03 2017 14:07:33 GMT-0400 (EDT) Apex Reports: One Link, Multiple Destinations https://jeffkemponoracle.com/2017/08/02/apex-reports-one-link-multiple-destinations/ <p>Every Interactive Report has an optional set of &#8220;Link&#8221; attributes that allow you to specify the location where the user should be redirected if they click a link next to a record in the report. You can choose &#8220;Link to Custom Target&#8221; and use the Link Builder to easily specify the target application, page, item values to pass, and other attributes.</p> <p><img data-attachment-id="4022" data-permalink="https://jeffkemponoracle.com/2017/08/02/apex-reports-one-link-multiple-destinations/linkbuilder1/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder1.png?w=1108" data-orig-size="521,506" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="linkbuilder1" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder1.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder1.png?w=1108?w=521" class="alignnone size-full wp-image-4022" src="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder1.png?w=1108" alt="linkbuilder1" srcset="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder1.png 521w, https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder1.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder1.png?w=300 300w" sizes="(max-width: 521px) 100vw, 521px" /></p> <p>What if the report combines different entities, and you need to direct the user to a different page depending on the type of entity? Or, if you need to direct the user to a different page with different attributes depending on the status of the record?</p> <p>One method is to generate the URL in the report query using <code>apex_page.get_url</code> (Apex 5+) or <code>apex_util.prepare_url</code> (Apex 4 or earlier), or (God forbid) you could generate the url yourself using string concatenation.</p> <p>A more <em>declarative</em> solution is to instead use Apex page redirects. This solution involves the following:</p> <ol> <li>Add some hidden items to the page to store the parameters for each target page;</li> <li>Add a Branch to the page for each target page; and</li> <li>Add a Request to the link to signal the page that a redirect has been requested.</li> </ol> <p>Here&#8217;s an example. My page 550 has an interactive report which combines TI records with TRQ records (both of which have a very similar structure). If the user clicks on a TI record they should be redirected to p510 with the corresponding TI_ID, and if they click on a TRQ record they should be redirected to p305 with the corresponding TRQ_ID.</p> <p>Here&#8217;s the link attributes for this report:</p> <p><img data-attachment-id="4042" data-permalink="https://jeffkemponoracle.com/2017/08/02/apex-reports-one-link-multiple-destinations/linkbuilder2/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder2.png?w=1108" data-orig-size="522,514" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="linkbuilder2" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder2.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder2.png?w=1108?w=522" class="alignnone size-full wp-image-4042" src="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder2.png?w=1108" alt="linkbuilder2" srcset="https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder2.png 522w, https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder2.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2017/08/linkbuilder2.png?w=300 300w" sizes="(max-width: 522px) 100vw, 522px" /></p> <p>Notice that the page now <strong>redirects back to itself</strong> with the request set to &#8220;GOTO_TARGET&#8221;, along with the IDs required. My report query has been constructed so that every record will only have a TI_ID or a TRQ_ID, never both at the same time; so the link will ensure that only one of the <code>P550_GOTO_xxx_ID</code> values will be set.</p> <p>The page then just needs two Branches: one for each target. Conditions on each branch ensures they only get activated if the request has been set, and the branch is selected based on which &#8220;GOTO ID&#8221; item has been set:</p> <p><img data-attachment-id="4049" data-permalink="https://jeffkemponoracle.com/2017/08/02/apex-reports-one-link-multiple-destinations/branch1/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/08/branch1.png?w=1108" data-orig-size="660,440" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="branch1" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/08/branch1.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/08/branch1.png?w=1108?w=660" class="alignnone size-full wp-image-4049" src="https://jeffkemponoracle.files.wordpress.com/2017/08/branch1.png?w=1108" alt="branch1" srcset="https://jeffkemponoracle.files.wordpress.com/2017/08/branch1.png 660w, https://jeffkemponoracle.files.wordpress.com/2017/08/branch1.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2017/08/branch1.png?w=300 300w" sizes="(max-width: 660px) 100vw, 660px" /></p> <p><img data-attachment-id="4050" data-permalink="https://jeffkemponoracle.com/2017/08/02/apex-reports-one-link-multiple-destinations/branch2/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/08/branch2.png?w=1108" data-orig-size="658,408" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="branch2" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/08/branch2.png?w=1108?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/08/branch2.png?w=1108?w=658" class="alignnone size-full wp-image-4050" src="https://jeffkemponoracle.files.wordpress.com/2017/08/branch2.png?w=1108" alt="branch2" srcset="https://jeffkemponoracle.files.wordpress.com/2017/08/branch2.png 658w, https://jeffkemponoracle.files.wordpress.com/2017/08/branch2.png?w=150 150w, https://jeffkemponoracle.files.wordpress.com/2017/08/branch2.png?w=300 300w" sizes="(max-width: 658px) 100vw, 658px" /></p> <p>For a normal navigation to this report (e.g. from another page), the request should be blank (or some other value) so none of the Branches should be triggered.</p> <p>For a relatively simple scenario like this, I like the declarative approach. Each branch can take advantage of the full range of Apex features such as the link builder, security conditions, build options, etc.</p> <p>Note: this method works just as well for Classic report links as well.</p> <p>The thing to be mindful of is that the <strong>order of the branches</strong>, and the <strong>condition</strong> on each branch, must be carefully selected so that the correct branch is activated in each situation. I&#8217;ve shown a simple example which works because I have ensured that only one of the ID parameters is set at the same time. If a record has both IDs, the condition on the first branch &#8220;GOTO_TARGET (TI_ID)&#8221; will evaluate to True and it will be used, regardless of what GOTO_TRQ_ID was set to.</p> <p>If there were numerous potential destination pages, with a large number of parameters to pass, I might choose the <code>apex_page.get_url</code> method instead.</p> <p><strong>Related</strong></p> <ul> <li><a href="http://docs.oracle.com/database/apex-5.1/AEAPI/GET_URL-Function.htm#AEAPI30190">APEX_PAGE.get_url</a></li> </ul><br />Filed under: <a href='https://jeffkemponoracle.com/category/oracle/apex/'>APEX</a> Tagged: <a href='https://jeffkemponoracle.com/tag/apex/'>APEX</a>, <a href='https://jeffkemponoracle.com/tag/tips-tricks/'>tips-&amp;-tricks</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffkemponoracle.wordpress.com/4012/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffkemponoracle.wordpress.com/4012/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffkemponoracle.wordpress.com/4012/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffkemponoracle.wordpress.com/4012/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffkemponoracle.wordpress.com/4012/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffkemponoracle.wordpress.com/4012/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffkemponoracle.wordpress.com/4012/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffkemponoracle.wordpress.com/4012/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffkemponoracle.wordpress.com/4012/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffkemponoracle.wordpress.com/4012/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffkemponoracle.wordpress.com/4012/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffkemponoracle.wordpress.com/4012/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffkemponoracle.wordpress.com/4012/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffkemponoracle.wordpress.com/4012/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=jeffkemponoracle.com&#038;blog=12972578&#038;post=4012&#038;subd=jeffkemponoracle&#038;ref=&#038;feed=1" width="1" height="1" /> Jeffrey Kemp http://jeffkemponoracle.com/?p=4012 Wed Aug 02 2017 02:22:33 GMT-0400 (EDT) Meet the APEX Development-Team in Frankfurt, Germany! https://blogs.oracle.com/apex/meet-the-apex-development-team-in-frankfurt%2C-germany <p>The <strong>APEX Development</strong> team is visiting Frankfurt, Germany this September to discuss the future of Oracle Application Express, and you&#39;re invited to join in!</p> <p>We welcome you to our <a href="https://apex.oracle.com/pls/apex/f?p=210717:10::::::&amp;p_lang=en">first ever APEX Day</a> &mdash; a free event where you can meet the APEX development team in person, learn about features in the current release, and hear about the future direction of APEX!</p> <p>Topics like Interactive Grid, REST Services, Universal Theme - and a lot more will be covered. Bring your questions and feature suggestions for an insightful discussion with the team. The seats for this event are limited so <a href="https://apex.oracle.com/pls/apex/f?p=210717:10::::::&amp;p_lang=en">register now</a>.</p> <img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/cbb56c79e31db6c4fc04143417f38718/bildschirmfoto_2017_08_01_um_09_14_08.png" style="width: 1000px; height: 360px;" /> Carsten Czarski https://blogs.oracle.com/apex/meet-the-apex-development-team-in-frankfurt%2C-germany Tue Aug 01 2017 03:23:39 GMT-0400 (EDT) Meet the APEX Development-Team in Frankfurt, Germany! https://blogs.oracle.com/apex/meet-the-apex-development-team-in-frankfurt%2C-germany <p>The <strong>APEX Development</strong> team is visiting Frankfurt, Germany this September to discuss the future of Oracle Application Express, and you&#39;re invited to join in!</p> <p>We welcome you to our <a href="https://apex.oracle.com/pls/apex/f?p=210717:10::::::&amp;p_lang=en">first ever APEX Day</a> &mdash; a free event where you can meet the APEX development team in person, learn about features in the current release, and hear about the future direction of APEX!</p> <p>Topics like Interactive Grid, REST Services, Universal Theme - and a lot more will be covered. Bring your questions and feature suggestions for an insightful discussion with the team. The seats for this event are limited so <a href="https://apex.oracle.com/pls/apex/f?p=210717:10::::::&amp;p_lang=en">register now</a>.</p> <img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/cbb56c79e31db6c4fc04143417f38718/bildschirmfoto_2017_08_01_um_09_14_08.png" style="width: 1000px; height: 360px;" /> Carsten Czarski https://blogs.oracle.com/apex/meet-the-apex-development-team-in-frankfurt%2C-germany Tue Aug 01 2017 03:23:39 GMT-0400 (EDT) Treffen Sie das APEX-Entwicklerteam in Frankfurt! https://blogs.oracle.com/apexcommunity_deutsch/treffen-sie-das-apex-entwicklerteam-in-frankfurt <p>Das APEX Entwicklerteam trifft sich im September in Frankfurt, um dort die k&uuml;nftige Entwicklung von Application Express zu besprechen. Und Sie k&ouml;nnen dabei sein!</p> <p>Nehmen Sie am ersten <a href="https://apex.oracle.com/pls/apex/f?p=210717:10::::::&amp;p_lang=de">APEX Day</a> teil &mdash; und nutzen Sie die Gelegenheit, die APEX-Entwickler pers&ouml;nlich zu treffen, interessante Details zur aktuellen APEX-Version zu erfahren und einen Ausblick auf k&uuml;nftige Versionen zu erhalten. Die Teilnahme ist kostenlos.</p> <p>Themen wie Interactive Grid, REST Services, Universal Theme - und viele andere stehen auf der Agenda. Und uat&uuml;rlich gibt es reichlich Gelegenheit f&uuml;r Diskussionen, Fragen und Antworten. Bringen Sie Ihre Feature Requests mit! Die Pl&auml;tze sind limitiert - <a href="https://apex.oracle.com/pls/apex/f?p=210717:10::::::&amp;p_lang=de">melden Sie sich also am besten gleich an</a>.</p> <img alt="APEX Entwicklerteam" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe4a98-b117-958129af0c39/Image/cbb56c79e31db6c4fc04143417f38718/bildschirmfoto_2017_08_01_um_09_14_08.png" style="width: 1000px; height: 360px;" /> Carsten Czarski https://blogs.oracle.com/apexcommunity_deutsch/treffen-sie-das-apex-entwicklerteam-in-frankfurt Tue Aug 01 2017 03:18:27 GMT-0400 (EDT) Spaced Out http://spendolini.blogspot.com/2017/07/spaced-out.html A while back, I wrote about how to <a href="https://spendolini.blogspot.com/2015/10/universal-theme-face-lift.html" target="_blank">give the Universal Theme a face lift</a>. &nbsp;If you follow the steps in that post, the base font for an APEX application with the Universal Theme can easily be changed. <br /><br />While that's all well and good, sometimes you only want to change the font for a report, not the entire page. &nbsp;One of the applications that I'm building contains a number of IRs based mostly on log data. &nbsp;Thus, having that data in a monospaced font would make it a whole lot easier to read.<br /><br />You can search Google Fonts for monospaced fonts by selecting only that option on the right-side menubar. &nbsp;You can also opt for the standard yet kinda boring Courier and achieve the same thing.<br /><br />To implement this in your application, follow the steps in my other post, but stop shy of the final step. &nbsp;Instead of pasting in the text that I specify, paste in the following to the Custom CSS field in Theme Roller, using the name of the font you selected for the font-family:<br /><br /><pre>.a-IRR-table tr td { font-family: Ubuntu Mono; font-size: 14px; }</pre><br />This will only apply the monospaced font to IR data. &nbsp;Save your Theme Roller changes, and now, all of your IR data should be in a monospaced font. &nbsp;If you only need this on a specific page, then instead of pasting the code to Theme Roller, simply paste it into the specific page or pages Custom CSS region. Scott tag:blogger.com,1999:blog-8449039.post-2573633923490980573 Fri Jul 28 2017 10:48:00 GMT-0400 (EDT) Using LetsEncrypt on Amazon Linux https://jeffkemponoracle.com/2017/07/28/using-letsencrypt-on-amazon-linux/ <p><img data-attachment-id="3952" data-permalink="https://jeffkemponoracle.com/2017/07/28/using-letsencrypt-on-amazon-linux/sslapex/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/07/sslapex.png" data-orig-size="808,358" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="sslapex" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/07/sslapex.png?w=300&#038;h=133" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/07/sslapex.png?w=808" class=" size-medium wp-image-3952 alignleft" src="https://jeffkemponoracle.files.wordpress.com/2017/07/sslapex.png?w=300&#038;h=133" alt="sslapex" width="300" height="133" srcset="https://jeffkemponoracle.files.wordpress.com/2017/07/sslapex.png?w=300&amp;h=133 300w, https://jeffkemponoracle.files.wordpress.com/2017/07/sslapex.png?w=600&amp;h=266 600w, https://jeffkemponoracle.files.wordpress.com/2017/07/sslapex.png?w=150&amp;h=66 150w" sizes="(max-width: 300px) 100vw, 300px" />For a number of years now I&#8217;ve been using <a href="https://letsencrypt.org/"><strong>LetsEncrypt</strong></a> to provide free SSL certificates for the Apex applications I provide. These certificates last <a href="https://letsencrypt.org/2015/11/09/why-90-days.html">for 90 days</a> and are renewed automatically by a simple script on my server.</p> <p>By the way &#8211; if you&#8217;re not already using https for your public-facing Apex applications, <a href="http://mashable.com/2011/05/31/https-web-security/#oQknSEein5q0">you</a> <a href="https://developers.google.com/web/fundamentals/security/encrypt-in-transit/why-https">should</a>, <a href="https://https.cio.gov/everything/">okay</a> &#8211; <a href="https://www.bitballoon.com/blog/2014/10/03/five-reasons-you-want-https-for-your-static-site">even if your site doesn&#8217;t have data entry</a>.</p> <p>Each LetsEncrypt certificate can cover multiple subdomains. They don&#8217;t currently support wildcard domains (e.g. <code>*.example.com</code>) but they are planning to add this next year (2018).</p> <p>To install LetsEncrypt I ran the following on my Amazon Linux instance (note &#8211; this is my web server, not my database server):</p> <pre class="brush: plain; gutter: false; title: ; notranslate"> cd /opt git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ./letsencrypt-auto -v --debug </pre> <p><em>(when prompted at the last step I typed &#8220;c&#8221; to cancel the subsequent steps)</em></p> <p>It wasn&#8217;t easy at first because I got a number of errors which I&#8217;d google (or search the community forum) and eventually find reasonable answers. I&#8217;ve had to reinstall a number of times, as the OS is patched regularly and certbot is updated from time to time.</p> <p>I use Apache to provide about a dozen virtual hosts and therefore the automated installation option didn&#8217;t work for me. Instead, I&#8217;ve got lines like these in each VirtualHost:</p> <pre class="brush: plain; gutter: false; title: ; notranslate"> &lt;VirtualHost *:443&gt; ServerName subdomain.mydomain.com ServerAlias subdomain.mydomain.com SSLEngine on SSLCertificateFile &quot;/etc/letsencrypt/live/mydomain.com/cert.pem&quot; SSLCertificateKeyFile &quot;/etc/letsencrypt/live/mydomain.com/privkey.pem&quot; SSLCertificateChainFile &quot;/etc/letsencrypt/live/mydomain.com/chain.pem&quot; ... &lt;/VirtualHost&gt; </pre> <p>To register a certificate I used the following command as root (all one line):</p> <pre class="brush: plain; gutter: false; title: ; notranslate"> /opt/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/html -d mydomain.com,www.mydomain.com,sub1.mydomain.com,sub2.mydomain.com </pre> <p>This generates all the keys and certificates and stores them locally. No private keys ever leave the server. This command is using <a href="https://en.wikipedia.org/wiki/Subject_Alternative_Name">SAN</a> to combine multiple subdomains in one certificate. I run this command again separately for each domain.</p> <p>To renew all my certificates I run the following command as root:</p> <pre class="brush: plain; gutter: false; title: ; notranslate"> /opt/letsencrypt/letsencrypt-auto renew -n --no-self-upgrade service httpd restart </pre> <p>This will automatically skip any certificates that are not yet due to expire. I&#8217;ve put the above script in a file which is run by cron on a monthly basis.</p> <pre class="brush: plain; gutter: false; title: ; notranslate"> 0 20 1 * * /path-to-script/renewall.sh </pre> <p>To get usage info on the options:</p> <pre class="brush: plain; gutter: false; title: ; notranslate"> /opt/letsencrypt/letsencrypt-auto --help </pre> <p>Since it&#8217;s free, one cannot expect support from LetsEncrypt directly if there are issues; however, there is an active LetsEncrypt <a href="https://community.letsencrypt.org/">support community</a> which can be helpful at times.</p> <p>But it&#8217;s certainly made a big difference to my bottom line, and provided a bit of peace-of-mind to my users.</p> <a href='https://jeffkemponoracle.com/2017/07/28/using-letsencrypt-on-amazon-linux/letsencrypt/'><img width="150" height="35" src="https://jeffkemponoracle.files.wordpress.com/2017/07/letsencrypt.png?w=150&#038;h=35" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://jeffkemponoracle.files.wordpress.com/2017/07/letsencrypt.png?w=150&#038;h=35 150w, https://jeffkemponoracle.files.wordpress.com/2017/07/letsencrypt.png?w=297 297w, https://jeffkemponoracle.files.wordpress.com/2017/07/letsencrypt.png?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="3949" data-permalink="https://jeffkemponoracle.com/2017/07/28/using-letsencrypt-on-amazon-linux/letsencrypt/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/07/letsencrypt.png" data-orig-size="344,81" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="letsencrypt" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/07/letsencrypt.png?w=300" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/07/letsencrypt.png?w=344" /></a> <a href='https://jeffkemponoracle.com/2017/07/28/using-letsencrypt-on-amazon-linux/certbotlogo/'><img width="150" height="54" src="https://jeffkemponoracle.files.wordpress.com/2017/07/certbotlogo.png?w=150&#038;h=54" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://jeffkemponoracle.files.wordpress.com/2017/07/certbotlogo.png?w=150&#038;h=54 150w, https://jeffkemponoracle.files.wordpress.com/2017/07/certbotlogo.png 280w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="3969" data-permalink="https://jeffkemponoracle.com/2017/07/28/using-letsencrypt-on-amazon-linux/certbotlogo/" data-orig-file="https://jeffkemponoracle.files.wordpress.com/2017/07/certbotlogo.png" data-orig-size="280,100" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="certbotlogo" data-image-description="" data-medium-file="https://jeffkemponoracle.files.wordpress.com/2017/07/certbotlogo.png?w=280" data-large-file="https://jeffkemponoracle.files.wordpress.com/2017/07/certbotlogo.png?w=280" /></a> <p><strong>Related</strong></p> <ul> <li><a href="http://dgielis.blogspot.com.au/2016/05/please-use-https-for-your-apex-apps.html">Please, use HTTPS for your APEX apps</a></li> <li><a href="https://letsencrypt.org/">Let&#8217;s Encrypt</a></li> <li><a href="https://letsencrypt.org/getting-started/">Let&#8217;s Encrypt Getting Started guide</a></li> <li><a href="https://certbot.eff.org/">Certbot</a></li> <li><a href="https://github.com/certbot/certbot">Cerbot on GitHub</a></li> </ul><br />Filed under: <a href='https://jeffkemponoracle.com/category/other/'>Other</a> Tagged: <a href='https://jeffkemponoracle.com/tag/amazon-web-services/'>amazon-web-services</a>, <a href='https://jeffkemponoracle.com/tag/letsencrypt/'>letsencrypt</a>, <a href='https://jeffkemponoracle.com/tag/server-config/'>server-config</a>, <a href='https://jeffkemponoracle.com/tag/ssl/'>SSL</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jeffkemponoracle.wordpress.com/3884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jeffkemponoracle.wordpress.com/3884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jeffkemponoracle.wordpress.com/3884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jeffkemponoracle.wordpress.com/3884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/jeffkemponoracle.wordpress.com/3884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jeffkemponoracle.wordpress.com/3884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/jeffkemponoracle.wordpress.com/3884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jeffkemponoracle.wordpress.com/3884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jeffkemponoracle.wordpress.com/3884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jeffkemponoracle.wordpress.com/3884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jeffkemponoracle.wordpress.com/3884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jeffkemponoracle.wordpress.com/3884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jeffkemponoracle.wordpress.com/3884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jeffkemponoracle.wordpress.com/3884/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=jeffkemponoracle.com&#038;blog=12972578&#038;post=3884&#038;subd=jeffkemponoracle&#038;ref=&#038;feed=1" width="1" height="1" /> Jeffrey Kemp http://jeffkemponoracle.com/?p=3884 Thu Jul 27 2017 23:00:55 GMT-0400 (EDT) Easy Dashboard using nothing but APEX, Font APEX and SQL! http://joelkallman.blogspot.com/2017/07/easy-dashboard-using-nothing-but-apex.html A customer from Tennessee recently asked for help in creating a simple dashboard in their <a href="https://apex.oracle.com/" target="_blank">Oracle APEX</a> application. &nbsp;In the PHP system they were coming from, they had a dashboard that looked like the following:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-thbu6RNacVY/WXjfqCZ3ihI/AAAAAAAADiU/qjheLq9Ra8I_doSPXTweJxDr03UZzQ2UQCLcBGAs/s1600/dashboard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="298" data-original-width="957" height="198" src="https://2.bp.blogspot.com/-thbu6RNacVY/WXjfqCZ3ihI/AAAAAAAADiU/qjheLq9Ra8I_doSPXTweJxDr03UZzQ2UQCLcBGAs/s640/dashboard.png" width="640" /></a></div><br /><br />Most people think of dashboards as a nice cockpit panel containing charts and graphics. &nbsp;While this example doesn't perfectly fit that description, it can be classified as a report that is summarized, and any elements which need attention are presented in a different color.<br /><br />I've implemented similar solutions in the past, selecting an image reference in the SELECT clause of my report query, and then referencing this image reference as the column value. &nbsp;But this time, I first solicited the opinion of <a href="https://twitter.com/shakeeb" target="_blank">Shakeeb Rahman</a>, the Design Lead for <a href="https://apex.oracle.com/" target="_blank">Oracle APEX</a>, and he provided me a better solution. &nbsp;Using a simple combination of SQL and <a href="https://apex.oracle.com/fontapex" target="_blank">Font APEX</a>, this can be easily and elegantly solved!<br /><br />For this example, I created a new table CITY_STATUSES<br /><br /><pre class="brush:sql;toolbar:false;">create table city_statuses (<br /> city_name varchar2(100) primary key, <br /> status1 number, <br /> status2 number, <br /> status3 number);<br /></pre><br />I populated it with data, and then I created a new application with an Interactive Report on the table. &nbsp;The query of the Interactive Report was simply:<br /><br /><pre class="brush:sql;toolbar:false;">select city_name,<br /> status1,<br /> status2,<br /> status3<br /> from city_statuses<br /></pre><br />and my initial report looked like:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-fcIUTPIYy8I/WXjiWOlflTI/AAAAAAAADig/kyLg8TLiP6wpkG8mq6EUIc8VnSoHwUt9QCLcBGAs/s1600/dashboard1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="488" data-original-width="1022" height="304" src="https://4.bp.blogspot.com/-fcIUTPIYy8I/WXjiWOlflTI/AAAAAAAADig/kyLg8TLiP6wpkG8mq6EUIc8VnSoHwUt9QCLcBGAs/s640/dashboard1.png" width="640" /></a></div><br /><br />In my example, 1 is a good condition, 0 is a warning, and -1 indicates that an action must be taken.<br /><br /><h3>Universal Theme</h3><br />Universal Theme is a responsive, versatile, and customizable user interface for your Application Express apps. &nbsp;The Universal Theme in Oracle APEX 5.1 includes Font APEX, a drop-in replacement for Font Awesome, but with better graphics and more of them (courtesy of master graphic artist <a href="https://twitter.com/bobdalyillo" target="_blank">Bob Daly</a>). &nbsp;You can learn more about the Universal Theme at <a href="https://apex.oracle.com/ut">https://apex.oracle.com/ut</a>, and you can learn more about Font APEX at <a href="https://apex.oracle.com/fontapex">https://apex.oracle.com/fontapex</a>.<br /><br />Shakeeb recommended I use Font APEX and the Universal Theme helper classes to solve this problem. &nbsp;The helper classes can be used to set the colors on any custom component. &nbsp;You can find these Universal Theme helper classes at <a href="https://apex.oracle.com/ut">https://apex.oracle.com/ut</a> -&gt; Reference -&gt; Color and Status Modifiers. &nbsp;What's nice about these colors is that they are coordinated with the Theme Roller in APEX. &nbsp;If you change the global success color in Theme Roller, the icon color will also be updated.<br /><br />To solve this specific problem for the dashboard, I selected two additional columns in the SELECT clause for each STATUS column:<br /><ol><li><b>status_icon</b> - String representing the icon class and modifier class</li><li><b>status_description</b> - Description of the status icon, for accessibility purposes. &nbsp;This is very important, because we are changing from a discrete value in the report to an icon and a color. &nbsp;Without the description column, this information will be inaccessible.</li></ol>For the icons and modifiers, I used:<br /><ul><li>Success: <span style="white-space: pre;"> </span><span style="white-space: pre;"> </span>fa-check-circle-o u-success-text<span style="white-space: pre;"> </span></li><li>Warning: <span style="white-space: pre;"> </span>fa-exclamation-triangle u-warning-text<span style="white-space: pre;"> </span></li><li>Error: <span style="white-space: pre;"> </span>fa-exception u-danger-text<span style="white-space: pre;"> </span></li></ul><h3>The Solution</h3>For each status column in my SELECT clause, I added a corresponding icon and description column:<br /><br /><br /><pre class="brush:sql;toolbar:false;"> select city_name,<br /> status1,<br /> status2,<br /> status3,<br /> case status1 <br /> when 1 then 'fa-check-circle-o u-success-text'<br /> when 0 then 'fa-exclamation-triangle u-warning-text'<br /> when -1 then 'fa-exception u-danger-text'<br /> end status1_icon,<br /> case status1 <br /> when 1 then 'OK'<br /> when 0 then 'Warning'<br /> when -1 then 'Danger'<br /> end status1_description, <br /> case status2 <br /> when 1 then 'fa-check-circle-o u-success-text'<br /> when 0 then 'fa-exclamation-triangle u-warning-text'<br /> when -1 then 'fa-exception u-danger-text'<br /> end status2_icon,<br /> case status2 <br /> when 1 then 'OK'<br /> when 0 then 'Warning'<br /> when -1 then 'Danger'<br /> end status2_description, <br /> case status3 <br /> when 1 then 'fa-check-circle-o u-success-text'<br /> when 0 then 'fa-exclamation-triangle u-warning-text'<br /> when -1 then 'fa-exception u-danger-text'<br /> end status3_icon,<br /> case status3 <br /> when 1 then 'OK'<br /> when 0 then 'Warning'<br /> when -1 then 'Danger'<br /> end status3_description<br /> from city_statuses<br /></pre><br />After saving the updated query for the Interactive Report, I edited these columns in Page Designer and changed the property <b>Type</b> from <b>Plain Text</b> to <b>Hidden Column</b>.<br /><br />Then, for the columns STATUS1, STATUS2 and STATUS3, in Page Designer I changed the property <b>HTML Expression</b> to:<br /><br /><pre class="brush:html;toolbar:false;">&lt;span class="fa #STATUS1_ICON#" title="#STATUS1_DESC#"&gt;&lt;/span&gt;<br /></pre><br />Obviously, replace STATUS1 with the correct corresponding column name. I adjusted the heading and column alignment of each column to center, and voila! &nbsp;It couldn't be easier.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-wz0HgliJU_4/WXjoM2oxD9I/AAAAAAAADiw/iKqs5JT_Zg0ajUacjdnbw9jdKbqEbgvEQCLcBGAs/s1600/dashboard2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="487" data-original-width="1020" height="304" src="https://2.bp.blogspot.com/-wz0HgliJU_4/WXjoM2oxD9I/AAAAAAAADiw/iKqs5JT_Zg0ajUacjdnbw9jdKbqEbgvEQCLcBGAs/s640/dashboard2.png" width="640" /></a></div><br /><br />If for some reason you want to make the icons even larger, no problem! &nbsp;Simply add the fa-2x modifier in the HTML expression (after #STATUS1_ICON#). <br /><br />Experiment with the modifiers of Font APEX at <a href="https://apex.oracle.com/fontapex">https://apex.oracle.com/fontapex</a>. &nbsp;Choose your icon, vary the size, animation, modifier, and status. &nbsp;Just don't go crazy - we don't want to see the world's APEX apps introduce the equivalent of the &lt;marquee&gt; tag again.<br /><br />Shakeeb presented the Universal Theme, these modifiers, and much more in a <a href="https://www.youtube.com/watch?v=BGtJCayvHaI" target="_blank">recorded Webinar</a> from <a href="http://odtug.com/" target="_blank">ODTUG</a>.<br /><br />P.S. &nbsp;While you might be tempted to simplify the query and use an&nbsp;<a href="https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1#functions" target="_blank">inline PL/SQL function in the WITH clause</a>&nbsp;of the query, you most likely will encounter error "ORA-32034: unsupported use of WITH clause". &nbsp;This is because the Interactive Report will enclose your original query in a subquery, and in general, inline PL/SQL functions in subqueries are intentionally prohibited by the Oracle Database. &nbsp;However, the solution above also works with a Classic Report, and in that case, you could use an inline PL/SQL function in the WITH clause of the query. Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-2172713716423264273 Wed Jul 26 2017 15:37:00 GMT-0400 (EDT) APEX Basic REST authentication https://ruepprich.wordpress.com/2017/07/25/apex-basic-rest-authentication/ <p>To prevent unauthorized access to your REST modules, APEX provides an easy, declarative way of adding basic authentication. This method utilizes APEX user accounts and RESTful Service Privileges. In order not to expose passwords, you should make sure to enable SSL/HTTPS!</p> <p>First edit an existing APEX user account, and add the <strong>RESTful Services</strong> group to that user.  In our example we&#8217;ll edit the APEX user SCOTT. To do this, navigate to <strong>Manage Users and Groups</strong> in the workspace where your REST modules are, edit a user, and assign the group in the <strong>Group Assignments</strong> region:</p> <p><img data-attachment-id="2784" data-permalink="https://ruepprich.wordpress.com/2017/07/25/apex-basic-rest-authentication/group_assignment/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/group_assignment.png?w=550" data-orig-size="662,219" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="group_assignment" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/group_assignment.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/group_assignment.png?w=550?w=550" class="alignnone size-full wp-image-2784" src="https://ruepprich.files.wordpress.com/2017/07/group_assignment.png?w=550" alt="group_assignment" srcset="https://ruepprich.files.wordpress.com/2017/07/group_assignment.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/group_assignment.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/group_assignment.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/group_assignment.png 662w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Next create the RESTful Service Privilege by navigating to <strong>RESTful Services</strong> in the <strong>SQL Workshop</strong>. In the <strong>Tasks</strong> sidebar on the right, click the <strong>RESTful </strong><strong>Service Privilege</strong> link.</p> <p><img data-attachment-id="2793" data-permalink="https://ruepprich.wordpress.com/2017/07/25/apex-basic-rest-authentication/rsvc_priv/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/rsvc_priv.png?w=550" data-orig-size="192,404" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="rsvc_priv" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/rsvc_priv.png?w=550?w=143" data-large-file="https://ruepprich.files.wordpress.com/2017/07/rsvc_priv.png?w=550?w=192" class=" size-full wp-image-2793 alignnone" src="https://ruepprich.files.wordpress.com/2017/07/rsvc_priv.png?w=550" alt="rsvc_priv" srcset="https://ruepprich.files.wordpress.com/2017/07/rsvc_priv.png 192w, https://ruepprich.files.wordpress.com/2017/07/rsvc_priv.png?w=71 71w" sizes="(max-width: 192px) 100vw, 192px" /></p> <p>Fill out the form and select the modules you want to protect, by shuttling them to the right in <strong>Protected Modules</strong>.</p> <p><img data-attachment-id="2798" data-permalink="https://ruepprich.wordpress.com/2017/07/25/apex-basic-rest-authentication/rsvc_details/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png?w=550" data-orig-size="700,485" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="rsvc_details" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png?w=550?w=550" class="alignnone size-full wp-image-2798" src="https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png?w=550" alt="rsvc_details" srcset="https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/rsvc_details.png 700w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>That&#8217;s it! Everything under the selected module now requires the username and password of the APEX user. You can test this with the following curl command (edit URI as needed):</p> <p>curl -u scott:tiger <a href="http://servername/ords/workspace/hr/empinfo/" rel="nofollow">http://servername/ords/workspace/hr/empinfo/</a></p> <p>When testing with Postman, choose the <strong>Basic Auth</strong> from the authentication select list and enter the APEX user&#8217;s username and password.</p> <p><img data-attachment-id="2807" data-permalink="https://ruepprich.wordpress.com/2017/07/25/apex-basic-rest-authentication/postman/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/postman.png?w=550" data-orig-size="882,303" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="postman" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/postman.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/postman.png?w=550?w=550" class="alignnone size-full wp-image-2807" src="https://ruepprich.files.wordpress.com/2017/07/postman.png?w=550" alt="postman" srcset="https://ruepprich.files.wordpress.com/2017/07/postman.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/postman.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/postman.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/postman.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/postman.png 882w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>&nbsp;</p><br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ruepprich.wordpress.com/2774/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ruepprich.wordpress.com/2774/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=ruepprich.wordpress.com&#038;blog=12765658&#038;post=2774&#038;subd=ruepprich&#038;ref=&#038;feed=1" width="1" height="1" /> Christoph Ruepprich http://ruepprich.wordpress.com/?p=2774 Tue Jul 25 2017 15:00:37 GMT-0400 (EDT) is {JSON}, or not is {JSON}, that is the question https://svenweller.wordpress.com/2017/07/25/json-or-not-json-that-is-the-question/ <p><em>Whether &#8217;tis nobler in the mind to suffer</em><br /> <em> The [] and &#8220;&#8221; of outrageous json,</em><br /> <em> Or to take Arms against a Sea of troubles,</em><br /> <em> And by opposing {} end them: to select, to browse</em><br /> <em> No more; and by a browse, to say we end</em><br /> <em> the json array, and the thousand json objects</em><br /> <em> that Flesh is heir to? &#8216;Tis a consummation</em><br /> <em> devoutly to be wished. To select, to browse&#8230;</em></p> <h2>Intro</h2> <p>So I have this logging table where sometimes the message can be a json document. Most of the times it is an error message or some tracing information. But sometimes I want to show what data currently is inside a plsql collection. I wrote a small conversion function, that returns a clob which should contain JSON. This json ends up as a message in my logging table.</p> <p>Inside an apex application I added the possibility to show this JSON as a modal page. I use the JSONView Plugin, however most browsers now have a default JSON display capability.</p> <p>I detect if the message contains json data by using the 12.1 <strong>IS JSON</strong> operator.</p> <p>In case it is json, I provide a link to the modal page and print the data there. </p> <pre class="brush: sql; highlight: [2]; title: ; notranslate"> case when LOG_MESSAGE is json then '&lt;a href=&quot;'|| apex_util.prepare_url('f?p='||v('APP_ID')||':123:'||v('APP_SESSION') ||'::::P123_LOG_ID:'||to_char(LOG_ID)) ||'&quot; title=&quot;show JSON data&quot;&gt;{JSON}&lt;/a&gt;' else '&lt;pre&gt;'||LOG_MESSAGE||'&lt;/pre&gt;' end as log_message_enhanced </pre> <p> <br /> The modal page uses the application/json mime type.</p> <p>The result looks similar to this:</p> <p> <br /> <img data-attachment-id="6898" data-permalink="https://svenweller.wordpress.com/2017/07/25/json-or-not-json-that-is-the-question/modal_json_ok/" data-orig-file="https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=809" data-orig-size="1025,564" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="modal_json_ok" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=809" alt="modal_json_ok" class="alignnone size-full wp-image-6898" srcset="https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=809 809w, https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=150 150w, https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=300 300w, https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=768 768w, https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png?w=1024 1024w, https://svenweller.files.wordpress.com/2017/07/modal_json_ok.png 1025w" sizes="(max-width: 809px) 100vw, 809px" /><br />  </p> <p>How build such an apex page or how to do a conversion from a plsql collection to json is not part of this blog post. If your are interested in that, please leave a comment and I might consider to publish how to do so.</p> <h2>Problem</h2> <p>For certain documents the browser was not able to show the json. Instead it returned an error message and the json in text format. Here is an example.<br /> <img data-attachment-id="6897" data-permalink="https://svenweller.wordpress.com/2017/07/25/json-or-not-json-that-is-the-question/modal_json_error/" data-orig-file="https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=809" data-orig-size="1045,547" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="modal_json_error" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=809" alt="modal_json_error" class="alignnone size-full wp-image-6897" srcset="https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=809 809w, https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=150 150w, https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=300 300w, https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=768 768w, https://svenweller.files.wordpress.com/2017/07/modal_json_error.png?w=1024 1024w, https://svenweller.files.wordpress.com/2017/07/modal_json_error.png 1045w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p>Sorry for the German Message, but I was not able to switch my Firefox to english mode easily. The error essentially says: &#8220;We could not parse the json, it seems the document does not comply to the specifications.&#8221;</p> <p><strong>So the database says it is json, but the browser says it is not!</strong></p> <p>What is going on? That is the question.<br />  </p> <h2>Solution</h2> <p>The reason for the behaviour is that Oracles IS JSON check uses the <em>lax </em>json syntax (by default). <em>LAX</em> json allows several things, among others it allows to have a list of objects with a trailing comma at the end. Exactly my issue.</p> <p>Here is a basic SQL demonstration. Note the comma after the &#8220;Larry&#8221; inside the json object step.</p> <pre class="brush: sql; light: true; title: ; notranslate"> select * from dual where '[{&quot;index&quot;:1,&quot;name&quot;:&quot;Larry&quot;,}]' is json; </pre> <pre> DUMMY ----- X </pre> <p>So it is JSON. But only lax json. </p> <p>Fortunatly we can also do a check for the more <em>strict </em>json interpretation. </p> <pre class="brush: sql; light: true; title: ; notranslate"> select * from dual where '[{&quot;index&quot;:1,&quot;name&quot;:&quot;Larry&quot;,}]' is json (STRICT); </pre> <pre>No rows selected.</pre> <p>Can you spot the difference? The STRICT keyword including parenthesis tells the database that the document needs to confirm to the more strict specification.</p> <p>This is of cause documented: <a href="https://docs.oracle.com/database/121/ADXDB/json.htm#GUID-1B6CFFBE-85FE-41DD-BA14-DD1DE73EAB20" target="_blank">About Strict and Lax JSON Syntax</a></p> <p>The main differences are</p> <ul> <li>STRICT: each JSON field and each string value must be enclosed in double quotation marks (&#8220;).<br />LAX: An object literal can also be enclosed in single quotation marks (&#8216;). </li> <li>LAX: Case variations for keywords true, false, and null (for example, TRUE, True, TrUe, fALSe, NulL).</li> <li>LAX: An extra comma (,) after the last element of an array or the last member of an object (for example, [a, b, c,], {a:b, c:d,}).</li> <li>LAX: Numerals</li> <ul> <li>with one or more leading zeros (for example, 0042.3).</li> <li>Fractional numerals that lack 0 before the decimal point (for example, .14 instead of 0.14).</li> <li>Numerals with no fractional part after the decimal point (for example, 342. or 1.e27).</li> <li>A plus sign (+) preceding a numeral, meaning that the number is non-negative (for example, +1.3).</li> </ul> </ul> <p>But there are more differences.</p> <p>Using the (STRICT) keyword, solved my problem. Only those json documents where linked, that could be shown in the browser. The others were rendered as normal text.</p> <h2>Conclusion</h2> <p> <br /> Be aware that there are slightly different JSON specifications available.</p> <p>If you want to show json inside a browser, then make sure the json document confirms to the <em>strict</em> json specification.</p> <p>If you want to use json inside javascript, then probably the <em>lax</em> version is better suited.<br />  </p> <p> </p><br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/svenweller.wordpress.com/6794/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/svenweller.wordpress.com/6794/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=svenweller.wordpress.com&#038;blog=24902459&#038;post=6794&#038;subd=svenweller&#038;ref=&#038;feed=1" width="1" height="1" /> svenweller http://svenweller.wordpress.com/?p=6794 Tue Jul 25 2017 13:49:29 GMT-0400 (EDT) Connecting a Node.js App in ACCS to Exadata Express https://jsao.io/2017/07/connecting-a-node-js-app-in-accs-to-exadata-express/ <p>Two of my favorite Oracle Cloud services are the <a href="https://cloud.oracle.com/en_US/database/exadata-express/features">Exadata Express Cloud Service</a> (Exadata Express) and the <a href="https://cloud.oracle.com/en_US/application-container-cloud">Application Container Cloud Service</a> (ACCS). Exadata Express is a fully managed Oracle Database service at an <a href="https://cloud.oracle.com/en_US/database/exadata-express/pricing">entry-level price point</a> for small to medium sized data and ACCS is an easy way to deploy apps in Docker containers. In this post, I&#8217;ll demonstrate how to connect these two services at the most basic level.<br /> <span id="more-2430"></span><br /> What do I mean by &#8220;the most basic level&#8221;? First, I&#8217;m not going to demonstrate how to create an Oracle Cloud account with these two services &#8211; I&#8217;ll assume you&#8217;ve already done that. Also, the demo app in this post will be minimalistic. Normally, I might use the <a href="https://cloud.oracle.com/en_US/developer-service">Developer Cloud Service</a> to create a Git repo with an automated build process &#8211; not here. This post will focus only on what&#8217;s needed to get these two services connected.</p> <p>Contents:</p> <ul> <li><a href="#create-test-app">Create test app</a></li> <li><a href="#add-client-credentials">Add client credentials</a></li> <li><a href="#deploy-app">Deploy app</a></li> <li><a href="#add-environment-variables">Add environment variables</a></li> </ul> <h4 id="create-test-app">Create test app</h4> <p>Create a new directory named <strong>connection-test-app</strong> and add the following two files.</p> <pre class="crayon-plain-tag">{ &quot;runtime&quot;:{ &quot;majorVersion&quot;:&quot;6&quot; }, &quot;command&quot;: &quot;node index.js&quot;, &quot;release&quot;: {}, &quot;notes&quot;: &quot;&quot; }</pre> <p>ACCS apps often have one or two <a href="https://docs.oracle.com/en/cloud/paas/app-container-cloud/dvcjv/creating-meta-data-files.html">metadata files</a>. In this case, the <strong>manifest.json</strong> is used to specify the version of Node.js to run and the command to use to start the application.</p> <pre class="crayon-plain-tag">const http = require('http'); const oracledb = require('oracledb'); let error; let user; oracledb.getConnection( { user: process.env.EECS_USER, password: process.env.EECS_PASSWORD, connectString: 'dbaccess' }, function(err, connection) { if (err) {error = err; return;} connection.execute('select user from dual', [], function(err, result) { if (err) {error = err; return;} user = result.rows[0][0]; error = null; connection.close(function(err) { if (err) {console.log(err);} }); }) } ); http.createServer(function(request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); if (error === null) { response.end('Connection test succeeded. You connected to Exadata Express as ' + user + '!'); } else if (error instanceof Error) { response.write('Connection test failed. Check the settings and redeploy app!\n'); response.end(error.message); } else { response.end('Connection test pending. Refresh after a few seconds...'); } }).listen(process.env.PORT);</pre> <p>The <strong>index.js</strong> contains logic that runs a connection test (lines 6-26) and uses a simple web server to let us know the results of the test (lines 28-39). Note that three environment variables are referenced via <span class="inline-code">process.env</span>. PORT is <a href="https://docs.oracle.com/en/cloud/paas/app-container-cloud/dvcjv/making-application-configurable-runtime.html">defined by ACCS</a>, but the other environment variables will be created in the last step of this tutorial.</p> <h4 id="add-client-credentials">Add client credentials</h4> <p>To connect to Exadata Express, you must first download the client credentials. Open a browser and sign into your Oracle Cloud account. Then go to the Exadata Express service console, select the service instance that you&#8217;d like to connect to, and then click the link to download the client credentials.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/download-client-credentials.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/download-client-credentials.png" alt="" width="802" height="233" class="alignnone size-full wp-image-2443" srcset="https://jsao.io/wp-content/uploads/2017/07/download-client-credentials.png 802w, https://jsao.io/wp-content/uploads/2017/07/download-client-credentials-300x87.png 300w, https://jsao.io/wp-content/uploads/2017/07/download-client-credentials-768x223.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></a></p> <p>Before the client credentials download, you will be prompted to enter a password. You&#8217;ll need the password when connecting to Exadata Express using a Java keystore (e.g. with SQL Developer), but not when connecting to the database with OCI (e.g. with node-oracledb). </p> <p>Enter and confirm the password, then click <strong>Download</strong>. A file named <strong>client_credentials.zip</strong> will be downloaded to your machine. Once downloaded, you must treat the files securely to prevent unauthorized database access. </p> <p>Extract the contents of the <strong>client_credentials.zip</strong> file to the <strong>connection-test-app</strong> directory created earlier. The contents of that directory should appear as follows:</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/connection-test-app-directory.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/connection-test-app-directory.png" alt="" width="298" height="110" class="alignnone size-full wp-image-2446" /></a></p> <p>Change directories into the <strong>client_credentials</strong> directory and open the <strong>sqlnet.ora</strong> file in a text editor. Change the value of DIRECTORY from <span class="inline-code">?/network/admin</span> to <span class="inline-code">/u01/app/client_credentials</span>. Note that when deploying an app to ACCS, the app&#8217;s files are copied to the <strong>/u01/app</strong> directory of the container. The <strong>sqlnet.ora</strong> file must point to the location of the client credentials, which can differ depending on the environment.</p> <h4 id="deploy-app">Deploy app</h4> <p>At this point, we can deploy the app to ACCS. Change directories back up to <strong>connection-test-app</strong> and compress the contents (not the directory itself) in a new zip file named Archive.zip.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/archive.zip.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/archive.zip.png" alt="" width="288" height="128" class="alignnone size-full wp-image-2453" /></a></p> <p>Return to the browser and navigate to the ACCS service console. Click the <strong>Create Application</strong> button.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/accs-create-app.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/accs-create-app.png" alt="" width="802" height="380" class="alignnone size-full wp-image-2465" srcset="https://jsao.io/wp-content/uploads/2017/07/accs-create-app.png 802w, https://jsao.io/wp-content/uploads/2017/07/accs-create-app-300x142.png 300w, https://jsao.io/wp-content/uploads/2017/07/accs-create-app-768x364.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></a></p> <p>Select <strong>Node</strong> as the application platform.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/accs-platform.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/accs-platform.png" alt="" width="794" height="1058" class="alignnone size-full wp-image-2467" /></a></p> <p>Set the application name to <strong>eecstest</strong>, use the <strong>Archive</strong> file picker to select the application archive created in the previous step, and then set the <strong>Instances</strong> and <strong>Memory</strong> options to <strong>1</strong>. Click <strong>Create</strong> to start the deployment process.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/accs-app-properties.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/accs-app-properties.png" alt="" width="650" height="754" class="alignnone size-full wp-image-2472" srcset="https://jsao.io/wp-content/uploads/2017/07/accs-app-properties.png 650w, https://jsao.io/wp-content/uploads/2017/07/accs-app-properties-259x300.png 259w" sizes="(max-width: 650px) 100vw, 650px" /></a></p> <p>The app will appear in the list of ACCS applications where you can obtain its URL.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/accs-app-created.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/accs-app-created.png" alt="" width="1002" height="228" class="alignnone size-full wp-image-2474" srcset="https://jsao.io/wp-content/uploads/2017/07/accs-app-created.png 1002w, https://jsao.io/wp-content/uploads/2017/07/accs-app-created-300x68.png 300w, https://jsao.io/wp-content/uploads/2017/07/accs-app-created-768x175.png 768w, https://jsao.io/wp-content/uploads/2017/07/accs-app-created-1000x228.png 1000w" sizes="(max-width: 1002px) 100vw, 1002px" /></a></p> <p>If you navigate to that URL in a browser, you&#8217;ll see that the test has failed &#8211; this is expected.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/test-failed.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/test-failed.png" alt="" width="802" height="171" class="alignnone size-full wp-image-2475" srcset="https://jsao.io/wp-content/uploads/2017/07/test-failed.png 802w, https://jsao.io/wp-content/uploads/2017/07/test-failed-300x64.png 300w, https://jsao.io/wp-content/uploads/2017/07/test-failed-768x164.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></a></p> <p>Just one last step to get everything working&#8230;</p> <h4 id="add-environment-variables">Add environment variables</h4> <p>Return to the ACCS service console and drill into the <strong>eecstest</strong> app. Select the <strong>Deployments</strong> option on the left and click the <strong>Add</strong> button under <strong>Environment Variables</strong>. </p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/accs-deployments.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/accs-deployments.png" alt="" width="802" height="309" class="alignnone size-full wp-image-2477" srcset="https://jsao.io/wp-content/uploads/2017/07/accs-deployments.png 802w, https://jsao.io/wp-content/uploads/2017/07/accs-deployments-300x116.png 300w, https://jsao.io/wp-content/uploads/2017/07/accs-deployments-768x296.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></a></p> <p>Set <strong>Name</strong> to <strong>TNS_ADMIN</strong> and <strong>Value</strong> to <strong>$APP_HOME/client_credentials</strong>, then click <strong>Save</strong>.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/accs-add-env-var.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/accs-add-env-var.png" alt="" width="504" height="234" class="alignnone size-full wp-image-2479" srcset="https://jsao.io/wp-content/uploads/2017/07/accs-add-env-var.png 504w, https://jsao.io/wp-content/uploads/2017/07/accs-add-env-var-300x139.png 300w" sizes="(max-width: 504px) 100vw, 504px" /></a></p> <p>Repeat the previous steps to create two more environment variables. The first will be named <strong>EECS_USER</strong> and its value will be the username of the Exadata Express database user you want to connect with. The last environment variable will be named <strong>EECS_PASSWORD</strong> and its value will be the password of the database user specified in <strong>EECS_USER</strong>. </p> <p>After creating the three environment variables, scroll to the top and click the <strong>Apply Edits</strong> button. This will redeploy the application with the new settings.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/accs-apply-edits.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/accs-apply-edits.png" alt="" width="802" height="117" class="alignnone size-full wp-image-2481" srcset="https://jsao.io/wp-content/uploads/2017/07/accs-apply-edits.png 802w, https://jsao.io/wp-content/uploads/2017/07/accs-apply-edits-300x44.png 300w, https://jsao.io/wp-content/uploads/2017/07/accs-apply-edits-768x112.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></a></p> <p>After the app is deployed, you can navigate to its URL where you should see that the connection test has succeeded.</p> <p><a href="https://jsao.io/wp-content/uploads/2017/07/test-succeeded.png" rel="prettyPhoto[gallery-2b8U]"><img src="https://jsao.io/wp-content/uploads/2017/07/test-succeeded.png" alt="" width="802" height="154" class="alignnone size-full wp-image-2482" srcset="https://jsao.io/wp-content/uploads/2017/07/test-succeeded.png 802w, https://jsao.io/wp-content/uploads/2017/07/test-succeeded-300x58.png 300w, https://jsao.io/wp-content/uploads/2017/07/test-succeeded-768x147.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></a></p> <p>As you can see, connecting these two services isn&#8217;t difficult once you know what the moving pieces are. When working with a real app, I recommend keeping the client credentials separate from the application files. </p> <p>If developing locally, the TNS_ADMIN environment variable can point to a local copy of the client credentials used for dev. When deploying to another environment in ACCS, you can use a Developer Cloud Service build process to download the correct client credentials from the Storage Service and add them to the app files before deploying them to ACCS.</p> danmcghan https://jsao.io/?p=2430 Tue Jul 25 2017 09:32:52 GMT-0400 (EDT) Oracle APEX 5.1, ATAF and automated testing http://lschilde.blogspot.com/2017/07/oracle-apex-51-ataf-and-automated.html <div dir="ltr" style="text-align: left;" trbidi="on"><h2 style="text-align: justify;"><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2; text-align: justify;"><b><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 18.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Oracle APEX 5.1, ATAF and automated testing</span></b><br><b><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 18.0pt; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></b></div></h2><br /><h3 style="text-align: left;"><b><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 13.5pt; line-height: 115%; mso-ansi-language: EN-AU; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ATAF - Why not giving it a chance?</span></b></h3><br /><h4 style="text-align: left;"><![endif]--><b><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; line-height: 115%; mso-ansi-language: EN-AU; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Step 1. Configuration and installation – hands on experience</span></b></h4><br /><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings></xml><![endif]--><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; line-height: 115%; mso-ansi-language: EN-AU; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Back to everyday work with some spare time to try out what I picked up from this year’s KScope17.&nbsp;</span><br /><br /><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; line-height: 115%; mso-ansi-language: EN-AU; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Among many great sessions I taken with me, one that I decided to try out now is ATAF – <b style="mso-bidi-font-weight: normal;"><a href="https://www.apextestautomation.co.uk/">APEX test automation framework</a></b>.</span><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-AU</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument></xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles></xml><![endif]--><!--[if gte mso 10]><style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-fareast-language:EN-US;} </style><![endif]--><br /><br /><div style="text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-7vv7q0kpVyw/WWhJQNWnJ7I/AAAAAAAALMI/0LKBZWfc4XIFXMC4ahTLyIPIUI5pfqEEgCPcBGAYYCw/s1600/ATAF.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="360" src="https://2.bp.blogspot.com/-7vv7q0kpVyw/WWhJQNWnJ7I/AAAAAAAALMI/0LKBZWfc4XIFXMC4ahTLyIPIUI5pfqEEgCPcBGAYYCw/s640/ATAF.jpg" width="640" /></a></div></div><br /><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-AU</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument></xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles></xml><![endif]--><!--[if gte mso 10]><style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-fareast-language:EN-US;} </style><![endif]--> <br /><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Writing and maintenance of testing scripts is something none of us like doing but it is something that can safe heaps of time later in the project. I am hoping that we do not have to go into why you want to automate your testing and all the benefits it brings. </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">From my developers perspective, having to deal with maintenance of scripts that I created in Selenium wasn’t most exciting thing but over time it has proven to be a challenge and was taking way too much of my project time. This is why I got excited about Simon’s project and ATAF. If it could reduce the time needed just from maintenance perspective I think we have something good in our hands.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">After spending roughly a week with ATAF I decided to write down initial thoughts and how it all went. </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Please note this is my personal view about ATAF and your experience might be slightly different. Any ‘negative’ comment (if any :) ) is only meant to be a constructive criticism to help make this a better tool for all of us. </span><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><b style="mso-bidi-font-weight: normal;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Download and documentation</span></b></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Good thing is that Simon and the team made an effort to make it publicly available on Github <a href="https://github.com/schunt1/ATAF">https://github.com/schunt1/ATAF</a></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">After you get the source there is a Documentation folder giving you all necessary information about how it works and how to install ATAF.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><b style="mso-bidi-font-weight: normal;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Installation</span></b><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">As per documentation there is an option for you to install ATAF in your existing scheme or installing it on its own. </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">I decided to install it in its separate schema as I have too many workspaces I need this for so wanted to reduce multiple installations. </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Basically it consisted of creating a new DB schema with create view grant, new workspace and running install.sql script. Installation was pretty easy and it did require a recompilation of all objects as per documentation. Installation script did need a "/" at the end otherwise it just hang in my SQL session. </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><b style="mso-bidi-font-weight: normal;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Configuration</span></b></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Again following the documentation there was not much to do here. There were some additional view changes to support running from separate schema.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Only addition was that ATAF schema required grant execute on DBMS_LOCK package.</span><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"><br /></span><b style="mso-bidi-font-weight: normal;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">First run</span></b></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">After ATAF application was imported into my workspace, this is where things started to go slightly off the rails. Do not get me wrong, nothing that you will not able to fix but it did need some additional interventions. <span style="mso-spacerun: yes;">&nbsp;</span><span style="mso-spacerun: yes;">&nbsp;</span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Basically things were hooked up to hardcoded theme number 42 which is a default value for all default testing data. In my case I was using custom build theme with ID 40000 so had to make some changes to original scripts. I am expecting that most people with Universal theme (42) would not have to do the same.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><b style="mso-bidi-font-weight: normal;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Changes and comments</span></b></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Application pages I had to change:</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Page 1 – fetch returns multiple rows error</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Page 2 – Select LOV invalid</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Page 3 – Actions did not see my Interactive Grid JS buttons</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Page 18 – LOV needed a change</span></i></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Files updated to fix above issues:</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_apex_applications_v</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_apex_page_items</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_apex_page_items_v</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_apex_pages_v</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_apex_shortcuts_v</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_apex_themes_v</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_test_condition_full_v</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_test_condition_v</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ATAF_PKB</span></i></div><i> </i><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><i><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">ataf_selenium_for_custom_theme</span></i></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">To align with my domain needed to do this update</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"><span style="font-size: 10pt;">update ataf_selenium </span></span></div><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"> </span><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"><span style="font-size: 10pt;">set target = replace(target, 'ords', 'apex/lbs')</span></span></div><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"> </span><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"><span style="font-size: 10pt;">where theme_number = '40000'</span></span></div><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"> </span><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"><span style="font-size: 10pt;">and target like '%/apex/%';</span></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">As you can see it wasn’t all smooth sailing but now that I am actually able to run ATAF I am pleasantly surprised.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">I was able to create my dummy testing scripts which ran perfectly fine in Selenium after just 2 days of work which is pretty good in my eyes without having to know a single line of ‘Selenium scripting’. </span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><b style="mso-bidi-font-weight: normal;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Challenges and still to come</span></b></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Since I am still in early days learning ATAF and all of its features it did take me a while to get running. I also think that initially there will be a learning curve for all to grasp how it all works.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">After a day or so of using ATAF I was able to add test data and framework made it easy to loop through my test-cases which nice to see.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Selecting menus, buttons and entering page items was not a problem.</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-7Snb7HqZJP8/WXb_Q346LEI/AAAAAAAALMU/UzRms-hVTVsVGv0avIa7ZtEewAA2KwaEQCLcBGAs/s1600/Capture2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="522" data-original-width="513" height="320" src="https://4.bp.blogspot.com/-7Snb7HqZJP8/WXb_Q346LEI/AAAAAAAALMU/UzRms-hVTVsVGv0avIa7ZtEewAA2KwaEQCLcBGAs/s320/Capture2.PNG" width="314" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br /> <div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">If I can point anything as challenging, I am still learning how is it best to create new actions that will do custom validations in my 5.1 apps.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Also it will be interesting to see how I will survive with my xpath selector knowledge as I am more used to class selectors.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">But hey feeling about ATAF is positive and I think this is all that matters.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">To summarize, hope more of us will give ATAF a go and would love to see what others make of it.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">In next couple of days I will try my best to dedicate more time figuring out some new things in ATAF and putting it all together for Part 2 of this post.</span><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;"><br /></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt; text-align: justify;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Happy Apexing,</span><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: 5.0pt;"><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: Arial; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">SLino&nbsp;</span><span style="font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-bidi-font-family: &quot;Times New Roman&quot;; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div></div> SLino tag:blogger.com,1999:blog-8185384792158425670.post-9024375855610111365 Tue Jul 25 2017 04:31:00 GMT-0400 (EDT) Oracle SQL Developer Randomly Closes http://www.talkapex.com/2017/07/oracle-sql-developer-randomly-closes/ <p>I recently had a situation that running either <a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html" target="_blank" rel="external">Oracle SQL Developer</a> or <a href="http://www.oracle.com/technetwork/developer-tools/datamodeler/overview/index.html" target="_blank" rel="external">SQL Developer Data Modeler</a> on a Windows 7 VM (more on this later) would randomly close (or crash depending on how you look at it). The log files didn’t produce anything substantial and after a lot of digging around it was due to the JVM and the video driver. <a href="https://twitter.com/thatjeffsmith" target="_blank" rel="external">Jeff Smith</a> confirmed this over Twitter:</p> <p><blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="en" dir="ltr">So it&#39;s the jvm crashing because of the video driver…happens on Windows a decent amount, usually fixed with a driver update</p>&mdash; Jeff Smith 🥃 ☜ (@thatjeffsmith) <a href="https://twitter.com/thatjeffsmith/status/888428472326029315" target="_blank" rel="external">July 21, 2017</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>I was using windows on a VM and it had no available video driver updates. After reading <a href="https://stackoverflow.com/questions/40651162/sql-developer-crashes-randomly-every-time" target="_blank" rel="external">this post</a> on StackOverflow I found there is a configuration setting to get around the issue. It wasn’t very clear as to where to make the configuration change so here it is:</p> <ol> <li>Modify <code>datamodeler\ide\bin\jdk.conf</code></li> <li>Add <code>AddVMOption -Dsun.awt.nopixfmt=true</code> on a new line after <code>AddVMOption -Dsun.java2d.noddraw=true</code></li> <li>Restart the application</li> </ol> <p>A few additional notes:</p> <ol> <li>The versions I downloaded included the JDK. If you’re using your own JDK then the location of <code>jdk.conf</code> will probably be different.</li> <li>If you’re using the included JDK version then you’ll need to remember to do this step with each update of the applications.</li> </ol> Martin Giffy D'Souza http://www.talkapex.com/2017/07/oracle-sql-developer-randomly-closes/ Sat Jul 22 2017 00:59:33 GMT-0400 (EDT) Sans Kscope http://www.grassroots-oracle.com/2017/07/sans-kscope.html A few years ago I was lucky enough to attend Kscope15, and while I wasn't there this year, I have bizarre feeling of involvement.<br /><br /><h4>The Buzz</h4>I knew it was coming because the Twitter engine told me. I could have ignored Twitter for a week, or I could try garner some interesting information.<br /><br />I could also live vicariously through all those Oracle fanatics sharing their Kscope experience on&nbsp;<a href="https://twitter.com/odtug" target="_blank">Twitter</a>. I joke, but actually a lot of the gurus regularly share knowledge and interact in forums such as <a href="https://twitter.com/search?q=%23orclapex" target="_blank">Twitter</a>, <a href="https://orclapex.slack.com/" target="_blank">Slack</a> and <a href="https://community.oracle.com/community/database/developer-tools/application_express/content?customTheme=otn" target="_blank">OTN</a>. If you're not involved in one of these feeds, you're probably missing out on a valueable source of contemporary tech information.<br /><br /><div>You may notice some of the most recent&nbsp;<a href="https://twitter.com/search?q=%23kscope17" target="_blank">#Kscope17</a>&nbsp;tweets are from the after-party. It turns out this party is actually before the final 2 hour sessions on Thursday morning. Kudos to all those party animals that turned up to my jQuery deep dive in '15.&nbsp;</div><div><br /></div><h4>Content</h4>People share key slides. This gives us all a head's up for something photo worthy. Discussions start, interesting news and techniques get explored.<br /><br />Key sessions were live streamed, and (I believe all) sessions will be available to ODTUG members as screen/voice recordings in September. For $99US a year, that's bargain training value. It's just setting aside an hour or so a week to knock off the relevant sessions.<br /><br /><h4>Party</h4>The Kscope party is amazing. I obviously wasn't there, but half a world away I experienced my own night out and I had a little epiphany, of sorts.<br /><br />I was going to a music gig. No big name band, moreso a collaboration of&nbsp;<a href="https://www.facebook.com/pg/seaofnamesaus/about/" target="_blank">local musicians</a>&nbsp;performing a tribute to A Perfect Circle's <i>Mer de Noms</i> album. I know a few of you out there will have some clue as to what those words mean, or may like similar progressive rock. For me it was seeing a few mates perform an album I love live.<br /><div><br /></div><div>The gig was on at the same time as the Thursday morning live stream, but I wasn't missing this gig. It turned out to be an&nbsp;<i>amazing&nbsp;</i>gig.&nbsp;</div><div><br /></div><div>I've seen the singer (Dez) perform a number of times and he does a brilliant job emulating not only the original singer's voice, but also brings an amazing on stage presence. He smashed Tool's <i>Aenima </i>a few months ago at the same club, renowned for seasonal tribute gigs.<br />Another good friend was up there, pretending to know what to do with a six-string bass ;p, plus some other talented guys I've seen playing around before. And then out comes another dude up with an electric violin for a few songs!<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td><a href="https://1.bp.blogspot.com/-w918zqVC49o/WVzfbOpZy8I/AAAAAAAAQ2s/o5rGZUzZ-s8ECxyyv8Nujb2SG7CZ35RvwCLcBGAs/s1600/sea_of_names.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="905" data-original-width="1600" height="225" src="https://1.bp.blogspot.com/-w918zqVC49o/WVzfbOpZy8I/AAAAAAAAQ2s/o5rGZUzZ-s8ECxyyv8Nujb2SG7CZ35RvwCLcBGAs/s400/sea_of_names.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="font-size: 12.8px;">Sea of Names - A Perfect Circle tribute</td></tr></tbody></table><br />The sound was amazing, the small crowd was pumped, I had a lift to the gig so I actually enjoyed a few beers for a change. They did so well I had an early call of best gig ever, which is hard to judge &amp; compare, but then I remembered seeing Roger Waters perform&nbsp;<i><a href="https://www.livenation.com.au/blog/roger-waters-the-wall-australia-and-new-zealand-screening-de" target="_blank">The Wall</a>&nbsp;</i>a few years ago and that will be hard to beat.</div><div><br />It ticked a lot of boxes, boys, well done. Encore.<br /><br /></div><h4>Reflection</h4>We're a long way from iconic music meccas like Seattle, but Perth kicks out some brilliant musicians, and I'm a grateful music lover.<br /><br />For a few moments I thought about the Kscope attendees, having a fine time, letting off some steam after some solid days soaking up a lot of information.<br /><br />I also thought about the dedication and skill required for people to learn a craft, then share it with others, be it music or code.<br /><br />Congratulations <a href="http://odtug.kscope.com/" target="_blank">ODTUG</a> on creating an annual conference with such an impact.<br /><h4>Future</h4>Many things afoot in this household at the moment, and if all goes smooth, we could find ourselves moved into a new home by the time abstracts close for <a href="http://www.kscope18.odtug.com/page/abstact-submission" target="_blank">Kscope18</a> in October.<br /><br />That's the plan ;p<br /><br /> Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-2345140691317549957 Thu Jul 20 2017 11:04:00 GMT-0400 (EDT) Science Friday: Collect rocks, plant flag http://www.grassroots-oracle.com/2017/07/science-friday-collect-rocks-plant-flag-apollo11.html Every year that goes by firms my realisation that putting people on the moon was an absolutely stunning achievement.<br /><br />Almost 50 years ago a massive team of engineers helped put 3 highly skilled men in orbit around that giant rock in our sky, that is stunningly distant, yes infinitesimally close, <i>then </i>land, <i>then </i>take off again.<br /><br />While still doing the <a href="http://www.popularmechanics.com/space/rockets/a24429/hidden-figures-real-story-nasa-women-computers/" target="_blank">math by hand.</a><br /><a href="http://www.popularmechanics.com/space/rockets/a24429/hidden-figures-real-story-nasa-women-computers/" target="_blank"><br /></a>I think the best perspective of the distance in a scale overhead.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-w-lBqPsJIiw/WXC_mbCXikI/AAAAAAAAQ3c/vLqj1J3x92oIxFeYHt0Ac6qqh5SVN_AAgCLcBGAs/s1600/Earth_Moon.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="226" data-original-width="1325" height="66" src="https://3.bp.blogspot.com/-w-lBqPsJIiw/WXC_mbCXikI/AAAAAAAAQ3c/vLqj1J3x92oIxFeYHt0Ac6qqh5SVN_AAgCLcBGAs/s400/Earth_Moon.gif" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><a href="http://calgary.rasc.ca/moonscope.htm" target="_blank">Ranging the moon</a></td></tr></tbody></table>It's best behind a bunch of black, or a view from a&nbsp;<a href="http://earthsky.org/space/hirise-image-earth-moon-nov-20-2016" target="_blank">telescope orbiting Mars</a>., but consider it in light seconds.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-5unic9BDvf4/WXC_h5TZ5kI/AAAAAAAAQ3Y/VrLlV7ey1qsGCKZsNeztIy91uHHkuJb_ACLcBGAs/s1600/Distance_From_Earth_to_Moon_In_Light_Seconds.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="181" data-original-width="1031" height="56" src="https://2.bp.blogspot.com/-5unic9BDvf4/WXC_h5TZ5kI/AAAAAAAAQ3Y/VrLlV7ey1qsGCKZsNeztIy91uHHkuJb_ACLcBGAs/s320/Distance_From_Earth_to_Moon_In_Light_Seconds.gif" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><a href="https://en.wikipedia.org/wiki/File:Distance_From_Earth_to_Moon_In_Light_Seconds.gif" target="_blank">Wiki</a></td></tr></tbody></table><br />Then put some men in a hunk of metal utop a chemical&nbsp;<strike>missile</strike>&nbsp;rocket over a period of days.<br /><br />Last year the twitter account <a href="https://twitter.com/ReliveApollo11" target="_blank">@ReliveApollo11</a> recreated the days surrounding the landing, to help those of us too young to have experienced the timeline over the wireless as it happened.<br /><blockquote class="twitter-tweet" data-lang="en"><div dir="ltr" lang="en">The Moon is in both shadow and earthshine, filling 3/4 of the hatch window. Neil says, “it’s a view worth the price of the trip.” <a href="https://twitter.com/hashtag/Apollo11?src=hash">#Apollo11</a></div>— Apollo 11 (@ReliveApollo11) <a href="https://twitter.com/ReliveApollo11/status/887685717866016772">July 19, 2017</a></blockquote><script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script><br />Anyone can view it, and I highly recommend you try transport yourself to another time.<br /><br />Blog title thanks to the 10c <a href="https://timesmachine.nytimes.com/timesmachine/1969/07/21/issue.html?smid=tw-nytarchives&amp;smtyp=cur" target="_blank">New York Times</a> from that day #Apollo11 Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-182342019784600483 Thu Jul 20 2017 10:51:00 GMT-0400 (EDT) A Birthday This Big Deserves an Entire Year of Celebrations – Happy Birthday ODTUG! http://www.odtug.com/p/bl/et/blogaid=739&source=1 A Birthday This Big Deserves an Entire Year of Celebrations – Happy Birthday ODTUG! If you think you know everything about ODTUG’s history – think again! We’ve picked the minds of many long-time ODTUGers and compiled this list of memorable ODTUG milestones. ODTUG http://www.odtug.com/p/bl/et/blogaid=739&source=1 Wed Jul 19 2017 16:12:34 GMT-0400 (EDT) Oracle Application Express Curriculum Announcement - an Addendum http://joelkallman.blogspot.com/2017/07/oracle-application-express-curriculum.html Earlier today, on the <a href="https://blogs.oracle.com/apex/oracle-announces-oracle-application-express-curriculum" target="_blank">"official" Oracle APEX blog</a>, I published the announcement of the release of the Oracle Application Express curriculum with a permissive-use license.<br /><br />Firstly, many thanks go to <a href="https://twitter.com/chaitanya_in" target="_blank">Chaitanya Koratamaddi</a>, a product manager on the <a href="https://apex.oracle.com/" target="_blank">Oracle APEX</a> team, based out of Hyderabad, India. &nbsp;Chaitanya worked tirelessly on the development of this curriculum over the past year. &nbsp;It's been a grand goal of ours to quickly grow the global APEX community, and one of the best ways to do this is by working with educators. &nbsp;As I said in <a href="http://joelkallman.blogspot.com/2017/04/developing-training-course-or.html" target="_blank">an earlier blog post</a>, while education in Oracle Application Express (APEX) is offered as a part of many university and secondary school courses around the globe, in most cases, the educators took it upon themselves to develop their own custom curriculum. &nbsp;We wanted to make it easy for new educators to adopt Oracle Application Express as part of a secondary school or university curriculum, and this freely offered curriculum will go a long way towards that.<br /><br />Once the curriculum was developed and published, then the real fun began, namely, working within Oracle to have the curriculum released with a permissive use license. &nbsp;One of the primary reasons for a permissive-use license was to be able to engage the ever-vibrant <a href="https://apex.world/" target="_blank">Oracle APEX community</a> in the crowd-sourcing of translated content, as evidenced by <a href="http://translate-apex.com/">translate-apex.com</a>. &nbsp;If this curriculum content was provided with a standard Oracle copyright, then translation of the content by a third-party couldn't even be considered. &nbsp;We were told from the outset that it was very unlikely this request for a permissive-use license would ever be approved by one or more of the approving lines of business within Oracle. &nbsp;We were asked if this was this ever done before at Oracle, and to our knowledge, it was not. &nbsp;Setting precedent is never a good position to be in when you're humbly seeking approvals. ;)<br /><br />However, after numerous months and rewriting the business justification numerous times, all approvals were obtained within Oracle. &nbsp;And from this, I have two simple observations:<br /><br /><ol><li><a href="https://www.oracle.com/" target="_blank">Oracle</a> is changing, and for the better. &nbsp;Five years ago, there is zero chance this would have ever been approved within Oracle. &nbsp;Zero.<br /></li><li><a href="https://apex.oracle.com/" target="_blank">Oracle Application Express</a> leads this great company...again.</li></ol><br /><br />If you're interested in the freely available curriculum for Oracle APEX, please visit <a href="http://apex.oracle.com/education">apex.oracle.com/education</a>. Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-2460713018394202422 Wed Jul 19 2017 16:09:00 GMT-0400 (EDT) Oracle Announces Oracle Application Express Curriculum https://blogs.oracle.com/apex/oracle-announces-oracle-application-express-curriculum <p>The curriculum for <a href="https://apex.oracle.com" target="_blank">Oracle Application Express</a> (APEX) 5.1 is now generally available. &nbsp;Additionally, the Oracle Application Express curriculum is now available with a permissive-use license, namely Creative Commons Attribution 4.0 International Public License and Universal Permissive License (UPL) Version 1.0.</p> <p>The Application Express courseware, which has been in development for the past year, includes 16 distinct lessons, complete with PowerPoint presentations, hands-on-labs in PDF format and all necessary SQL scripts and application export files. &nbsp;Additionally, the source files of the hands-on-labs are provided in Microsoft Word format, suitable for translation or excerpting.</p> <p>The <a href="https://apex.world" target="_blank">Oracle APEX community</a> has come together in the past to provide crowd-sourced translations for the runtime user interface of Oracle Application Express (see <a href="https://translate-apex.com" target="_blank">translate-apex.com</a>). &nbsp;Oracle intends to work directly with the owners of translate-apex.com (<a href="http://pretius.com/" target="_blank">Pretius sp. z o.o. sk</a>) to organize and provide the crowd-sourced translations of the Oracle Application Express curriculum, making native-language Oracle APEX educational materials freely available to all, globally.</p> <p>If you are an educator at an accredited institution, you are also able to access this same curriculum for free from <a href="https://academy.oracle.com" target="_blank">Oracle Academy</a>, as part of the <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#apexdevfound" target="_blank">Oracle Application Express &ndash; Application Development Foundations</a>. &nbsp;With Oracle Academy, you gain access to a hosted work environment for your students (no software to install), you can track your students progress, and there are specialized learning paths and access to other curriculum, including <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#dbfound">Database Foundations</a>, <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#datasql" target="_blank">Database Design and Programming with SQL</a> and <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#progsql" target="_blank">Programming with PL/SQL</a>. &nbsp;For more information, visit <a href="https://academy.oracle.com" target="_blank">academy.oracle.com</a>.</p> <p>The Application Express curriculum will be kept up to date with future major releases of Oracle Application Express, with the goal of releasing the updated curriculum on the same day as the product release. &nbsp;Additionally, it is Oracle&#39;s future goal to share these resources with the Application Express community and maintain them in a <a href="https://github.com/oracle" target="_blank">github repository</a>, with the same permissive use license.</p> <p>If you wish to download the Oracle Application Express curriculum, you can access it directly at <a href="https://apex.oracle.com/education">apex.oracle.com/education</a>.</p> Additional Information <p>Oracle Application Express is a high productivity platform for creating declarative, low code Web applications on the <a href="https://www.oracle.com/database" target="_blank">Oracle Database</a> and in the <a href="https://cloud.oracle.com/database" target="_blank">Oracle Cloud</a>. &nbsp;To learn more about Oracle Application Express, visit <a href="https://apex.oracle.com" target="_blank">apex.oracle.com</a>. &nbsp;To learn more about Oracle Database Cloud, visit <a href="https://cloud.oracle.com/database" target="_blank">cloud.oracle.com/database</a>. &nbsp;To access the Oracle Application Express curriculum, visit <a href="https://apex.oracle.com/education" target="_blank">apex.oracle.com/education</a>.</p> Joel Kallman https://blogs.oracle.com/apex/oracle-announces-oracle-application-express-curriculum Wed Jul 19 2017 06:30:00 GMT-0400 (EDT) Oracle Announces Oracle Application Express Curriculum https://blogs.oracle.com/apex/oracle-announces-oracle-application-express-curriculum <p>The curriculum for <a href="https://apex.oracle.com" target="_blank">Oracle Application Express</a> (APEX) 5.1 is now generally available. &nbsp;Additionally, the Oracle Application Express curriculum is now available with a permissive-use license, namely Creative Commons Attribution 4.0 International Public License and Universal Permissive License (UPL) Version 1.0.</p> <p>The Application Express courseware, which has been in development for the past year, includes 16 distinct lessons, complete with PowerPoint presentations, hands-on-labs in PDF format and all necessary SQL scripts and application export files. &nbsp;Additionally, the source files of the hands-on-labs are provided in Microsoft Word format, suitable for translation or excerpting.</p> <p>The <a href="https://apex.world" target="_blank">Oracle APEX community</a> has come together in the past to provide crowd-sourced translations for the runtime user interface of Oracle Application Express (see <a href="https://translate-apex.com" target="_blank">translate-apex.com</a>). &nbsp;Oracle intends to work directly with the owners of translate-apex.com (<a href="http://pretius.com/" target="_blank">Pretius sp. z o.o. sk</a>) to organize and provide the crowd-sourced translations of the Oracle Application Express curriculum, making native-language Oracle APEX educational materials freely available to all, globally.</p> <p>If you are an educator at an accredited institution, you are also able to access this same curriculum for free from <a href="https://academy.oracle.com" target="_blank">Oracle Academy</a>, as part of the <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#apexdevfound" target="_blank">Oracle Application Express &ndash; Application Development Foundations</a>. &nbsp;With Oracle Academy, you gain access to a hosted work environment for your students (no software to install), you can track your students progress, and there are specialized learning paths and access to other curriculum, including <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#dbfound">Database Foundations</a>, <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#datasql" target="_blank">Database Design and Programming with SQL</a> and <a href="https://academy.oracle.com/en/solutions-curriculum-full.html#progsql" target="_blank">Programming with PL/SQL</a>. &nbsp;For more information, visit <a href="https://academy.oracle.com" target="_blank">academy.oracle.com</a>.</p> <p>The Application Express curriculum will be kept up to date with future major releases of Oracle Application Express, with the goal of releasing the updated curriculum on the same day as the product release. &nbsp;Additionally, it is Oracle&#39;s future goal to share these resources with the Application Express community and maintain them in a <a href="https://github.com/oracle" target="_blank">github repository</a>, with the same permissive use license.</p> <p>If you wish to download the Oracle Application Express curriculum, you can access it directly at <a href="https://apex.oracle.com/education">apex.oracle.com/education</a>.</p> Additional Information <p>Oracle Application Express is a high productivity platform for creating declarative, low code Web applications on the <a href="https://www.oracle.com/database" target="_blank">Oracle Database</a> and in the <a href="https://cloud.oracle.com/database" target="_blank">Oracle Cloud</a>. &nbsp;To learn more about Oracle Application Express, visit <a href="https://apex.oracle.com" target="_blank">apex.oracle.com</a>. &nbsp;To learn more about Oracle Database Cloud, visit <a href="https://cloud.oracle.com/database" target="_blank">cloud.oracle.com/database</a>. &nbsp;To access the Oracle Application Express curriculum, visit <a href="https://apex.oracle.com/education" target="_blank">apex.oracle.com/education</a>.</p> Joel Kallman https://blogs.oracle.com/apex/oracle-announces-oracle-application-express-curriculum Wed Jul 19 2017 06:30:00 GMT-0400 (EDT) Retire Your E-Business Suite Data in Style with APEX http://www.jmjcloud.com/blog/retire-your-e-business-suite-data-in-style-with-apex <h2 class="wsite-content-title">The Situation</h2> <span class='imgPusher' style='float:left;height:0px'></span><span style='display: table;width:211px;position:relative;float:left;max-width:100%;;clear:left;margin-top:0px;*margin-top:0px'><a><img src="http://www.jmjcloud.com/uploads/7/8/4/7/78474242/published/keepcalmandretire-min.png?1500136958" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 10px; border-width:0; max-width:100%" alt="Picture" class="galleryImageBorder wsite-image" /></a><span style="display: table-caption; caption-side: bottom; font-size: 90%; margin-top: -0px; margin-bottom: 0px; text-align: center;" class="wsite-caption"></span></span> <div class="paragraph" style="display:block;"><span style="color:rgba(0, 0, 0, 0.87)">Oracle E-Business Suite is an old friend. I have been implementing and extending EBS since 1994 (think version 9.4 character mode). There comes a time, however, when we need to move onto the next big thing. If only it was as easy to move to the next ERP as it is to upgrade your iPhone. If you have made the decision to move to Oracle ERP Cloud but are wondering what to do with the years and years of accumulated EBS data, then this post is for you. With APEX and some EBS know how, there is an affordable way to sunset your EBS environment without having to either convert all of the data or maintain your old EBS environment for the next 5-10 years.</span></div> <hr style="width:100%;clear:both;visibility:hidden;"></hr> <h2 class="wsite-content-title">The Problem</h2> <span class='imgPusher' style='float:left;height:0px'></span><span style='display: table;width:220px;position:relative;float:left;max-width:100%;;clear:left;margin-top:0px;*margin-top:0px'><a><img src="http://www.jmjcloud.com/uploads/7/8/4/7/78474242/published/oracle-ebs-min.png?1500137334" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; border-width:0; max-width:100%" alt="Picture" class="galleryImageBorder wsite-image" /></a><span style="display: table-caption; caption-side: bottom; font-size: 90%; margin-top: -0px; margin-bottom: 0px; text-align: center;" class="wsite-caption"></span></span> <div class="paragraph" style="display:block;"><span style="color:rgba(0, 0, 0, 0.87)">The problem is that in many cases you are legally required to keep your ERP data for many years (100 years if you are into Nuclear Energy!). One option is to keep EBS up and running in view only mode. Maintaining the hardware to keep the full EBS stack up and running, however, is not cheap. When you add the cost of keeping it patched and secure you end up with pretty much the same headache you were trying to get rid of by going to the cloud in the first place. Just shifting all this software to AWS or Oracle IaaS really doesn't help much either.<br />&#8203;</span><br />Implementers<span style="color:rgba(0, 0, 0, 0.87)">&nbsp;will convert your data to ERP Cloud for you but this can get expensive quickly. The more years of data you have and the more complex the data you are migrating, the bigger the bill. If you are converting anything more than the legally required number of years of General Ledger, your master data and any high volume open transactions then the chances are you are paying more than you need to. If you can reduce the amount and types of data you have to move to ERP Cloud you can reduce the implementation bill significantly. No matter what data you are able to convert, however, the chances are you will still be required to retain much of your EBS data for at least 5-10 years.</span></div> <hr style="width:100%;clear:both;visibility:hidden;"></hr> <h2 class="wsite-content-title">The Solution (APEX to the Rescue)</h2> <span class='imgPusher' style='float:left;height:0px'></span><span style='display: table;width:auto;position:relative;float:left;max-width:100%;;clear:left;margin-top:0px;*margin-top:0px'><a><img src="http://www.jmjcloud.com/uploads/7/8/4/7/78474242/published/apex-logo-no-words-min_1.png?1500136298" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 10px; border-width:0; max-width:100%" alt="Picture" class="galleryImageBorder wsite-image" /></a><span style="display: table-caption; caption-side: bottom; font-size: 90%; margin-top: -0px; margin-bottom: 0px; text-align: center;" class="wsite-caption"></span></span> <div class="paragraph" style="display:block;"><span style="color:rgba(0, 0, 0, 0.87)">We were recently given this challenge by a customer. They had a legacy EBS R11.5.10 environment they had inherited during an acquisition. The data had long since been converted to their corporate EBS R12 environment but they had to keep the old environment open for audit purposes. It was running on aging Sun Hardware and was becoming increasingly challenging to manage.<br />&#8203;</span><br /><span style="color:rgba(0, 0, 0, 0.87)">We proposed migrating just the database to a much smaller Linux Server and putting an APEX front end on it. Not only does this solve the problem of maintainability and cost, it also gives users a modern easy to use UI to work with.</span><br /><br /><span style="color:rgba(0, 0, 0, 0.87)">Now that this is up and running and the old hardware retired, the next step is to move just the tables they need to a PaaS cloud service. We are thinking we can squeeze this into something like Exadata Express ($175/month for 20GB). That a big step down from maintaining a full EBS environment for something that is accessed a dozen or so times a year.</span></div> <hr style="width:100%;clear:both;visibility:hidden;"></hr> <h2 class="wsite-content-title">Why APEX?</h2> <div class="paragraph">I believe APEX is uniquely suited to solving this problem:<ol><li>It runs off an Oracle database (which you have anyway)</li><li>All it needs to run (aside from the database) is ORDS which, when run in standalone mode offers a tiny footprint when compared to the full EBS stack.</li><li>The data and APEX application can be easily moved to a cloud service (such as Exadata Express).</li><li>APEX offers an&nbsp;easy to use and powerful reporting capability with build in advanced end user features such as Aggregation, Grouping, Charting, Filtering, Pivoting etc. All based on a simple SQL statement.</li><li>APEX allows you to integrate various security models so users could login using their current Active Directory credentials.</li></ol></div> <h2 class="wsite-content-title">Sneak Peek</h2> <div class="paragraph">I'll leave you with a sneak peak of what we built. The application was built using the latest version of APEX (as of time of writing 5.1.2). It handles the various EBS organization constructs, Operating Units, Legal Entities, Ledgers, Inventory Organizations etc.</div> <div><div style="height:10px;overflow:hidden"></div> <div id='386566907123073892-slideshow'></div> <div style="height:10px;overflow:hidden"></div></div> http://www.jmjcloud.com/blog/retire-your-e-business-suite-data-in-style-with-apex Sun Jul 16 2017 01:00:00 GMT-0400 (EDT) DOAG #NextGEN goes POUG http://www.apex-at-work.com/2017/07/doag-nextgen-goes-poug.html Hallo liebe Oracle Community,<br /><br />die letzten Wochen und Monate waren etwas sehr hektisch, daher hatte ich auch keine Zeit für Blogposts rund um Oracle und APEX. Der Grund lag in meiner Aktivität in der <a href="https://www.doag.org/de/nextgen/nextgen/" target="_blank">DOAG #NextGEN Community.</a> Wir als Community planten ein Studenten- und Azubi-Event für Oracle Technologien.<br /><br />Das Ergebnis ist eine Reise zur <a href="http://poug.org/en/edycja/high-five-poug/" target="_blank">POUG</a> nach Krakau. <br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-RkDbhW4lOZ0/WWkhzy8YtzI/AAAAAAAABxo/HyuY93myHpsTlxa9cnYQnOPtUKU45sBxgCLcBGAs/s1600/HIGH_FIVE_POUG___Ora-600.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="685" data-original-width="1600" height="274" src="https://1.bp.blogspot.com/-RkDbhW4lOZ0/WWkhzy8YtzI/AAAAAAAABxo/HyuY93myHpsTlxa9cnYQnOPtUKU45sBxgCLcBGAs/s640/HIGH_FIVE_POUG___Ora-600.png" width="640" /></a></div><br />Mit dabei sind die bekanntesten Oracle Speaker aus ganz Europa.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Sub-Lpzxv9o/WWkiR-4vt8I/AAAAAAAABxs/-DbVKDeQgzcVbyM-QiCN_gJqZXhAVNmhgCLcBGAs/s1600/Sabine_%25E2%2588%259E_Heimsath_on_Twitter___OMG__they_hardly_fit_on_one_page___POUG2017_is_gonna_be_ACE_%25E2%2599%25A0%25EF%25B8%258F_https___t_co_3buuxpouXs_.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1125" height="640" src="https://1.bp.blogspot.com/-Sub-Lpzxv9o/WWkiR-4vt8I/AAAAAAAABxs/-DbVKDeQgzcVbyM-QiCN_gJqZXhAVNmhgCLcBGAs/s640/Sabine_%25E2%2588%259E_Heimsath_on_Twitter___OMG__they_hardly_fit_on_one_page___POUG2017_is_gonna_be_ACE_%25E2%2599%25A0%25EF%25B8%258F_https___t_co_3buuxpouXs_.png" width="449" /></a></div><br />Und genau dieses Event, das sich so drastisch von allen anderen Oracle Community Events in Europa unterscheidet, möchten wir nutzen, um den Studenten einen Einblick in die DBA- und Development-Community zu geben.<br /><br />Gemeinsam mit der DOAG haben wir so den <a href="https://www.doag.org/index.php?id=941" target="_blank">POUG Trip: DOAG #NextGEN goes POUG</a> auf die Beine gestellt.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-8Q0bGTCayuU/WWkk-NZEgRI/AAAAAAAABxw/13vBajENmsE6wfUki846npNJXPYkzE6jQCLcBGAs/s1600/Banners_and_Alerts_und_POUG_Trip__DOAG_e_V_.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="780" data-original-width="1600" height="308" src="https://3.bp.blogspot.com/-8Q0bGTCayuU/WWkk-NZEgRI/AAAAAAAABxw/13vBajENmsE6wfUki846npNJXPYkzE6jQCLcBGAs/s640/Banners_and_Alerts_und_POUG_Trip__DOAG_e_V_.png" width="640" /></a></div><br />Wir planen, mit einem Bus von Berlin aus nach Krakau zu fahren. Unsere Gruppe wird aus 20 Studenten, Azubis und einigen DOAG Community Mitgliedern bestehen. Aktuell suchen wir noch nach 3-4 Sponsoren, die bei diesem Event mit machen möchten. Es geht darum, einem Studenten oder Auszubildenden diese Reise kostenlos zu ermöglichen, um mit deren Hilfe die Oracle Community auch jüngeren ITlern wieder näher zu bringen. Wir hoffen natürlich auf einen viralen Effekt und wollen rund um das Event so viel Lärm wie möglich machen, damit alle von unserer aktiven Community erfahren.<br /><br />Ihr habt selbst Studenten / Azubis die im Oracle Umfeld tätig sind? Dann sollen diese sich einfach anmelden, um so die Chance zu erhalten, eine der begehrten Wildcards zu bekommen. Die Konferenz ist international aufgestellt, und fast alle Vorträge werden auf Englisch gehalten.<br /><br />Ich kenne viele in der Community, die sich auch privat an solch einem Event beteiligen würden, daher mein Vorschlag: Rottet euch zusammen und einer meldet sich dann bei der DOAG als Sponsor an.<br />Denn wenn jeder einzeln kommt, dann steigt mir die DOAG wahrscheinlich aufs Dach. :)<br /><br />Ps.: Die Kosten für einen Studenten betragen 600 € (beinhaltet Reise, Hotel, Ticket, Verpflegung).<br /><br />Bei Fragen steht die DOAG gern bereit, diese zu beantworten: +4970011362438<br /><br /><br />Danke schon mal vorab für eure Hilfe! Tobias Arnhold tag:blogger.com,1999:blog-6481483192141562388.post-6723831635243267853 Sat Jul 15 2017 15:32:00 GMT-0400 (EDT) Insum’s Kscope17 Highlights https://www.insum.ca/odtug-kscope17-highlights/ <h1>Insum’s Kscope17 Highlights</h1> <h2>Monty Latiolais</h2> <p>Another KScope has come and gone. It seemed it would never arrive, but then is over way too soon.</p> <p>This years&#8217; conference being in San Antonio was special. I lived there from 2003 to 2010. My son was born there. We still maintain great friends in the area. But my fondest memory of San Antonio centered around KScope12. Great conference. Great attendance. Definitely my fondest memory of San Antonio until now. KScope 17 changed all that.</p> <div>Where do I begin?</div> <div></div> <div>For me, Kscope is about giving back&#8230;giving back to the organization that has meant so much to me over the years&#8230;giving back to the development community&#8230;giving back to the host city. This year, I arrived too late to participate in the Community Service Day, but I was only too happy to volunteer in the Kscope Kid’s Labs for my good friend, Jeremy Harms of EmeraldCube. For those unfamiliar with Jeremy, all you need to do is go to <a href="http://www.vinecitycodecrew.org">www.vinecitycodecrew.org</a> and prepare to be inspired.</div> <p>The labs were powered by RaspberryPi’s and were broken down by ages. The youngest learned some basic programming elements using a graphical language called Scratch. Older kiddos took total control of Minecraft writing Python scripts that did everything from creating cityscapes to constructing TNT pyramids &#8211; and then of course detonating them using a plunger they cobbled together on an associated breadboard. Big explosions! Big fun!<img class="wp-image-9130 size-large aligncenter" src="https://www.insum.ca/wp-content/uploads/2017/07/monty-kscope17-600x477.jpg" alt="monty-kscope17" width="600" height="477" srcset="https://www.insum.ca/wp-content/uploads/2017/07/monty-kscope17-600x477.jpg 600w, https://www.insum.ca/wp-content/uploads/2017/07/monty-kscope17-300x239.jpg 300w, https://www.insum.ca/wp-content/uploads/2017/07/monty-kscope17-768x611.jpg 768w, https://www.insum.ca/wp-content/uploads/2017/07/monty-kscope17-450x358.jpg 450w, https://www.insum.ca/wp-content/uploads/2017/07/monty-kscope17.jpg 786w" sizes="(max-width: 600px) 100vw, 600px" /></p> <p>This was the first year of the Kid’s Labs, but based on the reaction of both the kids and the parents, I expect it won’t be the last.</p> <div> <p>Sunday night&#8217;s Welcome Reception was a constant parade of people coming by the Insum booth &#8211; old friends and new talking APEX 5.1, AOP, EBS extensions and just catching up. I&#8217;ve often said KScope is like a family reunion and Sunday night, that was certainly on full display. Word got around pretty quick that we had Insum logo&#8217;d fidget spinners. Hundreds were gone in a flash.</p> <p>Monday was seemingly a day of days. The balance of Monday was spent helping customers through our Book An Expert offering. It&#8217;s great to see just how widespread the use of APEX has become. Clients from a wide range of industries brought their issues to us and guys like Jorge, Adrian and Vincent hit it out of the park. Monday night at KScope is Community night. David Schleis and I had responsibilities with the Database community (see David&#8217;s entry below) so I wasn&#8217;t able to see first hand the APEX Open-Mic Night. I&#8217;m certain it did not disappoint.</p> </div> <div>Tuesday morning was Insum&#8217;s Vendor Presentation and what a time it was. Joined onstage by Martin d&#8217;Souza and Jorge Rimblas, we focused on just how APEX is akin to a breadboard, as you can quickly connect or integrate third-party components with very little effort. Martin demonstrated how to generate Excel spreadheets using APEX and nodeJS. Need to incorporate Visio-like functionality in your APEX app? Talk to me. Jorge wowed folks with a front end using Knockout.js  The feedback we received was overwhelmingly positive. People liked the fact that we weren&#8217;t there to sell them anything. We were there to show them how to leverage their investment in APEX.</div> <div></div> <div>When I think of Wednesday I can&#8217;t help but think of the Special Event. For her 20th birthday, ODTUG brought back memories of some of the Special Events of the past. I spent most of my time outside under the pavilion just taking it all in. Looking at what the event has become and knowing where it came from, ODTUG should be very proud of it&#8217;s place in the Oracle ecosystem.</div> <div></div> <div>While Thursday may only be a half day, it was chocked full of good stuff. Jorge MC&#8217;d a session of APEX Lightening Talks by Dimitri, Scott, Martin, Vincent and Peter among others. It culminated with Joel explaining just how prevalent APEX is within the halls of Oracle&#8230;to the tune of a billion page views&#8230;that&#8217;s billion with a &#8216;B&#8217;</div> <p>&nbsp;</p> <h2>Jackie McIlroy</h2> <p>This was my first Kscope and, y&#8217;all, I was impressed! Not only by ODTUG as an organization, but also with the Oracle and APEX communities. I could not be more proud to be a part of such a friendly and vibrant group of people. I very much enjoyed meeting with all of the bloggers, presenters, and experts that I have followed through the years and who have helped me throughout my career. Everyone in the APEX community is eager to share their knowledge and help others, and I left the conference with a renewed desire to give back to the community that has given so much to me.</p> <p>One of my favorite sessions was the #LetsWreckThisTogether APEX Talks. This was the final session of the APEX Track and a great way to finish out the conference. Thought leaders in the APEX community gave short 10 minute presentations that highlight tips, tricks, or shortcuts to make APEX development easier and faster. I learned something new from each and every one of these fun, fast-paced presentations.</p> <p>Another of my favorite events was the Women in Technology (WIT) Luncheon. During the luncheon attendees were divided into small groups to discuss solutions to real issues that women face in a male dominated industry. It was really refreshing to see a number of men attend this event and to get their perspective on the issues we discussed. I encourage more men to get involved in the WIT community &#8211; I promise, we aren&#8217;t scary <img src="https://s.w.org/images/core/emoji/2.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p> <p>I also really enjoyed getting to talk to all of the people who stopped by the Insum booth. I had an absolute blast meeting new friends that had just had their interests piqued by APEX during the conference and wanted to learn more about how it could help them in their current or future projects. It was also my pleasure to meet current and past clients that just stopped by to say hello and let us know how solutions Insum has implemented for them are still adding value to their organizations.</p> <p>&nbsp;</p> <h2>Michel St-Amour</h2> <p>Kscope is our favourite conference of the year and for so many reasons this year, it earned top honours again. As we’re now positioned across North America and Peru, the week provides the opportunity for our team to see each other face-to-face. We’re also fortunate to be able to chat with many of our clients and partners during our annual appreciation event at Kscope.</p> <p><img class="size-full wp-image-9127 aligncenter" src="https://www.insum.ca/wp-content/uploads/2017/07/insum-client-event-1.jpg" alt="insum-client-event" width="1000" height="667" srcset="https://www.insum.ca/wp-content/uploads/2017/07/insum-client-event-1.jpg 1000w, https://www.insum.ca/wp-content/uploads/2017/07/insum-client-event-1-300x200.jpg 300w, https://www.insum.ca/wp-content/uploads/2017/07/insum-client-event-1-768x512.jpg 768w, https://www.insum.ca/wp-content/uploads/2017/07/insum-client-event-1-600x400.jpg 600w, https://www.insum.ca/wp-content/uploads/2017/07/insum-client-event-1-880x587.jpg 880w, https://www.insum.ca/wp-content/uploads/2017/07/insum-client-event-1-450x300.jpg 450w" sizes="(max-width: 1000px) 100vw, 1000px" /></p> <p>&nbsp;</p> <p>This ODTUG conference is also a collection of our year’s hard work. Our team presented 10 sessions and our vendor presentation, <a href="https://www.insum.ca/breadboard-innovation-oracle-apex/">APEX is a Breadboard</a>. It’s incredible to see the recognition from the community as well. I’m proud to say we collected a few awards:</p> <ul> <li><strong>Innovation Award:</strong> Vincent Morneau for <em>APEX Nitro</em></li> <li><strong>ODTUG Volunteer Award:</strong> Adrian Png</li> <li><strong>Top APEX Track Speaker:</strong> Martin D’Souza &#8211; <em>Explore the APEX APIs</em></li> <li><strong>Best Overall Speaker:</strong> Martin D’Souza &#8211; <em>Explore the APEX APIs</em></li> </ul> <p>The APEX community continues to give and we’re more than happy to contribute by supporting Monday evening’s APEX Community/Open Mic Night and the APEX Track. Our very own, Vincent Morneau’s contributions to the Oracle community were recognized by receiving Oracle ACE status!</p> <p>Kscope continues to be a highlight of our year and we’re excited to be back next year.</p> <p>&nbsp;</p> <h2>Adrian Png</h2> <p>It was a nostalgic return to San Antonio for me where I attended my very first Kscope conference five years ago! I am a huge fan of Texan cuisine, and not surprising, ODTUG delivered again!</p> <p>The keyword for me this year is “sharing” for the following reasons:</p> <ol> <li>This was the first Kscope I have had to deliver two presentations. As stressful as it might be, I was happy to be talking about my experiences in various projects I have worked on throughout the past two years. I was very happy to hear from attendees after, that they had faced similar challenges and the solutions I have shared will be helpful in some way. I am looking forward to making my sample codes available in the coming weeks!</li> <li>I had at least two conversations with attendees who had praised Insum for not being “just about business”. Our history of blog posts, presentations and open source contributions were a hallmark of our desire to help organizations, invested in Oracle APEX, be successful. I am proud to be a part of this effort and grateful that the management is super-supportive of employees in their involvement with the community.</li> <li>It’s been said that it’s not the destination, but the journey that counts. It was a proud moment for all of us at Insum, to have bagged that many awards this year. They remind us of how sharing knowledge, technology and time make a difference in our community, and that we now have a greater responsibility to keep that flame burning bright!</li> </ol> <p>&nbsp;</p> <h2>Daniel Boudreault</h2> <p>As a Kscope noob, everything at the conference was new and there was so much to take in.  I felt like every aspect of the conference was enough to fill the entire week, but you can’t be in more than one place at once. The number of presentations I wanted to attend alone were enough to fill two weeks. But even though I couldn’t attend them all, I left the conference with a wealth of new information. In addition to all the presentations, everyone at the conference, presenters and attendees alike, were all accessible and friendly.  The event really leaves one overwhelmed, but with great memories, information and so many new acquaintances and friends.</p> <p>The event itself is also very grandiose, for a first timer especially. The logistics of the event and the quality of everything from the food and special events to the presentations themselves is very impressive and a lot of fun.  While I can’t speak for all the tracks, all in all, Kscope is an event for anybody involved in the APEX and Oracle database communities and I’m sure the other tracks would echo that sentiment.</p> <p>Kscope is an event for anybody involved in the APEX and Oracle database communities and I’m sure the other tracks would echo that sentiment.</p> <p>&nbsp;</p> <h2>Jorge Rimblas</h2> <p>For me, this Kscope I was also returning to San Antonio for the second time, and the experienced matched the anticipation. I presented two sessions: JavaScript and CSS for PL/SQL Developers and  Deliver a Knockout with your APEX Applications. Both had excellent attendance, and I&#8217;m very thankful for that.</p> <p><img class="size-full wp-image-9128 aligncenter" src="https://www.insum.ca/wp-content/uploads/2017/07/jorge-rimblas.jpg" alt="jorge-rimblas" width="533" height="800" srcset="https://www.insum.ca/wp-content/uploads/2017/07/jorge-rimblas.jpg 533w, https://www.insum.ca/wp-content/uploads/2017/07/jorge-rimblas-200x300.jpg 200w, https://www.insum.ca/wp-content/uploads/2017/07/jorge-rimblas-400x600.jpg 400w, https://www.insum.ca/wp-content/uploads/2017/07/jorge-rimblas-450x675.jpg 450w" sizes="(max-width: 533px) 100vw, 533px" /></p> <p>One thing that stuck out for me was the number of other technologies all around us. People are using all sorts of things to deliver the highest quality solutions possible: from Docker, Knockout, Oracle JET, and even REST services. It&#8217;s clear that we can no longer focus on only the Oracle DB. JavaScript, for example, is everywhere. Is it the correct tool for all tasks? Absolutely not. Yet, it is a critical element, and as such, we would be well-served embracing it.</p> <p>This Kscope was also special to me because I completed my two-year term as APEX Content Chair. I&#8217;m very thankful for all the great content the speakers provided us and even more for the job the APEX Content Committee did to select it. I heard many positive comments that confirm what I already knew.</p> <p>&nbsp;</p> <h2>Vincent Morneau</h2> <p>This was my third Kscope and it did not disappoint. I was fortunate enough to come as a presenter, and while the additional stress can be a little tiring sometimes, it is entirely worth it. I was very happy with the attendance in my sessions and the feedback I received was absolutely overwhelming.</p> <p>It was a very lucky year for me, as I was awarded the ODTUG innovation award for APEX Nitro and I also became an Oracle Ace. Some part of me is thinking: it can only go down from here, but somehow I doubt it!</p> <p>Kscope is known for it’s incredible content that is accessible to everyone, but it is much more than just the content. It is about making connections. I always look forward to meet again people from all around the world; new people, but most importantly people I can now call friends.</p> <p>&nbsp;</p> <p><img class="size-full wp-image-9131 aligncenter" src="https://www.insum.ca/wp-content/uploads/2017/07/vincent-friends.jpg" alt="vincent-odtug-friends" width="1000" height="667" srcset="https://www.insum.ca/wp-content/uploads/2017/07/vincent-friends.jpg 1000w, https://www.insum.ca/wp-content/uploads/2017/07/vincent-friends-300x200.jpg 300w, https://www.insum.ca/wp-content/uploads/2017/07/vincent-friends-768x512.jpg 768w, https://www.insum.ca/wp-content/uploads/2017/07/vincent-friends-600x400.jpg 600w, https://www.insum.ca/wp-content/uploads/2017/07/vincent-friends-880x587.jpg 880w, https://www.insum.ca/wp-content/uploads/2017/07/vincent-friends-450x300.jpg 450w" sizes="(max-width: 1000px) 100vw, 1000px" /></p> <h2></h2> <h2>David Schleis</h2> <p>For me, the session highlights included seeing that modeling still matters as evidenced by several presentations on the topic. Also, I was particularly intrigued by a session by Simon Hunt on doing automated testing of APEX applications using an APEX application integrated with Selenium. This is definitely something I will be looking into.</p> <p>Monday night at KScope is Community night, and as an active member of the Database Community, I had a part to play in the proceedings. This year, the Database Community wanted to do something like the highly successful APEX Open-Mic Night, but not entirely like it. We decided on allowing folks to take the stage and show some of their favorite DB tricks, tips or techniques, or tell a joke or a story or juggle or whatever. We also added a Gong Show twist. So while I channeled Chuck Barris (tuxedo tee shirt and all) to keep things moving, and a panel of judges including our own Monty Latiolais looked on, audience members took their chance at getting their message across, or getting gonged. I’ll be honest; it was chaotic, but it was fun.</p> <p>Oh, and my best conference ever? That would be my very first ODTUG conference back in 1999 that got me started on the journey that has lead me here, being a member of the best Oracle APEX team in the world.</p> <p><img class="aligncenter wp-image-9168 size-large" src="https://www.insum.ca/wp-content/uploads/2017/07/schleis-600x600.png" alt="schleis odtug" width="600" height="600" srcset="https://www.insum.ca/wp-content/uploads/2017/07/schleis-600x600.png 600w, https://www.insum.ca/wp-content/uploads/2017/07/schleis-150x150.png 150w, https://www.insum.ca/wp-content/uploads/2017/07/schleis-300x300.png 300w, https://www.insum.ca/wp-content/uploads/2017/07/schleis-768x768.png 768w, https://www.insum.ca/wp-content/uploads/2017/07/schleis-100x100.png 100w, https://www.insum.ca/wp-content/uploads/2017/07/schleis-880x880.png 880w, https://www.insum.ca/wp-content/uploads/2017/07/schleis-450x450.png 450w, https://www.insum.ca/wp-content/uploads/2017/07/schleis.png 1024w" sizes="(max-width: 600px) 100vw, 600px" /></p> <p>The post <a rel="nofollow" href="https://www.insum.ca/odtug-kscope17-highlights/">Insum’s Kscope17 Highlights</a> appeared first on <a rel="nofollow" href="https://www.insum.ca">Insum</a>.</p> Monty Latiolais https://www.insum.ca/?p=9125 Fri Jul 14 2017 13:30:09 GMT-0400 (EDT) 10 Oracle plsql things you probably didn’t know https://svenweller.wordpress.com/2017/07/14/10-plsql-things-you-probably-didnt-know/ <p>Many people enjoyed reading my last blog post &#8220;10 Oracle SQL features you probably didn&#8217;t know&#8221;. So I decided to spice it up a little more and do something similar for plsql.</p> <p>I hope you like that one too.</p> <p>With our further ado, let&#8217;s get started with the list.</p> <h2>10. The first Oracle version to feature plsql was Oracle DB version 6 (1988)</h2> <p>And no. Steven Feuerstein did NOT invent it.</p> <p>At that time PLSQL did not have stored procedures nor did it have proper exception handling. But it already had embedded SQL.</p> <p>I learned that from the great <a href="http://www.dba-oracle.com/t_edb_pl_sql_features_release.htm" target="_blank" rel="noopener">Lewis Cunningham</a>. One of the godfathers of development with SQL and PLSQL.</p> <p>Stored Procedures were added in Oracle 7 (1992). 7.3 was the version when I started to work with an Oracle Database. At that point plsql was in version 2.x. However there never was a version 3. Plsql versioning jumped to 8 when Oracle DB version 8 was introduced and plsql versioning was aligned with the db versions. So there are no plsql versions 3-7. But honestly? Nobody cares anymore that plsql does have its own versioning.</p> <h2>9. labels do not need to match</h2> <p>We can use &lt;&lt;labels&gt;&gt; in plsql. Mostly to increase readability of code. This is especially useful for loop constructs, but it also works for normal begin..end blocks.</p> <pre>begin &lt;&lt;<span style="color:#ff0000;">mainloop</span>&gt;&gt; loop &lt;&lt;<span style="color:#0000ff;">check_some</span>&gt;&gt; begin &lt;&lt;<span style="color:#99cc00;">dummyloop</span>&gt;&gt; for r in (select * from dual) loop <span style="color:#008000;">-- do nothing</span> null; end loop <span style="color:#99cc00;">dummyloop</span>; end <span style="color:#0000ff;">check_some</span>; exit when 1=1; end loop <span style="color:#ff0000;">mainloop</span>; end; /</pre> <p>As we can see there are several &lt;&lt;labels&gt;&gt;. And the usage of those labels at the &#8220;end&#8221; helps to distinguish which code part we are looking at <a title="link to footnote" href="#footnote1"><sup>[1]</sup></a>.</p> <p><em><strong>But this is only as good as the programmer is!</strong></em></p> <p>Unfortunatly this works too:</p> <pre>begin &lt;&lt;<span style="color:#ff0000;">mainloop</span>&gt;&gt; loop &lt;&lt;<span style="color:#0000ff;">check_some</span>&gt;&gt; begin &lt;&lt;<span style="color:#99cc00;">dummyloop</span>&gt;&gt; for r in (select * from dual) loop <span style="color:#008000;">-- do nothing</span> null; end loop <span style="color:#99cc00;">mainloop</span>; end <span style="color:#0000ff;">check_sum</span>; exit when 1=1; end loop <span style="color:#ff0000;">dummyloop</span>; end; /</pre> <p>Here I mixed up the labels from the loops. And the &#8220;end check_<strong>sum</strong>&#8221; does not match the label at the beginning of the block. In fact the &#8220;label&#8221; at the end can be anything that is not a reserved word.</p> <p>It runs identical to the previous code (still doing nothing). But it is way more confusing for the &#8220;future me&#8221; that has to maintain this mess.</p> <h2>8. pragma SERIALLY_REUSABLE</h2> <p>During the lifetime of a session, the package state (package variables, open cursors, etc.) are held in the UGA (user global area).  Subsequent calls in the same session to the same package profit from that by not needing to reinitialize the package state.</p> <p>The pragma SERIALLY_REUSABLE is able to change this behaviour.</p> <p><a href="https://docs.oracle.com/database/121/LNPLS/packages.htm#LNPLS99977" target="_blank" rel="noopener">serially_reusable packages</a></p> <blockquote><p>After the work unit (server call) of a SERIALLY_REUSABLE package completes, Oracle Database does the following:</p> <ul> <li>Closes any open cursors.</li> <li>Frees some nonreusable memory (for example, memory for collection and long VARCHAR2 variables)</li> <li>Returns the package instantiation to the pool of reusable instantiations kept for this package.</li> </ul> </blockquote> <p>Essentially this means, that the package state exists only during the package call. Not for the whole session.</p> <p>So far I never had the need to use this pragma. But I can imagine some very very special situations, where this might become interesting.</p> <h2>7. You can compile a package even while another session is running it</h2> <p>In general this is not possible. Assuming a package is currently running. Or to say it in technical terms: We have an active session (Session A) executing a packaged procedure.</p> <p>A second session  (Session B) trying to do an &#8220;ALTER COMPILE PACKAGE (BODY)&#8221; would <em>wait</em> until session A finishes and will then afterwards try to compile the package. Upon success the first session A then will get a &#8220;package state has been discarded&#8221; error message as soon as it tries to run the same package once again. The second next try to run the package would succeed and will use the new package version. At that time the package state was discarded from the session and the new instantiation can be loaded.</p> <p>This is all documented and well known behaviour.</p> <p>We face three potential issues with this</p> <ol> <li>Session B needs to wait</li> <li>Session A might get an error</li> <li>Session B might wait so long that the developer decides to kill the client (closing SQL developer) thereby making everything 10 times worse, because the database compile call still is valid on the database session level &#8211; blocking all following attempts to run or compile the package.</li> </ol> <p style="text-align:center;"><span style="color:#0000ff;"><strong>EBR for the rescue!</strong></span></p> <p>Using Edition Based Redefinition (EBR) we can circumvent those issues.</p> <p>Both sessions just need to use different editions. EBR allows us to store and run different code versions of the same plsql based object in the same database.</p> <p> </p> <p><em>preparation</em></p> <p>First create a package with a long running procedure. My example uses a procedure that runs for exactly 1 minute.</p> <pre class="brush: sql; title: ; notranslate"> create or replace package myPck is procedure runMinute; end myPck; / create or replace package body myPck is procedure runMinute is begin sys.dbms_lock.sleep(60); end runMinute; end myPck; /</pre> <p> </p> <p>Setup an edition DEV$ALPHA that is a child of the default edition (ORA$BASE).</p> <pre class="brush: sql; light: true; title: ; notranslate"> create edition DEV$ALPHA; </pre> <p> </p> <p>You need an edition enabled schema to do this.</p> <p>This is simple to do, but to explain EBR in more detail is beyond the scope of this blog post.</p> <p><em>Example scenario</em></p> <p>Lets run a few commands in two different sessions.</p> <p>Session A resembles a USER/TESTER who currently executes the packaged function.</p> <p>Session B resembles a DEVELOPER who wants to deploy a new version of the package.</p> <p><strong>Session A</strong> does this</p> <blockquote><p>set time on</p> <p>alter session set edition=ORA$BASE;</p> <p><strong>execute myPck.runMinute;</strong></p></blockquote> <p><strong>Session B</strong> was started already and after the execute in Session A, run the following script in Session B.</p> <blockquote><p>alter session set edition=DEV$ALPHA;</p> <p>&#8212; add a new procedure to the package</p> <p>create or replace editionable package myPck &#8230;<br /> /</p> <p><strong>create or replace editionable package body</strong> myPck &#8230;<br /> /</p> <p>&#8212; run the new procedure</p> <p><strong>exec myPck.run5secs;</strong></p></blockquote> <p>Result is Session B finishes way before Session A does complete its 1 minute run.</p> <p>See screenshot<img data-attachment-id="6666" data-permalink="https://svenweller.wordpress.com/2017/07/14/10-plsql-things-you-probably-didnt-know/ebr_run_sessions/" data-orig-file="https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=809" data-orig-size="2842,1408" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ebr_run_sessions" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=809?w=809" class="alignnone size-full wp-image-6666" src="https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=809" alt="ebr_run_sessions" srcset="https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=809 809w, https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=1618 1618w, https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=150 150w, https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=300 300w, https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=768 768w, https://svenweller.files.wordpress.com/2017/07/ebr_run_sessions.png?w=1024 1024w" sizes="(max-width: 809x) 100vw, 809px" /></p> <p>q.e.d.</p> <h2>6. call a (pipelined) table function without the TABLE operator</h2> <p>It works only from 12.2 onwards. It is more of a SQL feature than a plsql one.</p> <p>This will make a table function look indistinguishable from a parametrized view.</p> <p><em>Example: split_string</em></p> <p>First lets create a simple little table function. This one here just converts a delimited list into rows.</p> <pre class="brush: sql; collapse: true; light: false; title: ; toolbar: true; notranslate"> create or replace function split_string (p_str IN VARCHAR2 ,p_delimiter IN VARCHAR2 default ',' ) RETURN sys.odcivarchar2list PIPELINED IS /** Function to split strings based upon delimiter * * @author Sven Weller * * @param p_str input string * @param p_delimiter delimiter string, default =, Delimiter should only be 1 char. * @return list of strings * */ v_entry varchar2(4000); v_remaining_str varchar2(4000); BEGIN -- input string needs to hold something to be able to split if p_str is not null then &lt;&lt;steps&gt;&gt; for i in 1..regexp_count(p_str,'\'||p_delimiter)+1 loop -- search + split v_entry := rtrim(regexp_substr(p_str,'[^\'||p_delimiter||']*('||p_delimiter||'|$)',1,i),p_delimiter); pipe row(v_entry); end loop steps; else raise no_data_found; end if; END split_string; / </pre> <p> </p> <pre>function created.</pre> <p>in <strong>11g</strong> we call the function like this:</p> <pre>select * from <span style="color:#0000ff;">TABLE(</span>split_string('A:BB::CCC',':')<span style="color:#0000ff;">)</span>;</pre> <p>in <strong>12.2</strong> we can now call it like that:</p> <pre>select * from split_string('A:BB::CCC',':');</pre> <p>As you can see the TABLE row source operator is gone. And it still works! The results of both statements are identical.</p> <table class="u-Report" style="height:180px;" summary="SQL Query Results" width="405"> <tbody> <tr> <th id="COLUMN_VALUE">COLUMN_VALUE</th> </tr> <tr> <td headers="COLUMN_VALUE">A</td> </tr> <tr> <td headers="COLUMN_VALUE">BB</td> </tr> <tr> <td headers="COLUMN_VALUE">&#8211;</td> </tr> <tr> <td headers="COLUMN_VALUE">CCC</td> </tr> </tbody> </table> <p>Want to test it? I made an <a href="https://livesql.oracle.com/apex/livesql/file/content_E87TNZ63BHGCOCR0NCYRQBOAP.html" target="_blank" rel="noopener">example on livesql.com.</a></p> <p>At the moment this is an <em>undocumented</em> 12.2 feature. So don&#8217;t use it for production code (yet). I quite like it. <strong>Less code is better!</strong> It might become some de-facto standard (similar to connect by level) and eventually will make it into the documentation.</p> <h2>5. dot notation for parameters</h2> <p>We can refer to parameters using the name of the module that declared them. This is useful when we need to distinguish a parameter from a column name.</p> <p><em>example</em></p> <pre class="brush: sql; highlight: [8]; title: ; notranslate"> create or replace function myFancyFunc (dummy in varchar2) return number is ret number := 0; begin begin select 1 into ret from dual where dummy = myFancyFunc.dummy and rownum = 1; exception when no_data_found then null; end; return ret; end myFancyFunc; / </pre> <pre>Function MYFANCYFUNC compiled select myFancyFunc('X') from dual; 1 select myFancyFunc('Y') from dual; 0</pre> <p>The function simply compares the value in the dummy column of the dual table to the value we input. If instead we would just compare dummy=dummy then we would get always 1 as a result. No matter what the input is. Even if we add an alias to the table and prefix the column with an alias, the non aliased &#8220;dummy&#8221; will still be interpreted as a column.</p> <p>This behaviour is documented: <a href="https://docs.oracle.com/database/121/LNPLS/nameresolution.htm#LNPLS2154" target="_blank" rel="noopener">Oracle Doc 12.1 &#8211; plsql name resolution</a></p> <blockquote><p><em>If a SQL statement references a name that belongs to both a column </em><br /> <em>and either a local variable or formal parameter, </em><br /> <em>then <strong>the column name takes precedence</strong>.</em></p></blockquote> <p>Interestingly we can also use labels on block level for specifying variables that are defined in this block.</p> <pre>set serveroutput on &lt;&lt;<span style="color:#0000ff;">main</span>&gt;&gt; declare <span style="color:#0000ff;">dummy</span> varchar2(10) := '<span style="color:#0000ff;">Y</span>'; begin &lt;&lt;<span style="color:#ff6600;">block1</span>&gt;&gt; declare <span style="color:#ff6600;">dummy</span> varchar2(10) := '<span style="color:#ff6600;">X</span>'; begin &lt;&lt;<span style="color:#993366;">block2</span>&gt;&gt; declare <span style="color:#993366;">dummy</span> varchar2(10) := '<span style="color:#993366;">A</span>'; begin select dummy into <span style="color:#993366;">dummy</span> from dual where dummy = <span style="color:#ff6600;">block1.dummy</span>; dbms_output.put_line('MainBlock:'||<span style="color:#0000ff;">main.dummy</span>); dbms_output.put_line('Block1:'||<span style="color:#ff6600;">block1.dummy</span>); dbms_output.put_line('Block2:'||<span style="color:#993366;">block2.dummy</span>); end block2; end block1; end main; / PL/SQL procedure successfully completed. <span style="color:#0000ff;">MainBlock:Y</span> <span style="color:#ff6600;">Block1:X</span> <span style="color:#993366;">Block2:X</span></pre> <p>Without dot notation the innermost variable (block2) is used &#8211; as we can see in the INTO part. And we can reference a different variable with the same name from a &#8220;higher&#8221; declaration by using the dot notation.</p> <p> </p> <h2>4. variable names be emojis</h2> <p><em>example</em></p> <pre>set serveroutput on declare "&#x1f4a9;"exception; pragma exception_init("&#x1f4a9;",-20001); "⌚" timestamp := systimestamp; "&#x1f551;"interval day to second; "&#x1f3b2;"number; "&#x1f4a4;"number := 2; begin "&#x1f3b2;":= round(dbms_random.value(1,6)); for "&#x1f51c;"in 1.."&#x1f3b2;"loop dbms_lock.sleep("&#x1f4a4;"); end loop; "&#x1f551;":= systimestamp - "⌚" ; dbms_output.put_line('Slept for '|| "&#x1f551;"); exception when "&#x1f4a9;"then dbms_output.put_line('Sorry something bad happend!'); raise "&#x1f4a9;"; end; / PL/SQL procedure successfully completed. Slept for +00 00:00:08.049000</pre> <p>The source code looks a little bit different in sql developer. But trust me. I simply copy&amp;pasted it from there to here.</p> <p><img data-attachment-id="6605" data-permalink="https://svenweller.wordpress.com/2017/07/14/10-plsql-things-you-probably-didnt-know/emojicode/" data-orig-file="https://svenweller.files.wordpress.com/2017/07/emojicode.png?w=809" data-orig-size="698,838" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="emojicode" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2017/07/emojicode.png?w=809?w=250" data-large-file="https://svenweller.files.wordpress.com/2017/07/emojicode.png?w=809?w=698" class="alignnone size-full wp-image-6605" src="https://svenweller.files.wordpress.com/2017/07/emojicode.png?w=809" alt="emojicode" srcset="https://svenweller.files.wordpress.com/2017/07/emojicode.png 698w, https://svenweller.files.wordpress.com/2017/07/emojicode.png?w=125 125w, https://svenweller.files.wordpress.com/2017/07/emojicode.png?w=250 250w" sizes="(max-width: 698px) 100vw, 698px" /></p> <p>To make this work you need to use a font that supports emoijs/symbols, I used font &#8220;Segoe UI Symbol&#8221;. It is supposed to look better on windows 10<a title="link to footnote" href="#footnote3"><sup>[3]</sup></a>.</p> <p>If you are a hard core emoji lover then I suggest to have a look at <a href="http://www.emojicode.org/">emojicode.org</a></p> <p>It is a emoji based programming language. Which did not make it into the esoteric programming languages list (yet).  <a href="http://www.dangermouse.net/esoteric/ook.html" target="_blank" rel="noopener">Ook? Ook!</a></p> <p> </p> <h2>3. variables can be made mandatory (NOT NULL)</h2> <p>Check out the NOT NULL keyword during the variable declaration.</p> <pre class="brush: sql; title: ; notranslate">declare v_index number not null := 0; begin v_index := 1; v_index := null; end; /</pre> <p>Error report &#8211;<br /> <span style="color:#ff0000;">ORA-06550: line 5, column 14: PLS-00382: expression is of wrong type</span><br /> ORA-06550: line 5, column 3: PL/SQL: Statement ignored</p> <p>The error message is a bit vague about <em>what</em> happened, but it is very exact <em>where</em> it happened (line 5, column 14). And what do we see there? A NULL expression.</p> <p>The expression is of wrong<em> type</em>, because we added a NOT NULL constraint to the number type that was used. For more complex cases we can create our own sub types and use them. But if we just want to make sure that we do not need to consider null cases during further variable calls, then this is a possible way.</p> <p><a href="https://docs.oracle.com/database/122/LNPLS/scalar-variable-declaration.htm#LNPLS01388" target="_blank" rel="noopener">Link to plsql documentation</a></p> <p>Currently there are no such other constraints  that we can use.  I could imagine with the potential arrival of <a href="https://community.oracle.com/ideas/13028" target="_blank" rel="noopener">SQL assertions</a>, this might become a hot topic in plsql too.</p> <h2>2. you can &#8220;hack&#8221; dbms_output</h2> <p><span style="color:#ff0000;">Warning! This is dangerous. It might break some (poorly written) code that resides in the same schema. Do it at your own risk!</span> It is also hilariously funny to do on april fools day to your fellow coworkers. I mean they shouldn&#8217;t use dbms_output anyway. That will teach them!</p> <p>I start the example by showing the behaviour first. Then the code to produce this result.</p> <p><em>behaviour</em></p> <pre class="brush: sql; title: ; notranslate"> create or replace procedure doSomething is v_dummy dual.dummy%type; begin select dummy into v_dummy from dual where 1=2; exception when others then dbms_output.put_line(sqlerrm); end doSomething; / </pre> <p>Now we run the module a couple of times and want to see the output. We should expect a NO_DATA_FOUND error message.</p> <blockquote><p>set serveroutput on</p> <p>execute doSomething;<br /> execute doSomething;<br /> execute doSomething;<br /> execute doSomething;<br /> execute doSomething;</p></blockquote> <p>Surprisingly instead of the error message we get something like this.</p> <blockquote><p>PL/SQL procedure successfully completed.</p> <p><strong>Wrong usage of DBMS_OUTPUT detected.</strong></p> <p>PL/SQL procedure successfully completed.</p> <p><strong>Make Databases Great Again!</strong></p> <p>PL/SQL procedure successfully completed.</p> <p><strong>ORA-01403: no data found</strong></p> <p>PL/SQL procedure successfully completed.</p> <p><strong>Make Databases Great Again!</strong></p> <p>PL/SQL procedure successfully completed.</p> <p><strong>So tell me what you want, what you really, really want</strong></p></blockquote> <p>Omg! What is going on here?</p> <p>Well here is the catch. We can &#8220;overload&#8221; dbms_output in out own schema. Then our package is called and not the original package from sys.</p> <p><em>source code</em></p> <pre class="brush: sql; collapse: true; light: false; title: dbms_output; toolbar: true; notranslate">create or replace package dbms_output as procedure enable(BUFFER_SIZE number default null); procedure put_line(A in varchar2); procedure GET_LINE(LINE out VARCHAR2,STATUS out integer); procedure GET_LINES(LINES out sys.dbms_output.CHARARR,NUMLINES in out NUMBER); procedure GET_LINES(LINES out sys.DBMSOUTPUT_LINESARRAY,NUMLINES in out NUMBER); end dbms_output ; / create or replace package body dbms_output as procedure enable(BUFFER_SIZE number default null) is begin sys.dbms_output.enable(BUFFER_SIZE); end; function getRandomQuote (A in varchar2) return varchar2 is type quotes_t is table of varchar2(4000) index by binary_integer; v_quotes quotes_t; v_random binary_integer; begin v_quotes(1) := 'You are hacked by the Chinese'; v_quotes(2) := 'Wrong usage of DBMS_OUTPUT detected.'; v_quotes(3) := 'System failure. Get away from keyboard'; v_quotes(4) := 'Close all windows! NOW!'; v_quotes(5) := 'Make Databases Great Again!'; v_quotes(6) := A; -- sometimes return the correct text v_quotes(7) := A; -- sometimes return the correct text v_quotes(8) := 'So tell me what you want, what you really, really want'; v_quotes(9) := 'None but ourselves can free our minds.'; v_quotes(10) := 'Let there be light!'; v_random := round(dbms_random.value(1,v_quotes.last)); return v_quotes(v_random); end getRandomQuote; procedure put_line(A in varchar2) is begin sys.dbms_output.put_line(getRandomQuote(A)); end; procedure GET_LINE(LINE out VARCHAR2,STATUS out integer) is begin sys.dbms_output.GET_LINE(LINE,STATUS); end; procedure GET_LINES(LINES out sys.dbms_output.CHARARR,NUMLINES in out NUMBER) is begin sys.dbms_output.GET_LINES(LINES,NUMLINES); end; procedure GET_LINES(LINES out sys.DBMSOUTPUT_LINESARRAY,NUMLINES in out NUMBER) is begin sys.dbms_output.GET_LINES(LINES,NUMLINES); end; end dbms_output ; /</pre> <p>How does it work?</p> <p>Because how sql name resolution kicks in, the DBMS_OUTPUT package in our schema is used and not the public synonym for the DBMS_OUTPUT package from the sys schema.</p> <p>The get_line functions then pushes the changed text to the normal buffer mechanism.</p> <p>How can we avoid it?</p> <p>Best is not to use DBMS_OUTPUT in real production code. It is a nice quick debugging tool. But not more than that.</p> <p>Also if you prefix dbms_output always with the SYS schema, then it will call the original logic.<br />  </p> <h2>1. when others does <strong>not</strong> catch all exceptions</h2> <p><em>example</em></p> <pre class="lang-sql prettyprint prettyprinted">set serveroutput on declare e_cancelled exception; pragma exception_init(e_cancelled, <span style="color:#0000ff;">-1013</span>); begin begin <span style="color:#0000ff;">raise e_cancelled;</span> exception <span style="color:#0000ff;">when others then</span> dbms_output.put_line('EXCEPTION OTHERS'); end; end; / <span style="color:#ff0000;"> ORA-01013:</span> user requested cancel of current operation ORA-06512: at line 6</pre> <p>We still see an exception, but not the dbms buffer output!</p> <p>This needs some explanation.</p> <p>There is a very limited set of exceptions that will not be captured by the WHEN OTHERS handler. We need to look closely and understand the exception itself to comprehend why <em>this is a good thing</em>.</p> <p>Here the ORA-01013 is the &#8220;user requested cancel of current operation&#8221; exception. Essentially it means somebody pressed &#8220;CTRL+C&#8221; while running the code. In almost all environments this means: Stop doing whatever you do immediately! Or in more technical terms: It is an interrupt to the os process running your command. Same as executing &#8220;kill -2&#8221; (kill -SIGINT) in a nix environment (<a href="http://meinit.nl/the-3-most-important-kill-signals-on-the-linux-unix-command-line" target="_blank" rel="noopener">the-3-most-important-kill-signals-on-the-linux-unix-command-line</a>). Even if the process is allowed to ignore the command, it shouldn&#8217;t do so by default.</p> <p>ORA-01013 can sometimes also be the result of a timeout. Where the client is waiting for a response and after some time sends this as a timeout signal to the database session.</p> <p>We are allowed to capture this exception and write a special handler for it.</p> <pre class="lang-sql prettyprint prettyprinted">set serveroutput on declare e_cancelled exception; pragma exception_init(e_cancelled, <span style="color:#0000ff;">-1013</span>); begin begin <span style="color:#0000ff;">raise e_cancelled;</span> exception when others then dbms_output.put_line('EXCEPTION OTHERS'); end; exception <span style="color:#0000ff;">when e_cancelled then</span> dbms_output.put_line('OPERATION CANCELED'); END; / PL/SQL procedure successfully completed. <span style="color:#0000ff;">OPERATION CANCELED</span> </pre> <p>Nothing to worry about. Just nice to know.</p> <p>Please note: This example will behave differently in older outdated db versions. I think it was introduced as a <a href="https://support.oracle.com/epmos/faces/BugDisplay?parent=DOCUMENT&amp;sourceId=12838063.8&amp;id=12838063">fix for bug#12838063</a> in 11.2.0.4.</p> <p>Other exceptions that are not handled include &#8220;<span style="color:#ff0000;">ORA-03113</span>: end-of-file on communication channel&#8221;.</p> <p>But not &#8220;<span style="color:#ff0000;">ORA-06508</span>: PL/SQL: could not find program unit being called&#8221;. This was supposed to go through &#8220;when others&#8221; but testing on 12.2.0.1 revealed it is captured.</p> <p> </p> <p> </p> <h4 id="footnote">Footnotes</h4> <hr /> <h6 id="footnote1">1. This is probably the only bug free code I ever wrote. It was meant to do nothing and it does that exceptionally well!<a title="link to footnote" href="#footnote2"><sup>[2]</sup></a></h6> <h6 id="footnote2">2. There might be room for some performance improvement. Allowing us to do nothing even faster.</h6> <h6 id="footnote3">3. On windows 10 <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f4a9.png" alt="💩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> is supposed to look like <span class="emoji"><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f51d.png" alt="🔝" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f4a9.png" alt="💩" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</h6> <p> </p> <p> </p> <p> </p><br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/svenweller.wordpress.com/5197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/svenweller.wordpress.com/5197/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=svenweller.wordpress.com&#038;blog=24902459&#038;post=5197&#038;subd=svenweller&#038;ref=&#038;feed=1" width="1" height="1" /> svenweller http://svenweller.wordpress.com/?p=5197 Fri Jul 14 2017 08:30:17 GMT-0400 (EDT) DBE plany na przyszłość http://apex.dbe.pl/2017/07/dbe-plany-na-przyszosc.html <br /> Wszystko co dobre szybko się kończy. Tak więc wracamy na ziemie a dokładnie do Wrocławia. Zawsze po podróży w głowie mam milion pomysłów i planów.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://4.bp.blogspot.com/-EjWcg-O4rTE/WWScnceCclI/AAAAAAAAKCc/Q2X5KhjtrlobqiLdxJ2DHCMTCYoFWJ7BACLcBGAs/s1600/8a2b5a70c7bb2f167f0450c58b83f55e.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="428" data-original-width="570" height="240" src="https://4.bp.blogspot.com/-EjWcg-O4rTE/WWScnceCclI/AAAAAAAAKCc/Q2X5KhjtrlobqiLdxJ2DHCMTCYoFWJ7BACLcBGAs/s320/8a2b5a70c7bb2f167f0450c58b83f55e.jpg" width="320" /></a></div> <br /> <br /> Dla części z nich prawdopodobieństwo realizacji jest bardzo wysokie dla części mniej : ). Tak więc co w najbliższym czasie planujemy zrobić:<br /> <br /> <ul> <li>w przeciągu 2-4 miesięcy zmieniamy biuro. Chodzi o powiększenie powierzchni oraz podwyższenie standardu</li> <li>ponowne zwiększenie zatrudnienia</li> <li>po wakacjach przygotowanie cyklu szkoleń otwartych z zakresu APEX 5.1</li> <li>bardziej aktywny udział na blogu</li> <li>udział w konferencji Oracle-owej w Krakowie</li> <li>stworzenie drugiego brandu firmy nastawionego wyłącznie na zagranicę oczywiście ściśle związanego z APEX-em !</li> </ul> ) tag:blogger.com,1999:blog-7531463720728239813.post-5127930785859787779 Fri Jul 14 2017 02:00:00 GMT-0400 (EDT) Oracle APEX at KSCOPE17 http://lschilde.blogspot.com/2017/07/oracle-apex-at-kscope17.html <div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"></div><div style="text-align: left;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings></xml><![endif]--></div><div style="text-align: left;"><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-AU</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument></xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Mediuist 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles></xml><![endif]--><!--[if gte mso 10]><style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-fareast-language:EN-US;} </style><![endif]--> </div><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 18.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">APEX at KSCOPE17</span></b><b><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;; font-size: 18.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></b></h2><h3 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 13.5pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Why is it so damn good! </span></b><b><span style="font-family: Wingdings; font-size: 13.5pt; mso-ascii-font-family: Arial; mso-bidi-font-family: Arial; mso-char-type: symbol; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU; mso-hansi-font-family: Arial; mso-symbol-font-family: Wingdings;"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;">:)</span></span></b><b><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;; font-size: 13.5pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></b></h3><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Summary of thoughts </span></b><b><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></b><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">&nbsp;</span></h4><div class="MsoNormal" style="line-height: normal; text-align: left;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Yet another great conference by APEX community - what else can you say when you have such a busy program and abundance of awesome speakers presenting.</span></div>&nbsp; <br /><div class="MsoNormal" style="line-height: normal; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; text-align: center;"><a href="https://1.bp.blogspot.com/-vMBD9V_Wg48/WWhJRUtVTrI/AAAAAAAALLg/78k8RjGFYgYhxtiLbGYb6yX8YsoHNLfPgCEwYBhgL/s1600/city.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="110" src="https://1.bp.blogspot.com/-vMBD9V_Wg48/WWhJRUtVTrI/AAAAAAAALLg/78k8RjGFYgYhxtiLbGYb6yX8YsoHNLfPgCEwYBhgL/s200/city.jpg" width="200" /></a><a href="https://1.bp.blogspot.com/-I708xbVZnRU/WWhMFKnPaTI/AAAAAAAALL0/tg06Mc56-a8iTppkBggXCcbmH01RnRY2QCLcBGAs/s1600/slika.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"> <img border="0" data-original-height="675" data-original-width="1200" height="110" src="https://1.bp.blogspot.com/-I708xbVZnRU/WWhMFKnPaTI/AAAAAAAALL0/tg06Mc56-a8iTppkBggXCcbmH01RnRY2QCLcBGAs/s200/slika.jpg" width="200" /></a><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"><br /></span></div><div class="MsoNormal" style="line-height: normal; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">&nbsp; </span></div><div class="MsoNormal" style="line-height: normal; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">I loved it yet again. Great people above all, location and content.</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-aGPzEurkXZs/WWhJMPn2ycI/AAAAAAAALLI/rRtNFGhgmfYbb6i3GqKNNQ9UyFVqv8tVACEwYBhgL/s1600/badge.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="996" data-original-width="1200" height="165" src="https://1.bp.blogspot.com/-aGPzEurkXZs/WWhJMPn2ycI/AAAAAAAALLI/rRtNFGhgmfYbb6i3GqKNNQ9UyFVqv8tVACEwYBhgL/s200/badge.jpg" width="200" /></a><a href="https://2.bp.blogspot.com/-gpasDUSchxk/WWhJSVyzx_I/AAAAAAAALLk/SK1dPiEyCcker0AY2gUrWD35EksQYYgbACEwYBhgL/s1600/city2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="675" height="200" src="https://2.bp.blogspot.com/-gpasDUSchxk/WWhJSVyzx_I/AAAAAAAALLk/SK1dPiEyCcker0AY2gUrWD35EksQYYgbACEwYBhgL/s200/city2.jpg" width="111" /></a></div><div class="MsoNormal" style="line-height: normal; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">This was my third time and again I came back with loads of notes and things to try out when I get back. Not more can you wish for. </span></div><div class="separator" style="clear: both; text-align: center;"></div><br /> <div class="MsoNormal" style="line-height: normal; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">There were talks if this year was as good as previous one, but overall I think people from ODTUG hit the mark again (at least for me).</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-v8sqihuBkkM/WWhJRbLvGvI/AAAAAAAALLY/B_klh363x1E22UsNtKYToL8y6D5EnxBywCEwYBhgL/s1600/John.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1200" height="192" src="https://1.bp.blogspot.com/-v8sqihuBkkM/WWhJRbLvGvI/AAAAAAAALLY/B_klh363x1E22UsNtKYToL8y6D5EnxBywCEwYBhgL/s320/John.jpg" width="320" /></a></div><div class="MsoNormal" style="line-height: normal; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><b style="mso-bidi-font-weight: normal;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Overview and my takeaway</span></b></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Lots of great ideas/features from the team for APEX 5.2 release. </span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><u><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Universal theme - Shakeeb</span></u></div><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Inline help text for form customizations</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Ability to adjust region dialog size </span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Declarative touch events like swap</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Improve responsive styles</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Improve loading performance</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">HD version of icons – Font APEX HD</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Floating labels modernizing UI</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">New Card templates like header and media</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Improvements on theme rolling with additional styles and options</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">APEX Spotlight</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Effortless navigation</span><div style="text-align: left;"> </div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-qVPsW59dvvU/WWhME8XCOVI/AAAAAAAALLs/NZFOi9xLbXEfyvolDlfqsNMPjqUq5gpXgCEwYBhgL/s1600/HD.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="180" src="https://3.bp.blogspot.com/-qVPsW59dvvU/WWhME8XCOVI/AAAAAAAALLs/NZFOi9xLbXEfyvolDlfqsNMPjqUq5gpXgCEwYBhgL/s320/HD.jpg" width="320" /></a></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><u><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">JET charts – Marc S.</span></u></div><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Improvements in customization over 5.1.2 version</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Ability to use select * from table as source of your queries</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Zoom in zoom out functionality </span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Adjusting series colours either as query column or using advance JS configuration similar how IG is done now</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Ability to change orientation using DA</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">New chart types like Gant charts, pyramid or box plot</span><div style="text-align: left;"> </div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><u><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Interactive Grid – John S.</span></u></div><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Application available for download from John's blog IG Cookbook with John’s latest tips for IG</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Resize advanced configure options; globally as well on each column to be declarative in 5.2</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Context menu on click instead of action row menu</span><br /> <span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Demo on listening to modal changes and acting based on it</span><br /> <span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Ideas to double model same data to compare data or similar</span><br /> <span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Example of Split grid in form multi view demo </span><br /> <span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Normal form populated with DA by subscribing to changes on modal grid; extra option is multiple selections and editing</span><br /> <span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Awesome example of IG customization of detail view being a standard view and changing to use Card templates with changes to buttons</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">IG API documentation will be included</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Select cell range copy down or copy to clipboard functionality to be added</span><div style="text-align: left;"> </div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-yc2xXs795D8/WWhJQvJ5Y5I/AAAAAAAALLU/bY0qL7OFAT08L9wPodyTU-MQ38_FF4K4ACEwYBhgL/s1600/IG.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="225" src="https://3.bp.blogspot.com/-yc2xXs795D8/WWhJQvJ5Y5I/AAAAAAAALLU/bY0qL7OFAT08L9wPodyTU-MQ38_FF4K4ACEwYBhgL/s400/IG.jpg" width="400" /></a></div><br /><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><u><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Other features</span></u></div><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">New property panel search functionality that will search all fields and values</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Exposing advanced calendar configurations (FullCalendar) </span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Blueprint and Features functionality to help you build your apps</span><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Interesting was a mention of further improvements on APEX “talking” to external REST APIs.</span><div style="text-align: left;"> </div><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-wyDTy6Fv0qA/WWhJRTbfhwI/AAAAAAAALLc/pltNzX5nPBwSAJ2XITqhDzqRHVSane9ZwCEwYBhgL/s1600/Peter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="180" src="https://2.bp.blogspot.com/-wyDTy6Fv0qA/WWhJRTbfhwI/AAAAAAAALLc/pltNzX5nPBwSAJ2XITqhDzqRHVSane9ZwCEwYBhgL/s320/Peter.jpg" width="320" /></a></div><br /> <div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><u><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Other speaker tips:</span></u></div><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Great intro session by P. Raganitsch for all who want to dig deeper into Electron JS; installation and features like reading system files or access to printing engine</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">When building your apps make sure your CSS scripts are loaded before JavaScript as this puts importance on visual over functional part of your page first </span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">If you are not using region caching, maybe time to consider learning about this great feature; great tip is to display date region last refreshed using apex_util.cache_get_date_of_region_cache</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Ever had problem with LOV reloads when your page are loading – loadash.js library to the rescue. It can help you control number of reloads needed when cascading LOVs are involved</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Using substitution strings in your query like &amp;SESSION. Performance wise it is better to use concatenation. -&gt; ‘f?p=……’|| :SESSION</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">apex_debug.log_debms_output outputs all dmbs_output in your session</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Everyone is talking about Docker – great tips from Roel H. on how to setup one for your APEX environments and things you need to know</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">If you ever hit limitations with JSON size when working with images check out Dimitri’s presentation on Java from 12.2 database and all the tips here using Nashhorn</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">One of my favourite was Simon’s Hunt – Automated testing framework demonstration session; if you ever wanted to do testing right and simple definite worth checking. We still have to see how this will work out but thumbs up for making this available to the community</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">&nbsp;</span></span><br /><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">I have to mention great APEX Nitro please check more details on OraOpenSource. Great way to speed up you development work</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">APEX Generator; awesome idea how to optimize your project work by rendering your apex pages directly from PL/SQL; another great work by friends from MT-AG; look forward when this will be publicly available to try it out</span><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: Arial; mso-fareast-language: EN-AU;"><span style="mso-list: Ignore;">-<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Good practice is to document your PL/SQL work so why not use <a href="https://github.com/OraOpenSource/plsql-md-doc">https://github.com/OraOpenSource/plsql-md-doc</a></span><br /><div style="text-align: left;"> </div><div class="MsoListParagraphCxSpLast" style="line-height: normal; mso-add-space: auto; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-QCC3xitvPh8/WWhJQWSyX1I/AAAAAAAALLQ/eXIBPVaD6l8Tm0ReJjGUVuOglegz6iBjACEwYBhgL/s1600/Dimitri.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="180" src="https://4.bp.blogspot.com/-QCC3xitvPh8/WWhJQWSyX1I/AAAAAAAALLQ/eXIBPVaD6l8Tm0ReJjGUVuOglegz6iBjACEwYBhgL/s320/Dimitri.jpg" width="320" /></a></div><br /> <br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">For last something we all need that was demoed by Joel Kallman from APEX team is Quick SQL sample application. It is now so easy to create dummy data or mock-up models for your applications. Please check sample packaged applications and you will never look back</span><span style="font-family: Wingdings; font-size: 12.0pt; mso-ascii-font-family: Arial; mso-bidi-font-family: Arial; mso-char-type: symbol; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU; mso-hansi-font-family: Arial; mso-symbol-font-family: Wingdings;"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings;"></span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">.</span><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-7vv7q0kpVyw/WWhJQNWnJ7I/AAAAAAAALLM/UK0TKiTOm40uHTHOyPonIXthkovwk_NawCEwYBhgL/s1600/ATAF.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="225" src="https://1.bp.blogspot.com/-7vv7q0kpVyw/WWhJQNWnJ7I/AAAAAAAALLM/UK0TKiTOm40uHTHOyPonIXthkovwk_NawCEwYBhgL/s400/ATAF.jpg" width="400" /></a></div><br /><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span><br /><div style="text-align: left;"> </div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">To summarize, I know I will see you next year in Orlando for KScope18.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Thanks to all who made my stay in San Antonio so great.&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-aov6IsjnrV8/WWhJSbSY0YI/AAAAAAAALLo/txKCrpcojrE75odQfzx5l8KkGMctApmOwCEwYBhgL/s1600/ekipa.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1200" height="180" src="https://3.bp.blogspot.com/-aov6IsjnrV8/WWhJSbSY0YI/AAAAAAAALLo/txKCrpcojrE75odQfzx5l8KkGMctApmOwCEwYBhgL/s320/ekipa.jpg" width="320" /></a></div><br /> <div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: justify;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">Happy Apexing,</span><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;"></span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">SLino&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12.0pt; mso-fareast-font-family: &quot;Times New Roman&quot;; mso-fareast-language: EN-AU;">In case you missed it, you can join ODTUG and view all recorded sessions online otherwise join us for <a href="http://www.ausoug.org.au/pages/calendar">free AUSOUG 2017 webinar series</a> with some of KScope17 presenters.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div></div> SLino tag:blogger.com,1999:blog-8185384792158425670.post-6728737399048239264 Fri Jul 14 2017 01:04:00 GMT-0400 (EDT) Report row buttons firing a dynamic action http://apextips.blogspot.com/2017/07/report-row-buttons-firing-dynamic-action.html A lot of the time on reports of data, we'll define a link column, and specify an image which is the beloved pencil icon.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-uI5Qfi9prpY/WWdUONl38ZI/AAAAAAAAIMo/0mIXRzwv2Q4s2s5uK4ZW96xl0UC7Z44ogCLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B07-06-18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="228" data-original-width="480" height="152" src="https://2.bp.blogspot.com/-uI5Qfi9prpY/WWdUONl38ZI/AAAAAAAAIMo/0mIXRzwv2Q4s2s5uK4ZW96xl0UC7Z44ogCLcBGAs/s320/Screenshot%2Bfrom%2B2017-07-13%2B07-06-18.png" width="320" /></a></div><br />Which is good and all, but looking in the Sample Database Application (packaged application), they have taken a different approach to style links - a button that stretches the width of it's containing cell. So, the UI ends up looking like so:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-bF-D6EJ__TU/WWdVG2wkqTI/AAAAAAAAIMs/ebIIfAMC-TwznUT-K2EnrNv5MsdxtOGdgCLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B07-09-47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="203" data-original-width="384" height="169" src="https://4.bp.blogspot.com/-bF-D6EJ__TU/WWdVG2wkqTI/AAAAAAAAIMs/ebIIfAMC-TwznUT-K2EnrNv5MsdxtOGdgCLcBGAs/s320/Screenshot%2Bfrom%2B2017-07-13%2B07-09-47.png" width="320" /></a></div><br /><br />So, is this done?<br /><br />Well first, you define a new column for the placeholder. Suppose I want my link column to be Report, I define an extra column in my query:<br /><br /><pre>, 'Report' report_link</pre><br />Then I need to go to my new column's attributes, and change the column type to a link.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-MrM6kxzw7BA/WWdXdWYiNSI/AAAAAAAAIMw/TWCxMyc6FN0xp53sK9cCC264D8SmyHUGACLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B07-19-25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="237" data-original-width="284" src="https://3.bp.blogspot.com/-MrM6kxzw7BA/WWdXdWYiNSI/AAAAAAAAIMw/TWCxMyc6FN0xp53sK9cCC264D8SmyHUGACLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B07-19-25.png" /></a></div><br />And, in the link attributes, set the text to what you want displayed. Here, I'm just going to display the value of the new column and point to my desired page. So I set the target page, then also the Link text as #REPORT_LINK#.<br /><br />At this point the report will just show link text, as we expect.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-amlNNFNgDBA/WWdYlq7z4yI/AAAAAAAAIM0/5TFYAXHnkpUwJSdj1n6Onlq93LX2GIHVQCLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B07-24-59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="201" data-original-width="429" height="149" src="https://3.bp.blogspot.com/-amlNNFNgDBA/WWdYlq7z4yI/AAAAAAAAIM0/5TFYAXHnkpUwJSdj1n6Onlq93LX2GIHVQCLcBGAs/s320/Screenshot%2Bfrom%2B2017-07-13%2B07-24-59.png" width="320" /></a></div><br />So, then to replicate the same style, we just need to apply the same classes, which happen to be:<br /><br /><br /><ul><li>t-Button&nbsp;</li><li>t-Button--simple&nbsp;</li><li>t-Button--hot&nbsp;</li><li>t-Button--stretch</li></ul><div>So, in the link, set the link attributes as:</div><div><br /></div><pre>class="t-Button t-Button--simple t-Button--hot t-Button--stretch".</pre><div><br /></div><div>Now when we run the page, we get the desired behaviour:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-jabuXQ3f6N8/WWdZJs4UL6I/AAAAAAAAIM4/izPEV-Uu-s05IRx5NAg3BiyI-YJ9qLc6ACLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B07-27-24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="201" data-original-width="459" height="140" src="https://1.bp.blogspot.com/-jabuXQ3f6N8/WWdZJs4UL6I/AAAAAAAAIM4/izPEV-Uu-s05IRx5NAg3BiyI-YJ9qLc6ACLcBGAs/s320/Screenshot%2Bfrom%2B2017-07-13%2B07-27-24.png" width="320" /></a></div><div><br /></div><div>How about for a dynamic action?</div><div><br /></div><div>Well, in the columns link, there is no option for "Defined by Dynamic Action" as we usually see in regular page buttons. We just get page or URL options.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/--evsQAZvWwI/WWdbPs8nL_I/AAAAAAAAIM8/IWVmHdRBqu0MQI83RivjSJ68M83luD2IQCLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B07-34-54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="202" data-original-width="519" height="124" src="https://2.bp.blogspot.com/--evsQAZvWwI/WWdbPs8nL_I/AAAAAAAAIM8/IWVmHdRBqu0MQI83RivjSJ68M83luD2IQCLcBGAs/s320/Screenshot%2Bfrom%2B2017-07-13%2B07-34-54.png" width="320" /></a></div><div><br /></div><div>Typically, you will assign a special class to your element so that you can specify a jQuery selector on your dynamic action target that will fire and optionally a data attribute used to store the ID of the row (such as data-order-id="xx"). More on this later.<br /><br />So, back to the column action. A typical pattern here will be to specify URL and that a target of #, javascript:void(0);, or javascript:;.</div><div><br /></div><div>The # is usually a trick when you want to go to a position in the same page, so not using href as it was designed for.<br /><br />The void is a JavaScript operator that returns void, and the other one is obviously an empty javascript expression!<br /><br />When using void, it is important to pass in 0 to the function, or it's likely you will receive the following error:<br /><br />Uncaught SyntaxError: Unexpected token )<br /><br />With all that said, I think it is better to avoid these (hacky?) solutions. It is not a "link" so the href tag should ideally not be there. If you want a row button that will fire a dynamic action, instead you should set the column type to plain text and then set a HTML expression on the column.<br /><br />Since it is a button we want, it is a button we shall use. We will end up with markup as follows, &nbsp;that we add into the HTML expression:<br /><br /><pre>&lt;button class="orderReportButton</pre><pre> t-Button<br /> t-Button--simple<br /> t-Button--hot<br /> t-Button--stretch" data-order-id="#ORDER_ID#" type="button"&gt;<br /> &lt;span class="t-Button-label"&gt;Report&lt;/span&gt;<br />&lt;/button&gt;<br /></pre><br />There we have.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-BgBLivH8W78/WWgahNgHQpI/AAAAAAAAINg/aRFwUn-aLtc_2c7jgul6m1jMqQSBktYGACLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B21-12-28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="207" data-original-width="450" height="147" src="https://2.bp.blogspot.com/-BgBLivH8W78/WWgahNgHQpI/AAAAAAAAINg/aRFwUn-aLtc_2c7jgul6m1jMqQSBktYGACLcBGAs/s320/Screenshot%2Bfrom%2B2017-07-13%2B21-12-28.png" width="320" /></a></div><br /><br />Now, we just need to finish off our dynamic action. We create a click dynamic action based on a jQuery selector.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-ZJr-cZHxBeU/WWga5K_U9kI/AAAAAAAAINk/9cMAuqRHZxskVP1rfJyXsPU8PJ-XZfUXQCLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B21-14-02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="147" data-original-width="286" src="https://4.bp.blogspot.com/-ZJr-cZHxBeU/WWga5K_U9kI/AAAAAAAAINk/9cMAuqRHZxskVP1rfJyXsPU8PJ-XZfUXQCLcBGAs/s1600/Screenshot%2Bfrom%2B2017-07-13%2B21-14-02.png" /></a></div><br /><br />Then, in our true action, we can just reference the expression "this.triggeringElement.getAttribute('data-order-id')" or jQuery "$(this.triggeringElement).data('order-id');<br /><br /><br /></div> trent tag:blogger.com,1999:blog-8785176694082881912.post-5693493275902922387 Thu Jul 13 2017 21:27:00 GMT-0400 (EDT) Oracle OPC Firewall Rules https://ruepprich.wordpress.com/2017/07/13/oracle-opc-firewall-rules/ <h4>Create Firewall Rules</h4> <p>Managing firewall rules on Oracle OPC can be a bit confusing. In this example we want to open up ports 80 and 443 to our compute instance, in order to allow the web server there to be accessed by the public internet.</p> <p>There are four elements to a firewall rule:</p> <ol> <li><strong>Security List</strong> &#8211; a named container for <em>Security Rules</em>. A security list can have multiple rules assigned to it. Multiple security lists can be assigned to an instance.</li> <li><strong>Security Application</strong> &#8211; an port range and an associated protocol.</li> <li><strong>Security IP List</strong> &#8211; a comma separated list of IP address that should get access to your instance. Using 0.0.0.0/0 specifies the public internet.</li> <li><strong>Security Rule</strong> &#8211; says which port range (<em>application</em>) is assigned to an IP list (<em>source</em>) and to which security list (<em>destination</em>) this assignment belongs to.</li> </ol> <p>To create an <em>inbound</em> firewall rule, create a rule for a <em>Security Application</em> and specify the <em>Security IP List</em> (in the <em>Source</em> filed) for which addresses can get through the ports in the <em>Security Application</em>. Then assign that rule to a <em>Security List</em>, specified in the <em>Destination</em> field.</p> <p><img data-attachment-id="2582" data-permalink="https://ruepprich.wordpress.com/2017/07/13/oracle-opc-firewall-rules/diagram-png-001/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=550" data-orig-size="1024,768" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="diagram.png.001" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=550?w=550" class="alignnone size-full wp-image-2582" src="https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=550" alt="diagram.png.001" srcset="https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/diagram-001.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/diagram-001.png 1024w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Let&#8217;s go through the steps. Let&#8217;s assume we already have a compute instance with our web server on it. Log into your Oracle OCP cloud account dashboard, and click the Compute region. From there click the <em>Open Service Console</em> button. Here you should see your existing compute instance under the <em>Instances</em> tab.</p> <p><img data-attachment-id="2590" data-permalink="https://ruepprich.wordpress.com/2017/07/13/oracle-opc-firewall-rules/instances/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/instances.png?w=550" data-orig-size="874,356" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="instances" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/instances.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/instances.png?w=550?w=550" class="alignnone size-full wp-image-2590" src="https://ruepprich.files.wordpress.com/2017/07/instances.png?w=550" alt="instances" srcset="https://ruepprich.files.wordpress.com/2017/07/instances.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/instances.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/instances.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/instances.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/instances.png 874w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Click the Network tab where you should see existing security rules, if any. In the left navigation pane are the various elements we need for the firewall rule.<br /> <img data-attachment-id="2593" data-permalink="https://ruepprich.wordpress.com/2017/07/13/oracle-opc-firewall-rules/network_tab/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/network_tab.png?w=550" data-orig-size="575,397" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="network_tab" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/network_tab.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/network_tab.png?w=550?w=550" class="alignnone size-full wp-image-2593" src="https://ruepprich.files.wordpress.com/2017/07/network_tab.png?w=550" alt="network_tab" srcset="https://ruepprich.files.wordpress.com/2017/07/network_tab.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/network_tab.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/network_tab.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/network_tab.png 575w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>&nbsp;</p> <p>Click the <em> Security Lists</em> link and then the <em>Create Security List</em> button to create a Security List. Security lists get assigned to instances and map the various ports and IP addresses to that instance:<br /> <img data-attachment-id="2463" data-permalink="https://ruepprich.wordpress.com/?attachment_id=2463" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=550" data-orig-size="771,332" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="security_list" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=550?w=550" class="alignnone size-full wp-image-2463" src="https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=550" alt="security_list" srcset="https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/security_list.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/security_list.png 771w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Click the <em>Security Applications</em> link and then the Create <em>Security Application</em> button. We&#8217;ll create an application for port 443.<br /> <img data-attachment-id="2476" data-permalink="https://ruepprich.wordpress.com/?attachment_id=2476" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=550" data-orig-size="773,378" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="security_application" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=550?w=550" class="alignnone size-full wp-image-2476" src="https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=550" alt="security_application" srcset="https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/security_application.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/security_application.png 773w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Click the create button again to add another security application for port 80 to allow http access:<br /> <img data-attachment-id="2525" data-permalink="https://ruepprich.wordpress.com/2017/07/13/oracle-opc-firewall-rules/security_application80/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=550" data-orig-size="774,376" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="security_application80" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=550?w=550" class="alignnone size-full wp-image-2525" src="https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=550" alt="security_application80" srcset="https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/security_application80.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/security_application80.png 774w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Click the <em>Security IP Lists</em> link and then the Create <em>Security IP List</em> button to create a security list which determines the IP addresses that can get through. Using 0.0.0.0/0 allows all IP addresses.<br /> <img data-attachment-id="2478" data-permalink="https://ruepprich.wordpress.com/?attachment_id=2478" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=550" data-orig-size="772,309" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="security_ip_list" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=550?w=550" class="alignnone size-full wp-image-2478" src="https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=550" alt="security_ip_list" srcset="https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/security_ip_list.png 772w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Now map the Port(s) to the IP list and the security list. In other words, open up port 443 to the internet for the <em>cmr_internet</em> security list. This is done by creating a <em>Security Rule</em>. This rule basically says allow port 443 to be accessed by the public web, and assign this rule to the security list <em>cmr_public_web. </em>Below the security list will be assigned to the instance. Note that this is an <strong>inbound</strong> policy, meaning that this is for traffic from the internet to your compute instance. If you were to reverse the source and destination values, it would become an <strong>outbound</strong> policy.</p> <p><span style="color:#333333;">Quick note about inbound and outbound:<br /> Inbound and outbound policies need to coincide with the policies of the <em>Security List</em>. A rule only works if the corresponding policy is set to <em>Deny</em>. In regular language this would mean: &#8220;Deny everything except what&#8217;s in the security rules.&#8221; If the policy is set to <em>Permit</em>, it means &#8220;Let everything through.&#8221;</span></p> <p>Click the <em>Security Rules</em> link and then the <em>Create Security Rule</em> button. Then map the <em>Security Application</em> to a <em>Source</em> and a <em>Destination</em>.</p> <p><img data-attachment-id="2494" data-permalink="https://ruepprich.wordpress.com/?attachment_id=2494" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=550" data-orig-size="770,607" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="security_rule" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=550?w=550" class="alignnone size-full wp-image-2494" src="https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=550" alt="security_rule" srcset="https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/security_rule2.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/security_rule2.png 770w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Create another rule for the port 80 application and assign it to the same security list:<br /> <img data-attachment-id="2529" data-permalink="https://ruepprich.wordpress.com/2017/07/13/oracle-opc-firewall-rules/security_rule80/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=550" data-orig-size="772,607" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="security_rule80" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=550?w=550" class="alignnone size-full wp-image-2529" src="https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=550" alt="security_rule80" srcset="https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/security_rule80.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/security_rule80.png 772w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Now we can see that two rules are assigned to a single security list. One for HTTP and one for HTTPS. Both can be accessed via the public internet:<br /> <img data-attachment-id="2532" data-permalink="https://ruepprich.wordpress.com/2017/07/13/oracle-opc-firewall-rules/two_rules/" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=550" data-orig-size="1011,73" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="two_rules" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=550?w=550" class="alignnone size-full wp-image-2532" src="https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=550" alt="two_rules" srcset="https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/two_rules.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/two_rules.png 1011w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Finally we assign this rule to our compute instance to allow our web server there to serve pages to the public internet via HTTP and HTTPS.</p> <p>Switch back to the <em>Instances</em> tab, click the instance you want to assign the <em>Security List</em> to, and click the <em>Add to Security List</em> button:<br /> <img data-attachment-id="2500" data-permalink="https://ruepprich.wordpress.com/?attachment_id=2500" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=550" data-orig-size="776,187" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="add_list_to_instance" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=550?w=550" class="alignnone size-full wp-image-2500" src="https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=550" alt="add_list_to_instance" srcset="https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/add_list_to_instance.png 776w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>Repeat these steps to create a rule for SSH access on port 22, so that you can access the instance through a terminal. The final result should look like this:<br /> <img data-attachment-id="2505" data-permalink="https://ruepprich.wordpress.com/?attachment_id=2505" data-orig-file="https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=550" data-orig-size="1187,140" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="security_lists_assigned" data-image-description="" data-medium-file="https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=550?w=300" data-large-file="https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=550?w=550" class="alignnone size-full wp-image-2505" src="https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=550" alt="security_lists_assigned" srcset="https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=550 550w, https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=1100 1100w, https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=150 150w, https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=300 300w, https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=768 768w, https://ruepprich.files.wordpress.com/2017/07/security_lists_assigned-e1499894991471.png?w=1024 1024w" sizes="(max-width: 550px) 100vw, 550px" /></p> <p>At this point the firewall settings are ready to go. The compute instance can now be accessed via the internet on ports 80 and 443. You can now add or remove other security lists, or add/remove rules from a particular security list to fit your needs.</p> <p>&nbsp;</p><br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ruepprich.wordpress.com/2521/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ruepprich.wordpress.com/2521/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=ruepprich.wordpress.com&#038;blog=12765658&#038;post=2521&#038;subd=ruepprich&#038;ref=&#038;feed=1" width="1" height="1" /> Christoph Ruepprich http://ruepprich.wordpress.com/?p=2521 Thu Jul 13 2017 17:30:52 GMT-0400 (EDT) Built with ❤️ using Oracle Application Express (APEX) http://joelkallman.blogspot.com/2017/07/built-with-using-oracle-application.html I couldn't get to my keyboard fast enough, to write this blog post. &nbsp;<a href="https://twitter.com/shakeeb" target="_blank">Shakeeb Rahman</a> showed me something last night that I wanted to share with the awesome <a href="https://apex.oracle.com/" target="_blank">APEX</a> community as soon as possible.<br /><div><br /></div><div>APEX is used in literally thousands of applications within <a href="https://www.oracle.com/" target="_blank">Oracle</a>. &nbsp;And in some of the latest apps that we're writing ourselves, in the footer we're including a short phrase which lets people know it was "built with Oracle APEX." &nbsp;We're proud of the app, proud of the UI, and we want people in the company to know that it's an APEX app. &nbsp;But Shakeeb showed me something last night that took this to a whole new level!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-MaPNia8EfmQ/WWgP34IYPJI/AAAAAAAADh4/Ae-kjhHPC6kVq5kNv-1M05qJ15dE471RQCLcBGAs/s1600/heartapex2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="72" data-original-width="442" src="https://3.bp.blogspot.com/-MaPNia8EfmQ/WWgP34IYPJI/AAAAAAAADh4/Ae-kjhHPC6kVq5kNv-1M05qJ15dE471RQCLcBGAs/s1600/heartapex2.gif" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><div><br /></div><div><br /></div><div>The instructions to add this to your APEX 5.1 application are extraordinarily simple:</div><div><br /></div><div><ol><li>Create a new region on the Global Page (page 0) and set the <b>Region Position</b> to <b>Footer</b>. Set the <b>Region Template</b> to <b>Blank with Attributes (no grid)</b>.</li><div><br /></div><li>Use this HTML as the Region Source: <pre class="brush:html;toolbar:false;">&lt;span class="footer-apex">Built with <br /> &lt;span class="fa fa-heart"><br /> &lt;span class="u-VisuallyHidden">love&lt;/span><br /> &lt;/span> <br /> using &lt;a href="https://apex.oracle.com/" target="_blank" title="Oracle Application Express">Oracle APEX&lt;/a><br />&lt;/span><br /></pre></li><li>Add this CSS to your Theme Style by opening Theme Roller and pasting into the Custom CSS section: <pre class="brush:css;toolbar:false;">.footer-apex {font-size: 11px; line-height: 16px; display: inline-block; vertical-align: top;}<br />.footer-apex .fa.fa-heart { vertical-align: top; font-size: 10px; <br /> line-height: 16px; width: 16px; text-align: center; <br /> transition: color 1s ease; }<br />.footer-apex:hover .fa.fa-heart { color: #FF0000; animation: pulse 1s infinite; }<br /> <br />@keyframes pulse {<br /> 0% { transform: scale(0.9); }<br /> 70% { transform: scale(1.25); }<br /> 100% { transform: scale(0.9); }<br />}<br /></pre></li></ol><div><br /></div></div><div>That's it! &nbsp;Simple. &nbsp;It might work in APEX 5.0 and later, but it will definitely work in APEX 5.1 and later.</div><div><br /></div><div>I encourage everyone in the APEX community to add this to the footer of their applications. &nbsp;Many end users don't even know they're using an APEX application, or even what APEX is. &nbsp;This is an easy way to show it, and and show it with <i>style</i>!</div><div><br /></div><div><b>BOOM!</b></div><div><br /></div><div><br /></div> Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-4457911526470210253 Thu Jul 13 2017 11:59:00 GMT-0400 (EDT) How to get, use, and close a DB connection using async functions https://jsao.io/2017/07/how-to-get-use-and-close-a-db-connection-using-async-functions/ <p>So far in this async series, we&#8217;ve covered <a href="https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-callbacks/">Node.js style callbacks</a>, the <a href="https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-the-async-module/">Async module</a>, and <a href="https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-promises/">promises</a>. In this final part of the series, we&#8217;ll learn about async functions (a.k.a. async/await). To me, async functions are the most exciting thing to happen to JavaScript since Ajax. Finally, we can read JavaScript code in a synchronous manner while it executes asynchronously as it always has.<br /> <span id="more-2037"></span></p> <div class="alert alert-info" role="alert"> <strong>Please Note:</strong> This post is part of <a href="https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-various-async-patterns/">a series on working with database connections using various asynchronous patterns</a>. See that post for more details and links to other options. </div> <p>Contents:</p> <ul> <li><a href="#async-functions-overview">Async functions overview</a></li> <li><a href="#try-catch">try&#8230;catch</a></li> <li><a href="#async-loops">Async loops</a></li> <li><a href="#parallel-execution">Parallel execution</a></li> <li><a href="#async-function-demo-app">Async function demo app</a></li> </ul> <h4 id="async-functions-overview">Async functions overview</h4> <p>Async functions are a relatively new feature of JavaScript (not specific to Node.js). Support for the feature first landed in <a href="https://nodejs.org/en/blog/release/v7.6.0/">Node.js v7.6</a> via an update to the V8 JavaScript engine. Because async functions rely heavily on Promises, I recommend you read <a href="https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-promises/">the previous post</a> before continuing. </p> <p>I like to think of async functions as two parts: async and await. Let&#8217;s look at each part in turn.</p> <h5><span class="inline-code">async</span></h5> <p>For the longest time, we&#8217;ve had the ability to create functions in JavaScript using function statements (must be named) or function expressions (often anonymous). </p> <pre class="crayon-plain-tag">function getNumber() { // Function statment return 42; } let logNumber = function() { // Function expression console.log(getNumber()); } logNumber(); // 42</pre> <p>If you run the script above in Node.js, you should see <span class="inline-code">42</span> printed to the console.</p> <p>JavaScript now has asynchronous counterparts to these constructs. Placing the new <span class="inline-code">async</span> keyword before the function statement or expression returns an <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncFunction">AsyncFunction</a> (async function) object.</p> <pre class="crayon-plain-tag">async function getNumber() { // Async function statment return 42; } let logNumber = async function() { // Async function expression console.log(getNumber()); } logNumber(); // Promise { 42 }</pre> <p>Running this script in Node.js should print <span class="inline-code">Promise { 42 }</span>. As you can see, when async functions are invoked, they return promises rather than the actual values returned!</p> <p>For the async based script to be the functional equivalent of the first, we&#8217;d have to rewrite it as follows.</p> <pre class="crayon-plain-tag">async function getNumber() { // Async function statment return 42; } let logNumber = async function() { // Async function expression getNumber() // returns a promise .then(function(value) { console.log(value); }); } logNumber(); // 42</pre> <p>Now we&#8217;re back to logging the value <span class="inline-code">42</span>.</p> <p>Just as we saw with <a href="https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-promises/#promise-chaining">promise chaining</a>, if the async function completes without error, then the promise it returns is resolved. If the function returns a value, then that becomes the promise’s value. If an error is thrown and goes unhandled, then the promise is rejected and the error becomes the promise&#8217;s value.</p> <p>Though interesting, returning promises isn&#8217;t what makes async functions special. We could, after all, just return promises from regular functions. What makes async functions special is <span class="inline-code"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await">await</a></span>.</p> <h5><span class="inline-code">await</span></h5> <p>The <span class="inline-code">await</span> operator, which is only available inside of an async function, is where the magic happens. It&#8217;s like hitting the pause button on your code so that it can wait for a promise to be resolved or rejected before continuing. This is a concept known as a <a href="https://en.wikipedia.org/wiki/Coroutine">coroutine</a>. Coroutines have been available in JavaScript since <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*">generator functions</a> were introduced, but async functions make them much more approachable.</p> <p>Await does not block the main thread. Instead, the currently running call stack, up to the point of <span class="inline-code">await</span>, is allowed to finish so that other functions in the callback queue can be executed. When the promise is resolved or rejected, the remaining portion of the code is queued for execution. If the promise was resolved, its value is returned. If the promise was rejected, the rejected value is thrown on the main thread.</p> <p>Here&#8217;s a demonstration of <span class="inline-code">await</span> that uses <span class="inline-code">setTimeout</span> to simulate an async API. I&#8217;ve added some additional console output to help illustrate what&#8217;s happening.</p> <pre class="crayon-plain-tag">function getRandomNumber() { return new Promise(function(resolve, reject) { setTimeout(function() { const randomValue = Math.random(); const error = randomValue &gt; .8 ? true : false; if (error) { reject(new Error('Ooops, something broke!')); } else { resolve(randomValue); } }, 2000); }); } async function logNumber() { let number; console.log('before await', number); number = await getRandomNumber(); console.log('after await', number); } console.log('before async call'); logNumber(); console.log('after async call');</pre> <p>When this script is run in Node.js without an error occurring, the output will look like the following (I&#8217;ve added a comment where the two-second delay happens).</p> <pre class="crayon-plain-tag">before async call before await undefined after async call # 2 second delay after await 0.22454453163016597</pre> <p>Note that <span class="inline-code">after async call</span> was logged before <span class="inline-code">after await 0.22454453163016597</span>. Only the remaining code in the async function is paused; the remaining synchronous code in call stack will finish.</p> <p>If an error is thrown, you&#8217;ll see the <span class="inline-code">UnhandledPromiseRejectionWarning</span> we covered in the last post. The rejection could be handled with the methods mentioned in that post or using <span class="inline-code">try&#8230;catch</span>!</p> <h4 id="try-catch">try&#8230;catch</h4> <p>In the <a href="https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-various-async-patterns/">first post</a> in this series, I explained why <span class="inline-code">try&#8230;catch</span> blocks don&#8217;t work with asynchronous operations &#8211; you can&#8217;t catch errors that occur outside of the current call stack. But now that we have async functions, <span class="inline-code">try&#8230;catch</span> can be used for asynchronous operations!</p> <p>Here&#8217;s a stripped down version of the previous script that catches errors that occur in the async API and uses a default value instead.</p> <pre class="crayon-plain-tag">function getRandomNumber() { return new Promise(function(resolve, reject) { setTimeout(function() { const randomValue = Math.random(); const error = randomValue &gt; .8 ? true : false; if (error) { reject(new Error('Ooops, something broke!')); } else { resolve(randomValue); } }, 2000); }); } async function logNumber() { let number; try { number = await getRandomNumber(); } catch (err) { number = 42; } console.log(number); } logNumber();</pre> <p>If you run that script enough times you&#8217;ll eventually get <span class="inline-code">42</span> in the output. <span class="inline-code">try&#8230;catch</span> works again, woohoo!</p> <h4 id="async-loops">Async loops</h4> <p>In addition to being able to use <span class="inline-code">try&#8230;catch</span> blocks again, we can do asynchronous loops too! In the following example, I use a simple <span class="inline-code">for</span> loop that logs out three values serially.</p> <pre class="crayon-plain-tag">function getRandomNumber() { return new Promise(function(resolve, reject) { setTimeout(function() { const randomValue = Math.random(); const error = randomValue &gt; .8 ? true : false; if (error) { reject(new Error('Ooops, something broke!')); } else { resolve(randomValue); } }, 2000); }); } async function logNumbers() { for (let x = 0; x &lt; 3; x += 1) { console.log(await getRandomNumber()); } } logNumbers();</pre> <p>Running this script in Node.js, you should see three numbers printed to the console every two seconds. No third party libraries, no complicated promise chains, just a simple loop. Loops work again, yay!</p> <h4 id="parallel-execution">Parallel execution</h4> <p>Clearly, async functions make it easy to do sequential flows and use standard JavaScript constructs with asynchronous operations. But what about parallel flows? This is where <span class="inline-code"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all">Promise.all</a></span> and <span class="inline-code"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race">Promise.race</a></span> come in handy. Because they both return promises, <span class="inline-code">await</span> can work with them like any other promise-based API. </p> <p>Here&#8217;s an example that uses <span class="inline-code">Promise.all</span> to get three random numbers in parallel.</p> <pre class="crayon-plain-tag">function getRandomNumber() { return new Promise(function(resolve, reject) { setTimeout(function() { const randomValue = Math.random(); const error = randomValue &gt; .8 ? true : false; if (error) { reject(new Error('Ooops, something broke!')); } else { resolve(randomValue); } }, 2000); }); } async function logNumbers() { let promises = []; promises[0] = getRandomNumber(); promises[1] = getRandomNumber(); promises[2] = getRandomNumber(); Promise.all(promises) .then(function(values) { console.log(values); }) .catch(function(err) { console.log(err); }); } logNumbers();</pre> <p>Because <span class="inline-code">Promise.all</span> rejects its promise if any promise passed in is rejected, you may need to run the script a few times to see the three random numbers printed out.</p> <h4 id="async-function-demo-app">Async function demo app</h4> <p>The async function demo app is comprised of the following four files. The files are also available via <a href="https://gist.github.com/dmcghan/c3c4b43c592c1e37532546f58f4f8033">this Gist</a>.</p> <pre class="crayon-plain-tag">{ &quot;name&quot;: &quot;async-functions&quot;, &quot;version&quot;: &quot;1.0.0&quot;, &quot;description&quot;: &quot;&quot;, &quot;main&quot;: &quot;index.js&quot;, &quot;scripts&quot;: { &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot; }, &quot;keywords&quot;: [], &quot;author&quot;: &quot;Dan McGhan &lt;dan.mcghan@oracle.com&gt; (https://jsao.io/)&quot;, &quot;license&quot;: &quot;ISC&quot;, &quot;dependencies&quot;: { &quot;oracledb&quot;: &quot;^1.13.1&quot; } }</pre> <p>This is a very basic <span class="inline-code">package.json</span> file. The only external dependency is oracledb.</p> <pre class="crayon-plain-tag">const oracledb = require('oracledb'); const dbConfig = require('./db-config.js'); const employees = require('./employees.js'); async function startApp() { try { await oracledb.createPool(dbConfig); let emp = await employees.getEmployee(101); console.log(emp); } catch (err) { console.log('Opps, an error occurred', err); } } startApp();</pre> <p>All of the async methods in node-oracledb are overloaded to work with callback functions <a href="https://github.com/oracle/node-oracledb/blob/master/doc/api.md#promiseoverview">or promises</a>. If a callback function is not passed in as the last parameter, then a promise will be returned. This version of the <span class="inline-code">index.js</span> uses the <span class="inline-code">await</span> operator with the driver&#8217;s promise APIs to create a connection pool and fetch an employee. Although the pool is returned from the call to <span class="inline-code">createPool</span>, it&#8217;s not referenced here as the <a href="https://github.com/oracle/node-oracledb/blob/master/doc/api.md#-831-connection-pool-cache">built-in pool cache</a> will be used in <span class="inline-code">employees.js</span>.</p> <pre class="crayon-plain-tag">module.exports = { user: 'hr', password: 'oracle', connectString: 'localhost:1521/orcl', poolMax: 20, poolMin: 20, poolIncrement: 0 };</pre> <p>The <span class="inline-code">db-config.js</span> file is used in <span class="inline-code">index.js</span> to provide the connection info for the database. This configuration should work with <a href="https://jsao.io/2017/05/creating-a-sandbox-for-learning-nodejs-and-oracle-database/">the DB App Dev VM</a>, but it will need to be adjusted for other environments.</p> <pre class="crayon-plain-tag">const oracledb = require('oracledb'); function getEmployee(empId) { return new Promise(async function(resolve, reject) { let conn; // Declared here for scoping purposes. try { conn = await oracledb.getConnection(); console.log('Connected to database'); let result = await conn.execute( `select * from employees where employee_id = :emp_id`, [empId], { outFormat: oracledb.OBJECT } ); console.log('Query executed'); resolve(result.rows[0]); } catch (err) { console.log('Error occurred', err); reject(err); } finally { // If conn assignment worked, need to close. if (conn) { try { await conn.close(); console.log('Connection closed'); } catch (err) { console.log('Error closing connection', err); } } } }); } module.exports.getEmployee = getEmployee;</pre> <p>This version of the employees module is similar to the promise version in that the <span class="inline-code">getEmployee</span> function was written as a promise-based API &#8211; it immediately returns a new promise instance which is asynchronously resolved or rejected. The main difference is that <span class="inline-code">await</span> is used with the driver&#8217;s promise APIs to get a connection to the database, use it to execute a query, and then close a connection.</p> <p>A <span class="inline-code">try&#8230;catch&#8230;finally</span> block was used to catch errors and ensure the connection was closed either way. To me, this version of the module is the simplest to read of all those in the series and it doesn&#8217;t hurt that it has the fewest lines of code as well.</p> <p>Hopefully, you now have a better grasp on async functions and are as excited as I am about using them!</p> danmcghan https://jsao.io/?p=2037 Thu Jul 13 2017 09:24:03 GMT-0400 (EDT) Profiling a Java + JDBC Application http://feedproxy.google.com/~r/KrisBlog/~3/0stYpl24lgk/profiling-java-jdbc-application.html NetBeans First, there's NO Java coding needed nor Java source code needed to profile a Java program this way.  NetBeans added this a while back up I just found it recently.  The ability to attach to any Java program and profile the SQL going across JDBC. The dev team's blog on it is here: http://jj-blogger.blogspot.nl/2016/05/netbeans-sql-profiler-take-it-for-spin.html SQLcl SQLcl is our <div class="feedflare"> <a href="http://feeds.feedburner.com/~ff/KrisBlog?a=0stYpl24lgk:H-T2AsSXwYs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/KrisBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/KrisBlog?a=0stYpl24lgk:H-T2AsSXwYs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/KrisBlog?d=7Q72WNTAKBA" border="0"></img></a> </div><img src="http://feeds.feedburner.com/~r/KrisBlog/~4/0stYpl24lgk" height="1" width="1" alt=""/> Kris Rice tag:blogger.com,1999:blog-37621059.post-2199978538108102449 Wed Jul 12 2017 10:57:00 GMT-0400 (EDT) SQLcl 17.2 http://feedproxy.google.com/~r/KrisBlog/~3/84mcH4VxjnU/sqlcl-172.html New Versioning Scheme Starting with this release the numbering scheme is changed.  All releases will now be the YEAR&lt;period&gt;Quarter&lt;period&gt;build numbers. So the new SQLcl is 17.2.0.184.0917.   Breaking that down.  17   - Year 2     - Quarter 0     -  Patch number 184 - Day in Julian 0917 - hour and minute the build was done. New Features Securing Literals  which was introduced <div class="feedflare"> <a href="http://feeds.feedburner.com/~ff/KrisBlog?a=84mcH4VxjnU:58GTecuFE0I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/KrisBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/KrisBlog?a=84mcH4VxjnU:58GTecuFE0I:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/KrisBlog?d=7Q72WNTAKBA" border="0"></img></a> </div><img src="http://feeds.feedburner.com/~r/KrisBlog/~4/84mcH4VxjnU" height="1" width="1" alt=""/> Kris Rice tag:blogger.com,1999:blog-37621059.post-2888030028879426051 Tue Jul 11 2017 18:07:00 GMT-0400 (EDT) After KScope 2 http://apex.dbe.pl/2017/07/after-kscope-2.html Antelope Canyon, Monument Valley - cool !<br /> <br /> Podobnie jak wczoraj, śniadanie w tej samej restauracji. Szybkie zakupy i jedziemy w kierunku Antelope Canyon a w drodze powrotnej Monument Valley. Pewnie część z was nie wiele mówią te nazwy, natomiast kilka zdjęć stamtąd znacie... : ) np. Jeden z kilku ekranów powitalnych w Windows 8.<br /> Dodam jeszcze że zdjęcie wykonane tam jest jednym z najdrożej sprzedanych zdjęc w historii.<br /> Ponieważ jest to miejsce bardzo oblegane, bilety zarezerwowaliśmy kilka miesięcy wcześniej. Bilety są na konkretną godzinę, a że jesteśmy około 2 godziny za wcześniej jedziemy jeszcze na Horseshoe Bend... sami spójrzcie : )<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://1.bp.blogspot.com/-Lwws1xHF2H4/WWJY4TmJXVI/AAAAAAAAKBc/WE-4tLdiDbsXdxR6sHXUKKfjGH80iZqYgCLcBGAs/s1600/Przechwytywanie1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="785" data-original-width="1194" height="262" src="https://1.bp.blogspot.com/-Lwws1xHF2H4/WWJY4TmJXVI/AAAAAAAAKBc/WE-4tLdiDbsXdxR6sHXUKKfjGH80iZqYgCLcBGAs/s400/Przechwytywanie1.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-3ys1T9ROfwc/WWJY4UTgsDI/AAAAAAAAKBg/EDC9hNURmCc_8GBxEWitolfRWE70jrLQQCLcBGAs/s1600/Przechwytywanie.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="775" data-original-width="1184" height="261" src="https://2.bp.blogspot.com/-3ys1T9ROfwc/WWJY4UTgsDI/AAAAAAAAKBg/EDC9hNURmCc_8GBxEWitolfRWE70jrLQQCLcBGAs/s400/Przechwytywanie.JPG" width="400" /></a></div> <br /> <br /> Przychodzi nasza godzina więc wracamy do punktu zbiórki. Przewodnik każe nam wsiadać na pakę truck-a z kilkoma innymi turystami. Ruszamy. Po chwili jazdy zjeżdżamy na pustynną drogę... i się zaczyna : ) kłęby kurzu i co chwile nas podbija do góry.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://1.bp.blogspot.com/-4fxwcAz3gQE/WWJY4WhV6LI/AAAAAAAAKBk/GBpj_UE9z2IM06wIKTEBUK56KQGaafMwwCEwYBhgL/s1600/Przechwytywanie2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="782" data-original-width="1197" height="261" src="https://1.bp.blogspot.com/-4fxwcAz3gQE/WWJY4WhV6LI/AAAAAAAAKBk/GBpj_UE9z2IM06wIKTEBUK56KQGaafMwwCEwYBhgL/s400/Przechwytywanie2.JPG" width="400" /></a></div> <br /> <br /> Dla nas super ale kilka starszych japonek wydaje dziwne odgłosy... Pierwsze chwile w canyon-ie potwierdzają jakość miejsca. Nawet panie z kraju kwitnącej wiśni zapominają o drodze.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://4.bp.blogspot.com/-vAtqBwEA_84/WWJY4gD5utI/AAAAAAAAKBo/NmqsgV5ejpsmfJrDV0o7D7A99ovsYbE2gCEwYBhgL/s1600/Przechwytywanie3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="794" data-original-width="1197" height="265" src="https://4.bp.blogspot.com/-vAtqBwEA_84/WWJY4gD5utI/AAAAAAAAKBo/NmqsgV5ejpsmfJrDV0o7D7A99ovsYbE2gCEwYBhgL/s400/Przechwytywanie3.JPG" width="400" /></a></div> <br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://1.bp.blogspot.com/-_fIpsvkuF8E/WWJY48dbHRI/AAAAAAAAKBs/8NEPkooHUSIl7T3XYH52YfvLM8VjVGJ1QCEwYBhgL/s1600/Przechwytywanie4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="781" data-original-width="1193" height="261" src="https://1.bp.blogspot.com/-_fIpsvkuF8E/WWJY48dbHRI/AAAAAAAAKBs/8NEPkooHUSIl7T3XYH52YfvLM8VjVGJ1QCEwYBhgL/s400/Przechwytywanie4.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-YNclMcQVsfM/WWJY4_h7ctI/AAAAAAAAKBw/yK-zZPQIPDsPR-nROhg_MPvzYzDdWENkACEwYBhgL/s1600/Przechwytywanie5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="795" data-original-width="1197" height="265" src="https://2.bp.blogspot.com/-YNclMcQVsfM/WWJY4_h7ctI/AAAAAAAAKBw/yK-zZPQIPDsPR-nROhg_MPvzYzDdWENkACEwYBhgL/s400/Przechwytywanie5.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-xay4Je321lk/WWJY5ErkvxI/AAAAAAAAKB0/9ClnvmHB7sYUBLjf2LO_v7b4ISfHZ2RRgCEwYBhgL/s1600/Przechwytywanie6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="794" data-original-width="1195" height="265" src="https://2.bp.blogspot.com/-xay4Je321lk/WWJY5ErkvxI/AAAAAAAAKB0/9ClnvmHB7sYUBLjf2LO_v7b4ISfHZ2RRgCEwYBhgL/s400/Przechwytywanie6.JPG" width="400" /></a></div> <br /> <br /> Droga powrotna była jeszcze większym hardcorem. Indianka, która kierowała truckiem wyraźnie chciała zrobić jeszcze jeden kurs... - połowa japonek zgubiła swoje kapelusiki.<br /> <br /> Chwila oddechu i ruszamy do Monument Valley. Droga niesamowita totalne pustkowia droga widoczna po horyzont.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-_lD1oka0Wjk/WWJZ-3mwjYI/AAAAAAAAKB8/A4zdglNpHI0B98SYIpxTYqbJ2h-mHyqqgCLcBGAs/s1600/Przechwytywanie6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="767" data-original-width="1200" height="255" src="https://2.bp.blogspot.com/-_lD1oka0Wjk/WWJZ-3mwjYI/AAAAAAAAKB8/A4zdglNpHI0B98SYIpxTYqbJ2h-mHyqqgCLcBGAs/s400/Przechwytywanie6.JPG" width="400" /></a></div> <br /> <br /> Chcemy zdążyć przed zachodem słońca więc nigdzie się nie zatrzymujemy. Udaje nam się dojechać 40 minut przed zachodem... widok zapiera dech w piersiach : )<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://1.bp.blogspot.com/-ghHR8aeECDU/WWJZ-7fIDoI/AAAAAAAAKB4/u8_ixh7mJ3EwQr-6HsJFcT328Uk-ZAu4wCEwYBhgL/s1600/Przechwytywanie5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="788" data-original-width="1198" height="262" src="https://1.bp.blogspot.com/-ghHR8aeECDU/WWJZ-7fIDoI/AAAAAAAAKB4/u8_ixh7mJ3EwQr-6HsJFcT328Uk-ZAu4wCEwYBhgL/s400/Przechwytywanie5.JPG" width="400" /></a></div> <br /> <div> <br /></div> ) tag:blogger.com,1999:blog-7531463720728239813.post-2603014356909788676 Tue Jul 11 2017 05:00:00 GMT-0400 (EDT) REST and Application Express: Filtering https://blogs.oracle.com/apex/rest-and-application-express-filtering <p>More and more Application Express developers are faced with the requirement to integrate REST services or HTTP/JSON data feeds into their applications. Application Express provides great support for SOAP web services, but for REST services using JSON to exchange data, the built-in functionality is limited. For instance, all the JSON parsing has to be done manually by employing PL/SQL code or SQL functions.</p> <p>During the last weeks, we released a few articles describing how to access a REST service from within Application Express, how to leverage the REST Client Assistant packaged application and how to deal with REST services providing large result sets ...</p> <ul> <li><span><a href="http://blogs.oracle.com/apex/rest-services-and-application-express-51-part-1">Generate SQL and PL/SQL code to access REST services using REST Client Assistant</a></span></li> <li><span><a href="http://blogs.oracle.com/apex/rest-and-apex-51%3A-pagination">Work with REST services returning large result sets page-wise</a></span></li> <li><span><a href="http://blogs.oracle.com/apex/apex-https-certificates-and-the-oracle-wallet">Configure a database wallet to access HTTPS services</a></span></li> </ul> <p>In the previous articles, we always fetched all response data from the REST service - either all at once or page-wise, depending on REST service capabilities. But in practice, it&#39;s often required to get only a subset of the response data - we want to filter the response based on some end user criteria.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/58e68a7cdad9823c0557ea2f192a7a83/image03.png" style="width: 500px; height: 311px;" /></p> <p>&quot;So that&#39;s easy&quot; might be your first thought - since all JSON parsing is done with SQL functions. In the SQL query, both XMLTABLE and JSON_TABLE act as a row source, so its result can be treated like rows from a table or view. Thus we can simply amend the WHERE clause of the SQL query, which has been generated be the REST Client Assistant packaged application.&nbsp;</p> <p>But imagine a REST service returning a huge amount of data (thousands or even millions of rows). As learned in the Work with REST services returning large result sets page-wise article, these services return their data page-wise. So, in order to apply a SQL filter, we would first have to fetch all data, walking though all the response pages.&nbsp;</p> <p>For REST services provided by Oracle REST Data Services (ORDS), a filter syntax is provided: Filter criteria can be passed to ORDS with the REST request and will be executed server-side returning only the final (and limited) amount of rows.</p> <p><a href="https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/6142/index-en.html" target="_blank">This article</a> shows how the response of a &nbsp;REST service invocation can be filtered either using SQL or a filtering syntax provided by the REST service. Have a read, how this can be used in your own Application Express applications.</p> <p>&nbsp;</p> Carsten Czarski https://blogs.oracle.com/apex/rest-and-application-express-filtering Tue Jul 11 2017 03:56:00 GMT-0400 (EDT) REST and Application Express: Filtering https://blogs.oracle.com/apex/rest-and-application-express-filtering <p>More and more Application Express developers are faced with the requirement to integrate REST services or HTTP/JSON data feeds into their applications. Application Express provides great support for SOAP web services, but for REST services using JSON to exchange data, the built-in functionality is limited. For instance, all the JSON parsing has to be done manually by employing PL/SQL code or SQL functions.</p> <p>During the last weeks, we released a few articles describing how to access a REST service from within Application Express, how to leverage the REST Client Assistant packaged application and how to deal with REST services providing large result sets ...</p> <ul> <li><span><a href="http://blogs.oracle.com/apex/rest-services-and-application-express-51-part-1">Generate SQL and PL/SQL code to access REST services using REST Client Assistant</a></span></li> <li><span><a href="http://blogs.oracle.com/apex/rest-and-apex-51%3A-pagination">Work with REST services returning large result sets page-wise</a></span></li> <li><span><a href="http://blogs.oracle.com/apex/apex-https-certificates-and-the-oracle-wallet">Configure a database wallet to access HTTPS services</a></span></li> </ul> <p>In the previous articles, we always fetched all response data from the REST service - either all at once or page-wise, depending on REST service capabilities. But in practice, it&#39;s often required to get only a subset of the response data - we want to filter the response based on some end user criteria.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/58e68a7cdad9823c0557ea2f192a7a83/image03.png" style="width: 500px; height: 311px;" /></p> <p>&quot;So that&#39;s easy&quot; might be your first thought - since all JSON parsing is done with SQL functions. In the SQL query, both XMLTABLE and JSON_TABLE act as a row source, so its result can be treated like rows from a table or view. Thus we can simply amend the WHERE clause of the SQL query, which has been generated be the REST Client Assistant packaged application.&nbsp;</p> <p>But imagine a REST service returning a huge amount of data (thousands or even millions of rows). As learned in the Work with REST services returning large result sets page-wise article, these services return their data page-wise. So, in order to apply a SQL filter, we would first have to fetch all data, walking though all the response pages.&nbsp;</p> <p>For REST services provided by Oracle REST Data Services (ORDS), a filter syntax is provided: Filter criteria can be passed to ORDS with the REST request and will be executed server-side returning only the final (and limited) amount of rows.</p> <p><a href="https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/6142/index-en.html" target="_blank">This article</a> shows how the response of a &nbsp;REST service invocation can be filtered either using SQL or a filtering syntax provided by the REST service. Have a read, how this can be used in your own Application Express applications.</p> <p>&nbsp;</p> Carsten Czarski https://blogs.oracle.com/apex/rest-and-application-express-filtering Tue Jul 11 2017 03:56:00 GMT-0400 (EDT) REST Services und Application Express: Filtering https://blogs.oracle.com/apexcommunity_deutsch/rest-services-und-application-express-filtering <p>Die Anforderung, mit REST Services zu arbeiten, haben auch Application Express-Entwickler mehr und mehr auf dem Schreibtisch. Zwar k&ouml;nnen Web Service Referenzen f&uuml;r REST Services in den Gemeinsamen Komponenten eingerichtet werden; die Unterst&uuml;tzung ist jedoch recht limitiert: So muss die JSON-Antwort, die der REST Service sendet, typischerweise manuell geparst und verarbeitet werden.</p> <p>In den vergangenen Wochen konnten Sie bereits mehrere Tipps zum Thema im Rahmen der APEX-Community lesen: So haben Sie erfahren, wie Sie, mit der seit Version 5.1 vorhandenen neuen Packaged Applications REST Client Assistant ...</p> <ul> <li><span><a href="http://blogs.oracle.com/apexcommunity_deutsch/rest-services-und-application-express-51-teil-2">SQL und PL/SQL Code zum Zugriff auf den REST Service und zum JSON-Parsing erzeugen</a></span></li> <li><span><a href="http://blogs.oracle.com/apexcommunity_deutsch/rest-services-und-application-express-51-teil-2">gr&ouml;&szlig;ere Datenmengen seitenweise vom REST Service abrufen k&ouml;nnen</a></span></li> <li><a href="http://blogs.oracle.com/apexcommunity_deutsch/apex-https-zertifikate-und-das-oracle-wallet">ein Wallet konfigurieren, um problemlos auf SSL-gesicherte Services zuzugreifen</a>​</li> </ul> <p>In den bisherigen Tipps wurden stets alle Daten des REST Service abgerufen - entweder alle auf einmal, oder seitenweise. In der Praxis sind aber oft nur Teilmengen der Daten gefragt: man m&ouml;chte die Ergebnismenge mit einem Filter einschr&auml;nken.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/58e68a7cdad9823c0557ea2f192a7a83/image03.png" style="width: 500px; height: 311px;" /></p> <p>&quot;Das ist ja einfach&quot; d&uuml;rfte nun der allererste Gedanke sein - schlie&szlig;lich findet das JSON-Parsing mit SQL und den SQL-Funktionen XMLTABLE oder JSON_TABLE statt. Beide stellen die Daten so bereit, als ob sie aus einer Tabelle k&auml;men - in der WHERE-Klausel k&ouml;nnen nun also beliebige SQL-Filter verwendet werden.&nbsp;</p> <p>Problematisch wird dies allerdings, wenn die Antwort des REST Service potenziell sehr gro&szlig;e Datenmengen zur&uuml;ck liefert - man stelle sich vor, ohne Filter w&uuml;rde eine sechs- oder gar siebenstellige Anzahl an Zeilen zur&uuml;ckgegeben. Viele REST-Services geben die Daten dann seitenweise ab; das wurde im Community-Tipp Gr&ouml;&szlig;ere Datenmengen seitenweise vom REST Service abrufen n&auml;her betrachtet. Ginge man wie oben vor, bedeutet das, dass man zun&auml;chst alle Daten, &uuml;ber mehrere Seiten hinweg, vom REST Service abrufen w&uuml;rde. Anschlie&szlig;end w&uuml;rde man, per SQL-Filter, das meiste davon wieder verwerfen. Es ist klar, dass dies f&uuml;r den kleinere Services (unter 1.000 Zeilen) noch in Ordnung geht, bei gr&ouml;&szlig;eren Datenmengen ist diese Vorgehensweise allerdings problematisch.</p> <p>Lesen Sie in <a href="https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/6142/index.html" target="_blank">unserem aktuellen Tipp</a>, wie Sie die Ergebnismenge eines REST Service filtern k&ouml;nnen - wann Sie problemlos mit SQL arbeiten und wann Sie eine Filter-Syntax, am Beispiel von Oracle REST Data Services, nutzen k&ouml;nnen.&nbsp;</p> <p>&nbsp;</p> Carsten Czarski https://blogs.oracle.com/apexcommunity_deutsch/rest-services-und-application-express-filtering Tue Jul 11 2017 03:50:03 GMT-0400 (EDT) Custom workflow to download or upload specific Google Drive files http://apextips.blogspot.com/2017/07/custom-workflow-to-download-or-upload.html I had an interest in downloading and uploading a specific file into my Google Drive at certain timing points. For examples sake, let's call the files "Designs.cad". There is a command line project on GitHub which is Go based. So if you have Go installed, it is just a matter of running:<br /><br /><pre>go get&nbsp;github.com/prasmussen/gdrive<br /></pre><br /><br />This will download from source, so if you don't want to do this or if you don't have Go installed (you should - there are lots of great go projects), you can see a list of releases on the project page -&nbsp;<a href="https://github.com/prasmussen/gdrive">https://github.com/prasmussen/gdrive</a> - which you can download and place in your system somewhere, with the command becoming "gdrive".<br /><br />When you first install it, you will need to authenticate your account. Running any command will prompt you to go to a URL to get an authorization code and paste in back on your console. So for example, if I run:<br /><br /><pre>gdrive list<br /></pre><br />Which is designed to list files in my Drive. After running the command, if you haven't previsouly authenticated, you will be prompted to go to a URL to paste the authorization code. Sample output:<br /><br /><pre>trent@birroth:~$ gdrive list<br />Authentication needed<br />Go to the following url in your browser:<br />https://accounts.google.com/o/oauth2/auth?access_type=offline&amp;client_id...<br /><br />Enter verification code: xxx<br /></pre><br />Where xxx is the verification code I pasted back in.<br />If successful, you will end up with a file at: $HOME/.gdrive/token_v2.json, containing on the necessary authorization codes so the program can continue to function whilst ever the authorization exists for this application.<br /><br />So, looking at the help, there are two commands that will be useful - download and update.<br /><br />We can find out the program usage with the help command, like so for the download operation.<br /><br /><pre>$ gdrive help download<br />Download file or directory<br />gdrive [global] download [options] <fileid><br /><br />global:<br /> -c, --config <configdir> Application path, default: /home/trent/.gdrive<br /> --refresh-token <refreshtoken> Oauth refresh token...<br /> --access-token <accesstoken> Oauth access token...<br /> --service-account <serviceaccount> Oauth service account filename...<br /><br />options:<br /> -f, --force Overwrite existing file<br /> -s, --skip Skip existing files<br /> -r, --recursive Download directory recursively...<br /> --path <path> Download path<br /> --delete Delete remote file when download is successful<br /> --no-progress Hide progress<br /> --stdout Write file content to stdout<br /> --timeout <timeout> Set timeout in seconds...<br /></timeout></path></serviceaccount></accesstoken></refreshtoken></configdir></fileid></pre><br /><br />To use this, I need to find the file ID, which I can do by using the list command, or looking at the web interface of Google Drive. The filename will be the same as that as it is on Google Drive. So, with that information I end up with the command:<br /><br /><pre>gdrive download --path /home/trent/ --force 1GUG3Y3Ce56Pa0k2<br /></pre><br />Which gives output like so:<br /><br /><pre>Downloading Designs.cad -&gt; /home/trent/Designs.cad<br />Downloaded 1GUG3Y3Ce56Pa0k2 at 18.2 KB/s, total 18.2 KB</pre><br />Similarly, to send the file in the other direction, we need to look at the usage for the command update<br /><br /><pre>$ gdrive help update<br />Update file, this creates a new revision of the file<br />gdrive [global] update [options] <fileid> <path><br /><br />global:<br /> -c, --config <configdir> Application path, default: /home/trent/.gdrive<br /> --refresh-token <refreshtoken> Oauth refresh token...<br /> --access-token <accesstoken> Oauth access token...<br /> --service-account <serviceaccount> Oauth service account filename...<br /><br />options:<br /> -p, --parent <parent> Parent id...<br /> --name <name> Filename<br /> --description <description> File description<br /> --no-progress Hide progress<br /> --mime <mime> Force mime type<br /> --timeout <timeout> Set timeout in seconds...<br /> --chunksize <chunksize> Set chunk size in bytes...<br /></chunksize></timeout></mime></description></name></parent></serviceaccount></accesstoken></refreshtoken></configdir></path></fileid></pre><br />That means, our command will become:<br /><br /><pre>gdrive update 1GUG3Y3Ce56Pa0k2 /home/trent/Designs.cad<br /></pre><br /><br /> trent tag:blogger.com,1999:blog-8785176694082881912.post-1368952633952063644 Mon Jul 10 2017 19:49:00 GMT-0400 (EDT) URL do Apex http://desenvolvedorapex.blogspot.com/2017/07/url-do-apex.html Olá pessoal,<br /><br />A URL do Apex possui uma regra de formação que é muito interessante conhecer.<br /><br />Ela possui o formato semelhante ao apresentado na imagem abaixo.<br /><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://2.bp.blogspot.com/-q-Bo08ou7Uc/WWPw6AbbAMI/AAAAAAAAAus/EHrU8Uv_GukudENlVqTA-5mwV_PwIrgBQCLcBGAs/s1600/URL%2Bbrowser.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="46" data-original-width="912" height="20" src="https://2.bp.blogspot.com/-q-Bo08ou7Uc/WWPw6AbbAMI/AAAAAAAAAus/EHrU8Uv_GukudENlVqTA-5mwV_PwIrgBQCLcBGAs/s400/URL%2Bbrowser.png" width="400" /></a></div><br />O objetivo desta postagem serão os valores que ficam <b>separados por ":" </b>após o trecho "<b>f?p=</b>" da URL.<br /><br />Repare que, na figura acima, logo após o trecho "f?p=" há o número <b>9829</b>. Este número é o <b>número da aplicação</b>. Ele deve ser único dentro de uma instância do Apex. Pode-se utilizar o apelido da aplicação em vez do número.<br /><br />Em seguida, há o número "<b>7</b>" que indica o <b>número da página</b>. Pode-se utilizar também o apelido da página.<br /><br />Após isso, há um número bem grande "<b>2010875792236801</b>" que é o <b>número da sessão</b>. A sessão é gerada automaticamente pela engine do Apex e é utilizada para o gerenciamento da sessão: valores de componentes, usuário logado etc.<br /><br />O texto "<b>EDIT</b>" é a <b>requisição</b> que está sendo passada para a página.<br /><br />O trecho "<b>NO</b>" indica que a aplicação NÃO está no modo <b>depuração (debug)</b>. Para ajustar a aplicação no modo de depuração, deve-se colocar "YES" ou "LEVEL<b>n</b>", onde <b>n </b>é o nível de depuração desejado (1 a 9). O default para "n" é 4. Se quiser uma maior nível de depuração deve-se colocar valores mais altos para "n". Por exemplo, pode-se colocar LEVEL9, caso queira o maior nível de depuração.<br /><br />O número "<b>7</b>" que vem logo após o "NO", indica que a <b>limpeza de cache</b> deve ser realizada para a página 7. Pode-se passar qualquer um dos valores da coluna "String da URL" de acordo com o quadro abaixo.<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-pMvvAX1fe0g/WWP13iLzkwI/AAAAAAAAAu0/R3F1lzFEpc0rqb2u-AoL2jZGlAPKbBs-wCLcBGAs/s1600/Clear%2Bcache.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="391" data-original-width="946" height="165" src="https://2.bp.blogspot.com/-pMvvAX1fe0g/WWP13iLzkwI/AAAAAAAAAu0/R3F1lzFEpc0rqb2u-AoL2jZGlAPKbBs-wCLcBGAs/s400/Clear%2Bcache.PNG" width="400" /></a></div><br />"<b>P7_COD_CLIENTE</b>" é o nome do <b>item de entrada</b>&nbsp;(input parameter) que receberá algum valor passado pela URL. Para mais de um item, coloque os nomes dos itens separados por vírgula.<br /><br />"2" é o <b>valor</b> que está sendo passado para o item de entrada. No caso P7_COD_CLIENTE está sendo "setado" para o valor 2.<br /><br />O último "<b>NO</b>" indica que a página não está no<b> modo de impressão amigável</b>. Para que esteja no modo de impressão, deve-se utilizar o valor "YES".<br /><br />Achou complicado? Segue um quadro resumo com os componentes da URL.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-9vtZLrWLpnA/WWP1bGatS9I/AAAAAAAAAuw/EKohGzzfEiUnh3CtadrUXkkaFfPCfuYhwCLcBGAs/s1600/Componentes%2BURL%2BApex.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="412" data-original-width="697" height="236" src="https://4.bp.blogspot.com/-9vtZLrWLpnA/WWP1bGatS9I/AAAAAAAAAuw/EKohGzzfEiUnh3CtadrUXkkaFfPCfuYhwCLcBGAs/s400/Componentes%2BURL%2BApex.PNG" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Espero que tenha gostado!</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Qualquer dúvida ou sugestão, deixe seu comentário.</div> Anderson Ferreira tag:blogger.com,1999:blog-5150514048465222719.post-7806818124731380752 Mon Jul 10 2017 17:58:00 GMT-0400 (EDT) Converting a physical machine for use in VirtualBox http://apextips.blogspot.com/2017/07/converting-physical-machine-for-use-in.html I recently had an interest in converting a physical machine (Windows) I have into a virtualised environment. For my personal Virtual needs, I tend to use and favour VirtualBox - so my end goal is to have the system running in VirtualBox.<br /><br />A quick google with these keywords reveals this VirtualBox article:&nbsp;<a href="https://www.virtualbox.org/wiki/Migrate_Windows">https://www.virtualbox.org/wiki/Migrate_Windows</a>. However, this talks about Windows XP, and then one of the software it references is 10 years old. And for some extra context, Windows XP was first released in 2001 and the last release (SP3) in 2008. Ok, so I'm deciding not to go down that path.<br /><br />Putting aside the previous article, I happen to know there are two solutions that support converting a physical machine.<br /><ul><li>VMWare</li><li>Microsoft (Disk2vhd)</li></ul>So, I will go with the VMWare option for this article/guide. The software is found over at:&nbsp;<a href="https://www.vmware.com/ca/products/converter.html">https://www.vmware.com/ca/products/converter.html</a>. So, I download and install the software (note, you will need a VMWare account in order to download this software).<br /><br />The software includes official documentation in the form of a PDF document, so if you want to review that, head over to:&nbsp;<a href="https://www.vmware.com/pdf/convsa_61_guide.pdf">https://www.vmware.com/pdf/convsa_61_guide.pdf</a> - chapter 6 is the relevant chapter.<br /><br />Firstly, you will want to start the program as Administrator to ensure you have full privileges. Search for VMWare and right click the relevant entry, and then click "Run as administrator". &nbsp;Once it's opened, click on the "Convert machine" toolbar button - this will begin the wizard.<br /><br />For the source, it's pretty safe to leave the default options<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-i5K-KPwTm4w/WWEolb97WEI/AAAAAAAAIJM/mK5pc6d4OKoNzxjKSvSwaHuVvMV8RoorQCLcBGAs/s1600/2017-07-08_14h46_18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="165" data-original-width="543" height="97" src="https://1.bp.blogspot.com/-i5K-KPwTm4w/WWEolb97WEI/AAAAAAAAIJM/mK5pc6d4OKoNzxjKSvSwaHuVvMV8RoorQCLcBGAs/s320/2017-07-08_14h46_18.png" width="320" /></a></div><br />On the second step, Destination system, I will opt to target VMWare Player 7.x. And I think it goes without saying you should be targeting this to be saved on an external disk. So, the desitnation configuration ends up looking like:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-d2ULFXXDsiQ/WWEpYXhE-eI/AAAAAAAAIJQ/ZC99vXN5kaYt5idto1d7EtIASv-YoamTwCLcBGAs/s1600/2017-07-08_14h49_56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="330" data-original-width="770" height="137" src="https://2.bp.blogspot.com/-d2ULFXXDsiQ/WWEpYXhE-eI/AAAAAAAAIJQ/ZC99vXN5kaYt5idto1d7EtIASv-YoamTwCLcBGAs/s320/2017-07-08_14h49_56.png" width="320" /></a></div><br />After this step, you will be presented with all the system options that you may want to update - such as reducing the memory, since your virtual environment would probably have far less memory than your physical machine. I also change the number of virtual cores down to 2 (from 4).<br /><br />That's all done we can run the conversion. Click Finish and the process will begin. After the job submits, the process will take some time, so you can re-visit the process later (it offers a time estimation - for me, it estimated 1 hour, but jumped up and down periodically).<br /><br />In the meantime, we can go and grab VMWare Workstation player, if we don't already have anything to verify the conversion in VMWare. This can be found here:&nbsp;<a href="https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0">https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0</a> note: this is free for non-commercial use. This is just if you want to verify the conversion in VMWare - if you prefer, or that license doesn't suit, you can skip this step and grab the ovftool directly over here:&nbsp;<a href="https://www.vmware.com/support/developer/ovf/">https://www.vmware.com/support/developer/ovf/</a><br /><br />With the conversion finished, you should end up with two files: a vmdk and vmx file. Here, we can test it works by opening it up in VMWare Player - for performance, you may want to copy the files over to your host computer, space permitting. Aside from that, all should be working.<br /><br />Now to convert this for use in VirtualBox. You can either just point at the vmdk file and create the machine manually or create an appliance - I will go forward with the latter approach, though pointing at the existing storage file (vmdk) will get you up and running much quicker!<br /><br />VMWare player comes with a command line program named ovftool which supports converting from "VMX" to "OVF". (This tool can also be downloaded standalone: <a href="https://www.vmware.com/support/developer/ovf/">https://www.vmware.com/support/developer/ovf/</a>&nbsp;- the next step is based on if you installed VMWare player). So, go to the folder where workstation player was installed to - on my system, it is: "C:\Program Files (x86)\VMware\VMware Player". You should see a folder named "OVFTool" - right click that whilst holding the shift key, and click "Open PowerShell Window Here".<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-fy_AB7R2Fn8/WWFDCO4i8NI/AAAAAAAAIJg/pYUgi1FGMBgz5_X8gKSMie2Ot0CzkN8pwCLcBGAs/s1600/2017-07-08_16h39_22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="347" data-original-width="640" height="173" src="https://4.bp.blogspot.com/-fy_AB7R2Fn8/WWFDCO4i8NI/AAAAAAAAIJg/pYUgi1FGMBgz5_X8gKSMie2Ot0CzkN8pwCLcBGAs/s320/2017-07-08_16h39_22.png" width="320" /></a></div><br />Then run (adjusting to where your VMWare VM was saved to and where you want the VirtualBox appliance saved to) the following:<br /><br /><pre>ovftool.exe "F:\VMWareConverted\WindowsVM\WindowsVM.vmx" "F:\VBAppliance\WindowsVM.ovf"<br /></pre><br />This is another fairly long process, so sit back!<br /><br />Once that finishes, head over to VirtualBox, and import the appliance we just created - the ovf file.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-Aw8oL4OBSNw/WWITHlrzecI/AAAAAAAAIKA/JtK4tvzv62ABN-BZaZMgUfjel89a2I82QCLcBGAs/s1600/2017-07-09_07h27_12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="305" data-original-width="329" height="296" src="https://4.bp.blogspot.com/-Aw8oL4OBSNw/WWITHlrzecI/AAAAAAAAIKA/JtK4tvzv62ABN-BZaZMgUfjel89a2I82QCLcBGAs/s320/2017-07-09_07h27_12.png" width="320" /></a></div><br /><br />The name comes through as "vm" so you'll probably want to update that, I also changed the Guest OS Type property to Windows to match my system.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-AhNhkOIxPF8/WWIT36CMKaI/AAAAAAAAIKE/sqcQIcqoYPUwdwH_ffl9Ve5Sy_W-3V1hgCLcBGAs/s1600/2017-07-09_07h30_23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="519" data-original-width="647" height="256" src="https://3.bp.blogspot.com/-AhNhkOIxPF8/WWIT36CMKaI/AAAAAAAAIKE/sqcQIcqoYPUwdwH_ffl9Ve5Sy_W-3V1hgCLcBGAs/s320/2017-07-09_07h30_23.png" width="320" /></a></div><br />I also disabled all the network adapters (4) that came through in the settings, so I can manually add them later - I encountered issues where the network adapters weren't being detected properly in the guest, so this is probably the safer option - we add the network interfaces manually after import.<br /><br />Click import to create the VM within VirtualBox.<br /><br />Once that finishes, when attempting to run the machine, you will find you're not out of the woods yet. So, here are some extra steps you'll want to do before starting the virtual machine.<br /><br /><ul><li>Enable EFI (if your computer is recent and EFI based)</li><li>Move the HDD to the SATA controller&nbsp;</li><li>Add an optical disk (so we can install the guest additions)</li><li>Enable the network</li><li>Switch to Intel HD Audio</li><li>Install guest additions</li></ul><br /><br />I found that when starting the system, I would receive the following error:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-RjXQ_3JbMlY/WWIW9-hwhZI/AAAAAAAAIKM/j665JzUA-IM8tsvhuDaVrslzko39WEzYwCLcBGAs/s1600/2017-07-09_07h43_43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="491" data-original-width="722" height="217" src="https://3.bp.blogspot.com/-RjXQ_3JbMlY/WWIW9-hwhZI/AAAAAAAAIKM/j665JzUA-IM8tsvhuDaVrslzko39WEzYwCLcBGAs/s320/2017-07-09_07h43_43.png" width="320" /></a></div><b>Enable EFI</b><br /><br />After doing a bit of digging, I can see in the VirtualBox settings, EFI is not enabled but my system is fairly recent so that is in use and needs to be enabled. So head into the configuration and make sure that is enabled.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-FX2VLsYRh_Y/WWIXTOoZznI/AAAAAAAAIKQ/qAX0RefyX88ySx0UI4uH7s76Bt0QTFDegCLcBGAs/s1600/2017-07-09_07h45_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="698" height="228" src="https://2.bp.blogspot.com/-FX2VLsYRh_Y/WWIXTOoZznI/AAAAAAAAIKQ/qAX0RefyX88ySx0UI4uH7s76Bt0QTFDegCLcBGAs/s320/2017-07-09_07h45_02.png" width="320" /></a></div><br /><br />So, now this time when trying to boot we will get another error. Progress!<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-YrSdj3fgYf8/WWIXuZb4fPI/AAAAAAAAIKU/qlLBkl1ju1AM8BAQ5VyOyaE5YCK1TFHFACLcBGAs/s1600/2017-07-09_07h46_51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="686" data-original-width="785" height="279" src="https://1.bp.blogspot.com/-YrSdj3fgYf8/WWIXuZb4fPI/AAAAAAAAIKU/qlLBkl1ju1AM8BAQ5VyOyaE5YCK1TFHFACLcBGAs/s320/2017-07-09_07h46_51.png" width="320" /></a></div><br /><b><br /></b><b>Move the HDD to the SATA controller&nbsp;</b><br /><br />Looking in the VM configuration, I see the storage device is attached to a SAS controller. Just on a hunch, I try moving the moving the device into the SATA controller (delete and re-add the disk from the storage sections in the machine settings).<br /><br />So, remove the disk "WindowsVM-disk1.vmdk" from the SAS controller<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-zWT5egRn8q0/WWIZ3ApeKlI/AAAAAAAAIKg/JiW07bkloxo7abB0QEUAZy4pMUM2dgX9ACLcBGAs/s1600/2017-07-09_07h56_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="698" height="228" src="https://2.bp.blogspot.com/-zWT5egRn8q0/WWIZ3ApeKlI/AAAAAAAAIKg/JiW07bkloxo7abB0QEUAZy4pMUM2dgX9ACLcBGAs/s320/2017-07-09_07h56_01.png" width="320" /></a></div><br /><br />Then re-attach it to the SATA controller. When prompted, specify Choose existing disk and navigate to where the disk is stored. This will a path similar to be: $HOME/VirtualBox VMs/ConvertedPC/WindowsVM-disk1.vmldk.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-zHSX8f50uig/WWIZD-eZSCI/AAAAAAAAIKc/rSnFshxCQAQnbMUup_XKZWKk4O60v-zMgCLcBGAs/s1600/2017-07-09_07h52_34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="698" height="228" src="https://1.bp.blogspot.com/-zHSX8f50uig/WWIZD-eZSCI/AAAAAAAAIKc/rSnFshxCQAQnbMUup_XKZWKk4O60v-zMgCLcBGAs/s320/2017-07-09_07h52_34.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><b>Add an optical disk</b><br /><br />In the same settings area (Storage), click on the optical disk icon that is on the same line as the controller, in order to attach an optical drive to the system.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-E5sRa2M7oMo/WWJAWE3_4vI/AAAAAAAAILA/0FEVwEjMgSMgHMzi1cSK5WLdDn4fCZGoQCLcBGAs/s1600/2017-07-09_10h40_13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="112" data-original-width="225" src="https://2.bp.blogspot.com/-E5sRa2M7oMo/WWJAWE3_4vI/AAAAAAAAILA/0FEVwEjMgSMgHMzi1cSK5WLdDn4fCZGoQCLcBGAs/s1600/2017-07-09_10h40_13.png" /></a></div><br /><br />When prompted, specify to leave empty.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-aTYgnq_1aVk/WWJAeO-0kUI/AAAAAAAAILE/LdN4hMx3jbY5UWd-oVoiaQ3nraQNhodNQCLcBGAs/s1600/2017-07-09_10h40_47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="164" data-original-width="261" src="https://2.bp.blogspot.com/-aTYgnq_1aVk/WWJAeO-0kUI/AAAAAAAAILE/LdN4hMx3jbY5UWd-oVoiaQ3nraQNhodNQCLcBGAs/s1600/2017-07-09_10h40_47.png" /></a></div><br /><b>Add a network interface</b><br /><br />Since we disabled all network interfaces when importing the appliance, head over to network settings and add a NAT adapter so you can access the internet.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-WKQsWZ2VQBE/WWJAoc4r13I/AAAAAAAAILI/DST0DtmjpYQlOudA_DBSQWfI-QGLqH-0ACLcBGAs/s1600/2017-07-09_10h41_30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="430" data-original-width="651" height="211" src="https://4.bp.blogspot.com/-WKQsWZ2VQBE/WWJAoc4r13I/AAAAAAAAILI/DST0DtmjpYQlOudA_DBSQWfI-QGLqH-0ACLcBGAs/s320/2017-07-09_10h41_30.png" width="320" /></a></div><br /><br /><b>Switch to Intel HD Audio</b><br /><br />When I first booted, I found the audio controller wasn't working so I switched it over to Intel HD Audio, and all worked well after that.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-C7YQcydk2vA/WWIgIC9RiOI/AAAAAAAAIKw/bDG-WW8_ioUPlEIm2LAOxdHmPNUCEvGPwCLcBGAs/s1600/2017-07-09_08h22_46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="698" height="228" src="https://4.bp.blogspot.com/-C7YQcydk2vA/WWIgIC9RiOI/AAAAAAAAIKw/bDG-WW8_ioUPlEIm2LAOxdHmPNUCEvGPwCLcBGAs/s320/2017-07-09_08h22_46.png" width="320" /></a></div><br /><br />And after doing all this, we are able to successfully boot into our PC that has now been virtualised.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-m3-NbrTgctw/WWIbG_VyAFI/AAAAAAAAIKk/did4AM1SHjEa1eML71ktSMiKBGnfB8P2gCLcBGAs/s1600/2017-07-09_07h59_31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="858" data-original-width="1026" height="267" src="https://1.bp.blogspot.com/-m3-NbrTgctw/WWIbG_VyAFI/AAAAAAAAIKk/did4AM1SHjEa1eML71ktSMiKBGnfB8P2gCLcBGAs/s320/2017-07-09_07h59_31.png" width="320" /></a></div><br /><b>Install guest additions</b><br /><br />Log in, and install guest additions. This is done by clicking on the Devices menu and selecting Insert Guest Additions CD image...<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-nryVl6fo81M/WWJBSWoNZ5I/AAAAAAAAILM/XkN5BLsZfbwU33wJQOJGl8VU0Ana-3FMACLcBGAs/s1600/2017-07-09_10h44_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="201" data-original-width="280" src="https://4.bp.blogspot.com/-nryVl6fo81M/WWJBSWoNZ5I/AAAAAAAAILM/XkN5BLsZfbwU33wJQOJGl8VU0Ana-3FMACLcBGAs/s1600/2017-07-09_10h44_04.png" /></a></div><br />Follow the steps in the VM. After the process completes it will want to reboot your system - after which point you have your fully functional converted PC as a VM in VirtualBox. trent tag:blogger.com,1999:blog-8785176694082881912.post-1359289974479306528 Sun Jul 09 2017 11:01:00 GMT-0400 (EDT) After KScope 1 http://apex.dbe.pl/2017/07/after-kscope-1.html <br /> Grand Canyon<br /> <br /> Rano śniadanie w mega klimatycznej przydrożnej restauracyjce. Mimo, że nie jest zbyt czysto widać "plastik fantastik" i amerykański kicz to jednak to miejsce ma coś.. Czas tu zatrzymał się w latach 60. Obsługa nie jest zbyt żwawa... natomiast gości jest sporo i sam posiłek bardzo dobry.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-1eaaA4L4d-k/WWJDIEGhk4I/AAAAAAAAKBE/311vuqln7fc8_7SH2wYUWPEQLhppBk0QgCKgBGAs/s1600/DSC_0276.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://2.bp.blogspot.com/-1eaaA4L4d-k/WWJDIEGhk4I/AAAAAAAAKBE/311vuqln7fc8_7SH2wYUWPEQLhppBk0QgCKgBGAs/s400/DSC_0276.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://1.bp.blogspot.com/-jkf1iHt31S4/WWJDIBZKSEI/AAAAAAAAKBE/Ilp9otjFivUIf7-VdU6vJHMsGnhGL0wNwCKgBGAs/s1600/DSC_0290.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-jkf1iHt31S4/WWJDIBZKSEI/AAAAAAAAKBE/Ilp9otjFivUIf7-VdU6vJHMsGnhGL0wNwCKgBGAs/s400/DSC_0290.JPG" width="400" /></a></div> <br /> <br /> Wsiadamy do auta i w drogę nad Grand Canyon.<br /> Przed wjazdem do parku kupujemy bilet. Wybieramy roczny na wszystkie narodowe parki w USA. Z kalkulacji wynika że to jest najlepsze rozwiązanie szczególnie że w planach jest kilka parków do odwiedzenia.<br /> Sam Grand Canyon... majestatyczny, nie da się tego przełożyć na słowa czy nawet zdjęcia, to trzeba po prostu zobaczyć. Mimo, że temperatura sięga prawie 40 st. C. wybieramy aktywne przejście wzdłuż 15 km. południowej krawędzi canyon-u. Bierzemy po 2 litry wody na głowę i staramy się ciągle nawadniać.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://3.bp.blogspot.com/-2kN-KolOjys/WWJDbGE1j9I/AAAAAAAAKBI/BYabAjMTEXg4g21ib8RAzX_zh6otOe1kQCKgBGAs/s1600/DSC_0280.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://3.bp.blogspot.com/-2kN-KolOjys/WWJDbGE1j9I/AAAAAAAAKBI/BYabAjMTEXg4g21ib8RAzX_zh6otOe1kQCKgBGAs/s400/DSC_0280.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://4.bp.blogspot.com/-fXem9_GxmJY/WWJDbA4dAnI/AAAAAAAAKBI/kTbhUzDyvfQ_YzFOeqiLL5rOMovSJLC_gCKgBGAs/s1600/DSC_0284.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="1600" height="140" src="https://4.bp.blogspot.com/-fXem9_GxmJY/WWJDbA4dAnI/AAAAAAAAKBI/kTbhUzDyvfQ_YzFOeqiLL5rOMovSJLC_gCKgBGAs/s640/DSC_0284.JPG" width="640" /></a></div> <br /> <br /> <br /> Po około 5 godzinach jesteśmy z powrotem przy aucie. Następnie jedziemy na drugą część canyon-u tzw. Desert View tam doczekujemy zachodu słońca i heja z powrotem do Flagstaff.<br /> <br /> Następny dzień robimy bardziej swobodny... jedziemy na Meteor Crater w Arizonie. Czyli wielką dziurę zrobioną przez spory meteoryt. Obiekt jest położony na totalnym pustkowiu i prowadzony tylko przez Indian. Jak pewnie część z was wie USA w ramach rekompensaty za krzywdy wyrządzone pierwotnym mieszkańcom Ameryki pozwala na wiele wyjątków. Np monopol na pracę czy zakładanie kasyn prowadzonych tylko przez Indian.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-Y4w7Z9wRKT0/WWJDpw9K6sI/AAAAAAAAKBM/O_RsQLcE5ukH0pcFkX_ZSk0lJn4qXQ9lACKgBGAs/s1600/DSC_0287.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="1600" height="140" src="https://2.bp.blogspot.com/-Y4w7Z9wRKT0/WWJDpw9K6sI/AAAAAAAAKBM/O_RsQLcE5ukH0pcFkX_ZSk0lJn4qXQ9lACKgBGAs/s640/DSC_0287.JPG" width="640" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://4.bp.blogspot.com/-T2O841hUm78/WWJDp0Uel1I/AAAAAAAAKBM/b8NgQwl3pFYuPsLMtddTb3tzOpCBdoYdQCKgBGAs/s1600/DSC_0289.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="1600" height="140" src="https://4.bp.blogspot.com/-T2O841hUm78/WWJDp0Uel1I/AAAAAAAAKBM/b8NgQwl3pFYuPsLMtddTb3tzOpCBdoYdQCKgBGAs/s640/DSC_0289.JPG" width="640" /></a></div> <br /> <br /> Po zwiedzaniu wracamy do Flagstaff i załatwiamy przyziemne rzeczy typu pranie zakupy itp. Wieczorem idziemy na kolację i piwo to pobliskiej restauracji.<br /> <br /> Tu chciałbym wspomnieć o jednej niesamowitej rzeczy, która mnie w USA zachwyca. Ogólnie ujęta obsługa klienta a raczej podejście do człowieka. Nie ważne czy to jest lotnisko, wypożyczalnia samochodów, stacja benzynowa a tym bardziej restauracja. Obsługa tutaj to SZTUKA ! Jeżeli załatwiasz jakąś rzecz to zawsze osoba po drugiej stronie zapyta: jak się czujesz ? co tu robisz ? skąd jesteś ? Jeżeli nie jesteś zdecydowany na jakiś posiłek czy piwo, no problem zaraz masz wszystkie próbki do spróbowania. To naprawdę jest rzecz godna naśladowania...<br /> <div> <br /></div> ) tag:blogger.com,1999:blog-7531463720728239813.post-3796901548553086858 Sun Jul 09 2017 10:58:00 GMT-0400 (EDT) ODTUG Kscope17 Award Winners Announced http://www.odtug.com/p/bl/et/blogaid=738&source=1 Congratulations to all of the ODTUG Kscope17 award winners, including Oracle Contributor of the Year, ODTUG Volunteer Award, Innovation Award, Best First-Time Speaker, Best Overall Speaker, Top Speakers by Track, Kscope GO Winners, and the Ambassador Winner. ODTUG http://www.odtug.com/p/bl/et/blogaid=738&source=1 Fri Jul 07 2017 09:10:02 GMT-0400 (EDT) ODTUG Kscope17 Award Winners Announced http://www.kscope18.odtug.com/p/bl/et/blogaid=738&source=1 Congratulations to all of the ODTUG Kscope17 award winners, including Oracle Contributor of the Year, ODTUG Volunteer Award, Innovation Award, Best First-Time Speaker, Best Overall Speaker, Top Speakers by Track, Kscope GO Winners, and the Ambassador Winner. ODTUG http://www.kscope18.odtug.com/p/bl/et/blogaid=738&source=1 Fri Jul 07 2017 09:10:02 GMT-0400 (EDT) The importance of being CURRENT_USER http://oraclequirks.blogspot.com/2017/07/the-importance-of-being-currentuser.html Byte64 tag:blogger.com,1999:blog-18037024.post-6190783409644724569 Fri Jul 07 2017 07:00:00 GMT-0400 (EDT) Oracle Apex 5.1.2 - Oracle Application Express http://rcitools.blogspot.com/2016/07/oracle-apex-504-oracle-application.html &nbsp;<br />Une nouvelle release d' Oracle Application Express 5.1 est disponible depuis le 28 juin 2017. Il s'agit de la version 5.1.2.00.9 qui est un cumul de mises à jour depuis Décembre 2017. Cette nouvelle release succède à la 5.1.1 rendue publique fin Mars 2017.<br /><br />Cette nouvelle version d' Apex 5.1 est disponible, en production et avec support Oracle, pour toutes les versions d'Oracle, standard et entreprise, à partir d'Oracle 11.2.0.4.<br /><br />Elle est également téléchargeable pour la version gratuite Oracle XE 11.2 (Express Edition).<br /><br /><a target="_blank" href="http://www.oracle.com/technetwork/developer-tools/apex/application-express/apex-512-patch-set-notes-3799708.html">Présentation des nouvelles fonctionnalités de la version 5.1.2</a> <br /><br /><a target="_blank" href="http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html">Téléchargement d'Oracle Apex 5.1.2</a> <br /><br /><a target="_blank" href="http://rci-informatique.net/crc/index.php/formations/oracle/oracle-apex-introduction/">Formations introduction Oracle Apex 5.1.2</a> <br /><br /><a target="_blank" href="http://rci-informatique.net/crc/index.php/formations/oracle/oracle-apex-perfectionnement/">Formations perfectionnement Oracle Apex 5.1.2</a> <br /><br />&nbsp; RCI Informatique tag:blogger.com,1999:blog-6486731048356836969.post-3973025762949099533 Thu Jul 06 2017 18:35:00 GMT-0400 (EDT) A few useful Oracle 12cR2 MOS Docs http://jaffardba.blogspot.com/2017/07/mos-doc-about-12cr2.html <div dir="ltr" style="text-align: left;" trbidi="on">A few useful MOS Docs are listed below , in case if 12cR2 upgrade around the corner.<br /><br /><br /><br /><ul style="text-align: left;"><li>How to Upgrade to/Downgrade from Grid Infrastructure 12.2 and Known Issues (Doc ID 2240959.1)</li><li>Complete Checklist for Upgrading to Oracle Database 12c Release 2 (12.2) using DBUA (Doc ID 2189854.1)</li><li>12.2 Grid Infrastructure Installation: What's New (Doc ID 2024946.1)</li><li>Patches to apply before upgrading Oracle GI and DB to 12.2.0.1 (Doc ID 2180188.1)</li><li>Differences Between Enterprise, Standard Edition 2 on Oracle 12.2 (Doc ID 2243031.1)</li><li>12.2 gridSetup.sh Does Not List Disks Unless the Discovery String is Provided (Doc ID 2244960.1) </li></ul><br /><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings></xml><![endif]--><br /></div> The Human Fly tag:blogger.com,1999:blog-19771507.post-1008875316858656311 Thu Jul 06 2017 08:33:00 GMT-0400 (EDT) Refresh selected row(s) in an Interactive Grid http://roelhartman.blogspot.com/2017/07/refresh-selected-rows-in-interactive.html In my previous post I blogged about <a href="https://roelhartman.blogspot.nl/2017/07/push-changed-rows-to-interactive-grid.html" target="_blank">pushing changed rows from the dabatase into an Interactive Grid</a>. The use case I'll cover right here is probably more common - and therefore more useful!<span class="fullpost"></span><br /><div><br /></div><div>Until we had the IG, we showed the data in a report (Interactive or Classic). Changes to the data where made by popping up a form page, making changes, saving and refreshing the report upon closing the dialog. Or by clicking an icon / button / link in your report that makes some changes to the data (like changing a status) and ... refresh the report.&nbsp;</div><div>That all works fine, but the downsides are:</div><div><ol><li>The whole dataset is returned from the server to the client - again and again. And if your pagination size is large, that does lead to more and more network traffic, more interpretation by the browser and more waiting time for the end user.</li><li>The "current record" might be out of focus after the refresh, especially by larger pagination sizes, as the first rows will be shown. Or (even worse) while you were working on page 3 of your report, it gets refreshed and your are back on square 1. There are some work arounds (like keeping the offset before refresh and returning to that position after refresh) and plugins that should keep the user on the same page.</li></ol>But since Interactive Grid we have the option to refresh just one or more records! And to use that feature to update the currently selected row(s), you only need two lines of JavaScript:<br /><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">var myGrid = apex.region( &lt;regionid&gt; )</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.widget()</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.interactiveGrid("getViews")</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.grid;</span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">myGrid.model.fetchRecords( myGrid.getSelectedRecords() ); </span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; "><br /></span>The first line defines the IG object, the second line is using the&nbsp;<span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; ">getSelectedRecords</span><span style="font-family: inherit;"> method to get the currently selected record(s) and passes these on to the </span><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; ">fetchRecords</span><span style="font-family: inherit;"> method. The effect is awesome, as the page stays exactly what and where it was - so no scrolling etc - and you see only the data change. Even the "current" selection stays in place.<br />You only need to think about what should happen when the record is deleted (from the database or from the result set of your query) by your action....</span><br /><span style="font-family: inherit;"><br /></span>And to make it even easier to use - and eventually adapt for future enhancements, you should create a simple Dynamic Action plugin. Or <a href="https://drive.google.com/open?id=0B8Su3_nLqAoeYTE3LUNuZVVHRlk" target="_blank">download it from here</a>.<br /><div><br /></div><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: x-small;"><br /></span></div> Roel Hartman tag:blogger.com,1999:blog-20567072.post-7570889443895465986 Thu Jul 06 2017 07:34:00 GMT-0400 (EDT) Oracle Clusterware 12cR2 - deprecated and desupported features http://jaffardba.blogspot.com/2017/07/oracle-clusterware-12cr2-deprecated-and.html <div dir="ltr" style="text-align: left;" trbidi="on"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings></xml><![endif]--><br /><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument></xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false" DefSemiHidden="false" DefQFormat="false" DefPriority="99" LatentStyleCount="375"> <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/> <w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/> <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/> <w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/> <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/> <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/> <w:LsdException Locked="false" Priority="39" Name="Table Grid"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/> <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" Name="Light List"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/> <w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/> <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/> <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/> <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/> <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/> <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/> <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hashtag"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Unresolved Mention"/> </w:LatentStyles></xml><![endif]--><!--[if gte mso 10]><style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:8.0pt; mso-para-margin-left:0in; line-height:107%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} </style><![endif]--> <br /><div class="MsoNoSpacing">Having clear understanding of deprecated and desupported features in a new release is equally important as knowing the new features of the release. In this short blog post, I would like to highlight the following features that are either deprecated or desupported in 12cR2.</div><div class="MsoNoSpacing"><br /></div><h2>Deprecated</h2><div class="MsoNoSpacing" style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><i style="mso-bidi-font-style: normal;">config.sh</i>will no longer be used for Grid configuration wizard, instead, the <i style="mso-bidi-font-style: normal;">gridSetip.sh</i> is used in 12cR2;</div><div class="MsoNoSpacing" style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Placement of OCR and Voting files directly on a shared filesystem is not deprecated;</div><div class="MsoNoSpacing" style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>The diagcollection.pl utility is deprecated in favor of Oracle Trace File Analyzer;</div><div class="MsoNoSpacing"><br /></div><h2>Desupported</h2><div class="MsoNoSpacing" style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;"><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>You are no longer able to use Oracle Clusterware commands that are prefixed with crs_.</div><div class="MsoNoSpacing"><br /></div><div class="MsoNoSpacing"><br /></div><div class="MsoNoSpacing">In my next blog post, will go over some of the important features Oracle Clusterware in 12cR2. Stay tuned.</div><div class="MsoNoSpacing"><br /></div><div class="MsoNoSpacing"><b style="mso-bidi-font-weight: normal;"><u>References:</u></b></div><div class="MsoNoSpacing"><a href="https://docs.oracle.com/database/122/CWADD/changes-in-this-release-for-oracle-clusterware-administration-and-deployment-guide.htm#GUID-F0444666-2CE6-4EF3-9322-E5A55961B1F2">https://docs.oracle.com/database/122/CWADD/changes-in-this-release-for-oracle-clusterware-administration-and-deployment-guide.htm#GUID-F0444666-2CE6-4EF3-9322-E5A55961B1F2</a></div><div class="MsoNoSpacing"><br /></div></div> The Human Fly tag:blogger.com,1999:blog-19771507.post-3007947445590878366 Thu Jul 06 2017 05:27:00 GMT-0400 (EDT) Storage Server: FreeNAS: use your SSD efficiently http://vanbortel.blogspot.com/2017/07/storage-server-freenas-use-your-ssd.html FreeNAS: use your SSD efficiently ZIL and Cache Not open for discussion; I think it is a complete waste of resources to use a 120, or 250GB SSD for logs, let alone cache, as FreeNAS will (and should!) use RAM for that. So, I searched and found a way to create two partitions on a single SSD, and expose these as ZIL (ZFS Intended Log) and cache to the pool.Mind you - there are performance tests Frank tag:blogger.com,1999:blog-12361937.post-8663832421702751320 Wed Jul 05 2017 13:13:00 GMT-0400 (EDT) 2017 ODTUG Innovation Award Winner & Honorable Mention http://www.odtug.com/p/bl/et/blogaid=737&source=1 For 2017, member votes were combined with overall judges scoring to determine the Innovation Award winner and Honorable Mention. The winner was announced at the General Session at ODTUG Kscope17.For those that were unable to attend.... drum roll please... ODTUG http://www.odtug.com/p/bl/et/blogaid=737&source=1 Wed Jul 05 2017 10:08:38 GMT-0400 (EDT) Storage Server: Firmware http://vanbortel.blogspot.com/2017/06/storage-server-firmware.html Firmware The first thing to do, in order to get any software RAID program to run, is to flash the controller out of RAID mode. Only then all of the disks will be seen as just a bunch of disks - nothing else. JBOD that is, for short. The board I have, comes with a LSI SAS2308 controller, to with I want to connect 12 SATA drives using three SAS-to-SATA breakout cables. Drivers There are Frank tag:blogger.com,1999:blog-12361937.post-8835955858803993048 Wed Jul 05 2017 03:23:00 GMT-0400 (EDT) Storage Server: Software - FreeNAS http://vanbortel.blogspot.com/2017/07/storage-server-software-freenas.html Software: FreeNAS All hardware has been implemented, all 13 harddisks and one SSD are connected, serial numbers, as well as physical, and logical locations noted. Cramming 4 2.5" disks in the CD bay Time to add some software. I will install the latest and the greatest(?) FreeNAS software, V11. Installation The installation, due to IPMI being capable of mounting remote images, is a Frank tag:blogger.com,1999:blog-12361937.post-2277869741015836157 Wed Jul 05 2017 03:21:00 GMT-0400 (EDT) Fire an employee? It's that easy! http://oraclequirks.blogspot.com/2017/07/fire-employee-its-that-easy.html Byte64 tag:blogger.com,1999:blog-18037024.post-4993788627156324088 Tue Jul 04 2017 16:45:00 GMT-0400 (EDT) Artigos selecionados para o "Latin America OTN Tour 2017" http://desenvolvedorapex.blogspot.com/2017/07/artigos-selecionados-para-o-latin.html <div align="center" class="MsoNormal" style="text-align: center;"><br /></div><div align="center" class="MsoNormal" style="text-align: center;"><a href="https://4.bp.blogspot.com/-4hgsv9Qqnk0/WVv6jX4qUpI/AAAAAAAAAuI/iUAmr5ml3FUTVv1H-XZLFq0n__X1e7ThwCLcBGAs/s1600/guob%2Btech%2Bday%2B2017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="310" data-original-width="848" height="145" src="https://4.bp.blogspot.com/-4hgsv9Qqnk0/WVv6jX4qUpI/AAAAAAAAAuI/iUAmr5ml3FUTVv1H-XZLFq0n__X1e7ThwCLcBGAs/s400/guob%2Btech%2Bday%2B2017.jpg" width="400" /></a></div><div align="center" style="text-align: center;"><br /></div><div style="text-align: justify;">Novamente duas palestras minhas sobre a tecnologia <b>Oracle Application Express</b> foram selecionadas para o evento "<b><i>Latin America Oracle Technology Network Tour</i></b>" conhecido como "<b><i>GUOB Tech Day</i></b>" que ocorrerá em São Paulo no dia 5 de agosto.<br /><br />O evento é organizado pelo <i>Grupo de Usuários Oracle do Brasil (GUOB) </i>e este ano promete ser o maior <b>GUOB Tech Day</b> de todos os tempos com 5 salas simultâneas e a maior quantidade de palestras feitas por brasileiros!<br /><br />Maiores informações no site: <a href="http://www.guob.com.br/">www.guob.com.br</a>.<br /><br />Para quem gosta de desconto, pode se inscrever até o dia <b>09/07</b> utilizando o seguinte cupom:&nbsp;<strong style="text-align: center;">&nbsp;NAO_PERCA_GUOB</strong><br /><br />Não perca tempo! Inscreva-se logo.</div> Anderson Ferreira tag:blogger.com,1999:blog-5150514048465222719.post-4648798473069454068 Tue Jul 04 2017 16:30:00 GMT-0400 (EDT) Restricting shuttle choices even faster http://warp11.nl/2017/07/restricting-shuttle-choices-even-faster/ <div> <div class="post-body entry-content" id="post-body-8045720870199803022"> Some months ago I published an Oracle Apex plugin to restrict the left side shuttle choices. You can read the original post <a href="https://dickdral.blogspot.nl/2017/04/oracle-apex-plug-in-for-restricting.html" target="_blank">here</a>.<br /> On the <a href="http://www.speech2form.com/ords/f?p=OPFG:RESTRICT_SHUTTLE" target="_blank">demo page</a> the On Change event was used to refresh the left side list. My friend Alex Nuijten made the remark this was not very intuitive. The user needs to navigate out of the selection item to see the change.<br /> So I changed the demo page to provide instant feedback. The selection is now refreshed after each keystroke. As this process is completely executed on the client the response is very fast. Only for very long list the user might notice a slight delay.<br /> No changes to the plugin were needed. It can still be downloaded at <a href="http://apex.world/" target="_blank">apex.world</a></p> <div class="separator"> <a href="https://2.bp.blogspot.com/-rer3GOGBg88/WVvotlpylaI/AAAAAAAAAgw/VmsiwA1Iq8MpgU2PXJ051dXw1gujW43rgCLcBGAs/s1600/restrict%2Bshuttle%2B2.gif"><img border="0" height="220" src="http://warp11.nl/wp-content/uploads/2017/07/restrict2Bshuttle2B2.gif" width="640" /></a></div> <p> Here is how is was done:</p> <p> Selection item<br /> Name :<b> P400_SELECTION</b><br /> Type: <b>Text Field</b></p> <p> Dynamic Action<br /> Name: <b>Select on keystroke</b><br /> Event: <b>Key Release</b><br /> Selection Type : <b>Item</b><br /> Item(s): <b>P400_SELECTION</b></p> <p> True Action<br /> Name: <b>Perform Selection</b><br /> Action: <b>Restrict Shuttle Values [plug-in]</b><br /> Search Item: <b>P400_SELECTION</b><br /> Selection Type: <b>Item(s)</b><br /> Item(s): <b>P400_SHUTTLE</b><br /> Fire on initialization: <b>No</b></p> <p> Happy Apexing</p> <p> </p> </div> </div> <p>Source Article from <a href="http://dickdral.blogspot.com/2017/07/restricting-shuttle-choices-even-faster.html">http://dickdral.blogspot.com/2017/07/restricting-shuttle-choices-even-faster.html</a></p> Dick Dral http://warp11.nl/2017/07/restricting-shuttle-choices-even-faster/ Tue Jul 04 2017 15:20:24 GMT-0400 (EDT) Restricting shuttle choices even faster http://dickdral.blogspot.com/2017/07/restricting-shuttle-choices-even-faster.html Some months ago I published an Oracle Apex plugin to restrict the left side shuttle choices. You can read the original post <a href="https://dickdral.blogspot.nl/2017/04/oracle-apex-plug-in-for-restricting.html" target="_blank">here</a>.<br />On the <a href="http://www.speech2form.com/ords/f?p=OPFG:RESTRICT_SHUTTLE" target="_blank">demo page</a> the On Change event was used to refresh the left side list. My friend Alex Nuijten made the remark this was not very intuitive. The user needs to navigate out of the selection item to see the change.<br />So I changed the demo page to provide instant feedback. The selection is now refreshed after each keystroke. As this process is completely executed on the client the response is very fast. Only for very long list the user might notice a slight delay.<br />No changes to the plugin were needed. It can still be downloaded at <a href="http://apex.world/" target="_blank">apex.world</a><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-rer3GOGBg88/WVvotlpylaI/AAAAAAAAAgw/VmsiwA1Iq8MpgU2PXJ051dXw1gujW43rgCLcBGAs/s1600/restrict%2Bshuttle%2B2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="248" data-original-width="712" height="220" src="https://2.bp.blogspot.com/-rer3GOGBg88/WVvotlpylaI/AAAAAAAAAgw/VmsiwA1Iq8MpgU2PXJ051dXw1gujW43rgCLcBGAs/s640/restrict%2Bshuttle%2B2.gif" width="640" /></a></div><br />Here is how is was done:<br /><br />Selection item<br />Name :<b> P400_SELECTION</b><br />Type: <b>Text Field</b><br /><br />Dynamic Action<br />Name: <b>Select on keystroke</b><br />Event: <b>Key Release</b><br />Selection Type : <b>Item</b><br />Item(s): <b>P400_SELECTION</b><br /><br />True Action<br />Name: <b>Perform Selection</b><br />Action: <b>Restrict Shuttle Values [plug-in]</b><br />Search Item: <b>P400_SELECTION</b><br />Selection Type: <b>Item(s)</b><br />Item(s): <b>P400_SHUTTLE</b><br />Fire on initialization: <b>No</b><br /><br /><i>Update 22-07-2017: A new version 1.2 has been released with a bug fix.This bug prevented the plug-in form functioning.&nbsp;</i><br /><div><i><br /></i></div>Happy Apexing<br /><br /><br /> Dick Dral tag:blogger.com,1999:blog-4312362131290962824.post-8045720870199803022 Tue Jul 04 2017 15:13:00 GMT-0400 (EDT) KScope18 i trochę rekreacji http://apex.dbe.pl/2017/07/kscope18-i-troche-rekreacji.html <br /> KScope17 zakończony. Ale wraz z zakończeniem rusza przygotowanie do KScope18. W roku 2018 KScope odbędzie się w Orlando. Główny hotel w którym będą odbywać się wszystkie sesje zlokalizowany będzie w Disney World... tak więc organizatorzy zaczynają myśleć już o przyszłych pokoleniach... najprawdopodobniej to będzie najbardziej rodzinny KScope w historii ; ).<br /> <br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <img border="0" data-original-height="280" data-original-width="1164" height="152" src="https://3.bp.blogspot.com/-XkJitafatOE/WVs3nmustPI/AAAAAAAAJ8Q/TXWXga5SSF0dKN6GS7qAMoHVuGZzQd7ewCLcBGAs/s640/Przechwytywanie.PNG" width="640" /><a href="http://www.kscope18.odtug.com/" target="_blank">http://www.kscope18.odtug.com/</a></div> <br /> My zgodnie z planem opuściliśmy już San Antonio i polecieliśmy w pierwszej kolejności do Las Vegas... miasto hazardu, rozpusty i niekończącej się rozrywki. Czy warto ? Pewnie że warto, raz w życiu na pewno, natomiast nie wyobrażam sobie spędzić tutaj tydzień. Nie przepadam za statyczną rozrywką no i temperaturą powyżej 40 stopni Celsjusza w cieniu !<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://3.bp.blogspot.com/-wTDl8G20z7c/WVtQ_gnCS8I/AAAAAAAAJ94/Gv6ZkyJcOAMFxg9sHRPd1LW4-BaeZUb1ACKgBGAs/s1600/DSC_0256.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://3.bp.blogspot.com/-wTDl8G20z7c/WVtQ_gnCS8I/AAAAAAAAJ94/Gv6ZkyJcOAMFxg9sHRPd1LW4-BaeZUb1ACKgBGAs/s400/DSC_0256.JPG" width="400" /></a></div> <br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-mjBYtC5Uz5c/WVs4LV11eDI/AAAAAAAAJ8U/Yw9HmW4ACscwNcSk_ObJCu1WmJTr3CsnACKgBGAs/s1600/DSC_0266.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://2.bp.blogspot.com/-mjBYtC5Uz5c/WVs4LV11eDI/AAAAAAAAJ8U/Yw9HmW4ACscwNcSk_ObJCu1WmJTr3CsnACKgBGAs/s400/DSC_0266.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-JPvh4XWdV5E/WVs4LccAYnI/AAAAAAAAJ8U/pZ_7eGEtkSAfEWvsaaPUtbUxNOfRW1P0gCKgBGAs/s1600/DSC_0262.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://2.bp.blogspot.com/-JPvh4XWdV5E/WVs4LccAYnI/AAAAAAAAJ8U/pZ_7eGEtkSAfEWvsaaPUtbUxNOfRW1P0gCKgBGAs/s400/DSC_0262.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://1.bp.blogspot.com/-QArhAg1oW-0/WVs4LcJb4RI/AAAAAAAAJ8U/Nx2yPmrVGN8QSiHjSOHd-GfcKgNsCFu9QCKgBGAs/s1600/DSC_0260.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-QArhAg1oW-0/WVs4LcJb4RI/AAAAAAAAJ8U/Nx2yPmrVGN8QSiHjSOHd-GfcKgNsCFu9QCKgBGAs/s400/DSC_0260.JPG" width="400" /></a></div> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://1.bp.blogspot.com/-9qJsslH9mAQ/WVs4LWtSOUI/AAAAAAAAJ8U/JUX7V_6Ug8UTCJHTChP0gwWuDDwpGOjWQCKgBGAs/s1600/DSC_0259.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-9qJsslH9mAQ/WVs4LWtSOUI/AAAAAAAAJ8U/JUX7V_6Ug8UTCJHTChP0gwWuDDwpGOjWQCKgBGAs/s400/DSC_0259.JPG" width="400" /></a></div> <br /> <br /> W Vegas wypożyczyliśmy auto i ruszyliśmy w kierunku Flagstaff. Po drodze zatrzymaliśmy się na Hover Dam... dwie godziny zwiedzania i około godziny 19 jesteśmy na miejscu.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://2.bp.blogspot.com/-vw4nBp1RXgM/WVs5Wffe34I/AAAAAAAAJ8Y/APO6_DissN8DpEQxUzzSx0qxsfRwHxibACKgBGAs/s1600/DSC_0272.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="1600" height="140" src="https://2.bp.blogspot.com/-vw4nBp1RXgM/WVs5Wffe34I/AAAAAAAAJ8Y/APO6_DissN8DpEQxUzzSx0qxsfRwHxibACKgBGAs/s640/DSC_0272.JPG" width="640" /></a></div> <br /> <br /> <br /> Flagstaff to dobry punkt do dalszych wypraw np. do Grand Canyon, Antelope Canyon, Monument Valley itp. Sama miejscowość położona jest przy słynnej Route 66 &nbsp;na wysokości około 2000m. n.p.m., dzięki temu temperatury są akceptowalne (28-35 st. C). Bazę mamy w hotelu budżetowym. Hotel jak hotel w zupełności wystarczy, ważne że czysto i żadnych problemów. Teraz co w USA w okresie długiego weekendu (4 lipca - dzień niepodległości USA) oznacza budżetowy hotel. Za dobę płacimy ponad 100 USD. Dodam że rezerwowaliśmy go około 5 miesięcy temu. Teraz nie ma żadnych szans aby dostać jakiś pokój.<br /> Jeszcze przed odpoczynkiem odwiedzamy 3 browary craftowe : )<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://3.bp.blogspot.com/-FSd4DQNtPoM/WVs5lmf7ZQI/AAAAAAAAJ8c/6shJNkkqklIYx1l4fbNnc4PHjiltpL2egCKgBGAs/s1600/DSC_0274.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" height="300" src="https://3.bp.blogspot.com/-FSd4DQNtPoM/WVs5lmf7ZQI/AAAAAAAAJ8c/6shJNkkqklIYx1l4fbNnc4PHjiltpL2egCKgBGAs/s400/DSC_0274.JPG" width="400" /></a></div> <br /> <br /> <br /> Jutro jedziemy nad Grand Canyon ! ) tag:blogger.com,1999:blog-7531463720728239813.post-8448064787793397993 Tue Jul 04 2017 02:50:00 GMT-0400 (EDT) APEX Interactive Grid: JavaScript Basics Cheat Sheet https://ruepprich.wordpress.com/2017/07/03/apex-interactive-grid-javascript-basics-cheat-sheet/ <div class="wpcom-reblog-snapshot"><div class="reblogger-note"><div class='reblogger-note-content'><blockquote><p>Nice cheat sheet for APEX Interactive Grid JavaScript</p> </blockquote></div></div><div class="reblog-post"><p class="reblog-from"><img alt='' src='https://0.gravatar.com/avatar/3a584b099900fbfa62bf195f1c668b35?s=32&#038;d=identicon&#038;r=G' class='avatar avatar-32' height='32' width='32' /><a href="https://thtech.wordpress.com/2017/07/03/apex-interactive-grid-javascript-basics-cheat-sheet/">TH TECHNOLOGY</a></p><div class="reblogged-content"> <p>APEX Interactive Grid can be customized by JavaScript in the Advanced –&gt; JavaScript Code attribute of the Grid or a Grid column.  Yup – JavaScript.</p> <p>JavaScript may be out of the comfort zone for PL/SQL developers, even those who implemented extensive tabular form customization working with PL/SQL collections.  Time to say Goodbye to those collections … Welcome JavaScript!</p> <p>The following is a collection of simple JavaScript lines most likely to be needed by a developer wanting to customize an Interactive Grid, or access data elements in the Grid.</p> <p>This is not a comprehensive list or a complete function – just a simple collection of lines to give you an idea of the process and examples of  – a reference for – the syntax.</p> <p><img class="alignnone size-full wp-image-1427" src="https://ruepprich.files.wordpress.com/2017/07/jsreflines1.gif?w=550" alt="JSRefLines"></p> <p>Taken line by line:</p> <pre>var $te = $(this.triggeringElement);</pre> <p>This line gets the triggering element – the element that caused the dynamic action (DA) to fire. Usually we…</p> </div><p class="reblog-source"><a href="https://thtech.wordpress.com/2017/07/03/apex-interactive-grid-javascript-basics-cheat-sheet/">View original post</a> <span class="more-words">537 more words</span></p></div></div><br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ruepprich.wordpress.com/2399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ruepprich.wordpress.com/2399/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=ruepprich.wordpress.com&#038;blog=12765658&#038;post=2399&#038;subd=ruepprich&#038;ref=&#038;feed=1" width="1" height="1" /> Christoph Ruepprich http://ruepprich.wordpress.com/2017/07/03/apex-interactive-grid-javascript-basics-cheat-sheet/ Mon Jul 03 2017 14:52:12 GMT-0400 (EDT) Push changed rows to an Interactive Grid http://roelhartman.blogspot.com/2017/07/push-changed-rows-to-interactive-grid.html For pushing changes from the database to the end user, the regular solution is using websockets. A change in a record is detected - using a trigger or using the CQN (Change Query Notification) feature - and a notification is send to a websocket server. That websocket server broadcasts the notification over a channel to all browsers that are tuned in to that websocket channel. Then the browser reacts to that notification, usually showing an alert or refreshing a report. This trick is described on multiple sites, just Google for "<i>oracle apex websockets</i>" or similar.<span class="fullpost"></span><br /><div><br /></div><div>So back in the old days, we used that notification in the browser to refresh the (interactive) report. But along comes the <b><i>Interactive Grid (IG)</i></b>. While he full-refresh mechanism still works for IG, an IG has also the option to refresh just one row.&nbsp;</div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-pyZDJnGS7C0/WVpL7ldpreI/AAAAAAAAEH8/m3cGtz6B1D0RQLZ39-qBLul02KqwWE1fQCLcBGAs/s1600/Screen%2BShot%2B2017-07-03%2Bat%2B15.51.01%2B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="736" data-original-width="660" height="320" src="https://1.bp.blogspot.com/-pyZDJnGS7C0/WVpL7ldpreI/AAAAAAAAEH8/m3cGtz6B1D0RQLZ39-qBLul02KqwWE1fQCLcBGAs/s320/Screen%2BShot%2B2017-07-03%2Bat%2B15.51.01%2B.png" width="286" /></a></div><div>So wouldn't it be awesome that just the changed row(s) get refreshed upon a change in the database, instead of the whole report? Can we do it ... yes we can!</div><div><br /></div><div>First in our "Execute when Page Loads" property we start listening to the websocket server when the page is loaded using:</div><div><br /></div><div><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">window.addEventListener("load", init, false);</span></div><div><br /></div><div>In the "Function and Global Variable Declaration" we add the actual code and the init function:</div><div><div class="MsoNormal" style="font-family: Calibri, sans-serif; font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><br /></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">//The websocket server is set using an Application Item&nbsp;</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">var wsUri = "&amp;WSSERVER.";<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><br /></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: 11pt;">function init() {</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; websocket = new WebSocket(wsUri);<span style="font-size: 11pt;">&nbsp;</span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-size: 11pt;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; websocket.onopen = function(evt) { onOpen(evt) };</span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; websocket.onclose = function(evt) { onClose(evt) };<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; websocket.onmessage = function(evt) { onMessage(evt) };<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; websocket.onerror = function(evt) { onError(evt) };<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">}<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><br /></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: 11pt;">// This is where the real magic happens</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><o:p><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">// onMessage is called when a message is received from the websocket server&nbsp;</span></o:p></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">function onMessage(msg) {<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: 11pt;">&nbsp; // msg is in JSON format, containing the ROWID of the changed record</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; var rowid,<span class="Apple-converted-space">&nbsp;</span><o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; record,<span class="Apple-converted-space">&nbsp;</span><o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; records = [],</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; json = JSON.parse( msg.data ),<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; l = json.changes.length;&nbsp;<span class="Apple-converted-space">&nbsp;</span><o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><span class="Apple-converted-space">&nbsp; // "myGrid" is the Static ID of the IG region</span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; var myGrid = apex.region("myGrid").widget().interactiveGrid("getViews").grid;<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; for ( var i = 0; i &lt; l; i++){&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; rowid = json.changes[i].rowid ;<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; // loop through all the rows, check if the rowid is present<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; // forEach callback params : record, index, key<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; myGrid.model.forEach( function(r, i, k){<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; if ( $.inArray( rowid, r ) &gt; -1 ) {<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; record = myGrid.model.getRecord(k);<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; if ( myGrid.model.getRecordMetadata(k).updated ){<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; apex.message.alert("Record " + (i+1) + " is changed by another user and is requeried");<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; }<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; &nbsp; records.push( record );<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; &nbsp; }<o:p></o:p></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span lang="EN-US"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; });<o:p></o:p></span></span></div><span style="font-size: 11pt;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; }</span></span><br /><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace; font-size: 11pt;">&nbsp; // fetch the changed records</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; if ( records.length &gt; 0 ) {<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; &nbsp; myGrid.model.fetchRecords(records);&nbsp;<span class="Apple-converted-space">&nbsp;</span><o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; }<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">}</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><br /></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">// Addtional helper functions below</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">$(window).on("beforeunload", function(){<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; websocket.close();<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">});&nbsp;<span class="Apple-converted-space">&nbsp;</span><o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><span class="Apple-converted-space"><br /></span></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">function onOpen(evt) {<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp;apex.debug("Websocket opened on &amp;WSSERVER.");<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">}<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><br /></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">function onClose(evt) {<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; apex.debug("Websocket closed");<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">}<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><br /></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">function onError(evt) {<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; apex.debug("Websocket Error");<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp; apex.debug(evt);<o:p></o:p></span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">}</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><br /></span></div><div class="MsoNormal" style="margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: inherit;">The key of the code above is that the records that are changed and are found on the current page are added to an array of records. And that array us used to fetch the records. If you inspect the network traffic that is going on, you can verify that only the changed records (in the screen shot below, three changed records) are fetched and shown on the screen.</span></div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><br /></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-ZbTQlszv0vo/WVpSORupyDI/AAAAAAAAEII/a2yYGtoBaQwxK71tKwwsrvZAT3_ThsIiQCLcBGAs/s1600/network.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="200" data-original-width="768" src="https://4.bp.blogspot.com/-ZbTQlszv0vo/WVpSORupyDI/AAAAAAAAEII/a2yYGtoBaQwxK71tKwwsrvZAT3_ThsIiQCLcBGAs/s1600/network.JPG" /></a></div><div class="separator" style="clear: both; text-align: left;">The whole process works seamless for the user. If he made a change to a record that didn't get updated by someone else (or another process) than he can keep working on that, if he did make a change - and thus there is a conflict - he will get a notification. In our example the process didn't even show a progress spinner, but maybe that's because our queries are fast (it is not on EMP, but based on a view that references several tables and returns over 40,000 rows).</div><div class="MsoNormal" style="font-size: 11pt; margin: 0cm 0cm 0.0001pt; text-size-adjust: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><br /></span><span style="font-family: inherit;">[Edit Jul 4 : I changed the code in a way that it is dependent on the DOM anymore, but only uses the model to determine whether there is a record to update]</span><span style="font-family: inherit; font-size: 11pt;">]</span></div></div> Roel Hartman tag:blogger.com,1999:blog-20567072.post-2590894783134045748 Mon Jul 03 2017 10:30:00 GMT-0400 (EDT) The APEX Community & ODTUG Kscope http://joelkallman.blogspot.com/2017/07/the-apex-community-odtug-kscope.html <div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div>Another successful <a href="https://odtug.com/" target="_blank">Oracle Development Tools User Group</a> (ODTUG) <a href="http://kscope17.com/" target="_blank">Kscope</a> conference is in the books. &nbsp;And like every year, the global <a href="https://apex.oracle.com/" target="_blank">APEX</a> community convenes at Kscope. It is really an amazing collection of experts <b>and</b> first-time attendees from around the globe - from the USA, Germany, England, Australia, Croatia, Brazil, Estonia, India, Austria, Belgium, Netherlands, Canada, Poland, Finland, New Zealand and more! <br /><br />Make no mistake - I appreciate and fully support many other conferences around the globe where <a href="https://apex.oracle.com/" target="_blank">APEX</a> has a presence, including:<br /><br /><ul><li>OUG Ireland</li><li>OUG Scotland</li><li>APEX World</li><li>APEX Connect</li><li>Great Lakes Oracle Conference</li><li>Oracle OpenWorld</li><li>Slovenian Oracle User Group</li><li>Croatian Oracle User Group</li><li>Oracle Developer Tour Latin America</li><li>DOAG Konferenz + Ausstellung</li><li>UKOUG Technology Conference and Exhibition</li><li>High Five Polish Oracle User Group</li></ul><br />But if you're in the APEX Community, or you want to join the passionate and growing global APEX community, please plan on attending an ODTUG Kscope conference. &nbsp;Just once. &nbsp;You'll thank me later.<br /><br />Registration for <a href="http://www.kscope18.odtug.com/" target="_blank">Kscope18 is already open</a>!<br /><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-ARL1V5uQKOM/WVkNoBbF7LI/AAAAAAAADhI/07YH5DyJ1n8SKlS8kApTwB-ah6ANFWhUQCLcBGAs/s1600/Screen%2BShot%2B2017-07-02%2Bat%2B10.51.56.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="869" data-original-width="1600" height="216" src="https://1.bp.blogspot.com/-ARL1V5uQKOM/WVkNoBbF7LI/AAAAAAAADhI/07YH5DyJ1n8SKlS8kApTwB-ah6ANFWhUQCLcBGAs/s400/Screen%2BShot%2B2017-07-02%2Bat%2B10.51.56.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Green means GO! APEX sessions at Kscope.</td></tr></tbody></table><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-G2OygRVmb6A/WVkN91epbiI/AAAAAAAADhM/2-9lUQMGLkk6ah4mded8HYeC7sAjj1W9ACLcBGAs/s1600/IMG_8052.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="484" data-original-width="1600" height="120" src="https://2.bp.blogspot.com/-G2OygRVmb6A/WVkN91epbiI/AAAAAAAADhM/2-9lUQMGLkk6ah4mded8HYeC7sAjj1W9ACLcBGAs/s400/IMG_8052.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">APEX Sunday Symposium</td></tr></tbody></table><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-NNfC-nXCq1s/WVkOObQrtII/AAAAAAAADhQ/Qha0VkiNUzgRHFSVJg6Sfx_sJjm3Wz9kQCLcBGAs/s1600/IMG_8068.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://3.bp.blogspot.com/-NNfC-nXCq1s/WVkOObQrtII/AAAAAAAADhQ/Qha0VkiNUzgRHFSVJg6Sfx_sJjm3Wz9kQCLcBGAs/s400/IMG_8068.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">APEX Open Mic Night</td></tr></tbody></table><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-DzZdI1T91aE/WVkOwzuEVpI/AAAAAAAADhU/EMT2-CPIO-Q7CgbX9bY8aiIlieWIPUy6QCEwYBhgL/s1600/IMG_8172.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="744" data-original-width="1600" height="185" src="https://3.bp.blogspot.com/-DzZdI1T91aE/WVkOwzuEVpI/AAAAAAAADhU/EMT2-CPIO-Q7CgbX9bY8aiIlieWIPUy6QCEwYBhgL/s400/IMG_8172.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">#LetsWreckThisTogether APEX Talks</td></tr></tbody></table><br /><br /> Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-4630030642516222808 Sun Jul 02 2017 11:28:00 GMT-0400 (EDT)