<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Function1 &#187; Best Practices</title>
	<atom:link href="http://www.function1.com/category/best-practices/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.function1.com</link>
	<description>Discussing all things portal, WebCenter Interaction, WebCenter Suite, Sharepoint, and related technologies.</description>
	<lastBuildDate>Fri, 25 Jun 2010 15:20:23 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Integrating a Google Web Toolkit application with WCI and the imageserver</title>
		<link>http://www.function1.com/2009/12/integrating-a-google-web-toolkit-application-with-wci-and-the-imageserver/</link>
		<comments>http://www.function1.com/2009/12/integrating-a-google-web-toolkit-application-with-wci-and-the-imageserver/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 18:35:27 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[google web toolkit]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[Portal]]></category>
		<category><![CDATA[wci]]></category>

		<guid isPermaLink="false">http://wp.function1.server296.com/?p=429</guid>
		<description><![CDATA[Google Web Toolkit (GWT) is an open-source web development toolkit that facilitates building rich, Javascript-based applications entirely through Java coding.  It is very useful in speeding up complex application development, as well as in multi-developer projects where Java’s static typing enforces convention across the board.  Function1 has employed GWT in the development of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a> (GWT) is an open-source web development toolkit that facilitates building rich, Javascript-based applications entirely through Java coding.  It is very useful in speeding up complex application development, as well as in multi-developer projects where Java’s static typing enforces convention across the board.  Function1 has employed GWT in the development of its product line and on the client site.</p>
<p>A GWT application code consists of the generated GWT static resource files (HTML, Javascript, and CSS) on the front end, and server-side service code on the middle and back end.  For performance reasons, static resource files are often deployed to the image server.  And <a href="http://code.google.com/webtoolkit/doc/1.6/FAQ_DebuggingAndCompiling.html#How_do_I_change_the_location_of_my_cache/nocache_HTML_files?">as of version 1.6, Google Web Toolkit easily allows for seamlessly changing the location of the generated GWT static resource files</a> from the default location in the war deployment.</p>
<p>If you do wish to pursue separating the generated static resources from the backing server code, there are a few steps to take.  The primary reason for this change is to avoid potential cross-domain issues that will arise from separating your resources; your imageserver may be running on imageserver.domain.com:80, while your application service might be running on appserver.domain.com:7001.</p>
<p><span id="more-429"></span></p>
<p>For this example, we’ll assume your application is called <em>formbuilder</em>.</p>
<ul>
<li>Under the <em>war</em> folder that GWT generates, you will find a folder with your application name, <em>formbuilder</em>.  Copy that folder to a target folder on the image server, such as /imageserver/RemoteGadgets/formbuilder/gwt/.</li>
<li>On the GWT entry point JSP page, you’ll make two changes.  The first is to create a Javascript variable that stores the gatewayed URL of the servlet.  The second is to change the GWT entry point Javascript reference.</li>
</ul>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img class="mt-image-none" src="http://www.function1.com/site/GWT%20portlet%20before.png" alt="GWT portlet before.png" width="603" height="560" /></span></p>
<ul>
<li>After the changes, your JSP will look something like the screenshot below.</li>
</ul>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img class="mt-image-none" src="http://www.function1.com/site/GWT%20portlet%20after.png" alt="GWT portlet after.png" width="603" height="560" /></span></p>
<ul>
<li>Finally, in the Java class that implements the EntryPoint interface, you will reference the gatewayed service URL using GWT’s <a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideCodingBasics.html#DevGuideJavaScriptNativeInterface">Javascript Native Interface</a> (JNSI).</li>
</ul>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img class="mt-image-none" src="http://www.function1.com/site/FormBuilderApp.png" alt="FormBuilderApp.png" width="597" height="753" /></span></p>
<hr />
<p>Bonus tip: As discussed earlier in this post, Google Web Toolkit provides tools to create rich, complex web applications entirely through Java code.  GWT was built with cross-browser compatibility in mind, but not all generated HTML is treated equally.   For example, adding a widget that generates a block level element into a container that generates an inline element may result in an “Error: Invalid source HTML for this operation.” error in Internet Explorer.  When building in GWT, remember that while you are coding in Java, your output is HTML + CSS + Javascript.  As with any web application, be sure to test your GWT app in a variety of browsers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2009/12/integrating-a-google-web-toolkit-application-with-wci-and-the-imageserver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Picture is Worth a Thousand Words Part 1: The Power of Graphs</title>
		<link>http://www.function1.com/2009/09/a-picture-is-worth-a-thousand-words-part-1-the-power-of-graphs/</link>
		<comments>http://www.function1.com/2009/09/a-picture-is-worth-a-thousand-words-part-1-the-power-of-graphs/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 14:23:28 +0000</pubDate>
		<dc:creator>Brian Hak</dc:creator>
				<category><![CDATA[Best Practices]]></category>

		<guid isPermaLink="false">http://wp.function1.com/index.php/269/uncategorized/a-picture-is-worth-a-thousand-words-part-1-the-power-of-graphs</guid>
		<description><![CDATA[It was brought to my attention over drinks a few weeks ago that not everybody appreciates insanely long, rambling blog posts. &#160;So here&#8217;s one that&#8217;s short and sweet&#160;relatively short: Consider putting information in a graph when you&#8217;re trying to make sense of lot&#8217;s of data.

Graphs are a wonderful thing, and with the continuing evolution of [...]]]></description>
			<content:encoded><![CDATA[<p>It was brought to my attention over drinks a few weeks ago that not everybody appreciates <a href="http://www.function1.com/site/2009/05/oh-albpm-why-you-gotta-go-and.html">insanely long, rambling blog posts</a>. &nbsp;So here&#8217;s one that&#8217;s <span class="Apple-style-span" style="text-decoration: line-through;">short and sweet</span>&nbsp;relatively short: Consider putting information in a graph when you&#8217;re trying to make sense of lot&#8217;s of data.
<div></div>
<div>Graphs are a wonderful thing, and with the continuing evolution of <a href="http://en.wikipedia.org/wiki/VisiCalc">spreadsheet software</a>, we don&#8217;t even have to break out the graph paper and ruler to put them together. &nbsp;Here are just a few things that I&#8217;ve found graphs super handy for:</div>
<p><span id="more-269"></span></p>
<div></div>
<div>
<ul>
<li><b>Looking at large data sets &#8211; </b>Humans weren&#8217;t made to pour over 60,000 lines of log data. &nbsp;When trying to understand what&#8217;s happening over time for a large sample of information, it&#8217;s often useful to put that data in a graph.</li>
<li><b>Looking for trends in data</b>&nbsp;- Another area that our brains aren&#8217;t particularly well wired for is spying trends in data (i.e. you don&#8217;t often hear people say, &#8220;Well Bob, I looked at the 239,683 lines in the Apache access log, and it looks like we started getting exponentially more traffic thrown at the server right around 3:58 PM&#8221;)</li>
<li><b>Making people believe you</b>&nbsp;- Sometimes showing somebody a picture goes over better than just telling them, &#8220;Dude, I telling you the problem is that Tomcat is totally responding way slow, braa&#8221;</li>
<li><b>Making people think you&#8217;re smart</b>&nbsp;- This is really just a corollary to the above. &nbsp;I &nbsp;don&#8217;t know what it is about graphs that turns people on, but show somebody a few impressive graphs and they seem to think you&#8217;re the <a href="http://www.youtube.com/watch?v=-K4lvV9Z4Zo">Bee&#8217;s Knees</a>.</li>
</ul>
<div></div>
<div>So what&#8217;s a blog post without an example or two, right? &nbsp;Two pictures and their related stories for your consideration:</div>
<div></div>
<div></div>
<div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="portal_sockets_graph.png" src="http://www.function1.com/site/portal_sockets_graph.png" width="590" height="291" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div>
<div>A long time ago, I was working with a customer who had a serious portal problem that took a loooooong time to figure out. &nbsp;After a while of running, the portal would just stop rendering random portlets on a page. &nbsp;At one point fairly early in the debugging process, we thought to look at the number of sockets the portal process was holding open and noticed that the number never seemed to go down. &nbsp;So, we set up a <a href="http://en.wikipedia.org/wiki/Cron">cron job</a>&nbsp;&nbsp;that would just log the number of sockets the portal process held every five seconds or so.</div>
<div></div>
<div>In the interest of full disclosure, I&#8217;ll tell you that I re-created the original graph for this blog post because I&#8217;ve long since lost access to the original data we used for trouble-shooting this problem. &nbsp;But, the original graph looked almost exactly like the recreation above. &nbsp;Over a sample of ~30,000 data points, it was clear that portal was never closing sockets. &nbsp;Amazingly, tech support eventually agreed this was a product flaw, and the customer received a hotfix that solved their problem.</div>
<div></div>
<div>More recently I had the chance to put together the following purty picture:</div>
<div></div>
<div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ldap_response_times_graph.png" src="http://www.function1.com/site/ldap_response_times_graph.png" width="681" height="344" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div>
</div>
<div>A customer I was working with had their portal grind to a halt: &nbsp;Full customer outage, big deal kind of halt. &nbsp;I won&#8217;t bore you with all the details, but it turns out that the root cause of the outage was slow response to authentication queries against an LDAP server. &nbsp;To be honest, I never would have guessed that slow LDAP queries could have dropped a whole system to its knees, but I decided to look at the LDAP logs just for kicks after troubleshooting for 12 hours and having no luck elsewhere. &nbsp;A casual review of the log data (180,000 lines) revealed nothing too abnormal. &nbsp;But I decided to graph the data anyways (mostly because I didn&#8217;t have any better ideas). &nbsp;Unfortunately, Excel has a 64,000 row limit on graph data. &nbsp;So I filtered out all the query response times under 1000 ms, because those weren&#8217;t really important for my purposes. &nbsp;And whatdda know, the resulting picture convinced me that our system really was down because of slow LDAP response times. &nbsp;</div>
<div></div>
<div>Notice in the above that we are humming along fine until about point 3825. &nbsp;Then, all of a sudden, we see some a huge spike in response time. &nbsp;As luck would have it, this spike occurred <b>exactly</b>&nbsp;at the onset of our outage. &nbsp;From that point on, we see response times varying considerably, but having a baseline response of around 15 seconds&#8230;a problem indeed! &nbsp;We made some architecture changes to drop the load on the LDAP server, and all was well.</div>
<div></div>
<div>That&#8217;s it. &nbsp;When in doubt&#8230;graph it. &nbsp;<a href="http://www.youtube.com/watch?v=9WNsd-uIDhA&amp;feature=related">Now you know, and knowing is half the battle</a>.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2009/09/a-picture-is-worth-a-thousand-words-part-1-the-power-of-graphs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Known limitations with the Web Center Interaction</title>
		<link>http://www.function1.com/2009/06/known-limitations-with-the-web-center-interaction/</link>
		<comments>http://www.function1.com/2009/06/known-limitations-with-the-web-center-interaction/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 05:05:00 +0000</pubDate>
		<dc:creator>Vasanth Manikumar</dc:creator>
				<category><![CDATA[Best Practices]]></category>

		<guid isPermaLink="false">http://wp.function1.com/index.php/264/uncategorized/known-limitations-with-the-web-center-interaction</guid>
		<description><![CDATA[Hey all!
Over the last few months, I&#8217;ve had 2 customers run into 2 separate limitations with the Oracle Web Center Interaction(WCI) product, namely in version 6.1 MP1.&#160; The first of the two cases I had run into previously, so that prompted the idea for this post to share and build a running list of these [...]]]></description>
			<content:encoded><![CDATA[<p>Hey all!</p>
<p>Over the last few months, I&#8217;ve had 2 customers run into 2 separate limitations with the Oracle Web Center Interaction(WCI) product, namely in version 6.1 MP1.&nbsp; The first of the two cases I had run into previously, so that prompted the idea for this post to share and build a running list of these limitations.&nbsp; The second of the 2 cases led me to dig deeper to find the reason for these constraints.&nbsp; What are these limitations you ask?</p>
<p>Well for example, if you&#8217;re working with ALUI 6.1MP1, did you know that the <em>maximum</em> number of pages created within a community is <strong><em>25</em></strong>?&nbsp; Or that a community cannot be created within a folder <em>more than</em> <strong><em>10</em></strong> levels deep?</p>
<p>Some of you may be thinking: why would you want to create more than 25 pages.&nbsp; In my customer&#8217;s case, their requirement was to have more than 25 pages organized within a community but have the majority of the pages hidden in the navigation.</p>
<p><span id="more-264"></span></p>
<p>These fixed values are actually hard-coded in the portal server library (a.k.a plumtreeserver), which I coincidentally covered in my last <a href="http://www.function1.com/site/2009/04/portal-server-api-1.html">post</a>.&nbsp; In particular, it&#8217;s in the com.plumtree.server.PT_SERVERCONSTANTS class.&nbsp; It seems as if Oracle is moving towards getting rid of some of these unnecessary constraints.&nbsp; For example, the constraint on the number of community pages has been removed in 10gR3.&nbsp; If you&#8217;re on an earlier version or if you hit another similar limitation, you have 2 simple choices but only one is a viable long term one.&nbsp; The first option would be&nbsp;to decompile&nbsp;the classes in the plumtreeserver.jar (or DLL for the .Net portal), modify the&nbsp;settings&nbsp;and rebuild the library.&nbsp; However, this option is not ideal as this would complicate product upgrades and Oracle support contracts.</p>
<p>The best approach is to try to look for some other workaround for these constraints.&nbsp; For the second limitation with admin folder levels, this still remains in 10gR3.&nbsp; One possible solution is to create a flatter taxonomy so that more subcommmunity levels can exist.&nbsp; If this isn&#8217;t feasible or no other options are available, you may be faced with replacing the fixed value in the portal server library.&nbsp; Again, we advise you do this only with extreme caution.&nbsp; Please contact us if you&#8217;d like more information.</p>
<p>The initial idea behind this article was not the&nbsp;workarounds, but to&nbsp;create a&nbsp;running list of these &#8220;hardcoded&#8221;&nbsp;limitations within the WebCenter Interaction product stack and the respective workarounds.&nbsp; I&#8217;ve started the list off, but please post your comments on other limitations that you have run into along with any solutions.&nbsp; I&#8217;ll be updating this post with all of the comments, so please submit any that you have found even if a workaround wasn&#8217;t.</p>
<p></p>
<p><strong>Portal Limitations</strong></p>
<table style="background-color: rgb(255, 255, 255);" width="100%" border="1" bordercolor="#ff6633" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="background-color: rgb(0, 255, 0);" width="50%"><strong>Limitation</strong></td>
<td style="background-color: rgb(0, 255, 0);">&nbsp;&nbsp;</td>
<td style="background-color: rgb(0, 255, 0);" width="50%"><strong>Workaround</strong></td>
</tr>
<tr>
<td>Cannot create more than 25 pages within a community (in ALUI 6.1 MP1 or earlier)</td>
<td>&nbsp;&nbsp;</td>
<td>Create the pages in another community and move them into the target community.</td>
</tr>
<tr>
<td style="background-color: rgb(204, 255, 204);">Maximum number of MyPages is 6</td>
<td style="background-color: rgb(204, 255, 204);">&nbsp;&nbsp;</td>
<td style="background-color: rgb(204, 255, 204);">None found yet!</td>
</tr>
<tr>
<td>Communities cannot be created within a folder which is &#8220;10 deep&#8221;</td>
<td>&nbsp;&nbsp;</td>
<td>Restructure the taxonomy to gains some levels back</td>
</tr>
<tr>
<td style="background-color: rgb(204, 255, 204);">Maximum length for the name of a document in the knowledge directory is 255 characters</td>
<td style="background-color: rgb(204, 255, 204);">&nbsp;&nbsp;</td>
<td style="background-color: rgb(204, 255, 204);">None found yet.</td>
</tr>
<tr>
<td>Maximum folder level in the Knowledge Directory is 28</td>
<td>&nbsp;&nbsp;</td>
<td>Restructure the knowledge directory taxonomy when the limit is reached.</td>
</tr>
<tr>
</tr>
</tbody>
</table>
<p></p>
<p></p>
<p>thanks,</p>
<p>Vasanth</p>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2009/06/known-limitations-with-the-web-center-interaction/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PTSpy log messages linked to &#8230; hair loss?</title>
		<link>http://www.function1.com/2009/04/ptspy-log-messages-linked-to-hair-loss/</link>
		<comments>http://www.function1.com/2009/04/ptspy-log-messages-linked-to-hair-loss/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 15:01:00 +0000</pubDate>
		<dc:creator>Vasanth Manikumar</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[ptspy]]></category>

		<guid isPermaLink="false">http://wp.function1.com/index.php/261/uncategorized/ptspy-log-messages-linked-to-hair-loss</guid>
		<description><![CDATA[For the past few years, researchers have been perplexed about the causes behind the increased rate of hair loss in ALUI portal administrators.  So, a team from Function1 took on the task of tracking these subjects for a few months and recorded the findings.  One of the interesting things discovered was that the [...]]]></description>
			<content:encoded><![CDATA[<p>For the past few years, researchers have been perplexed about the causes behind the increased rate of hair loss in ALUI portal administrators.  So, a team from Function1 took on the task of tracking these subjects for a few months and recorded the findings.  One of the interesting things discovered was that the cause was not genetic or gender-specific in most cases.  It was actually the simple explanation of the subjects repeatedly pulling on their hair while investigating problems with the portal.</p>
<p><img class="mt-image-none" style="WIDTH: 474px; HEIGHT: 371px" height="403" alt="pulling-out-hair_Full.jpg" src="http://www.function1.com/images/pulling-out-hair.jpg" width="500" /></p>
<p>For instance, the team observed one of the subjects being told that&nbsp;an&nbsp;issue with&nbsp;document refresh&nbsp;needs to be resolved&nbsp;right away.&nbsp; For the sake of research confidentiality, we&#8217;ll call this subject Jeb.&nbsp; Immediately, Jeb went to work and&nbsp;used the handy PTSpy utility&nbsp;to gather more information on the problem.&nbsp; After a&nbsp;few minutes, he&nbsp;had seemed to have found a clue in the log file:</p>
<p><span id="more-261"></span></p>
<p><em>CPTCardRefreshAgent::RefreshCard, caught exception (<strong>-2147203840</strong>) in refreshing card 4481.</em></p>
<p>Or on second thought, maybe not!&#8230; Jeb&#8217;s mood&nbsp;quickly changed&nbsp;from being hopeful to&nbsp;being dejected,&nbsp;and he&nbsp;had&nbsp;slowly started to tug on his hair.&nbsp; When questioned about his frustration, he simply kept repeating the phrase &#8220;negative 2 1 4 7 2 0 &#8230;.&#8221;.&nbsp; The research team noticed Jeb was losing it, so they quickly went to work and found a way to reach out to Jeb.</p>
<p>It took some time, but it turns&nbsp;out the answer lay in the Portal Server API library within the ALUI deployment.&nbsp;&nbsp;For those not&nbsp;familiar with the <a href="http://download.oracle.com/docs/cd/E13158_01/alui/wci/docs103/uiguide/apidocs/java/portalserver/index.html">Portal Server API</a> (previously called Plumtree Server API),&nbsp;this&nbsp;is a &#8220;common&#8221; native&nbsp;programming interface&nbsp;used by the Portal,&nbsp;Automation Server, and API Service.&nbsp;&nbsp;Even though, it&#8217;s not as simple to use as the IDK, it provides additional capabilities&nbsp;which&nbsp;go beyond those provided by the&nbsp;IDK.</p>
<p>In implementation, the bulk of the interface is in one&nbsp;JAR called&nbsp;&#8221;plumtreeserver.jar&#8221;, or in a DLL with the Windows version.&nbsp;&nbsp;The interesting part of this API is that&nbsp;half of the definitions are for actual&nbsp;code interfaces&nbsp;and the other&nbsp;half is static constant definitions.&nbsp; For addressing Jeb&#8217;s problem, we&#8217;re actually more interested in the static constants which&nbsp;provide the&nbsp;following types of information:</p>
<ul>
<li>task result codes</li>
<li>object class IDs</li>
<li>card status codes</li>
<li>job status codes</li>
</ul>
<p>Eventhough, they are all useful pieces of information, knowing what the result code values mean will&nbsp;allow Jeb to&nbsp;return to sanity.&nbsp; It turns out that this error code&nbsp;value can be decoded&nbsp;by looking at the PT_RESULTCODES class&nbsp;in the&nbsp;plumtreeserver library (DLL or JAR).&nbsp; Eventhough the class is provided in the&nbsp;JavaDocs and NDocs,&nbsp;these numeric error codes are not in the documentation.&nbsp;&nbsp;So, the team decompiled&nbsp;the&nbsp;DLL, and examined&nbsp;the decompiled&nbsp;class file for PT_RESULTCODES:&nbsp;<br />
<span class="mt-enclosure mt-enclosure-file" style="DISPLAY: inline"><a href="http://www.function1.com/images/PT_RESULTCODES.txt">PT_ResultCodes.txt</a></span></p>
<p>And voila!&#8230;&nbsp;the team was able to&nbsp;translate the numeric value seen in the log message to some more meaningful text.&nbsp; In Jeb&#8217;s case, &#8220;-2147203840&#8243; really&nbsp;meant that the &#8220;document was not found&#8221;.&nbsp; Just providing this translation to Jeb allowed him to return to sanity and continue to solve this issue.</p>
<p>Function1</p>
<p>Behavior Research Team</p>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2009/04/ptspy-log-messages-linked-to-hair-loss/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Function1 Holiday Enterprise Software Shopping Guide</title>
		<link>http://www.function1.com/2008/12/the-function1-holiday-enterprise-software-shopping-guide/</link>
		<comments>http://www.function1.com/2008/12/the-function1-holiday-enterprise-software-shopping-guide/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 20:03:10 +0000</pubDate>
		<dc:creator>Brian Hak</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://wp.function1.com/index.php/255/uncategorized/the-function1-holiday-enterprise-software-shopping-guide</guid>
		<description><![CDATA[Howdy all.&#160; With the holiday season upon us and everyone getting inundated with offers of bargain&#160;flat screen&#160;TVs at your favorite big box store and&#160;10 spatulas for the price of&#160;9 down at Spatula City, your friends at Function1 hope you&#8217;ll save some of your hard-earned budget with this cost-saving tip:&#160; Make your software purchases at the [...]]]></description>
			<content:encoded><![CDATA[<p>Howdy all.&nbsp; With the holiday season upon us and everyone getting inundated with offers of bargain&nbsp;flat screen&nbsp;TVs at your favorite big box store and&nbsp;10 spatulas for the price of&nbsp;9 down at <a href="http://www.youtube.com/watch?v=2XbCWmY0eqY">Spatula City</a>, your friends at Function1 hope you&#8217;ll save some of your hard-earned budget with this cost-saving tip:&nbsp; Make your software purchases at the end of&nbsp;a vendor&#8217;s fiscal quarter.</p>
<p>Here&#8217;s a not-so-well-kept secret about the software business: software and maintenance is a high-margin business for vendors.&nbsp; This means that there is no list price on that shiny new piece of software X that you&#8217;re thinking of buying&#8230;&#8221;list price&#8221; is just a starting point for negotiating, alot like the tag in the window of a used car.&nbsp; What&#8217;s more, most software sales folks have a sales target each and every&nbsp;quarter.&nbsp; The&nbsp;difference to a salesman between beating&nbsp;and missing their quarterly number is pretty significant.&nbsp; Beat their number and they:</p>
<ul>
<li>Likely get a trip on the company to some exotic resort where they sip on delicious fruity drinks.</li>
<li>Buy that new convertible weekend car that they&#8217;ve been eying.</li>
</ul>
<p><span id="more-255"></span></p>
<p>Miss their number and they can expect:</p>
<ul>
<li>Lot&#8217;s of yelling from angry VPs</li>
<li>Lot&#8217;s of meetings and &#8220;planning sessions&#8221; with aforementioned VPs on how they&#8217;re going to make their number next quarter</li>
<li>Perhaps start looking for a new job</li>
</ul>
<p>The upshot here is that, come end of the quarter, if a vendor isn&#8217;t meeting their financial targets, it&#8217;s firesale time.&nbsp; In short, you have leverage to negotiate a much better price for your software.&nbsp; Say, for instance, you&#8217;ve received a quote to buy a site license for some software&nbsp;at $500K + 20% annual maintenance.&nbsp; Let&#8217;s also say that, come end of the quarter, your favorite salesman is $300K short of meeting his sales target.&nbsp; Let&#8217;s also say that the economy is currently in the toilet, and the vendor you&#8217;re working with is in danger of missing the financial target they&#8217;ve given to Wall Street.&nbsp; All these factors add up to a perfect storm of you saving a bunch of cash.&nbsp; If you&#8217;re not afraid to say, &#8220;No&#8221; to a price, there&#8217;s a good chance you get the $500K software for $300K&#8230;if you buy before the end of the quarter.&nbsp; So, not only have you saved $200K from your budget immediately, but you&#8217;re also realizing an annual maintenance savings of $40K&#8230;that&#8217;s real money.&nbsp; Money you can use to:</p>
<ul>
<li>Take your team on a trip to some exotic resort where you sip on delicious fruity drinks.</li>
<li>Throw a kick-ass holiday party</li>
<li>Hire your favorite consultants at Function1 to give you a hand in getting the most out of your new software purchase</li>
</ul>
<p>That&#8217;s about all for now.&nbsp; Hope you find this tip helpful, and that it saves your some $$$.&nbsp; If you&#8217;re really in the holiday spirit, feel free to send us a check for 10% of any money you save :)</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2008/12/the-function1-holiday-enterprise-software-shopping-guide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX Refresher</title>
		<link>http://www.function1.com/2008/11/ajax-refresher/</link>
		<comments>http://www.function1.com/2008/11/ajax-refresher/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 03:23:00 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://wp.function1.com/index.php/252/uncategorized/ajax-refresher</guid>
		<description><![CDATA[It&#8217;s been a while since we touched on AJAX, but a question came up recently about it an I thought it might be good to review. AJAX, or &#8220;Asynchronous JavaScript and XML&#8221;, is a way for portlet developers to create rich Web Applications that don&#8217;t require the entire browser page to refresh to update content.&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s <a href="http://www.function1.com/site/2007/05/handling-ajax-timeouts.html">been a while</a> since we touched on <a href="http://en.wikipedia.org/wiki/AJAX" target="_new">AJAX</a>, but a question came up recently about it an I thought it might be good to review. AJAX, or &#8220;Asynchronous JavaScript and XML&#8221;, is a way for portlet developers to create rich Web Applications that don&#8217;t require the entire browser page to refresh to update content.&nbsp; This is done by making asynchronous calls to the server and updating content within the page itself.&nbsp; With the AquaLogic portal, this means that portlets can dynamically update content in &lt;div&gt; tags by requesting new content without having to refresh the entire page (and other portlets on the page).&nbsp; It&#8217;s a pretty simple concept; in many cases you can accomplish this without having to even change any code &#8211; you can just specify &#8220;inline refresh&#8221; on the Web Service and the portal will automatically rewrite the HTML links on the page to make AJAX calls:</p>
<p><img class="mt-image-none" height="246" alt="inline_refresh.jpg" src="http://www.function1.com/site/2008/11/10/inline_refresh.jpg" width="404" /></p>
<p>The HTML rewrites cause the browser to make the HTTP request &#8220;behind the scenes&#8221;, and when a response comes back, the portal refreshes the content inside the portlet &lt;div&gt; tag.</p>
<p><span id="more-252"></span></p>
<p>But there are some things to know about this AJAX stuff, so here are a couple of refresher points about AJAX:</p>
</p>
<p>1) The response to an AJAX request is basically just a text string to a browser, and it&#8217;s up to your JavaScript to interpret it.&nbsp; Often you do something like:</p>
<p>
<pre>document.getElementById("responseDivTag").innerHTML = response.getResponse();</pre>
<p>&#8230; to refresh content.&nbsp; But note that this doesn&#8217;t tell the browser to &#8220;process&#8221; the response &#8211; specifically, JavaScript that comes back in the response won&#8217;t run, because all we&#8217;re doing is setting the HTML to a string that comes back from the server.&nbsp; In order to run JavaScript in the response, you should look into the <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/eval" target="_new">JavaScript &#8220;eval()&#8221; method</a>, which will take a string returned from the server and run it as JavaScript.&nbsp; Just make sure you don&#8217;t include the &lt;script&gt; tags in your response if you really are returning JavaScript and are parsing it as such.</p>
<p>2) The response does not have to actually be HTML!&nbsp; It&#8217;s just a string to the browser, and you can do anything with it.&nbsp; The most common use (which <a href="http://www.function1.com/site/products/">all of our products</a> use) is to return <a href="http://en.wikipedia.org/wiki/JSON">JSON</a>, or &#8220;JavaScript Object Notation&#8221;, which can then be treated as objects that your script can handle however you want.&nbsp; Let&#8217;s say you just want to know if there was a success or failure: you could literally just return a &#8220;0&#8243; or &#8220;1&#8243; in your response and write something like:</p>
<p>
<pre>if (response.getResponseText.equals("1"))


&nbsp;&nbsp; alert("success!");

else

&nbsp;&nbsp;&nbsp;alert("fail");
</pre>
<p>Obviously, this just barely scratches the surface on AJAX, and you can rest assured that you haven&#8217;t heard the last of it.&nbsp; AJAX is the cornerstone of pretty much all future Oracle portal technologies, and if you&#8217;re a web developer who&#8217;s not all that familiar with it, trust me:&nbsp; you will be soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2008/11/ajax-refresher/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beware The ALI Collaboration 4.5 Security Issue</title>
		<link>http://www.function1.com/2008/08/beware-the-ali-collaboration-4-5-security-issue/</link>
		<comments>http://www.function1.com/2008/08/beware-the-ali-collaboration-4-5-security-issue/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 21:29:29 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Collaboration]]></category>

		<guid isPermaLink="false">http://wp.function1.com/index.php/231/uncategorized/beware-the-ali-collaboration-4-5-security-issue</guid>
		<description><![CDATA[Oops &#8211; looks like this one slipped past QA:&#160; Collab 4.5 ships with &#8220;INFO&#8221; set as the logging threshold, which isn&#8217;t that much of a problem in and of itself (aside from giant log files being generated).&#160; But when INFO is turned on, Collab actually records the UNENCRYPTED password to the ptcollab\4.5\settings\logs\wrapper.log file:


The authentication ID [...]]]></description>
			<content:encoded><![CDATA[<p>Oops &#8211; looks like this one slipped past QA:&nbsp; Collab 4.5 ships with &#8220;INFO&#8221; set as the logging threshold, which isn&#8217;t that much of a problem in and of itself (aside from giant log files being generated).&nbsp; But when INFO is turned on, Collab actually records the UNENCRYPTED password to the ptcollab\4.5\settings\logs\wrapper.log file:</p>
<p><p><span id="more-231"></span></p>
<p><img class="mt-image-none" height="125" alt="collab_password.jpg" src="http://www.function1.com/site/2008/08/02/collab_password.jpg" width="863" /></p>
<p>The authentication ID and the DB password are both written out to the file.&nbsp; Obviously this isn&#8217;t a critical security hole (if a malicious user has access to your system, you&#8217;ve got other things to worry about), but a concern nonetheless.&nbsp; Until the issue is resolved, I&#8217;d recommend just upping your log threshold to WARN by modifying the \ptcollab\4.5\settings\config\wrapper.conf file.&nbsp; Change:</p>
<p>
<pre>wrapper.logfile.loglevel=INFO</pre>
</p>
<p>to:</p>
<p>
<pre>wrapper.logfile.loglevel=WARN</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2008/08/beware-the-ali-collaboration-4-5-security-issue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance Tuning Tips</title>
		<link>http://www.function1.com/2008/06/performance-tuning-tips/</link>
		<comments>http://www.function1.com/2008/06/performance-tuning-tips/#comments</comments>
		<pubDate>Sun, 08 Jun 2008 19:15:00 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Portal Server]]></category>

		<guid isPermaLink="false">http://wp.function1.com/index.php/217/uncategorized/performance-tuning-tips</guid>
		<description><![CDATA[For those of you unaware, Dev2Dev is meeting a grisly fate:&#160; it won&#8217;t be with us much longer (apparently all content except for the blogs up there will be migrated to the Oracle Mother Ship).&#160; No doubt our friends at Oracle will come up with an alternative way for employees to speak their minds, but [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you unaware, Dev2Dev is meeting a grisly fate:&nbsp; it won&#8217;t be with us much longer (apparently all content except for the blogs up there will be migrated to the Oracle Mother Ship).&nbsp; No doubt our friends at Oracle will come up with an alternative way for employees to speak their minds, but for now many employees and &#8220;alumni&#8221; still have something to say, and we want to give them a forum.&nbsp; Today&#8217;s guest post is from Ray Gao, <a href="http://dev2dev.bea.com/blog/raygao/archive/2008/04/how_to_tune_alu.html">one he started while still at BEA</a>&nbsp;(warning: dev2dev links are not long for this world&#8230;) on Performance Tuning of the ALI Portal.</p>
<p>The gist of his post is that there are a lot of moving parts in performance tuning, including the portal, remote tier, and the database: the performance chain is only as strong as its weakest link.</p>
<p>To get more of his great high-level overview on performance tuning, click on through for a good read!</p>
<p><span id="more-217"></span></p>
<hr />
<p>I had written a blog several weeks ago about how tune portal applications for performance on the dev2dev.bea.com website. As I am accumulating more material on this topic, I decided to write a more detailed blog with Function1. </p>
<p>The ALUI portal is based on a stacked and component-based architecture.</p>
<p>The following diagram shows various ALUI portal modules.</p>
<p>
<img class="mt-image-none" height="273" alt="perf_modules.jpg" src="http://www.function1.com/site/2008/06/02/perf_modules.jpg" width="563" /></p>
<p>Over the years, the ALUI portal has grown to provide a rich set of functionality. This means that the skill required for managing the portal and the complexity for implementing high performance applications (portlet) increased as well.</p>
<p><o:p>&nbsp;</o:p></p>
<p>In addition to having functional &amp; integration tests, high performance applications should also be vigorously tested under stress tests (in conjunction with the portal). Load tests help to detect issues, such as the application&#8217;s buckling &amp; failure threshold &#8211; the maximum of users, load, and throughput, uneven load distribution, etc. </p>
<p><o:p>&nbsp;</o:p></p>
<p>There could be many &#8220;moving parts&#8221;; a systematic approach is recommended for diagnosing performance bottleneck(s). We recommend using a checklist such as the one below to comprehensively test as many of these &#8220;moving parts&#8221; as possible: </p>
<ol type="1">
<li>Examine high-level system architecture, e.g. component &amp; deployment diagram, network infrastructure, to identify design flaws. </li>
<li>Obtain &amp; review performance metrics/reports and stress-test results</li>
<li>Perform a detailed analysis of subsystems &amp; servers, e.g. resource consuming, job scheduling, etc.</li>
<li>Carry out a sequential (time-series) study of 2 &amp; 3 in a time period over few weeks or several test runs.</li>
<li>Use profiler to pinpoint specific implementation issue, e.g. insufficient caching &amp; code optimization, etc.</li>
</ol>
<p class="MsoNormal" style="MARGIN: 12pt 0in 0pt">A broad task is reviewing the architecture diagrams and performing a capacity planning analysis. This helps you identify whether sufficient resources (bandwidth, CPU, disk I/O, load balancing) have been allocated for the corresponding number of users. The ALUI Portal Deployment Guide shows some baseline numbers (<a href="http://edocs.bea.com/alui/deployment/docs604/planning/index.html">http://edocs.bea.com/alui/deployment/docs604/planning/index.html</a>), e.g. hits/pages per second for a system of certain CPU and memory configuration.</p>
<p><o:p>&nbsp;</o:p></p>
<p>The next step is to review performance metrics. Leading Stress-testing tools such as Load Runner or Microsoft Web Application Stress Tool, can produce diagrams showing correlation between load and system performance.</p>
<p>
<img class="mt-image-none" height="331" alt="perf_errors.jpg" src="http://www.function1.com/site/2008/06/02/perf_errors.jpg" width="669" /></p>
<p>Stress Test &#8211; User Load</p>
<p>&nbsp;</p>
<p>
<img class="mt-image-none" height="318" alt="perf_throughput.jpg" src="http://www.function1.com/site/2008/06/02/perf_throughput.jpg" width="638" /></p>
<p>Stress Test &#8211; Throughput</p>
<p>&nbsp;</p>
<p><p><img class="mt-image-none" height="320" alt="perf_hits.jpg" src="http://www.function1.com/site/2008/06/02/perf_hits.jpg" width="637" /></p>
</p>
<p>Stress Test &#8211; Hit per Second<br style="mso-special-character: line-break" /><br style="mso-special-character: line-break" /></p>
<p>System performance has many different perspectives, e.g. CPU load, network bandwidth consumption, Memory, Disk I/O. Therefore, it is a good practice to design multiple test-cases for different criterions. For example, a &#8220;login-only&#8221; test consumes less network bandwidth than a &#8220;community page test&#8221; which needs to repaint the entire browser window. Therefore, the &#8220;login-only&#8221; test could help you identifying the maximum sustainable &#8220;Virtual Users&#8221;; whereas, &#8220;community page test&#8221; identifies the maximum &#8220;Throughput per Second&#8221; &amp; &#8220;Hits per Seconds&#8221;.</p>
<p><o:p>&nbsp;</o:p></p>
<p>Time progression tests (e.g. tests from week one, to week two, to week three, so on) can be used to further identify improvements in the application performance.</p>
<p><o:p>&nbsp;</o:p></p>
<p>All systems have &#8220;saturation points&#8221;, beyond which the performance &#8220;levels off&#8221; (the response time no longer increases) even as the load continues to expand. This is similar to a car engine, where power is a byproduct of RPM. This phenomenon can be explained by examining various joints in the entire system. Caching mechanisms exists at various points &amp; sub modules, e.g. application server, web server, network load-balancer, Database cluster, etc. They are buffers against increased load.</p>
<p><p><img class="mt-image-none" height="376" alt="perf_throughput2.jpg" src="http://www.function1.com/site/2008/06/02/perf_throughput2.jpg" width="601" /></p>
</p>
<p>There is also a &#8220;buckling point&#8221;, at which the system fails. This can be identified by observing huge spikes in the number of errors, time-out, and the system hanging or rebooting.</p>
<p><o:p>&nbsp;</o:p></p>
<p>Next, system resource consumption should be examined. Windows based systems use Perfmon tool for recording the system metrics during the stress-test, e.g. Processors load, network bandwidth consumption, Memory allocation, virtual memory swapping, Page Fault, Disk I/O, Process Execution Time, Request Wait, number of Worker Process Restart, etc. On Unix based machine, there are many powerful and robust tools for gathering resource consumptions, e.g. &#8220;iostat&#8221;, &#8220;cpustat&#8221;, &#8220;vmstat&#8221;, &#8220;top&#8221;, &#8220;sar&#8221;, to name a few, &#8230; Those data can also be used in making capacity planning/sizing decisions. </p>
<p><p><img class="mt-image-none" height="370" alt="perf_perfmon.jpg" src="http://www.function1.com/site/2008/06/02/perf_perfmon.jpg" width="473" /></p>
</p>
<p>Portlets are hosted within application servers. The app servers&#8217; log and performance metrics should also be reviewed. Depending on which platform, various tools can be attached to monitor the application servers&#8217; health. On Java-based application, JMX plug-ins monitor performance metric and manage the application server. IIS servers can be managed thorough MMC plug-ins.</p>
<p><o:p>&nbsp;</o:p></p>
<p>ALUI has a tool called PTSpy, which is based on Log4J and Log4C. PTSpy has several useful performance logging calls. Performance results can be recorded using various appenders (network, file, DB) and reviewed later.</p>
<p><p><img class="mt-image-none" height="114" alt="perf_ptspy.jpg" src="http://www.function1.com/site/2008/06/02/perf_ptspy.jpg" width="733" /></p>
</p>
<p>It is also recommended to use application profilers in the development environment to optimize the portlet code. Application profilers can identify both common issues, such as lacking caching mechanisms, insufficient connection pooling, memory leaks, as well as showing less obvious things, such as how often certain methods are called, the size of objects being passed between methods, how many instances of an object or method are created, etc. Many IDEs offer either free or commercial grade application profiler plug-ins. The Eclipse IDE has a Test &amp; Performance Tools Platform (TPTP) Project. It allows you to examine the code down to a line-by-line granularity as well as monitor the application at much higher-level, e.g. Web-Services calls. Similar tools are exists for Netbeans IDE, MS Visual Studio, Together J, etc.</p>
<p><o:p>&nbsp;</o:p></p>
<p>Application &amp; Server configuration files should also be examined. These include web.config, web.xml, portlet.xml, resources.xml, jdbc pool parameters (connection timeout, max number of connections), etc.</p>
<p><o:p>&nbsp;</o:p></p>
<p>Applications use the database to persist non-volatile data. Therefore, properly tuning the database (SQL calls &amp; package) will be very important aspect of performance management. Aside from system level indicators, including memory-consumption, network activity, total CPU utilization in minutes &amp; seconds, number of worker threads, DB monitors can show the frequency of tables being used and updated and how long it takes to join different queries. These metrics can lead to better designing the database schema and/or improving queries.</p>
<p><p><img class="mt-image-none" height="398" alt="perf_database.jpg" src="http://www.function1.com/site/2008/06/02/perf_database.jpg" width="762" /></p>
</p>
<p>Database Server Resource Utilization</p>
<p><p><img class="mt-image-none" height="174" alt="perf_database2.jpg" src="http://www.function1.com/site/2008/06/02/perf_database2.jpg" width="636" /></p>
</p>
<p>A system is only as good as its weakest link; whether it is the network, application logic (e.g. caching, patterns), database, or management. For example, job scheduling can also affect the system performance. Running virus-definition update and doing file backups during peak usage hours will degrade system performance. All non-essential activities, such as system back-ups, anti-virus scanning, and security policies (LDAP sync), should be scheduled to run during off-peak hours.</p>
<p><o:p>&nbsp;</o:p></p>
<p>Portlet application performance tuning is a methodical process. It covers multiple facets, e.g. infrastructure, management &amp; planning, profiling, patterns, etc. Some improvements are low-hanging fruit; others are not. They can be placed into following quadrants.</p>
<ol style="MARGIN-TOP: 0in" type="1">
<li>Easy to implement, significant performance improvement.</li>
<li>Easy to implement, insignificant performance improvement.</li>
<li>Difficult to implement, significant performance improvement.</li>
<li>Difficult to implement, insignificant performance improvement.</li>
</ol>
<p>Decisions to modify the system can be influenced by time, budget, and required skill-sets.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.function1.com/2008/06/performance-tuning-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
