<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7503870654723445782</id><updated>2012-01-30T15:42:05.041-08:00</updated><category term='Twitter'/><category term='business'/><category term='Firefox'/><category term='JAVA'/><category term='enterprise'/><category term='PL/SQL'/><category term='Oracle 10g'/><category term='OraTweet'/><category term='XMPP'/><category term='OHS'/><category term='Oracle 11g'/><category term='APEX'/><category term='Jabber'/><category term='oracle'/><title type='text'>Oracle Application Express - A Blog</title><subtitle type='html'>Blogging my experience with Oracle Application Express , Linux, Java and other Oracle Technologies.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://apextoday.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-7121216152427297858</id><published>2008-10-01T13:32:00.000-07:00</published><updated>2010-01-07T10:32:14.616-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='OraTweet'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>OraTweet  - Tweeting on the Enterprise</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_FuhTy6GGV7g/SfKLB4fA3HI/AAAAAAAALZs/YLOHJKGhJmI/s1600-h/screenshot_01.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_FuhTy6GGV7g/SLSmiR-ey5I/AAAAAAAAAeI/4qPSJfTMv0g/s1600-h/oratweet.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5238995374409960338" src="http://2.bp.blogspot.com/_FuhTy6GGV7g/SLSmiR-ey5I/AAAAAAAAAeI/4qPSJfTMv0g/s200/oratweet.png" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt; You can now download the OraTweet package at &lt;a href="http://oratweet.com/"&gt;http://oratweet.com&lt;/a&gt; !&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How It All Began:&lt;/span&gt;&lt;br /&gt;Although I didn't come up with the whole &lt;a href="http://en.wikipedia.org/wiki/Micro-blogging"&gt;micro-blogging&lt;/a&gt; concept, I did realize the potential it had in the enterprise when I first stumbled upon Twitter. Instead of just writing on this blog, a forum, or in Twitter something like, "Man, someone should write an enterprise twitter," I went to work using &lt;a href="http://apex.oracle.com/i/index.html"&gt;Oracle APEX&lt;/a&gt; which is an amazing rapid web application development tool that allowed me to focus on the real issue: create a micro-blogging messaging system. Since APEX sits right on top of our great flagship (Oracle RDBMS + mod_plsql = FTW!) it allowed me to use my pl/sql ninja skills.&lt;br /&gt;&lt;br /&gt;It took me literally one weekend to have the bare bone architecture up and running.&lt;br /&gt;As I posted here before I used a loaded JAVA/PLSQL XMPP library based on smack api to support &lt;a href="http://apextoday.blogspot.com/2008/05/adding-im-xmppjabber-messaging-to-apex.html"&gt;IM messaging&lt;/a&gt; right from the Oracle JVM and created &lt;a href="http://apextoday.blogspot.com/2008/07/oratweetbot-xmppjabber-listener-for.html"&gt;OraTweetBot&lt;/a&gt; as an IM listener. Hooking OraTweet to our internal IM system works flawlessly since we are using open source XMPP protocols. User adoption is also a plus since users can use their existing IM clients to interact with OraTweet. OraTweet also has the option of sending and getting updates from Twitter with PL/SQL, thus giving the user the option to post to the world or just internally.&lt;br /&gt;&lt;br /&gt;From the beginning I got great feedback from our own Web 2.0  &lt;a href="http://oracleappslab.com/2008/06/25/we-heart-hackers/"&gt;AppsLab&lt;/a&gt; adoption team and got some great pointers on corporate adoption. Since this is a side project I let OraTweet sit for a few weeks without much advertisement while I was doing improvements (and my actual work!). But Meg Bear and the &lt;a href="http://talentedapps.wordpress.com/"&gt;Fusion Talent Management Products&lt;/a&gt; team stumbled over OraTweet while looking for a solution to bridge the communication gap within their global team. They contacted me, and we worked together on some improvements and launched a pilot.&lt;br /&gt;At this point &lt;a href="http://carlback.blogspot.com/"&gt;Carl Backstrom&lt;/a&gt; from the APEX team offered to help me. Now thanks to him we have a working API, and we have plans to deploy OraTweet globally once it is ready. Having this API lets OraTweet work as a global messaging system allowing third parties and platforms such as &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt; interact with OraTweet users.&lt;br /&gt;&lt;br /&gt;After one week of alpha/beta life and not much internal advertisement OraTweeters numbers went from a dozen to the hundreds and is still growing, which shows that there is a hidden demand for internal communication tools like this. I like the fact that OraTweet flattens enterprise hierarchies and opens communication between all levels.&lt;br /&gt;&lt;br /&gt;Now the best part is that I'm planning to release OraTweet  for free as an &lt;a href="http://www.oracle.com/technology/products/database/application_express/packaged_apps/packaged_apps.html"&gt;APEX package&lt;/a&gt; once all the beta wrinkles are out. It works great next to the other free packages such as ARIA, which is our internal employee directory.&lt;br /&gt;&lt;br /&gt;What I envision as I release OraTweet is seeing companies, universities, and organizations running their own OraTweet instance, allowing them to keep their information private yet strengthening their own internal communities. It should be the same way we do email and instant messaging: We manage our own information, which allows us to broadcast messages safely in our own microcosm.&lt;br /&gt;&lt;br /&gt;PS Screenshots coming soon!&lt;br /&gt;&lt;br /&gt;Update 1 - Screenshot 1&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_FuhTy6GGV7g/SLXK4BdP1RI/AAAAAAAAAeQ/qogRMrt4y1Q/s1600-h/OraTweet.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5239316805328033042" src="http://3.bp.blogspot.com/_FuhTy6GGV7g/SLXK4BdP1RI/AAAAAAAAAeQ/qogRMrt4y1Q/s200/OraTweet.jpg" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Update 2 - Latest Screenshot&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_FuhTy6GGV7g/SfKLB4fA3HI/AAAAAAAALZs/YLOHJKGhJmI/s1600-h/screenshot_01.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5328474173591313522" src="http://4.bp.blogspot.com/_FuhTy6GGV7g/SfKLB4fA3HI/AAAAAAAALZs/YLOHJKGhJmI/s320/screenshot_01.png" style="cursor: pointer; float: left; height: 320px; margin-bottom: 10px; margin-left: 0px; margin-right: 10px; margin-top: 0px; width: 290px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-7121216152427297858?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/7121216152427297858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/7121216152427297858'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/08/oratweet-tweeting-on-enterprise.html' title='OraTweet  - Tweeting on the Enterprise'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FuhTy6GGV7g/SLSmiR-ey5I/AAAAAAAAAeI/4qPSJfTMv0g/s72-c/oratweet.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-6068386440407381735</id><published>2008-08-14T10:24:00.000-07:00</published><updated>2008-08-14T11:15:05.289-07:00</updated><title type='text'>Get TinyURL from PL/SQL - APEX</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FuhTy6GGV7g/SKRrT8fxczI/AAAAAAAAAeA/WWfAvCIQT-4/s1600-h/TinyURL.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_FuhTy6GGV7g/SKRrT8fxczI/AAAAAAAAAeA/WWfAvCIQT-4/s200/TinyURL.png" alt="" id="BLOGGER_PHOTO_ID_5234426657312437042" border="0" /&gt;&lt;/a&gt;Here is an example of how to use a PL/SQL function to convert an URL into a TinyURL using their api. This is very simple stuff yet it can save a lot of space!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;create or replace FUNCTION get_tinyURL(t_url IN VARCHAR2)&lt;br /&gt;RETURN VARCHAR&lt;br /&gt;IS&lt;br /&gt;http_req utl_http.req;&lt;br /&gt;http_resp utl_http.resp;&lt;br /&gt;res_value VARCHAR2(4000);&lt;br /&gt;BEGIN&lt;br /&gt;--utl_http.set_proxy('http://www.yourproxy.com:80'); --If you need to specify a proxy use this.&lt;br /&gt;http_req := utl_http.begin_request('http://tinyurl.com/api-create.php?url=' || t_url, 'GET');&lt;br /&gt;http_resp := utl_http.get_response(http_req);&lt;br /&gt;utl_http.read_text(http_resp,res_value);&lt;br /&gt;utl_http.end_response(http_resp);&lt;br /&gt;&lt;br /&gt;return res_value;&lt;br /&gt;&lt;br /&gt;END get_tinyURL;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-6068386440407381735?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/6068386440407381735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/6068386440407381735'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/08/get-tinyurl-from-plsql-apex.html' title='Get TinyURL from PL/SQL - APEX'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FuhTy6GGV7g/SKRrT8fxczI/AAAAAAAAAeA/WWfAvCIQT-4/s72-c/TinyURL.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-329027146146086557</id><published>2008-07-24T11:45:00.000-07:00</published><updated>2008-07-24T12:27:56.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>OraTweetBot, an XMPP/Jabber listener for Twitter</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_FuhTy6GGV7g/SIjODgAvW9I/AAAAAAAAAQw/3fIz9kDnx9M/s1600-h/xmpp.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_FuhTy6GGV7g/SIjODgAvW9I/AAAAAAAAAQw/3fIz9kDnx9M/s200/xmpp.jpg" alt="" id="BLOGGER_PHOTO_ID_5226653927091428306" border="0" /&gt;&lt;/a&gt;OraTweetBot is an XMPP/Jabber bot built with Java that will listen for tweets and post them to Twitter or to a database.  This is part of my pet project OraTweet which is built with &lt;a href="http://apex.oracle.com/"&gt;Oracle APEX&lt;/a&gt; and will soon make it available through a distributable APEX package.&lt;br /&gt;&lt;br /&gt;If you are tired of Twitter xmpp hook not working, you can use OraTweetBot to listen for your tweets and post them to Twitter.&lt;br /&gt;&lt;br /&gt;If you want to go further you can hook the bot to post to your database, then your database can trigger the post to Twitter (see &lt;a href="http://apextoday.blogspot.com/2008/06/post-updates-to-twitter-from-apex-plsql.html"&gt;Post Updates to Twitter from APEX (PL/SQL)&lt;/a&gt;). The big advantage of this is that you can actually map twitter users to a users table on the db and send on their behalf.&lt;br /&gt;&lt;br /&gt;Right now I'm only releasing the distributable form, if you want to get the source let me know on the comments. If there is a demmand I can create a sourceforge or google code project to host it.&lt;br /&gt;&lt;br /&gt;Instructions:&lt;br /&gt;&lt;br /&gt;1.-Download &lt;a href="http://noelportugal.googlepages.com/OraTweetBot.zip"&gt;here&lt;/a&gt; OraTweetBot (unzip)&lt;br /&gt;2.- Modify file conf.properties with your values.&lt;br /&gt;3.- If you are planning to send tweet to a database create a Stored Procedure called INSERT_TWEET:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;   create or replace&lt;br /&gt;   PROCEDURE INSERT_TWEET( email IN VARCHAR2, tweet IN VARCHAR2, tresource IN VARCHAR2, createdon IN TIMESTAMP    )&lt;br /&gt;   AS&lt;br /&gt;   BEGIN&lt;br /&gt;     INSERT INTO TWEET (EMAIL,TWEET,TRESOURCE,CREATEDON) VALUES (email,tweet, tresource, createdon );&lt;br /&gt;   COMMIT;&lt;br /&gt;   END INSERT_TWEET;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;4.- Run it from command line&lt;br /&gt;       $java -jar OraTweetBot.jar&lt;br /&gt;   or to run in the background&lt;br /&gt;       $nuhup java -jar OraTweetBot.jar &amp;amp;&lt;br /&gt;Run OraTweetBot preferably on an "always on" machine.&lt;br /&gt;&lt;br /&gt;You can login with the same XMPP (gmail) account from different clients, so you can set up OraTweetBot with the same account you want to post tweets with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-329027146146086557?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/329027146146086557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/329027146146086557'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/07/oratweetbot-xmppjabber-listener-for.html' title='OraTweetBot, an XMPP/Jabber listener for Twitter'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_FuhTy6GGV7g/SIjODgAvW9I/AAAAAAAAAQw/3fIz9kDnx9M/s72-c/xmpp.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-5914661291451758646</id><published>2008-07-23T19:26:00.001-07:00</published><updated>2008-07-23T19:39:49.989-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>Post Updates to Twitter from JAVA</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_FuhTy6GGV7g/SIfoaspp9ZI/AAAAAAAAAQk/k3IkwwDA784/s1600-h/java.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_FuhTy6GGV7g/SIfoaspp9ZI/AAAAAAAAAQk/k3IkwwDA784/s200/java.jpg" alt="" id="BLOGGER_PHOTO_ID_5226401437946869138" border="0" /&gt;&lt;/a&gt;Here is some sample java code you can use to post updates to Twitter from java.  This is just a simple POST method, if you are looking for a full Twitter library head to &lt;a class="ln" href="http://groups.google.com/group/twitter-development-talk/web/libraries-for-the-twitter-api"&gt;Twitter Development Talk&lt;/a&gt;. I implemented this code on the OraTweetBot which I will make available soon.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.io.OutputStreamWriter;&lt;br /&gt;import java.net.InetSocketAddress;&lt;br /&gt;import java.net.SocketAddress;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.net.URLConnection;&lt;br /&gt;import java.net.URLEncoder;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       SendTwitter(args[0]);&lt;br /&gt;   }&lt;br /&gt;       public static void SendTwitter(String msg ) {&lt;br /&gt;       try {&lt;br /&gt;           int proxyon = 1;&lt;br /&gt;           String proxyurl = "www-yourproxy.com";&lt;br /&gt;           int proxyport = 80;&lt;br /&gt;           String twitteruser = "username";&lt;br /&gt;           String twitterpass = "password";&lt;br /&gt;           SocketAddress addr = null;&lt;br /&gt;           java.net.Proxy proxy = null;&lt;br /&gt;           URLConnection connection = null;&lt;br /&gt;           String credentials = twitteruser + ":" + twitterpass;&lt;br /&gt;         &lt;br /&gt;           if (proxyon == 1){&lt;br /&gt;                 addr = new InetSocketAddress(proxyurl, proxyport);&lt;br /&gt;                 proxy = new java.net.Proxy(java.net.Proxy.Type.HTTP, addr);&lt;br /&gt;           }&lt;br /&gt;         &lt;br /&gt;           String encodecredentials = new sun.misc.BASE64Encoder().encode (credentials.getBytes());&lt;br /&gt;         &lt;br /&gt;           URL url = new URL("http://twitter.com/statuses/update.xml");&lt;br /&gt;           String encodedData = URLEncoder.encode(msg, "UTF-8");&lt;br /&gt;&lt;br /&gt;           if (proxyon == 1){&lt;br /&gt;               connection = url.openConnection(proxy);&lt;br /&gt;           }&lt;br /&gt;           else{&lt;br /&gt;               connection = url.openConnection();&lt;br /&gt;           }&lt;br /&gt;         &lt;br /&gt;           connection.setRequestProperty( "Authorization", "Basic " + encodecredentials);&lt;br /&gt;           connection.setDoOutput(true);&lt;br /&gt;&lt;br /&gt;           OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());&lt;br /&gt;           out.write("status=" + encodedData);&lt;br /&gt;           out.close();&lt;br /&gt;&lt;br /&gt;           BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));          &lt;br /&gt;           String decodedString;&lt;br /&gt;           while ((decodedString = in.readLine()) != null) {&lt;br /&gt;               System.out.println(decodedString);&lt;br /&gt;           }&lt;br /&gt;           in.close();&lt;br /&gt;&lt;br /&gt;           } catch (Exception e) {&lt;br /&gt;               System.out.println(e.toString());&lt;br /&gt;           }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-5914661291451758646?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/5914661291451758646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/5914661291451758646'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/07/post-updates-to-twitter-from-java.html' title='Post Updates to Twitter from JAVA'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_FuhTy6GGV7g/SIfoaspp9ZI/AAAAAAAAAQk/k3IkwwDA784/s72-c/java.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-1764423564356893875</id><published>2008-06-28T12:17:00.001-07:00</published><updated>2009-03-17T14:13:51.209-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PL/SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Getting friends timeline from Twitter to Oracle APEX (PL/SQL)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_FuhTy6GGV7g/SGFQo2lgb5I/AAAAAAAAAQE/OKtGjIGloE4/s1600-h/oratweet_icons_256.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_FuhTy6GGV7g/SGFQo2lgb5I/AAAAAAAAAQE/OKtGjIGloE4/s200/oratweet_icons_256.png" alt="" id="BLOGGER_PHOTO_ID_5215538506249564050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now that you have &lt;a href="http://apextoday.blogspot.com/2008/06/post-updates-to-twitter-from-apex-plsql.html"&gt;posted your Twitter updates from APEX&lt;/a&gt;, you  might want to read your friends time line. The procedure is very similar to posting of updates, except this time you want to receive the XML and process it for display inside a SQL query report. The returning XML will show the  20 most recent statuses posted in the last 24 hours from the authenticating user and that user's friends.&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-family:arial,sans-serif;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-family:arial,sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;create or replace&lt;br /&gt;FUNCTION get_twitter_timeline(t_user IN VARCHAR2,   t_pass IN VARCHAR2)&lt;br /&gt;RETURN XMLTYPE&lt;br /&gt;IS&lt;br /&gt;http_req utl_http.req;&lt;br /&gt;http_resp utl_http.resp;&lt;br /&gt;t_update_send VARCHAR2(200);&lt;br /&gt;res_value VARCHAR2(4000);&lt;br /&gt;XML_RETURN CLOB;&lt;br /&gt;BEGIN&lt;br /&gt;t_update_send := '--head';&lt;br /&gt;--utl_http.set_proxy('http://www-yourproxy.com:80'); --If you need to specify a proxy use this.&lt;br /&gt;http_req := utl_http.begin_request('http://twitter.com/statuses/friends_timeline.xml',   'POST',   utl_http.http_version_1_1);&lt;br /&gt;utl_http.set_response_error_check(TRUE);&lt;br /&gt;utl_http.set_detailed_excp_support(TRUE);&lt;br /&gt;utl_http.set_body_charset(http_req,   'UTF-8');&lt;br /&gt;utl_http.set_header(http_req,   'User-Agent',   'Mozilla/4.0');&lt;br /&gt;utl_http.set_header(http_req,   'Content-Type',   'application/x-www-form-urlencoded');&lt;br /&gt;utl_http.set_header(http_req,   'Content-Length',   to_char(LENGTH(t_update_send)));&lt;br /&gt;utl_http.set_transfer_timeout(to_char('60'));&lt;br /&gt;utl_http.set_authentication(http_req,   t_user,   t_pass,   'Basic');&lt;br /&gt;utl_http.write_text(http_req,   t_update_send);&lt;br /&gt;http_resp := utl_http.get_response(http_req);&lt;br /&gt;BEGIN&lt;br /&gt;WHILE 1 = 1&lt;br /&gt;LOOP&lt;br /&gt; utl_http.read_line(http_resp,   res_value,   TRUE);&lt;br /&gt; XML_RETURN := XML_RETURN || res_value;&lt;br /&gt;END LOOP;&lt;br /&gt;EXCEPTION&lt;br /&gt;WHEN utl_http.end_of_body THEN&lt;br /&gt;NULL;&lt;br /&gt;END;&lt;br /&gt;utl_http.end_response(http_resp);&lt;br /&gt;return XMLTYPE(XML_RETURN);&lt;br /&gt;EXCEPTION&lt;br /&gt;WHEN others THEN&lt;br /&gt;XML_RETURN := sqlerrm;&lt;br /&gt;RAISE;&lt;br /&gt;END get_twitter_timeline;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;SELECT EXTRACTVALUE(VALUE(twitter), '/status/user/name')  AS NAME&lt;br /&gt;, EXTRACTVALUE(VALUE(twitter), '/status/text') AS TEXT&lt;br /&gt;, EXTRACTVALUE(VALUE(twitter), '/status/created_at') AS CREATED_AT&lt;br /&gt;, EXTRACTVALUE(VALUE(twitter), '/status/source') AS SOURCE&lt;br /&gt;, EXTRACTVALUE(VALUE(twitter), '/status/user/screen_name') AS SCREEN_NAME&lt;br /&gt;, EXTRACTVALUE(VALUE(twitter), '/status/user/profile_image_url') AS PROFILE_IMAGE_URL&lt;br /&gt;FROM&lt;br /&gt;TABLE(XMLSEQUENCE(EXTRACT(get_twitter_timeline('twitter_user','twitter_password'), '/statuses/*'))) twitter&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Note that according to &lt;a href="http://groups.google.com/group/twitter-development-talk/web/api-documentation"&gt;Twitter API&lt;/a&gt; &lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-family:arial,sans-serif;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-family:arial,sans-serif;"&gt;&lt;a href="http://groups.google.com/group/twitter-development-talk/browse_thread/thread/f881564598a947a7#" rel="nofollow"&gt;the public timeline is cached for 60 seconds&lt;/a&gt; so requesting it more often than that is a waste of resources&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Happy Posting :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-1764423564356893875?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/1764423564356893875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/1764423564356893875'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/06/getting-friends-timeline-from-twitter.html' title='Getting friends timeline from Twitter to Oracle APEX (PL/SQL)'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_FuhTy6GGV7g/SGFQo2lgb5I/AAAAAAAAAQE/OKtGjIGloE4/s72-c/oratweet_icons_256.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-6666987845798346226</id><published>2008-06-24T12:17:00.000-07:00</published><updated>2009-03-17T14:07:02.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Post Updates to Twitter from Oracle APEX (PL/SQL)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_FuhTy6GGV7g/SGFQo2lgb5I/AAAAAAAAAQE/OKtGjIGloE4/s1600-h/oratweet_icons_256.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_FuhTy6GGV7g/SGFQo2lgb5I/AAAAAAAAAQE/OKtGjIGloE4/s200/oratweet_icons_256.png" alt="" id="BLOGGER_PHOTO_ID_5215538506249564050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I started a pet project called OraTweet. It is an Oracle internal "Twitter" with some key advantages such as the ability to follow groups  and IM (XMPP/Jabber) integration. Aside from having our own internal "tweets" a user can direct a message &lt;a href="http://twitter.com/oratweet"&gt;@oratweet&lt;/a&gt; and the application will post it to the generic OraTweet Twitter account. Also the user will be able to store its own credentials and post to its own account (ie &lt;a href="http://twitter.com/noelportugal"&gt;@noelportugal&lt;/a&gt;). I started playing with the &lt;a href="http://groups.google.com/group/twitter-development-talk/web/api-documentation"&gt;Twitter API&lt;/a&gt; and first start sending updates with a combination of a Java Class to execute a shell Curl command. I soon realized that was not the best way to do it, so I went to work and got the following Procedure. (note that this is the quick and dirty version, feel free to extend it and make it more foolproof)&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE update_twitter(t_user IN VARCHAR2,   t_pass IN VARCHAR2,   t_update IN VARCHAR2) AS&lt;br /&gt;http_req utl_http.req;&lt;br /&gt;http_resp utl_http.resp;&lt;br /&gt;h_name VARCHAR2(255);&lt;br /&gt;h_value VARCHAR2(1023);&lt;br /&gt;t_update_send VARCHAR2(4000);&lt;br /&gt;res_value VARCHAR2(32767);&lt;br /&gt;show_header NUMBER := 0;--0 False, 1 True&lt;br /&gt;show_xml NUMBER := 1;--0 False, 1 True&lt;br /&gt;BEGIN&lt;br /&gt;t_update_send := 'status=' || SUBSTR(t_update,   1,   140) || '';&lt;br /&gt;--utl_http.set_proxy('http://www,yourpoxy.com:80'); --If you need to specify a proxy un comment this line.&lt;br /&gt;http_req := utl_http.begin_request('http://twitter.com/statuses/update.xml',   'POST',   utl_http.http_version_1_1);&lt;br /&gt;utl_http.set_response_error_check(TRUE);&lt;br /&gt;utl_http.set_detailed_excp_support(TRUE);&lt;br /&gt;utl_http.set_body_charset(http_req,   'UTF-8');&lt;br /&gt;utl_http.set_header(http_req,   'User-Agent',   'Mozilla/4.0');&lt;br /&gt;utl_http.set_header(http_req,   'Content-Type',   'application/x-www-form-urlencoded');&lt;br /&gt;utl_http.set_header(http_req,   'Content-Length',   to_char(LENGTH(t_update_send)));&lt;br /&gt;utl_http.set_transfer_timeout(to_char('60'));&lt;br /&gt;utl_http.set_authentication(http_req,   t_user,   t_pass,   'Basic');&lt;br /&gt;utl_http.write_text(http_req,   t_update_send);&lt;br /&gt;http_resp := utl_http.get_response(http_req);&lt;br /&gt;&lt;br /&gt;DBMS_OUTPUT.PUT_LINE('status code: ' || http_resp.status_code);&lt;br /&gt;DBMS_OUTPUT.PUT_LINE('reason phrase: ' || http_resp.reason_phrase);&lt;br /&gt;&lt;br /&gt;IF show_header = 1 THEN&lt;br /&gt;FOR i IN 1 .. utl_http.get_header_count(http_resp)&lt;br /&gt;LOOP&lt;br /&gt;utl_http.get_header(http_resp,   i,   h_name,   h_value);&lt;br /&gt;DBMS_OUTPUT.PUT_LINE(h_name || ': ' || h_value);&lt;br /&gt;END LOOP;&lt;br /&gt;END IF;&lt;br /&gt;&lt;br /&gt;IF show_xml = 1 THEN&lt;br /&gt;BEGIN&lt;br /&gt;WHILE 1 = 1&lt;br /&gt;LOOP&lt;br /&gt;utl_http.read_line(http_resp,   res_value,   TRUE);&lt;br /&gt;DBMS_OUTPUT.PUT_LINE(res_value);&lt;br /&gt;END LOOP;&lt;br /&gt;&lt;br /&gt;EXCEPTION&lt;br /&gt;WHEN utl_http.end_of_body THEN&lt;br /&gt;NULL;&lt;br /&gt;END;&lt;br /&gt;END IF;&lt;br /&gt;&lt;br /&gt;utl_http.end_response(http_resp);&lt;br /&gt;&lt;br /&gt;EXCEPTION&lt;br /&gt;WHEN others THEN&lt;br /&gt;DBMS_OUTPUT.PUT_LINE(sqlerrm);&lt;br /&gt;RAISE;&lt;br /&gt;&lt;br /&gt;END update_twitter;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;begin&lt;br /&gt;UPDATE_TWITTER('my_twitter_acct','my_twitter_pass','Hello World from Oracle PL/SQL and APEX http://apextoday.blogspot.com');&lt;br /&gt;end;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;My following post will include on how to create an XMPP/Jabber listener with Java and how I hooked it up to my application.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;***Update I just blogged about &lt;a href="http://apextoday.blogspot.com/2008/06/getting-friends-timeline-from-twitter.html"&gt;Getting friends timeline from Twitter to APEX (PL/SQL) &lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-6666987845798346226?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/6666987845798346226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/6666987845798346226'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/06/post-updates-to-twitter-from-apex-plsql.html' title='Post Updates to Twitter from Oracle APEX (PL/SQL)'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_FuhTy6GGV7g/SGFQo2lgb5I/AAAAAAAAAQE/OKtGjIGloE4/s72-c/oratweet_icons_256.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-6920437161325798768</id><published>2008-05-16T18:44:00.000-07:00</published><updated>2008-05-21T14:06:55.886-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle 10g'/><category scheme='http://www.blogger.com/atom/ns#' term='Jabber'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle 11g'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Adding IM (Jabber/XMPP) messaging to Oracle APEX</title><content type='html'>One of my APEX application relies heavily on email notifications for work flow approval and task assignment notification. A few months ago it occurred to me that it would be really nice to implement IM notification and let users decide how they like to be notified. So I went to work and found a great  java open source XMPP/Jabber client called &lt;a href="http://www.igniterealtime.org/downloads/index.jsp"&gt;Smack&lt;/a&gt;. My first implementation was just a simple class that called smack functions loaded on the DB by loadjava.  But I recently found a project started by &lt;a href="http://oracle-xmpp.sourceforge.net/"&gt;Adrien Sales&lt;/a&gt; that wraps more of the Smack functions such as rosters. To add IM  functionality to your application follow these steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download&lt;a href="http://sourceforge.net/projects/oracle-xmpp/"&gt; Oracle XMPP/Jabber Instant Messenger&lt;/a&gt; for Oracle 11G.&lt;br /&gt;If you are using Oracle 10g  download from &lt;a href="http://noelportugal.googlepages.com/dist.zip"&gt;here&lt;/a&gt; (I had to recompile using an older smack version and JDK1_4)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Login to sqlplus as sysdba and create account XMPP to load java classes and package.&lt;br /&gt;&lt;pre class="programlisting"&gt;create user XMPP identified by XMPP&lt;br /&gt;default tablespace &lt;span style="font-style: italic;"&gt;your_tablespace&lt;/span&gt;&lt;br /&gt;temporary tablespace &lt;span style="font-style: italic;"&gt;your_temp_tablespace&lt;/span&gt;&lt;br /&gt;quota unlimited on users;&lt;br /&gt;GRANT "CONNECT" TO XMPP;&lt;br /&gt;GRANT "DBA" TO XMPP;&lt;br /&gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;From the shell go to the dist folder and excute&lt;br /&gt;&lt;pre class="programlisting"&gt;loadjava -u XMPP/XMPP -resolve lib/smack.jar&lt;br /&gt;loadjava -u XMPP/XMPP -resolve lib/smackx.jar&lt;br /&gt;loadjava -u XMPP/XMPP -resolve OracleXMPP.jar&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia,serif;"&gt;Login to sqlplus as sysdba and execute:&lt;br /&gt;&lt;pre class="programlisting"&gt;call dbms_java.grant_permission('PUBLIC', 'java.net.SocketPermission', '*', 'accept, connect,&lt;br /&gt;listen, resolve');&lt;br /&gt;call dbms_java.grant_permission('PUBLIC', 'java.net.NetPermission', '*', 'accept, connect,&lt;br /&gt;listen, resolve');&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Connect as XMPP/XMPP and run the &lt;a href="http://noelportugal.googlepages.com/oracle-xmpp-install.sql"&gt;following script&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Grant privileges on the new package to APEX_PUBLIC_USER:&lt;br /&gt;&lt;pre class="programlisting"&gt;grant execute, debug on dbms_xmpp to APEX_PUBLIC_USER;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Login to APEX to SQL Workshop&gt; SQL Commands and test:&lt;br /&gt;&lt;pre class="programlisting"&gt;select XMPP.dbms_xmpp.send_plain_text_message('talk.google.com',&lt;br /&gt;5222,&lt;br /&gt;'gmail.com',&lt;br /&gt;'&lt;span style="font-style: italic;"&gt;my_user&lt;/span&gt;',&lt;br /&gt;'&lt;span style="font-style: italic;"&gt;my_password&lt;/span&gt;',&lt;br /&gt;'&lt;span style="font-style: italic;"&gt;recipient@gmail.com'&lt;/span&gt;,&lt;br /&gt;'XMPP Test',&lt;br /&gt;'Hello from Oracle APEX') xmpp_return_code&lt;br /&gt;from dual;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;And thats it! Now if your company happens to be running a XMPP/Jabber server (like we do at Oracle) or if you have a user base that has gmail accounts or any of the other services running on XMPP, this could be a great alternative to emails. This is a huge hit on my applications and I bet anyone can come with more creative ways to include Jabber with APEX.  Let me know how you use it.&lt;br /&gt;&lt;br /&gt;I am also planning to post soon how I'm running my own Jabber server and how I can integrate it with my APEX application. Stay tuned!&lt;br /&gt;&lt;br /&gt;For more information on Jabber please visit &lt;a href="http://www.jabber.org/"&gt;http://www.jabber.org/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-6920437161325798768?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apextoday.blogspot.com/feeds/6920437161325798768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7503870654723445782&amp;postID=6920437161325798768' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/6920437161325798768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/6920437161325798768'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/05/adding-im-xmppjabber-messaging-to-apex.html' title='Adding IM (Jabber/XMPP) messaging to Oracle APEX'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-2752259610574189161</id><published>2008-05-15T14:35:00.000-07:00</published><updated>2008-05-20T17:48:49.760-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OHS'/><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><title type='text'>Apache 2 Compression with mod_deflate</title><content type='html'>Today, after a report from one my users that the our APEX application was getting "slower", I decided to implement mod_deflate for content compression. The performance is noticeable faster! I went with mod_deflate since is included in the Apache 2.0.x source package. Here is what I added to my httpd.conf:&lt;br /&gt;&lt;br /&gt;LoadFile /usr/lib/libz.so&lt;br /&gt;LoadModule deflate_module modules/mod_deflate.so&lt;br /&gt;&lt;br /&gt;&amp;lt;IfModule mod_deflate.c&gt;&lt;br /&gt;   # Insert filter&lt;br /&gt;   SetOutputFilter DEFLATE&lt;br /&gt;   # Netscape 4.x has some problems...&lt;br /&gt;   BrowserMatch ^Mozilla/4 gzip-only-text/html&lt;br /&gt;   # Netscape 4.06-4.08 have some more problems&lt;br /&gt;   BrowserMatch ^Mozilla/4\.0[678] no-gzip&lt;br /&gt;   # MSIE masquerades as Netscape, but it is fine&lt;br /&gt;   # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html&lt;br /&gt;   # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48&lt;br /&gt;   # the above regex won't work. You can use the following&lt;br /&gt;   # workaround to get the desired effect:&lt;br /&gt;   BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html&lt;br /&gt;   # Don't compress images&lt;br /&gt;   SetEnvIfNoCase Request_URI \&lt;br /&gt;   \.(?:gif|jpe?g|png|htc|wsdl|exe|t?gz|bz2|sit|rar|pdf|zip)$ no-gzip dont-vary&lt;br /&gt;   # Make sure proxies don't deliver the wrong content&lt;br /&gt;   Header append Vary User-Agent env=!dont-vary&lt;br /&gt;&amp;lt;/IfModule&gt;&lt;br /&gt;&lt;br /&gt;After that I all did was a quick&lt;br /&gt;opmnctl restartproc ias-component=HTTP_Server&lt;br /&gt;and voila!&lt;br /&gt;&lt;br /&gt;For more information on mod_deflate go to &lt;a target="_blank" href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html"&gt;http://httpd.apache.org/docs/2.0/mod/mod_deflate.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-2752259610574189161?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apextoday.blogspot.com/feeds/2752259610574189161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7503870654723445782&amp;postID=2752259610574189161' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/2752259610574189161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/2752259610574189161'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/05/apache-2-compression-with-moddeflate.html' title='Apache 2 Compression with mod_deflate'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7503870654723445782.post-2445402531324678623</id><published>2008-05-13T12:20:00.000-07:00</published><updated>2008-05-20T17:50:11.102-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Adding Firefox Search Engine to APEX</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_FuhTy6GGV7g/SCpAWgF9ZSI/AAAAAAAAAOw/xzYSdQCFuHM/s1600-h/asktom.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_FuhTy6GGV7g/SCpAWgF9ZSI/AAAAAAAAAOw/xzYSdQCFuHM/s320/asktom.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5200039475068888354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today, I got tired of constantly having to login to Metalink to search for SR's that I needed to check. I do have other tools (internal) that let me do the this (oracle forms) but I do prefer to use Metalink since it is built with APEX.  So here is what I did to speed up the search process; I added this to my intranet APEX application so my users can install the search engine. I also created an alternate example using Ask Tom's Site.&lt;br /&gt;&lt;br /&gt;First I created asktom.xml with the following (note that for space purposes could not include the whole data:image string. To create your own go to &lt;a target="_blank" href="http://software.hixie.ch/utilities/cgi/data/data"&gt;The data: URI kitchen&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&amp;lt;SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/"&gt;&lt;br /&gt;&amp;lt;os:ShortName&gt;Ask Tom&amp;lt;/os:ShortName&gt;&lt;br /&gt;&amp;lt;os:Description&gt;Ask Tom Search&amp;lt;/os:Description&gt;&lt;br /&gt;&amp;lt;os:InputEncoding&gt;utf-8&amp;lt;/os:InputEncoding&gt;&lt;br /&gt;&amp;lt;os:Image width="16" height="16"&gt;data:image/x-icon,%01%01%10%10%01%20h% ...&lt;br /&gt;&amp;lt;/os:Image&gt;&lt;br /&gt;&amp;lt;SearchForm&gt;http://asktom.oracle.com/pls/asktom/f?p=100:1&amp;lt;/SearchForm&gt;&lt;br /&gt;&amp;lt;os:Url type="text/html" method="GET" template="http://asktom.oracle.com/pls/asktom/f?p=100:1:0::NO:RP:P1_SEARCH_CRITERIA:{searchTerms}"&gt;&lt;br /&gt;&amp;lt;/os:Url&gt;&lt;br /&gt;&amp;lt;/SearchPlugin&gt;&lt;br /&gt;&lt;br /&gt;Then I added the following inside the &amp;lt;header&gt; of this blog:&lt;br /&gt;&lt;br /&gt;&amp;lt;link href='http://noelportugal.googlepages.com/asktom.xml' rel='search' title='Ask Tom' type='application/opensearchdescription+xml'/&gt;&lt;br /&gt;&lt;br /&gt;Now all you have to do (assuming you are using Firefox) is go to the Search engine and go to the bottom where it says: Add "Ask Tom", and thats it!&lt;br /&gt;&lt;br /&gt;You can create as many Search Engines and have them available to your Firefox users.&lt;br /&gt;For more info visit &lt;a target="_blank" href="http://developer.mozilla.org/en/docs/Creating_OpenSearch_plugins_for_Firefox"&gt;http://developer.mozilla.org/en/docs/Creating_OpenSearch_plugins_for_Firefox&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7503870654723445782-2445402531324678623?l=apextoday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://apextoday.blogspot.com/feeds/2445402531324678623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7503870654723445782&amp;postID=2445402531324678623' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/2445402531324678623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7503870654723445782/posts/default/2445402531324678623'/><link rel='alternate' type='text/html' href='http://apextoday.blogspot.com/2008/05/hello-world.html' title='Adding Firefox Search Engine to APEX'/><author><name>Noel Portugal</name><uri>http://www.blogger.com/profile/03892621778640963476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_FuhTy6GGV7g/Sxf3KqpD-NI/AAAAAAAAOBI/QXIrg_ub-wA/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_FuhTy6GGV7g/SCpAWgF9ZSI/AAAAAAAAAOw/xzYSdQCFuHM/s72-c/asktom.gif' height='72' width='72'/><thr:total>1</thr:total></entry></feed>
