<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://rss.function1.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://www.function1.com/wp-atom.php">
	<title type="text">Function1 - AquaLogic Blog</title>
	<subtitle type="text">Discussing all things portal, WebCenter Interaction, WebCenter Suite, Sharepoint, and related technologies.</subtitle>

	<updated>2010-08-20T00:28:32Z</updated>

	<link rel="alternate" type="text/html" href="http://www.function1.com" />
	<id>http://www.function1.com/feed/atom/</id>
	

	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://rss.function1.com/AqualogicBlog" /><feedburner:info uri="aqualogicblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>AqualogicBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
		<author>
			<name>jeremy</name>
					</author>
		<title type="html"><![CDATA[Search Index Exceeds 10GB Logical Limit: KABOOM]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/jKs2_DXCFbQ/" />
		<id>http://www.function1.com/?p=1001</id>
		<updated>2010-08-20T00:28:32Z</updated>
		<published>2010-08-20T00:00:27Z</published>
		<category scheme="http://www.function1.com" term="Search Server" />		<summary type="html"><![CDATA[A small nugget of information is hidden in a technical white paper for WebCenter Interaction (Page 7). Oracle suggests that &#8220;Each (search) node can contain up to 10GB of index data for 32-bit operating systems and 100GB for 64-bit&#8221;. What the white paper fails to mention is what happens if this limit is exceeded? In [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/08/search-index-exceeds-10gb-logical-limit-kaboom/">&lt;p&gt;A small nugget of information is hidden in a &lt;a href="http://www.oracle.com/technetwork/middleware/webcenter/overview/optimizing-wci-performance-129966.pdf" target="_blank"&gt;technical white paper for WebCenter Interaction&lt;/a&gt; (Page 7). Oracle suggests that &amp;#8220;Each (search) node can contain up to 10GB of index data for 32-bit operating systems and 100GB for 64-bit&amp;#8221;. What the white paper fails to mention is what happens if this limit is exceeded?&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://dsc.discovery.com/tv/mythbusters/" target="_blank"&gt;&lt;img class="alignnone" src="http://www.cornerstoneaustin.org/storage/graphics/mythbusters_large.jpg?__SQUARESPACE_CACHEVERSION=1272197349218" alt="" width="589" height="83" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In pseudo-Function1-&lt;a href="http://dsc.discovery.com/tv/mythbusters/" target="_blank"&gt;mythbusters&lt;/a&gt; fashion, we tested this rumor inadvertently for you. Our symptoms started when file and web crawlers were intermittently failing. Search and snapshot queries were still working as normal and no errors were showing in the UI. The job log mentioned two errors:&lt;/p&gt;
&lt;p&gt;&lt;span id="more-1001"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #888888"&gt;-2147204349 &amp;#8211; Error in function PTIndexer.CommitAll (): -2147204349 &amp;#8211; Error reported by server: error writing index request to disk: FILE_WRITE_FAILED (-2147204349)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #888888"&gt;&amp;#8230;and a similar error mentioning a FILE_READ_FAILURE on index requests.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Further investigation uncovered a number of similar error messages in the search node logs under \ptsearchserver\[version]\[node]\logs&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #888888"&gt;&amp;lt;entry timestamp=&amp;#8221;2010-07-28T08:06:58+04:00&amp;#8243;  thread=&amp;#8221;624&amp;#8243;  &amp;gt;&lt;br /&gt;
&amp;lt;error&amp;gt;Failed to write to file: \\..\requests\1_0_256\2761711648.15244.488488.delta&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&amp;lt;entry timestamp=&amp;#8221;2010-07-28T08:06:58+04:00&amp;#8243;  thread=&amp;#8221;624&amp;#8243;  &amp;gt;&lt;br /&gt;
&amp;lt;error&amp;gt;Error FILE_WRITE_FAILED in ..\..\src\IndexRecord.cc at line 192 (system error code 6: The handle is invalid.)&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&amp;lt;entry timestamp=&amp;#8221;2010-07-28T08:06:58+04:00&amp;#8243;  thread=&amp;#8221;624&amp;#8243;  &amp;gt;&lt;br /&gt;
&amp;lt;error&amp;gt;Error FILE_WRITE_FAILED in ..\..\src\IndexQueueMonitor.cc at line 104 (system error code 6: The handle is invalid.)&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&amp;lt;entry timestamp=&amp;#8221;2010-07-28T08:06:59+04:00&amp;#8243;  thread=&amp;#8221;624&amp;#8243;  &amp;gt;&lt;br /&gt;
&amp;lt;error&amp;gt;error writing index request to disk: FILE_WRITE_FAILED&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;br /&gt;
&amp;lt;entry timestamp=&amp;#8221;2010-07-28T08:06:59+04:00&amp;#8243;  thread=&amp;#8221;624&amp;#8243;  &amp;gt;&lt;br /&gt;
&amp;lt;error&amp;gt;Error FILE_WRITE_FAILED in ..\..\src\QueryParser.cc at line 3049 (system error code 6: The handle is invalid.)&amp;lt;/error&amp;gt;&lt;br /&gt;
&amp;lt;/entry&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Before realizing the search index had grown to 10GB, we attempted to restore from a prior checkpoint. On a side note, scheduled checkpoints are a lifesaver in search; if you don&amp;#8217;t have regularly scheduled checkpoints open another browser tab to your Portal and schedule a checkpoint. Restoring the checkpoint worked for a short time until Search Update started adding information to the index. Once again, errors started popping up in the search logs.&lt;/p&gt;
&lt;p&gt;After reviewing the search node indexes, we determined that a new partition would reduce the index size of each node from 10GB (two partitions) to 6.6GB (three partitions). Repartitioning creates the new partition alongside the old one in the node, and our index grew to around 14.5GB. If Search were a cement truck, it would look something like this: &lt;a href="http://www.youtube.com/watch?v=LIPprUxFap8" target="_blank"&gt;Mythbusters Cement Truck Explosion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Search no longer accepted requests, snapshot queries were empty, and no job could read or write to the search index.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resolution:&lt;/strong&gt;&lt;br /&gt;
The only way out at this point was to purge all the nodes using cadmin -purge, delete all checkpoint history, partition information, and request information. Here are some detailed steps on how this was done:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Use this method if your Search Server will not start.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;1.) Stop all search servers (if any are still running).&lt;br /&gt;
2.) Delete the contents of the following folders (not the folders themselves):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;\alui\ptsearchserver\cluster\requests\&lt;br /&gt;
\alui\ptsearchserver\cluster\repartitions\&lt;br /&gt;
\alui\ptsearchserver\cluster\checkpoints\&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;3.) For each search server in the cluster, perform the following:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;a. Go into the index folder of the node. For example, \alui\ptsearchserver\6.1\&amp;lt;nodename&amp;gt;\index.&lt;br /&gt;
b. The index folder will contain a folder named &amp;#8220;1&amp;#8243;. Open this folder and delete all its contents.&lt;br /&gt;
c. The index folder may also contain a folder named &amp;#8220;2&amp;#8243;. If this is the case, delete the 2 folder.&lt;br /&gt;
d. The index folder should contain a file named &amp;#8220;ready.&amp;#8221; Open it in a text editor and make sure it contains just the number 1. This &amp;#8220;ready&amp;#8221; file tells the node to look within the 1 folder for its content.&lt;br /&gt;
e. Open a command prompt &lt;span style="text-decoration: underline"&gt;within&lt;/span&gt; the 1 folder.&lt;br /&gt;
f. Run the following commands. The first command should create about 8 files. The second command should create about 7 files:&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;i. ..\..\..\bin\native\emptyarchive lexicon archive&lt;br /&gt;
ii. ..\..\..\bin\native\emptyarchive spell spell&lt;/p&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;We then repartitioned using the cluster.nodes file under cluster_home and the cadmin -repartition command. This created three empty partitions where a Search Repair could be performed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Myth Confirmed:&lt;/strong&gt;&lt;br /&gt;
Each search node can contain up to 10GB of index data for 32-bit operating systems. In fact, each search node should not exceed around 7GB-7.5GB so you have enough space to repartition the index without failure.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img class="aligncenter" src="https://smartmall.net-smart.net/challengemath/pic/mythbusters.jpg" alt="Mythbusters" width="320" height="398" /&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;For those of you who like explosions, see the full &lt;a href="http://www.youtube.com/watch?v=ynZxVErTovg&amp;amp;feature=related" target="_blank"&gt;Mythbusters Cement Truck explosion &lt;/a&gt;here.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/jKs2_DXCFbQ" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/08/search-index-exceeds-10gb-logical-limit-kaboom/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/08/search-index-exceeds-10gb-logical-limit-kaboom/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/08/search-index-exceeds-10gb-logical-limit-kaboom/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jeremy</name>
					</author>
		<title type="html"><![CDATA[PSA: Avoiding Catastrophic Failure]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/me0veCJd10o/" />
		<id>http://www.function1.com/?p=968</id>
		<updated>2010-06-25T15:20:23Z</updated>
		<published>2010-06-25T15:00:21Z</published>
		<category scheme="http://www.function1.com" term="General" /><category scheme="http://www.function1.com" term="backup" /><category scheme="http://www.function1.com" term="cloud computing" /><category scheme="http://www.function1.com" term="Online backup" /><category scheme="http://www.function1.com" term="prey" /><category scheme="http://www.function1.com" term="recovery" /><category scheme="http://www.function1.com" term="stolen laptop" /><category scheme="http://www.function1.com" term="sugarsync" />		<summary type="html"><![CDATA[The back story I recently had the misfortune of being the victim of theft. As a frequent traveller, I keep many of my most important items (technology, travel documents, iPhone charger, breath mints) close at hand in a single bag. At a moments notice I can be out the door and on a plane to help [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/06/psa-avoiding-catastrophic-failure/">&lt;p&gt;&lt;strong&gt;The back story&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I recently had the misfortune of being the victim of theft. As a frequent traveller, I keep many of my most important items (technology, travel documents, iPhone charger, breath mints) close at hand in a single bag. At a moments notice I can be out the door and on a plane to help my favorite portal customer. This particular theft reminded me that no matter how much I back up important documents, it doesn&amp;#8217;t stop someone from stealing the physical backup media.&lt;/p&gt;
&lt;p&gt;Years of experience (i.e. viruses, windows crashes, drive failures, drink spilling, and fumbles) have taught me to always backup. I carry an external harddrive along with my laptop that has a backup of my most important personal and professional documents. For the critical items, I also have a solid state media (flash drive) just to be sure. To make travel easier, I usually have said backup devices parked right alongside my laptop for easy access.&lt;/p&gt;
&lt;p&gt;GASP!!! You could hear a pin-drop when I realized someone had decided my bag was much better looking in his/her possession. My immediate disgust wasn&amp;#8217;t because of the $2,000+ worth of electronics I would have to replace, but the information on those devices. Countless hours of design, development, and documentation work were suddenly gone.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-968"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A Public Service Announcement from your friendly Function1 Consultants&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As good netizens, we decided to offer some alternative solutions to this problem in the hopes that our beloved clients don&amp;#8217;t have to feel the sting of regret.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://preyproject.com/"&gt;&lt;img class="alignnone" src="http://preyproject.com/i/icon-map.png" alt="X marks the spot to find your laptop" width="75" height="72" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Prey: They can run but they can&amp;#8217;t hide&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I was amazed by how little the police could do to retrieve my laptop and web stats like &amp;#8220;&lt;a href="http://news.cnet.com/Getting-over-laptop-loss/2100-1044_3-6089921.html" target="_blank"&gt;97% of stolen laptops are never recovered&lt;/a&gt;&amp;#8221; doesn&amp;#8217;t make me feel any better. Prey is an open source initiative that installs a small application on your laptop. You activate the application via a web interface if your laptop happens to go missing. Once activated, Prey will send you screenshots, IP information, and (if you have a webcam) a picture of the user. If the laptop has wifi in use, Prey will also try to geo-locate your laptop by triangulating wifi access points. Best of all, its FREE!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://preyproject.com/"&gt;http://preyproject.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;&lt;a href="http://www.sugarsync.om"&gt;&lt;img class="alignnone" src="http://www.mactricksandtips.com/wp-content/uploads/2008/07/sugarsync.png" alt="Sugarsync Logo" width="71" height="67" /&gt;&lt;/a&gt;&lt;br /&gt;
Backup: You can&amp;#8217;t steal the Internet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As high-speed internet and cloud computing have grown, online backup has become a realistic solution for joe consumer (i.e. me). I found a ton of information on solutions to online backup, but as a tech geek I wanted the coolest of the cool (and cheap too).&lt;/p&gt;
&lt;p&gt;It took me a while to find an online backup solution that could meet all my needs as a tech-geek, gadgeteer, and professional IT type. I wanted sync tools, &amp;#8220;set-and-forget&amp;#8221;, lots of gigabytes, and maybe a cool iPhone app. Sugar sync covers virtually all of the features I could cook up in a backup solution, then throws in some neat utilities. The interface is extremely straight forward and I was up and running within a couple of minutes. Compared to other backup solutions, sugarsync wasn&amp;#8217;t the lowest price per gb; but it has by far the most features.&lt;/p&gt;
&lt;p&gt;Pro&amp;#8217;s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose any folder on your PC to sync with the &amp;#8220;cloud&amp;#8221;&lt;/li&gt;
&lt;li&gt;Sync the same files with up to 5 different computers.&lt;/li&gt;
&lt;li&gt;Real-time sync when you&amp;#8217;re online&lt;/li&gt;
&lt;li&gt;Version history&lt;/li&gt;
&lt;li&gt;File resume, so you don&amp;#8217;t have to wait for a sync to finish before powering down.&lt;/li&gt;
&lt;li&gt;Online edit mode lets you edit from your personal sugarsync website&lt;/li&gt;
&lt;li&gt;iPhone app gives you access to your files anywhere&lt;/li&gt;
&lt;li&gt;256bit encryption&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con&amp;#8217;s&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Not the cheapest per gigabyte of storage. Microsoft Skydrive at $0 for 25gb was the largest free storage solution. Carbonite was a close second at around $55 for unlimited space.&lt;/li&gt;
&lt;li&gt;Cannot sync with a local external harddrive. I was hoping I could sync my files with the &amp;#8220;cloud&amp;#8221; and also update a local copy for backup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.sugarsync.com"&gt;http://www.sugarsync.com&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(I also checked out &lt;a href="http://windowslive.com/online/skydrive" target="_blank"&gt;Microsoft Skydrive&lt;/a&gt;, &lt;a href="http://www.dropbox.com/" target="_blank"&gt;Dropbox&lt;/a&gt;,  &lt;a href="http://www.mozy.com" target="_blank"&gt;Mozy&lt;/a&gt;, &lt;a href="http://www.box.net/" target="_blank"&gt;Box.Net&lt;/a&gt;, and &lt;a href="http://www.carbonite.com/" target="_blank"&gt;Carbonite&lt;/a&gt; before deciding where to drop my $$$. Each had its short-comings and benefits.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are a lot of things I WISH I had done, so I hope my experience prompts our clients to keep all that hard work and sensitive information within reach no matter the circumstances.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://www.themoreyouknow.com/"&gt;&lt;img class="alignnone" src="http://1.bp.blogspot.com/_nA8t7ZFEOBI/SqegLkrJ8fI/AAAAAAAAAlI/9pgec-KDITU/s400/MoreYouKnow.jpg" alt="The More You Know" width="320" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/me0veCJd10o" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/06/psa-avoiding-catastrophic-failure/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/06/psa-avoiding-catastrophic-failure/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/06/psa-avoiding-catastrophic-failure/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Brian Hak</name>
					</author>
		<title type="html"><![CDATA[Meta-Post #1:  A Blog Post About Blog Posts]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/wwpszr6jJ1k/" />
		<id>http://www.function1.com/?p=950</id>
		<updated>2010-05-01T14:55:27Z</updated>
		<published>2010-05-01T14:52:42Z</published>
		<category scheme="http://www.function1.com" term="Function1" />		<summary type="html"><![CDATA[I&#8217;m randomly up early on a Saturday morning and decided to use the time to put out this week&#8217;s belated blog post.  There are a bunch of things I probably should be writing about (including the WCI-&#62;Sharepoint migration tool we&#8217;re building&#8230;look for more info soon), but it&#8217;s before 8 AM on a Saturday, and I&#8217;m [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/05/meta-post-1-a-blog-post-about-blog-posts/">&lt;p&gt;I&amp;#8217;m randomly up early on a Saturday morning and decided to use the time to put out this week&amp;#8217;s belated blog post.  There are a bunch of things I probably &lt;em&gt;should&lt;/em&gt; be writing about (including the WCI-&amp;gt;Sharepoint migration tool we&amp;#8217;re building&amp;#8230;look for more info soon), but it&amp;#8217;s before 8 AM on a Saturday, and I&amp;#8217;m just not up for writing about technology.  So instead, you get this: a blog post about our blog posts.&lt;/p&gt;
&lt;p&gt;One of the reasons I left BEA was because I was tired of the big-company atmosphere.  Tired of the bureaucracy, of just being a number, of the corporate politics, and all the cons that come along with the positives of working for a large organization.  All in all, I felt like being at BEA was just kind of blah.  There wasn&amp;#8217;t any corporate culture, and I didn&amp;#8217;t identify with the company.  Maybe these things aren&amp;#8217;t that important, but I think they are.  And it&amp;#8217;s something we&amp;#8217;re cognizant of at Function1: corporate culture and identity matter.  It&amp;#8217;s an interesting challenge to build a consulting company in which employees feel part of a bigger whole, and not just off by themselves in Anytown, USA billing hours.  Likewise, deciding how you present your company to the outside world is an intriguing question to ponder.  How do you differentiate yourself from the approximately 1.27 gazillion other nameless consulting companies out there?  How do you want customers, partners, potential hires, and the general public to perceive your company?  Hard questions to answer, but my gut tells me that the best answer is to present your company honestly, as you are.&lt;/p&gt;
&lt;p&gt;Which brings us to the crux of today&amp;#8217;s post.  There&amp;#8217;s been a long-standing on again/off again discussion amongst our circle of professional friends about the style and tone of the Function1 blog.  Some people like it, and some people think it&amp;#8217;s not professional enough.  My take is this: other than our people,  this blog is the most consistent public-facing component of Function1.  And it&amp;#8217;s an honest reflection of who we are.  We&amp;#8217;re a small company that&amp;#8217;s damn good at what we do, and we have fun doing it.  We work hard for our customers and ourselves, but we don&amp;#8217;t take ourselves so seriously that we can&amp;#8217;t have a good time.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-950"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="505" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="src" value="http://www.youtube.com/v/mV1LWhNpTJU&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;embed type="application/x-shockwave-flash" width="640" height="505" src="http://www.youtube.com/v/mV1LWhNpTJU&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Look, in the grand scheme of things, I don&amp;#8217;t know if it&amp;#8217;s right or wrong that we have mustache growing contests and embed random videos in our corporate blog, but it sure seems better than being just another faceless consulting company.  That said, I&amp;#8217;ve been wrong in the past, so what do you think?  Handy poll included below for your convenience, but we also welcome comments with thoughts, feedback, and constructive criticism.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;script type='text/javascript' language='javascript' charset='utf-8' src='http://s3.polldaddy.com/p/3137064.js'&gt;&lt;/script&gt;&lt;noscript&gt; &lt;a href='http://answers.polldaddy.com/poll/3137064/'&gt;View Poll&lt;/a&gt;&lt;/noscript&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/wwpszr6jJ1k" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/05/meta-post-1-a-blog-post-about-blog-posts/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/05/meta-post-1-a-blog-post-about-blog-posts/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/05/meta-post-1-a-blog-post-about-blog-posts/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Allan</name>
					</author>
		<title type="html"><![CDATA[A Webcenter Interaction 10gR3 install and an Oracle 11g Database walk into a bar]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/mRVLWFvlD0Y/" />
		<id>http://www.function1.com/?p=936</id>
		<updated>2010-04-23T19:42:51Z</updated>
		<published>2010-04-23T19:42:51Z</published>
		<category scheme="http://www.function1.com" term="Portal" /><category scheme="http://www.function1.com" term="wci" />		<summary type="html"><![CDATA[Error accessing database! Check your config files and verify that your database is correctly scripted. It&#8217;s 2 AM, and these are not exactly the calm and soothing words you want to be seeing from PTSpy after a clean, fresh  install of your WCI portal. It is frustrating, it is alarming, and above all else, did [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/04/a-webcenter-interaction-10gr3-install-and-an-oracle-11g-database-walk-into-a-bar/">&lt;blockquote&gt;&lt;p&gt;Error accessing database! Check your config files and verify that your database is correctly scripted.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It&amp;#8217;s 2 AM, and these are not exactly the calm and soothing words you want to be seeing from PTSpy after a clean, fresh  install of your WCI portal. It is frustrating, it is alarming, and above all else, did I mention it is 2 AM?  The prospect of re-scripting a database by hand is just ever so slightly upsetting.  So we look at little deeper at the Spy log:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Exception in thread &amp;#8220;Main Thread&amp;#8221; com.plumtree.openkernel.exceptions.OKSQLException: Error in function PTSession.Connect (iUserID == 2, SecurityProviderInfo == null): Error in function PTSessionInfo.GetCurrentCommunityMembership (): Exception: [plumtree][Oracle JDBC Driver][Oracle]ORA-00979: not a GROUP BY expression&lt;br /&gt;
SQL: &amp;#8216;/* USER_COMMUNITY_MEMBERSHIPS:ANSI */ SELECT MAX(CS.ACCESSLEVEL) AS ACCESSLEVEL, C.NAME, C.ISLOCALIZED, C.OBJECTID, MC2.MEMBERSHIPTYPE FROM PTCOMMUNITIES C, PTCOMMSECURITY CS, PTVGROUPMEMBERSHIP GM, (SELECT MAX(MC.MEMBERSHIPTYPE) AS MEMBERSHIPTYPE, MC.COMMUNITYID FROM PTMYCOMMUNITIES MC, PTVGROUPMEMBERSHIP GM WHERE GM.GROUPID=MC.GROUPID AND GM.USERID=? GROUP BY MC.COMMUNITYID) MC2 WHERE GM.GROUPID=CS.GROUPID AND GM.USERID=? AND C.OBJECTID=CS.OBJECTID AND C.OBJECTID=MC2.COMMUNITYID GROUP BY C.NAME, C.ISLOCALIZED, C.OBJECTID, MC2.MEMBERSHIPTYPE ORDER BY LOWER(C.NAME) ASC&amp;#8217;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Red Herring Alert:&lt;/em&gt; We wasted an hour and a half monkeying around with the Database SQL scripts and looking for an error there based on the PTSpy message above.  That&amp;#8217;s an hour and a half we&amp;#8217;ll never get back.&lt;/p&gt;
&lt;p&gt;Luckily, you will not have to go through this pain!&lt;/p&gt;
&lt;p&gt;As it turns out, the real problem isn&amp;#8217;t a mis-scripted database, but a compatibility problem between WCI 10gR3 and some Oracle 11g database default settings.&lt;/p&gt;
&lt;p&gt;The fix is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;To start let&amp;#8217;s make a back up of our sensitive files just in case things go wrong (just copy them out to somewhere safe):&lt;br /&gt;
oracle\product\11.1.0\db_1\dbs\init.ora&lt;br /&gt;
oracle\product\11.1.0\db_1\database\iinitPLUM10.ora&lt;/li&gt;
&lt;li&gt;Open sqlplus and connect as sysdba&lt;/li&gt;
&lt;li&gt;SQL &amp;gt; alter system set &amp;#8220;_optimizer_group_by_placement&amp;#8221;=FALSE scope=spfile;&lt;/li&gt;
&lt;li&gt;Stop the Oracle service corresponding to your database SID, it will be called OracleService&amp;lt;YOUR_SID&amp;gt;&lt;/li&gt;
&lt;li&gt;Modify the file initPLUM10.ora and change ‘compatible = 10.2.0.0.0’ to ‘compatible = 11.0.0’&lt;/li&gt;
&lt;li&gt;Start OracleService&amp;lt;YOUR_SID&amp;gt;&lt;/li&gt;
&lt;li&gt;Reset IIS (use inetmgr to handle this using a pretty interface or open a command prompt and type: iisreset)&lt;/li&gt;
&lt;li&gt;Clear your browser cache&lt;/li&gt;
&lt;li&gt;Visit your portal home page.&lt;span id="more-936"&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For what it&amp;#8217;s worth, the fix actually is documented somewhat by Oracle in the Release Notes for 10gR3 in the following statement:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;* Note: When running WCI with Oracle 11g with the provided initPLUM10.ora file, make the following modification: Change compatible = 10.2.0.0.0 to compatible = 11.0.0. Also, to prevent problems with &amp;#8220;group by&amp;#8221; optimizations when using WCI with Oracle 11g you must add the following configuration to the bottom of your init$ORACLE_SID.ora file: _optimizer_group_by_placement=false.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The issue here, of course, is that if you did not read this single line addendum a little ways down in the release notes and instead you danced ahead in your portal install process the resulting error has nothing in the logs or the trace that would indicate that this is your issue.&lt;/p&gt;
&lt;p&gt;Hopefully though, you are here now and have what you need to continue on. And this one author who will be paying just a little more attention to reviewing software release notes in the future, if for no other reason than to be able to go home before the birds start chirping again in the morning.&lt;/p&gt;
&lt;p&gt;So here you are, you have just finished your install of Oracle WebCenter Interaction, 10g Release 3.&lt;/p&gt;
&lt;p&gt;On top of that, you even opted to run the latest version of the shiny new database that Oracle has to offer, Oracle Database 11g.&lt;/p&gt;
&lt;p&gt;And like a real man would &amp;#8211; you read the instructions all along the way (&lt;a href="http://download.oracle.com/docs/cd/E13158_01/alui/wci/docs103/map_wci_win_installguide_10-3"&gt;Oracle WCI 10gR3 installation guide&lt;/a&gt;, &lt;a href="http://download.oracle.com/docs/cd/E13158_01/alui/wci/docs103/relnotes/Release_Notes_Oracle_WebCenter_Interaction_v10-3-0.htm"&gt;WCI 10gR3 Release Notes&lt;/a&gt;), meticulously &amp;#8230; at least for Oracle products.&lt;/p&gt;
&lt;div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 436px; width: 1px; height: 1px;"&gt;
&lt;ol&gt;
&lt;li&gt;C:\applications\oracle\product\11.1.0\db_1\database\iinitPLUM10.ora&lt;/li&gt;
&lt;li&gt;C:\applications\oracle\product\11.1.0\db_1\dbs\init.ora&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/mRVLWFvlD0Y" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/04/a-webcenter-interaction-10gr3-install-and-an-oracle-11g-database-walk-into-a-bar/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/04/a-webcenter-interaction-10gr3-install-and-an-oracle-11g-database-walk-into-a-bar/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/04/a-webcenter-interaction-10gr3-install-and-an-oracle-11g-database-walk-into-a-bar/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Brian Hak</name>
					</author>
		<title type="html"><![CDATA[Function1 Welcomes Spheric to the Team]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/MDLy7S9ATdQ/" />
		<id>http://www.function1.com/?p=926</id>
		<updated>2010-04-15T22:21:29Z</updated>
		<published>2010-04-15T22:21:29Z</published>
		<category scheme="http://www.function1.com" term="Function1" /><category scheme="http://www.function1.com" term="General" />		<summary type="html"><![CDATA[Howdy all. This post is a bit late in coming, but exciting for me to share none-the-less. Function1 is pleased to announce its acquisition of Spheric Technologies. I could blabber on about what this means to us, our customers, and our loyal blog readers, but I&#8217;ll spare you all the pages of dialog and just [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/04/function1-welcomes-spheric-to-the-team/">&lt;p&gt;Howdy all.  This post is a bit late in coming, but exciting for me to share none-the-less.  Function1 is pleased to announce its acquisition of Spheric Technologies.  I could blabber on about what this means to us, our customers, and our loyal blog readers, but I&amp;#8217;ll spare you all the pages of dialog and just give you a link to the &lt;a href="http://news.yahoo.com/s/prweb/20100402/bs_prweb/prweb3816434_1" target="_blank"&gt;press release&lt;/a&gt; (our first, so you know it&amp;#8217;s a big deal) and copy/paste the announcement that&amp;#8217;s live elsewhere on our site.   To our our friends from Spheric&amp;#8230;.aloha, we&amp;#8217;re happy to have you on board.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/04/spheric.png"&gt;&lt;img class="aligncenter size-full wp-image-927" title="spheric" src="http://www.function1.com/wp-content/uploads/2010/04/spheric.png" alt="" width="297" height="117" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please join us in welcoming Spheric to the Function1 family. This acquisition increases the value we deliver to customers and partners by leveraging the combined experience and expertise of both the Spheric and Function1 teams.  We know many of you are wondering what this means, so please read on for more information.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-926"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0094d8;"&gt;Who is Function1?&lt;/span&gt;&lt;br /&gt;
&lt;/strong&gt; Function1 is a premier solutions provider that takes a customer-centric approach towards developing usable, functional, and scalable solutions for enterprise customers. In addition to providing Oracle WebCenter professional services, Function1 offers packaged enterprise software, remote support, and hosting solutions to customers across the public and private sectors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0094d8;"&gt;What does this mean for Spheric customers?&lt;/span&gt;&lt;br /&gt;
&lt;/strong&gt; Current Spheric customers now have a bigger support system to lean on for help with their WebCenter deployments and development projects. Here at Function1, we have a great group of consultants and developers that together with the Spheric team will help you get the most value out of your portal investment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0094d8;"&gt;What does this mean for current Function1 customers?&lt;/span&gt;&lt;br /&gt;
&lt;/strong&gt;Current Function1 customers should look forward to new products and services that come from the combined team. We also have new service offerings and products related to Oracle&amp;#8217;s Webcenter 11g release coming your way.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re thrilled to have Spheric as a part of the Function1 team.  Keep up on the latest at Function1 by visiting our &lt;a href="http://www.function1.com/blog"&gt;blog&lt;/a&gt; and following us on &lt;a href="http://www.twitter.com/function1corp"&gt;Twitter&lt;/a&gt;. Please contact us at info@function1.com with any questions &amp;#8211; we look forward to hearing from you.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/MDLy7S9ATdQ" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/04/function1-welcomes-spheric-to-the-team/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/04/function1-welcomes-spheric-to-the-team/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/04/function1-welcomes-spheric-to-the-team/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Brian Hak</name>
					</author>
		<title type="html"><![CDATA[On Music and Using WCI as a Corporate Communication Tool]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/PNqeqKciV0c/" />
		<id>http://www.function1.com/?p=763</id>
		<updated>2010-04-09T00:05:14Z</updated>
		<published>2010-04-09T00:05:14Z</published>
		<category scheme="http://www.function1.com" term="Portal" /><category scheme="http://www.function1.com" term="corporate communication" /><category scheme="http://www.function1.com" term="Java" /><category scheme="http://www.function1.com" term="Javascript" />		<summary type="html"><![CDATA[Since the age of 12 or so, I&#8217;ve had an on-going love affair with music. You know that scene in Almost Famous where William is going through the record collection his sister left him and is just blown away by the realization that all this music exists? Yeah, I had one of those moments, except [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/04/on-music-and-using-wci-as-a-corporate-communication-tool/">&lt;p&gt;Since the age of 12 or so, I&amp;#8217;ve had an on-going love affair with music.  You know that scene in &lt;a href="http://en.wikipedia.org/wiki/Almost_Famous" target="_blank"&gt;Almost Famous&lt;/a&gt; where William is going through the record collection his sister left him and is just blown away by the realization that all this music exists?&lt;/p&gt;
&lt;p&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="src" value="http://www.youtube.com/v/BQ7GYmQgzqg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/BQ7GYmQgzqg&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Yeah, I had one of those moments, except it was with my parents&amp;#8217; record collection, and the hippest LP they had was &lt;a href="http://www.amazon.com/Bob-Dylans-Greatest-Hits-Vol/dp/B00000J7SN" target="_blank"&gt;Bob Dylan&amp;#8217;s Greatest Hits Vol. II&lt;/a&gt;.  Still and all, I can remember exactly the time lying on my bed flipping through an &lt;a href="http://en.wikipedia.org/wiki/Uncanny_X-Men" target="_blank"&gt;Uncanny X-men&lt;/a&gt;, and listening to Bob Dylan&amp;#8217;s scratchy voice on scratchy old vinyl: the windows were open, it was spring.  Who knows, it&amp;#8217;s entirely possible that I&amp;#8217;m over-romanticizing the memory, but after that random afternoon, I was all about music.  I took up the piano and guitar, with varying degrees of success, and did my best to find new songs to put on mix tapes for friends.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-763"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;But that was all years ago.  It&amp;#8217;s rare that I play much music anymore, and when I do it usually involves breaking out the acoustic guitar much to the dismay of my wife and dog.  These days I mostly stick to listening as often as practical and acting mildly condescending whenever the topic of music comes up with someone who isn&amp;#8217;t &amp;#8220;into it&amp;#8221;.  I do still look for new music and share it with friends though.  It&amp;#8217;s just that now I post links on Facebook instead of making a mix tape (which is a shame, making quality mix tapes is a lost art).  In any case, as I was telling Facebook friends about the awesomeness that is the Clash&amp;#8217;s cover of &amp;#8220;Police and Thieves&amp;#8221; the other day, I got to thinking about the power of one-to-many broadcast messaging systems, and how you can use your portal to broadcast corporate communications out to your staff.&lt;/p&gt;
&lt;p&gt;&lt;a class="wpaudio" href="http://www.function1.com/wp-content/uploads/2010/04/13-Police-And-Thieves.mp3"&gt;The Clash &amp;#8211; Police And Thieves&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For instance, I was recently working with a client who needed everyone in their organization (14,000+ people) to sign-off on some compliance documents.  Getting 14,000 people to do anything is tough&amp;#8230;so how would you approach the problem?  If you&amp;#8217;re like most people, you probably start by sending out an e-mail to all-employees@mycompany.com and ask them to fill out some PDF document, digitally sign it, and then return via e-mail.  Shortly after hitting &amp;#8220;send&amp;#8221;, when 300 or so digitally signed PDFs hit your inbox, and you&amp;#8217;re getting dangerously close to your mail quota, you likely get to thinking&amp;#8230;&amp;#8221;hmm&amp;#8230;.how am I going to track compliance, do I really want to manage this through e-mail and a big ol&amp;#8217; spreadsheet?&amp;#8221;  Then, after some more time passes, you realize that you really aren&amp;#8217;t getting the response you&amp;#8217;d hoped for, and that 70%+ of the workforce appears to have completely ignored your e-mail.&lt;/p&gt;
&lt;p&gt;Time for plan B.&lt;/p&gt;
&lt;p&gt;Enter your trusty intranet portal.  Let&amp;#8217;s assume that you have a relatively mature portal deployment that&amp;#8217;s widely adopted as an employee intranet.  The customer I was working with in this case, for instance, sets their portal as the default homepage for all employee browsers.  As such, we know that the portal homepage gets very heavy traffic.  Why not leverage all the eyes that are on that homepage to broadcast an important piece of corporate communication?  And while we&amp;#8217;re at it, why not just build a simple portlet that lets folks upload their signed documents, and enables management to run compliance reports?  Sounds like a recipe for a pretty good portal use case.  Let&amp;#8217;s break down the components of the solution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A reminder to non-compliant users that they need to upload a digitally signed document&lt;/li&gt;
&lt;li&gt;A tool that allows users to upload completed documents&lt;/li&gt;
&lt;li&gt;A tool that allows management to run compliance reports&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post, I&amp;#8217;m just going to dig into the details of implementing a user reminder, because it&amp;#8217;s most relevant to the topic of using the Portal as a corporate communications tool.  Before we get wrapped up in actual implementation details though, let&amp;#8217;s take a minute to consider why the portal is a particularly well-suited solution to this problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We have a destination that most/all employees visit regularly, so we know our message will get in front of the target audience&lt;/li&gt;
&lt;li&gt;If we wanted to, we could target our message as specific groups of users (only HR employees, or just the Sales Team, for example)&lt;/li&gt;
&lt;li&gt;By using portlet preferences, we can make sure a reminder is only displayed to employees who have not complied with our message&lt;/li&gt;
&lt;li&gt;Users are authenticated into the portal.  This makes it easy for us to:
&lt;ul&gt;
&lt;li&gt;Associate uploaded files with a particular employee&lt;/li&gt;
&lt;li&gt;Know who has viewed our message and did not comply with the request&lt;/li&gt;
&lt;li&gt;Know who has viewed our message and did comply with the request&lt;/li&gt;
&lt;li&gt;Know how many times users view the message on average before they comply&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Okey Dokey, now we know what we need to build, and we&amp;#8217;ve convinced the people that need convincing that it makes sense to use the portal for the project, let&amp;#8217;s dive get down to the nitty gritty implementation details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementing A Reminder For Non-compliant Users&lt;/strong&gt;&lt;br /&gt;
Look, I hate pop-ups as much as the next guy, but they have their place. And using a pop-up to nag people who haven&amp;#8217;t acted on our company wide request seems fair enough.  So let&amp;#8217;s look at implementing a modal pop-up window on the portal homepage.  If you want to go all low-rent in your approach to the reminder, you could just add a little Javascript to your portal header like so and be done with it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div id="_mcePaste"&gt;&amp;lt;script type=&amp;#8221;text/javascript&amp;#8221;&amp;gt;&lt;/div&gt;
&lt;div id="_mcePaste" style="padding-left: 30px;"&gt;var redirect = confirm(&amp;#8220;Howdy.  You might need to sign a document and upload. Go do it now?&amp;#8221;);&lt;/div&gt;
&lt;div id="_mcePaste" style="padding-left: 30px;"&gt;if(redirect)&lt;/div&gt;
&lt;div id="_mcePaste" style="padding-left: 60px;"&gt;window.open(&amp;#8220;http://some.portal.url&amp;#8221;);&lt;/div&gt;
&lt;div id="_mcePaste"&gt;&amp;lt;/script&amp;gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;The result is something like this:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/04/js_popup.png"&gt;&lt;img class="aligncenter size-full wp-image-899" title="js_popup" src="http://www.function1.com/wp-content/uploads/2010/04/js_popup.png" alt="" width="366" height="144" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Not too pretty,  and doesn&amp;#8217;t give us a way to track who&amp;#8217;s seen our message and who hasn&amp;#8217;t.  And besides,  those old Javascript pop-ups are so 1998.  How about a more elegant approach that uses a Javascript library?  There are a ton of libraries you can use to do a modal screen overlay, pick your favorite.  Here at Function1, we like &lt;a href="http://extjs.com" target="_blank"&gt;extJs&lt;/a&gt;, so that&amp;#8217;s what I&amp;#8217;ll use for this example.  Basically, we just want a pretty screen overlay that displays our message to users.  Something like this:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/04/ext_popup2.png"&gt;&lt;img class="aligncenter size-full wp-image-901" title="ext_popup2" src="http://www.function1.com/wp-content/uploads/2010/04/ext_popup2.png" alt="" width="622" height="231" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Looking better, but we still don&amp;#8217;t have a way to track who&amp;#8217;s clicked through to comply with our message and who&amp;#8217;s ignoring our request.  And we can&amp;#8217;t yet figure out how to display our pop-up to just non-compliant users.  So how about if we wrap this pop-up in a portlet?  Then we can use portlet preferences to keep track of who&amp;#8217;s clicked through to comply, who&amp;#8217;s ignoring the message, and who&amp;#8217;s asked to be reminded later.  Logically, our portlet should work as follows when figuring out when to display the pop-up message:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/04/display_logic1.png"&gt;&lt;img class="aligncenter size-full wp-image-918" title="display_logic" src="http://www.function1.com/wp-content/uploads/2010/04/display_logic1.png" alt="" width="551" height="446" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;The trick now is to set a portlet preference based on how the user responds to our message.  Keep in mind that our pop-up is all Javascript driven (i.e. client-side logic), and we need to get back to the server in order to set a preference.  How do you figure we might accomplish such a feat?  With our friend AJAX of course.  ExtJS, and any other Javascript library worth it&amp;#8217;s salt, provides a nice wrapper around &lt;a href="http://en.wikipedia.org/wiki/XMLHttpRequest"&gt;XmlHttpRequest&lt;/a&gt; that makes it easy for us to do inline HTTP GETS/POSTS without having to refresh the entire portal page.  So what if we just make an AJAX post to a JSP that sets a portlet preference for us based on the users response to our message?  The logic would flow something like this:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/04/display_logic_cleaned.png"&gt;&lt;img class="aligncenter size-full wp-image-919" title="display_logic_cleaned" src="http://www.function1.com/wp-content/uploads/2010/04/display_logic_cleaned.png" alt="" width="650" height="514" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;OK, now we&amp;#8217;re getting somewhere.  We now have the mechanisms in place to:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Display a pretty pop-up for our message&lt;/li&gt;
&lt;li&gt;Log user response so management can report on it later&lt;/li&gt;
&lt;li&gt;Set a flag (via portlet preference) that determines when to display our pop-up&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The only thing left to do at this point is to include some logic in our portlet to check the portlet preference, and decide when to show the pop-up reminder. Here&amp;#8217;s a simplified version of the code that you might include in your portlet:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;%&lt;/p&gt;
&lt;p&gt;//Get a handle to the portlet context so we can check preferences&lt;/p&gt;
&lt;p&gt;IPortletContext portletContext = PortletContextFactory.createPortletContext(request, response);&lt;/p&gt;
&lt;p&gt;IPortletRequest portletRequest = portletContext.getRequest();&lt;/p&gt;
&lt;p&gt;IPortletResponse portletResponse = portletContext.getResponse();&lt;/p&gt;
&lt;p&gt;boolean showPopup = false;&lt;/p&gt;
&lt;p&gt;//read the preference and decide whether we should show pop-up or not&lt;/p&gt;
&lt;p&gt;String showPopupString = &lt;span style="white-space: pre;"&gt; &lt;/span&gt;portletRequest.getSettingValue(SettingType.Portlet, &amp;#8220;showPopup&amp;#8221;);&lt;/p&gt;
&lt;p&gt;if(showPopupString != null &amp;amp;&amp;amp; showPopupString.equalsIgnoreCase(&amp;#8220;true&amp;#8221;))&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;showPopup = true;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;if(showPopup)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;%&amp;gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&amp;lt;!&amp;#8211; Javascript code to show pop-up here &amp;#8211;&amp;gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&amp;lt;%&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;%&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And, viola, we&amp;#8217;re done!  According to WordPress, it only took me 1315 words to explain how and why you might want to use a pop-up in your portal.  Let me now try to summarize a bit more succinctly, in the form of a Haiku:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Portal has many eyes.&lt;/p&gt;
&lt;p&gt;Perfect for message broadcast,&lt;/p&gt;
&lt;p&gt;and compliance stats.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I know, I&amp;#8217;m a pretty good poet right?  I&amp;#8217;m embarrassed to tell you how long it took for me to be sure that &amp;#8220;compliance&amp;#8221; was a three syllable word, so I won&amp;#8217;t.  In any case, if you&amp;#8217;re interested in tinkering around with this example, first go download &lt;a href="http://www.extjs.com" target="_blank"&gt;extJS 3.2.0&lt;/a&gt; and then grab the portlet code &lt;a href="http://www.function1.com/wp-content/uploads/2010/04/popupPortlet.zip" target="_blank"&gt;here&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;popupPortlet.jsp &amp;#8211; This is your portlet that displays the pop-up message and contains display logic.  Set your WebService to point at this file.&lt;/li&gt;
&lt;li&gt;ignore.jsp &amp;#8211; This page just sets a portlet preference in response to an AJAX post&lt;/li&gt;
&lt;li&gt;later.jsp &amp;#8211; This page just sets a portlet preference in response to an AJAX post&lt;/li&gt;
&lt;li&gt;myApp.jsp &amp;#8211; This is a place-holder page that sets a portlet preference and would presumably contain the application you want users to step through.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that&amp;#8217;s just about a wrap.  One more thing though.  Remember that customer I told you about earlier who had to get 14,000+ employees to comply with a company wide request?  Well, they started out managing the request process via e-mail, and after many weeks of repeated e-mails, their compliance was at about 15% of the workforce.  After we implemented the portal pop-up reminder, compliance jumped to 60%+ within 4 days.  Not too shabby.&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;Bah, I can&amp;#8217;t resist putting up one more MP3 for you guys.  I&amp;#8217;ve never been a huge rap fan, but you can&amp;#8217;t deny good hip hop.  Enjoy this mash-up that let&amp;#8217;s me pretend to have some indie rock cred while blasting the song that made &lt;a href="http://en.wikipedia.org/wiki/The_Notorious_B.I.G." target="_blank"&gt;Biggie&lt;/a&gt; a household name:&lt;/p&gt;
&lt;p&gt;&lt;a class="wpaudio" href="http://www.function1.com/wp-content/uploads/2010/04/02-juicy-r-the-notorious-b.i.g.-vs.-the-xx.mp3"&gt;Notorious B.I.G vs. The XX &amp;#8211; Juicy&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/PNqeqKciV0c" height="1" width="1"/&gt;</content>
<link href="http://www.function1.com/wp-content/uploads/2010/04/13-Police-And-Thieves.mp3" rel="enclosure" length="10840602" type="audio/mpeg" />
<link href="http://www.function1.com/wp-content/uploads/2010/04/02-juicy-r-the-notorious-b.i.g.-vs.-the-xx.mp3" rel="enclosure" length="3967019" type="audio/mpeg" />
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/04/on-music-and-using-wci-as-a-corporate-communication-tool/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/04/on-music-and-using-wci-as-a-corporate-communication-tool/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/04/on-music-and-using-wci-as-a-corporate-communication-tool/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Sandeep Khaneja</name>
						<uri>http://www.function1.com</uri>
					</author>
		<title type="html"><![CDATA[Terms of Endearment &#8211; Part 1: Understanding High Availability]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/QOlC9OCzhfU/" />
		<id>http://www.function1.com/?p=870</id>
		<updated>2010-04-01T16:48:48Z</updated>
		<published>2010-04-01T16:48:48Z</published>
		<category scheme="http://www.function1.com" term="Uncategorized" /><category scheme="http://www.function1.com" term="high availability" /><category scheme="http://www.function1.com" term="redundancey" />		<summary type="html"><![CDATA[Hello Everybody&#8230;so this is my first post of a multi-part series of topics covering terms that are often misused or generally confusing. There are a number of topics I want to cover at a general 101 level before looking at each in more detail during a 202 series. So without further a dieu, those of [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/04/terms-of-endearment-part-1-understanding-high-availability/">&lt;div&gt;
&lt;p&gt;Hello Everybody&amp;#8230;so this is my first post of a multi-part series of topics covering terms that are often misused or generally confusing. There are a number of topics I want to cover at a general 101 level before looking at each in more detail during a 202 series.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;So without further a dieu, those of you that have had the pleasure of working with us may already know that for some reason people confuse Vasanth for me, and vice versa. While we are both awesome people, I assure you we are in fact different people with different parents that aren&amp;#8217;t even related to each other.  Never the less, some people may still expect me to respond if you call me by his name. Clearly this is some funky use of logic. Interestingly enough, that same logic seems prevalent with regard to technology terms. Say one word, mean another.  This post is about the difference between Redundant, and Highly Available.  Much like Vasanth and I, these terms are quite different from each other.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span id="more-870"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;First lets talk about &amp;#8220;redundancy&amp;#8221;.  Redundancy almost always refers to the hardware serving up your application and at times can extend to the infrastructure surrounding it. Redundancy is a term that is often used in explaining High Availability, but just because something is redundant does not mean that it is Highly Available. The definition of redundancy is a subset of the definition for High Availability.  In context, redundancy would imply that the physical hardware hosting your application includes multiple components of each type. An example of hardware redundancy for your average everyday web server would be 2 processors, 4 heat syncs, 8 system fans, 2 power inlets, 2 network cards, 2 hard drives, etc. Redundancy has applicability on various scales.  Power redundancy, for example, refers to both the power supply to your server as well as the supply to the rack that holds your server. Network redundancy refers to the switch your server is attached to as well as the network interface(s) on your server itself&amp;#8230;and so on. There are nearly a dozen other areas to discuss but I will save that deep drive for a future post.&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;So what does this have to do with High Availability and what does &amp;#8220;highly available&amp;#8221; mean? Simply put, an application that is highly available (a.k.a. HA) is one that is available to users 24 hours a day / 7 days a week with very little (if any) down time for maintenance. This implies that the hardware and infrastructure surrounding your application is redundant. That&amp;#8217;s the simple definition. In greater detail though, the term highly available means your application must be available for 90% to six nines. High Availability is usually measured as a percentage of up-time for a given system.  It is calculated throughout the year and marked at year end. Each organization can make the determination as to what is and is not an acceptable percentage of up-time. Six nines is the extreme of HA.  Six nines availability is exactly what it sounds like: 99.9999 % up-time.  That means 2.59 seconds of downtime per month or 31.5 seconds a year. There is however a bit of a grey zone around what qualifies as downtime. Downtime refers to a period where the application is unavailable to users. However planned downtime has a different weight than unplanned downtime.  Planned downtime is generally introduced to the environment for OS patches, software upgrades, and alike. Unplanned downtime is due to logical fault like an application crash, or physical fault like a damaged power supply.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;HA implementations can vary greatly depending on what type of application you are deploying and it&amp;#8217;s dependencies. Often people are mislead to believe that a system design like this has lots of servers, and extra network switches, and multiple firewalls, and all sorts of other crap &amp;#8230; but in reality an HA system is allot simpler than that. The larger the design the more complex it gets, because each component added introduces a new potential failure.  Some of the most highly available systems are simple. An example of a simple design would be a pair of single rack mount servers physically located in different locations each with redundant internal hardware such as mirrored drives, multiple NICs, multiple power supplies (all engaged), and two or more CPU&amp;#8217;s that are running processes independently. In a nutshell, that is HA for you and we&amp;#8217;re barely skimming the surface of this topic.  There are a number of other areas that are closely linked to this concept such as fault tolerance and reliability, but in an effort to keep this first post as the 101 to this series, I will go into more detail on that in some future blog post.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Okay, so now that we&amp;#8217;ve learned our terms, lets use it in a sentence: I know my applications are highly available because my up time is greater than 90%, my hardware is internally redundant, and it is physically located in separate locations.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;I hope you’ve found this post informative, see ya next time!&lt;/p&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/QOlC9OCzhfU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/04/terms-of-endearment-part-1-understanding-high-availability/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/04/terms-of-endearment-part-1-understanding-high-availability/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/04/terms-of-endearment-part-1-understanding-high-availability/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vasanth Manikumar</name>
					</author>
		<title type="html"><![CDATA[WCI Search Overload Syndrome]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/UAlPpmdddb4/" />
		<id>http://www.function1.com/?p=837</id>
		<updated>2010-03-26T16:32:19Z</updated>
		<published>2010-03-26T16:17:12Z</published>
		<category scheme="http://www.function1.com" term="Portal" /><category scheme="http://www.function1.com" term="Search Server" /><category scheme="http://www.function1.com" term="Banner Search" /><category scheme="http://www.function1.com" term="WCI Search" />		<summary type="html"><![CDATA[Recently, one of our customers asked us to help them improve the search experience for their 6.5 portal users, and before I could even think about the problem, the first thing that popped in my mind was this: This commercial is so telling of the search-overloaded world we live in, where we are constantly searching [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/03/wci-search-overload-syndrome/">&lt;p&gt;&lt;!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 		H1 { margin-bottom: 0.08in } 		H1.western { font-family: "Arial", sans-serif; font-size: 16pt } 		H1.cjk { font-family: "MS Mincho"; font-size: 16pt } 		H1.ctl { font-family: "Tahoma"; font-size: 16pt } --&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;
&lt;p&gt;Recently, one of our  customers  asked us to help them improve the search experience for their 6.5 portal users, and before I could even think about the problem, the first thing that popped in my mind was this:&lt;/p&gt;
&lt;p&gt;&lt;object width="500" height="306"&gt;&lt;param name="movie" value="http://www.youtube.com/v/i1AwFY6MuwE&amp;#038;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed  src="http://www.youtube.com/v/i1AwFY6MuwE&amp;#038;fs=1" type="application/x-shockwave-flash" width="500" height="306" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id="more-837"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This commercial is so telling of the search-overloaded world we live in, where we are constantly searching for information since the results are so handy.  On some days, I even feel like &lt;a href="http://www.theatlantic.com/magazine/archive/2008/07/is-google-making-us-stupid/6868/"&gt;Nicolas Carr&lt;/a&gt; and want to throw out my laptop!  Well &amp;#8230; may be after a few more searches.&lt;/p&gt;
&lt;p&gt;After &amp;#8220;researching&amp;#8221; this syndrome on the internet, I came back to focus on this customer&amp;#8217;s issue.  In general, their portal users were finding that relevant content was &lt;span style="text-decoration: underline;"&gt;not&lt;/span&gt; showing up at all or was showing up further down in the list of search results than expected.   While most of the issues were solved by repairing the search index and tuning other search features, there was still one quirky search scenario which was still returning unexpected results to their users when they performed a multi-word  search.&lt;/p&gt;
&lt;p&gt;For instance, if a portal user searched for &amp;#8216;Lincoln Abraham&amp;#8217; instead of  &amp;#8216;Abraham Lincoln&amp;#8217;, the search results returned something like this:&lt;/p&gt;
&lt;p&gt;1.      Biography of Lincoln, Abraham&lt;br /&gt;
2.     16th President:  Lincoln, Abraham&lt;br /&gt;
&amp;#8230;&lt;br /&gt;
12.   Abraham Lincoln&lt;/p&gt;
&lt;p&gt;Most users of Google and other search engines would expect result #12 to show up first.  In WCI, we could set a best bet to force #12 to show up first in the search results, but there were too many cases like this for this customer.  The answer to this problem lies in the algorithm used by the portal for the default search mode.  I recalled that I had come across this algorithm in a document some years ago but couldn&amp;#8217;t remember where.  Ironically, it could not be found by searching the internet, but on my backup drive.  It was actually in the Search Server section of the good ole Plumtree 4.5WS Deployment Guide, which I have no idea why I still  have saved but just thankful I did.  I&amp;#8217;m not sure if or where this is in the current documentation, but I&amp;#8217;ll save you some trouble by providing the section here: &lt;a href="http://www.function1.com/wp-content/uploads/2010/03/SearchEngine.pdf"&gt;Plumtree Search Engine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before I jump into showing how to fix the problem, let&amp;#8217;s quickly review the seemingly simple search functionality of the portal.   I&amp;#8217;m sure you&amp;#8217;re saying: &amp;#8220;What&amp;#8217;s there to review? &amp;#8230; I know how to search &amp;#8230;  I just type in some search terms  and click the search button&amp;#8221;.   While that&amp;#8217;s true, and that&amp;#8217;s what most of your portal users are doing, there are more options available there to narrow the search results, which are definitely useful!&lt;/p&gt;
&lt;p&gt;Including the default mode that most users use, the portal search actually supports the following 3 modes for queries:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; Mode &amp;#8211; list of strings without any reserved characters/words from the other 2 modes listed below.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internet&lt;/strong&gt; Mode – using include and exclude 	operators noted with &lt;strong&gt;&amp;#8216;+&amp;#8217; &lt;/strong&gt;and &lt;strong&gt;&amp;#8216;-&amp;#8217; &lt;/strong&gt; operators.  The &amp;#8216;+&amp;#8217; 	operator requires that word in the search result, and the &amp;#8216;-&amp;#8217; 	operator returns results without the corresponding term.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query Operator&lt;/strong&gt; Mode – uses a set of reserved 	search keywords to create complex query combinations.  Here&amp;#8217;s a 	list of the reserved words :
&lt;ul&gt;
&lt;li&gt;AND , OR, NOT&lt;/li&gt;
&lt;li&gt;NEAR , NEAR/ &amp;#8211; use to find words that are near each other in a phrase. Default proximity is 25 words, but NEAR/10 can be used to check 10 words apart instead&lt;/li&gt;
&lt;li&gt;&amp;lt;ORDER&amp;gt; -&lt;/li&gt;
&lt;li&gt;&amp;lt;WORD&amp;gt; -  find exact match on word with case-sensitivity&lt;/li&gt;
&lt;li&gt;&amp;lt;ALL&amp;gt;, &amp;lt;ANY&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the search server gets a query string which contains a reserved term for the latter 2 modes, then it uses that corresponding mode automatically to conduct the search.  Otherwise, &lt;strong&gt;if there&amp;#8217;s no reserved word, then it uses the default mode.&lt;/strong&gt; All modes support the use of wildcard character (*) and the use of double quotes for phrase-search  (i.e., &amp;#8220;President Abraham Lincoln&amp;#8221;).  Now that we&amp;#8217;ve covered the query operator mode, it&amp;#8217;ll make it easier to understand the algorithm for the default mode.  To illustrate the algorithm for this default mode, we&amp;#8217;ll use the same example as before.   When the user searched for “Lincoln Abraham”, the search server interprets this as a default mode query since there are no operators in the query string.  Here&amp;#8217;s the actual 3-part algorithm that the search server uses to perform the default-mode query:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/03/default_search_alg2.png"&gt;&lt;img class="aligncenter size-full wp-image-847" title="default_search_alg" src="http://www.function1.com/wp-content/uploads/2010/03/default_search_alg2.png" alt="" width="614" height="75" /&gt;&lt;/a&gt; NOTE:  The first part of the query ranks higher, so the results for part 1 will show up in the search results before the results for part 2.&lt;/p&gt;
&lt;p&gt;So, in other words, &lt;strong&gt;the default search mode is just a fixed query operator mode  search under the covers&lt;/strong&gt;.  With this revelation about the default search behavior, the question  still lingers &amp;#8230; How do we fix this customer&amp;#8217;s problem?  Well, after some testing, it turns out that default search was causing problems for this customer due to the &amp;lt;ORDER&amp;gt; keyword in part 2 of the default mode algorithm.  And, there are a couple of solutions for fixing this:&lt;/p&gt;
&lt;p&gt;Option 1:   Upgrade to 10gR3 , which doesn&amp;#8217;t seem to have this problem&lt;br /&gt;
Option 2:   Write a custom Programmable Event Interface that modifies the query string (see PEI in the &lt;a href="http://download.oracle.com/docs/cd/E13158_01/alui/wci/docs103/uiguide/webcenterinteraction_uicustomizationguide.pdf"&gt;WCI UI Customization Guide&lt;/a&gt;)&lt;br /&gt;
Option 3:   Replace the default search in the layout with custom search banner code&lt;/p&gt;
&lt;p&gt;Both options 2 &amp;amp; 3 will need to convert the query from a default mode one to a custom, query operator mode before submitting to the search server.  The custom query algorithm will be the same as the default mode without the &amp;lt;ORDER&amp;gt; operator.  For this customer using WCI 6.5, option 3 actually gives us the simplest and least intrusive way to fix this issue.  We did not end up implementing the solution for the customer as they chose to do this on their own.  But, here&amp;#8217;s a quick stab at how the code would be put together:&lt;/p&gt;
&lt;p&gt;In the base page layout file, we find the existing search UI and replace it with HTML like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/03/screenshot.7.jpeg"&gt;&lt;img class="aligncenter size-full wp-image-854" title="Custom Search Pseudo Code" src="http://www.function1.com/wp-content/uploads/2010/03/screenshot.7.jpeg" alt="" width="916" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, the psuedo-code for the javascript method mentioned above (&lt;em&gt;customizeSearchString&lt;/em&gt;) would be something like:&lt;/p&gt;
&lt;p&gt;1) Get the current value of the &lt;em&gt;fake_q_id&lt;/em&gt; text field&lt;/p&gt;
&lt;p&gt;2) Token-ize the text string entered by the user in the &lt;em&gt;fake_q_id&lt;/em&gt; field&lt;/p&gt;
&lt;p&gt;3) Don&amp;#8217;t convert if there&amp;#8217;s only 1 token (single-word query)  or if any of the tokens are a reserved word for search&lt;/p&gt;
&lt;p&gt;3) Using the tokens, construct a replacement query that doesn&amp;#8217;t use the &amp;lt;ORDER&amp;gt; keyword.&lt;/p&gt;
&lt;p&gt;4) Set the constructed query to the hidden &lt;em&gt;q_id&lt;/em&gt; field&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s it!  This javascript function essentially performs the conversion of the default mode query to the custom one we needed.  As for the customer we had supported, they have implemented a similar solution and the pilot users have been pleased!  At the end of the day, it&amp;#8217;s all about making the portal as intuitive and as productive as possible for your users.  And now that we understand the portal&amp;#8217;s search functionality better, it should make it easier for us to do exactly that.&lt;/p&gt;
&lt;p&gt;Happy searching :)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/UAlPpmdddb4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/03/wci-search-overload-syndrome/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/03/wci-search-overload-syndrome/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/03/wci-search-overload-syndrome/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Dave</name>
					</author>
		<title type="html"><![CDATA[Everything Maven Part 2 &#8211; Twitter Portlet]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/m7SgPmwAYas/" />
		<id>http://www.function1.com/?p=773</id>
		<updated>2010-03-18T21:25:26Z</updated>
		<published>2010-03-18T18:57:05Z</published>
		<category scheme="http://www.function1.com" term="Cool Tools" /><category scheme="http://www.function1.com" term="Development" /><category scheme="http://www.function1.com" term="Portal" /><category scheme="http://www.function1.com" term="Portal Server" /><category scheme="http://www.function1.com" term="idk" /><category scheme="http://www.function1.com" term="maven" /><category scheme="http://www.function1.com" term="wci" /><category scheme="http://www.function1.com" term="WebCenter Interaction" />		<summary type="html"><![CDATA[A few weeks ago I wrote about reasons why you might want to invest some time in learning and using maven: &#8220;Everything maven Part I&#8221;. Now it&#8217;s time to roll up our sleeves and get down into guts of maven. In this article, I&#8217;ll describe how you can use Maven to build and deploy a [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/03/everything-maven-part-2-twitter-portlet/">&lt;p&gt;A few weeks ago I wrote about reasons why you might want to invest some time in learning and using maven: &lt;a href="http://www.function1.com/2010/02/everything-maven-part-1-is-it-worth-the-effort/"&gt;&amp;#8220;Everything maven Part I&amp;#8221;&lt;/a&gt;. Now it&amp;#8217;s time to roll up our sleeves and get down into guts of maven. In this article, I&amp;#8217;ll describe how you can use Maven to build and deploy a WCI portlet using the IDK. The portlet will connect to Twitter and return all your followers&amp;#8217; latest tweets.&lt;/p&gt;
&lt;h3&gt;Step 1: Install Maven&lt;/h3&gt;
&lt;p&gt;Here&amp;#8217;s a link to the &lt;a href="http://maven.apache.org/download.html#Installation"&gt;official maven2 installation guide&lt;/a&gt;. Here are the steps I used to install on my windows laptop:&lt;span id="more-773"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download and install the Sun Java JDK 6 update 18. Here&amp;#8217;s the link: http://java.sun.com/javase/downloads/widget/jdk6.jsp.&lt;/li&gt;
&lt;li&gt;Download the latest maven installation zip file from here http://maven.apache.org/download.html&lt;/li&gt;
&lt;li&gt;Extract the zip and move &amp;#8216;apache-maven-2.2.1&amp;#8242; into c:/Program Files/Apache Software Foundation/apache-maven-2.2.1&lt;/li&gt;
&lt;li&gt;Create a windows environment variable named &amp;#8220;M2_HOME&amp;#8221; and pointed it to the maven installation directory: M2_HOME=c:\Program Files\Apache Software&lt;br /&gt;
Foundation\apache-maven-2.2.1&lt;/li&gt;
&lt;li&gt;Create a windows environment variable named &amp;#8220;M2_REPO&amp;#8221; and point it to &amp;#8220;C:\Documents And Settings\dave.m2\repository&amp;#8221; (this will make more sense after you read the section below on repositories).&lt;/li&gt;
&lt;li&gt;Make sure that the &amp;#8220;JAVA_HOME&amp;#8221; environment variable is set. For example, the JAVA_HOME environment variable on my windows laptop is set to C:\Program Files\Java\jdk1.6.0_18&lt;/li&gt;
&lt;li&gt;Add the &lt;code&gt;mvn&lt;/code&gt; command to the windows &amp;#8220;PATH&amp;#8221; environment variable like so: PATH=&amp;#8230;;%M2_HOME%\bin&lt;/li&gt;
&lt;li&gt;Finally, Test to ensure maven was installed correctly. Open a Windows DOS Command Prompt, and type &amp;#8220;mvn -version&amp;#8221;. If you see the following you should be good to go:&lt;br /&gt;
&lt;code&gt;C:\Users\Dave&amp;gt;mvn -version&lt;br /&gt;
Apache Maven 2.2.1 (r801777; 2009-08-06 15:16:01-0400)&lt;br /&gt;
Java version: 1.6.0_18&lt;br /&gt;
Java home: c:\Program Files (x86)\Java\jdk1.6.0_18\jre&lt;br /&gt;
Default locale: en_US, platform encoding: Cp1252&lt;br /&gt;
OS name: "windows 7" version: "6.1" arch: "x86" Family: "windows"&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maven is installed. Let&amp;#8217;s take a break, here&amp;#8217;s an airplane landing with one wing:&lt;/p&gt;
&lt;p&gt;&lt;object width="500" height="400"&gt;&lt;param name="movie" value="http://www.youtube.com/v/XZiP4NaeYrE&amp;#038;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed  src="http://www.youtube.com/v/XZiP4NaeYrE&amp;#038;fs=1" type="application/x-shockwave-flash" width="500" height="400" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;h3&gt;Step 1b: Get the code&lt;/h3&gt;
&lt;p&gt;Here&amp;#8217;s a Zip containing the complete portlet code: &lt;a href='http://www.function1.com/wp-content/uploads/2010/03/function1-twitter-portlet.zip'&gt;function1-twitter-portlet&lt;/a&gt;. Feel free to refer to this as I describe the steps to create a maven portlet project below. This zip contains a fully functionaly maven project. Extract the zip and open the pom.xml file. Add your twitter credentials to the file, and then open a command prompt. Change directories to wherever you extracted the zip and then run the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If maven is installed correctly, and your twitter credentials are valid, this command should download required jars from maven, run tests to make sure it can connect to twitter, and build a deploy-able portlet war file under directory named &amp;#8216;target&amp;#8217;!&lt;/p&gt;
&lt;h3&gt;Step 2: Create Basic pom.xml&lt;/h3&gt;
&lt;p&gt;Now that Maven is installed, we need to create an empty Maven Project. A the bare minimum, a Maven Project is nothing more than a folder that contains a single file named &amp;#8216;pom.xml&amp;#8217;. In Maven terminology, &amp;#8220;POM&amp;#8221; stands for &amp;#8220;Project Object Model&amp;#8221;. Maven will look for a pom.xml file to discover everything it needs to know about our Twitter Portlet Java Project. Once you&amp;#8217;ve used Maven for a few different projects, this will become second nature&amp;#8230;I promise. Eventually you&amp;#8217;ll have a template pom.xml that you can simply copy into a new directory each time you&amp;#8217;d like to create a new maven project.&lt;/p&gt;
&lt;p&gt;First, we&amp;#8217;ll create a new directory named &amp;#8216;twitter-portlet&amp;#8217; (or just follow along by browsing the code from the zip file). Next, create a new pom.xml file and copy in the following&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

  &amp;lt;groupId&amp;gt;com.function1&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;wci-twitter-portlet&amp;lt;/artifactId&amp;gt;
  &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
  &amp;lt;version&amp;gt;0.1&amp;lt;/version&amp;gt;

  &amp;lt;name&amp;gt;WebCenter Interation Twitter Portlet&amp;lt;/name&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So far, we haven&amp;#8217;t done anything more than describe our Twitter Portlet Project to Maven. Here&amp;#8217;s a short overview of each line: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &amp;#8220;modelVersion&amp;#8221; is required by all Maven2 Projects and always has the value 4.0.0.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;groupidId&amp;#8221; tells Maven that this project belongs in the &amp;#8220;com.function1&amp;#8243; group. The best practice is to use your company&amp;#8217;s name for the groupid, but it can be whatever you choose. Multiple projects (multiple pom.xml files) can all share the same group id.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;artifactId&amp;#8221; defines the name of our specific project: wci-twitter-portlet.&lt;/li&gt;
&lt;li&gt;&amp;#8220;packaging&amp;#8221; tells maven what type of project we&amp;#8217;re building. 99% of the time, this is either going to be &amp;#8220;war&amp;#8221; or &amp;#8220;jar&amp;#8221;. In this case, of course, we want a war to deploy as a remote portlet.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;version&amp;#8221; tag defines what version of the wci-twitter-portlet we&amp;#8217;re working on. In this case, its the first version ever so I chose to call it version &amp;#8220;0.1&amp;#8243;.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;name&amp;#8221; is just a human readable name. Maven will use this when generating documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Step 3: Directory Structure&lt;/h3&gt;
&lt;p&gt;Maven is very particular about the directory structure of a project. If this is the first time you&amp;#8217;ve used Maven, this might make you feel a bit trapped. When I first started with Maven I tried to fight it by using my own directory structure. Over time, I&amp;#8217;ve come to see the light. Trust me, just go with it. I&amp;#8217;ve realized that the directory structure used by Maven is a proven best practice and in the end it really makes things consistent and easy. Here&amp;#8217;s what the basic directory structure looks like: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/03/twitter-portlet-screenshot4.jpg"&gt;&lt;img src="http://www.function1.com/wp-content/uploads/2010/03/twitter-portlet-screenshot4.jpg" alt="" width="154" height="127" class="aligncenter size-full wp-image-788" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a directory named src/main/java. This is where we will put custom java code.&lt;/li&gt;
&lt;li&gt;Next create a directory named src/test/java. This is where unit test code goes.&lt;/li&gt;
&lt;li&gt;Now create a directory named src/main/resources. Here&amp;#8217;s were all your configuration files go. For example: DTD, .properties files, xml files (such as log4j.xml), etc.&lt;/li&gt;
&lt;li&gt;Finally, create a directory named src/main/webapps. Here&amp;#8217;s where your jsp&amp;#8217;s, and WEB-INF/web.xml file, and any static stuff like images, and javascript.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ok, directory structure is done, Time for a break! I think the things that this guy builds are freaking cool: &lt;/p&gt;
&lt;p&gt;&lt;object width="500" height="400"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WcR7U2tuNoY&amp;#038;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed  src="http://www.youtube.com/v/WcR7U2tuNoY&amp;#038;fs=1" type="application/x-shockwave-flash" width="500" height="400" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;h3&gt;Step 4: Generate an Eclipse Project&lt;/h3&gt;
&lt;p&gt;By this point, we&amp;#8217;ve given maven enough information to be able to create an Eclipse project for us. switch to your command prompt and run the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mvn eclipse:eclipse&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see a message &amp;#8220;BUILD SUCCESFUL&amp;#8221;. Open Eclipse and choose &amp;#8220;File -&amp;gt; Import -&amp;gt; Existing Projects into Workspace&amp;#8221;. Choose the twitter-portlet directory and import the wci-twitter-portlet eclipse project (notice Maven used the artifactid for the name of the eclipse project).&lt;/p&gt;
&lt;h3&gt;Step 5: IDK and DEPENDENCIES&lt;/h3&gt;
&lt;p&gt;Our Twitter Portlet will need to use the IDK to get the current username. We&amp;#8217;ll need to depend on the WCI IDK. So, the next step is to download the IDK (if you haven&amp;#8217;t yet). Once it&amp;#8217;s downloaded, extract the installation zip and then find the WEB-INF directory under idk/10.3.0/devkit. Copy the WEB-INF folder into the wci-twitter-portlet directory into src/main/webapp/.&lt;/p&gt;
&lt;p&gt;Now, delete the lib directory! Yep, you heard me. Just like taking off a bandaid, rip that lib directory out of there. After reading this article, you&amp;#8217;ll never have to copy the idk lib directory again (ok, except maybe when they upgrade to 11g). Now it&amp;#8217;s time to tell Maven to manage these jars for us.&lt;/p&gt;
&lt;h4&gt;Maven Repositories&lt;/h4&gt;
&lt;p&gt;Which leads us to the concept of Maven &amp;#8220;repositories&amp;#8221;. Maven looks for jar dependencies inside repositories. The Maven Book does a much better job at describing the concept than I can, but basically, a repository is simply directory structure containing maven artifacts.&lt;/p&gt;
&lt;p&gt;By default, Maven looks first for dependencies here: &lt;a href="http://repo1.maven.org/maven2/"&gt;http://repo1.maven.org/maven2/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to convention over configuration, everything inside the repository is organized using the following structure:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;groupId/artifactId/version/artifactId-version.ext&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For example, log4j, version 1.2.9 can be found here: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://repo1.maven.org/maven2/log4j/log4j/1.2.9/"&gt;http://repo1.maven.org/maven2/log4j/log4j/1.2.9/&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;In this case, groupid and artifactid are both set to &amp;#8216;log4j&amp;#8217;. Here&amp;#8217;s another example, &amp;#8216;axis&amp;#8217; can be found here: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://repo2.maven.org/maven2/org/apache/axis/axis/1.4/"&gt;http://repo2.maven.org/maven2/org/apache/axis/axis/1.4/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are several tools available to help search the maven repository for stuff. There&amp;#8217;s a &lt;a href="http://maven.apache.org/plugins/maven-eclipse-plugin/"&gt;Maven-Eclipse plugin&lt;/a&gt; that allows you to search and automatically add dedpendencies to a maven project. There&amp;#8217;s also a website that allows you to search the maven repository: &lt;a href="http://mvnrepository.com/"&gt;http://mvnrepository.com/&lt;/a&gt;. For example, when you do a search for &amp;#8216;log4j&amp;#8217; this site will show you all available versions. If you drill down into version 1.2.15, you&amp;#8217;ll see the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.2.15&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I know, I know, xml makes my eyes glaze over too. To be honest, I&amp;#8217;m not crazy about the fact that maven relies 100% on xml. When you write java code, you gotta deal with xml, what can I say?&lt;/p&gt;
&lt;p&gt;So, if we added this snippet of xml to or pom.xml, maven will know that our project uses log4j. In fact, maven will be so nice as to find and download the appropriate log4j jar and make it available on the classpath of our project.&lt;/p&gt;
&lt;p&gt;Maven is smart &amp;#8211; as smart as they come. Instead of downloading jars every time you do a build, it only downloads the jars once. And instead of downloading the same jars into every maven project, it downloads them into a directory under your operating system user&amp;#8217;s home directory. For example, on windows, this is C:\Documents and Settings\Dave\.m2\repository. On mac, this is /Users/Dave/.m2/repository.&lt;/p&gt;
&lt;p&gt;Ok, that was a lot. Here&amp;#8217;s a quick summary: The Maven repository located at http://repo2.maven.org is a remote repository. When you tell maven that you need log4j by including the xml snippet above, it will first check your local maven repository (which is under your os user&amp;#8217;s home directory). If it can&amp;#8217;t find the jar, it will then check http://repo1.maven.org/maven2/.&lt;/p&gt;
&lt;h4&gt;Dealing with IDK Jars&lt;/h4&gt;
&lt;p&gt;So, the problem is that none of the idk jars are available in either of those places. To solve this, we&amp;#8217;ll need to copy the idk jars into a local maven repository of some sort.&lt;/p&gt;
&lt;p&gt;The first step in doing so, is to re-arrange the jars inside the idk&amp;#8217;s lib directory to match the directory structure that maven expects. Like so:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.function1.com/wp-content/uploads/2010/03/twitter-portlet-screenshot3.jpg"&gt;&lt;img src="http://www.function1.com/wp-content/uploads/2010/03/twitter-portlet-screenshot3.jpg" alt="" width="309" height="636" class="aligncenter size-full wp-image-789" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next, we need to tell Maven to look at our new local directory repository in addition to the default repo at http://repo2.maven.org/maven2. Here&amp;#8217;s the snippet of xml inside pom.xml that does so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;repositories&amp;gt;
  &amp;lt;repository&amp;gt;
    &amp;lt;id&amp;gt;thirdparty&amp;lt;/id&amp;gt;

    &amp;lt;name&amp;gt;Thirdparty Jars&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;file://${basedir}/thirdparty/m2/repository&amp;lt;/url&amp;gt;
    &amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt;
  &amp;lt;/repository&amp;gt;

&amp;lt;/repositories&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that the idk dependencies are available, lets add them to our project. We&amp;#8217;re going to add a snippet of xml for each jar. Here&amp;#8217;s a few examples to give you an idea:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;dependencies&amp;gt;
   &amp;lt;dependency&amp;gt;

     &amp;lt;groupId&amp;gt;com.oracle.idk&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;activation&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;10.3&amp;lt;/version&amp;gt;
  &amp;lt;/dependency&amp;gt;

  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.oracle.idk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;axis&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;10.3&amp;lt;/version&amp;gt;

  &amp;lt;/dependency&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.oracle.idk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;commons-discovery&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;10.3&amp;lt;/version&amp;gt;

  &amp;lt;/dependency&amp;gt;
... more depenedencies ...
&amp;lt;/dependencies&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Phwew! We&amp;#8217;re getting to the end&amp;#8230;before we do, here&amp;#8217;s a old spice commercial that cracks me up:&lt;/p&gt;
&lt;p&gt;&lt;object width="500" height="306"&gt;&lt;param name="movie" value="http://www.youtube.com/v/owGykVbfgUE&amp;#038;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed  src="http://www.youtube.com/v/owGykVbfgUE&amp;#038;fs=1" type="application/x-shockwave-flash" width="500" height="306" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;h3&gt;Step 6: Write the Code!&lt;/h3&gt;
&lt;p&gt;At this point, we have everything to need to create a portlet that uses the IDK. Please take a look inside the zip to see the code. But why stop there? Let&amp;#8217;s add some twitter! It just so happens that there&amp;#8217;s a library called twitter4j available via maven:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.twitter4j&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;twitter4j-core&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.1.0&amp;lt;/version&amp;gt;

    &amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run &lt;code&gt;mvn eclipse:eclipse&lt;/code&gt; again to update your eclipse project with the new twitter4j jar. (If Eclipse is open while you run this command, remember to do a &amp;#8220;refresh&amp;#8221; in Eclipse so that Eclipse see&amp;#8217;s the new jar)&lt;/p&gt;
&lt;p&gt;Now, we can add some code to our portlet that uses twitter4j to retrieve the latest status from each twitter friend. Here&amp;#8217;s the relevant snippet. Feel free to peruse the full source int he zip file: &lt;/p&gt;
&lt;pre&gt;&lt;code&gt; public List&amp;lt;String&amp;gt; getFriendsMostRecentTweet() {
    List&amp;lt;String&amp;gt; tweets = new ArrayList&amp;lt;String&amp;gt;();
    String senderID = getTwitterLogin();
    String senderPassword = getTwitterPassword(); 

    Twitter twitter = new TwitterFactory().getInstance(senderID,
            senderPassword);
    PagableResponseList&amp;lt;User&amp;gt; statuses;
    try {
        statuses = twitter.getFriendsStatuses();
        for (User nextTwitterUser : statuses) {
            tweets.add(nextTwitterUser.getName() + ": "
                    + nextTwitterUser.getStatusText());
        }
    } catch (TwitterException e) {
        System.out.println("Unable to retrieve tweets");
        return null;
    }
    return tweets;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally: Running the command &amp;#8220;mvn install&amp;#8221; will create a war file named wci-twitter-portlet-0.1.war under the target directory. Deploy that war to tomcat (or weblogic or whatever you&amp;#8217;re using as a remote java portal server). Create the remote server, webservice, and portlet objects inside the WCI Portlet and marvel at the twitter messages!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/m7SgPmwAYas" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/03/everything-maven-part-2-twitter-portlet/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/03/everything-maven-part-2-twitter-portlet/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/03/everything-maven-part-2-twitter-portlet/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Brian Hak</name>
					</author>
		<title type="html"><![CDATA[&#8220;Just When I Thought I Was Out, They Pull Me Back In&#8221;: A Belated Welcome To Dave Paroulek]]></title>
		<link rel="alternate" type="text/html" href="http://rss.function1.com/~r/AqualogicBlog/~3/LaTM_gwmj4Y/" />
		<id>http://www.function1.com/?p=747</id>
		<updated>2010-03-11T20:25:23Z</updated>
		<published>2010-03-11T18:42:51Z</published>
		<category scheme="http://www.function1.com" term="Function1" />		<summary type="html"><![CDATA[Look, I think we can all agree that The Godfather III sucked, and was a black mark on an otherwise amazing trilogy. The one (and probably only) highlight of the movie was Pacino giving us the sound-bite, &#8220;Just when I thought I was out, The pull me back in!&#8221;. And so we welcome Dave Paroulek [...]]]></summary>
		<content type="html" xml:base="http://www.function1.com/2010/03/just-when-i-thought-i-was-out-they-pull-me-back-in-a-belated-welcome-to-dave-paroulek/">&lt;p&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/242H7F8DKHA&amp;#038;hl=en_US&amp;#038;fs=1&amp;#038;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/242H7F8DKHA&amp;#038;hl=en_US&amp;#038;fs=1&amp;#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Look, I think we can all agree that The Godfather III sucked, and was a black mark on an otherwise amazing trilogy.  The one (and probably only) highlight of the movie was Pacino giving us the sound-bite, &amp;#8220;Just when I thought I was out, The pull me back in!&amp;#8221;.  And so we welcome &lt;a href="http://www.function1.com/2010/02/everything-maven-part-1-is-it-worth-the-effort/"&gt;Dave Paroulek&lt;/a&gt; to the Function1 team.  &lt;/p&gt;
&lt;p&gt;As you may or may not know, the WCI professional services world isn&amp;#8217;t all that big.  Your options for finding quality consultants are pretty much either: Oracle (for an un-godly hourly tab), us, or a couple of &lt;a href="http://blog.integryst.com/webcenter-interaction/2010/02/06/wall-of-shame-rant-beware-shady-wci-consultant-resellers/"&gt;other firms&lt;/a&gt; with WCI expertise.  The small resource pool of qualified WCI consultants means that when we&amp;#8217;re looking to bring new folks on board, we start by talking to people we&amp;#8217;ve worked with in the past (usually at Plumtree/BEA/Oracle).  These folks are a know quantity, and we know they&amp;#8217;ll represent Function1 well and make our customers happy.  Such is the case with Dave.  Dave is another long-time Plumtree-&gt;BEA-&gt;Oracle guy who took a little different career path than the rest of the Plumtree alumni at Function1.  He put his time in working for Plumtree Public Sector professional services, and then moved onto the BEA Services Engineering team.  In this capacity, Dave was focused on designing, developing, and delivering WCI add-on software directly to customers.  But his development experience doesn&amp;#8217;t stop there.  About a year and a half or so ago, Dave left the mothership and took a full-time gig doing software development (specifically, playing around with &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;span id="more-747"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And now he&amp;#8217;s back in the fold.  &lt;a href="http://www.metacafe.com/watch/2780329/absence_makes_the_heart_grow_fonder_the_is_it_true_series/"&gt;Absence makes the heart grow fonder I suppose&lt;/a&gt;, and when we talked to Dave about coming on board at Function1, he was all about it.  Dave comes to Function1 helping us codify our software development practices and expertise, and continue on our quest to &lt;a href="http://www.youtube.com/watch?v=ASguOiaEvaQ"&gt;&lt;del datetime="2010-03-05T00:55:43+00:00"&gt;take over the world&lt;/del&gt;&lt;/a&gt;, err, provide world class services and software to customers everywhere.  We&amp;#8217;re tickled pink to have Dave with us:  be on the lookout for more &lt;a href="http://www.function1.com/2010/02/everything-maven-part-1-is-it-worth-the-effort/"&gt;kick-ass blog posts&lt;/a&gt; on software development tips and best practices from him soon.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/AqualogicBlog/~4/LaTM_gwmj4Y" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.function1.com/2010/03/just-when-i-thought-i-was-out-they-pull-me-back-in-a-belated-welcome-to-dave-paroulek/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.function1.com/2010/03/just-when-i-thought-i-was-out-they-pull-me-back-in-a-belated-welcome-to-dave-paroulek/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.function1.com/2010/03/just-when-i-thought-i-was-out-they-pull-me-back-in-a-belated-welcome-to-dave-paroulek/</feedburner:origLink></entry>
	</feed>
