<?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>Way of the Retainer</title>
	<atom:link href="http://kevin-powe.nerdfu.net/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://kevin-powe.nerdfu.net/blog</link>
	<description>IT keeps me busy until I can be Masi Oka</description>
	<lastBuildDate>Mon, 10 Aug 2009 00:49:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Getting More Out of Oracle Tuxedo Part Two: TXRPT</title>
		<link>http://kevin-powe.nerdfu.net/blog/?p=43</link>
		<comments>http://kevin-powe.nerdfu.net/blog/?p=43#comments</comments>
		<pubDate>Mon, 10 Aug 2009 00:42:22 +0000</pubDate>
		<dc:creator>Kevin Powe</dc:creator>
				<category><![CDATA[Tuxedo]]></category>

		<guid isPermaLink="false">http://kevin-powe.nerdfu.net/blog/?p=43</guid>
		<description><![CDATA[
It&#8217;s a report, about Tuxedo. See what I did there?

So the last time we talked about Tuxedo, we talked about the ULOG and TMTRACE. This time around, we&#8217;re going to look at a great tool for basic performance profiling.
The great thing with all of the tools we&#8217;re looking at, just as with the stuff we [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kevin-powe.nerdfu.net/blog/images/20090809-tuxedo.jpg"/></p>
<div style="text-align: center; font-size: smaller; font-weight: bold">
It&#8217;s a report, about <i>Tuxedo</i>. See what I did there?
</div>
<p>So the last time we talked about Tuxedo, we talked about <a href="http://kevin-powe.nerdfu.net/blog/?p=41" target="_blank">the ULOG and TMTRACE</a>. This time around, we&#8217;re going to look at a great tool for basic performance profiling.</p>
<p>The great thing with all of the tools we&#8217;re looking at, just as with the stuff we looked at in the last post, is that they&#8217;re built into the Tuxedo platform. Tuxedo provides a tool out of the box that gives you log files of service execution times at millisecond precision. It&#8217;s called <b>txrpt</b> (as per the title for the post) and you enable it for individual servers by specifying <a href="http://download-llnw.oracle.com/docs/cd/E13161_01/tuxedo/docs10gr3/rf5/rf5.html#wp1003290" target="_blank">CLOPT</a> particular CLOPT settings for your server.</p>
<p>Remember that there are two halves to your CLOPT (command-line) options for a Tuxedo server: general Tuxedo parameters on the left-hand side of the &#8216;&#8211;&#8217; marker, and server-specific (the ones you code for yourself) on the right hand side of the &#8216;&#8211;&#8217; marker. We&#8217;re specifying general Tuxedo parameters here. The ones we need to set are:</p>
<ul>
<li><b>-r</b> &#8211; to enable txrpt logging
<li><b>-e</b> &#8211; to specify the file that stderr will be redirected to for our server
</ul>
<p>We need both of these together, because txrpt logging is sent to the stderr stream. So we want to control where that txrpt logging goes. By indicating a particular file, we can isolate the performance results we&#8217;re interested in.</p>
<p>&nbsp;</p>
<p>So, if we were configuring txrpt logging for our old standby, the simpserv server that comes as part of simpapp, the configuration in our UBBconfig file might look like this:</p>
<table style="border: 0">
<tr>
<td>simpserv</td>
<td>SRVID=1</td>
</tr>
<tr>
<td/>
<td>SRVGRP=SpeedyServers</td>
</tr>
<tr>
<td/>
<td>MIN=1</td>
</tr>
<tr>
<td/>
<td>MAX=1</td>
</tr>
<tr>
<td/>
<td>CLOPT=&#8221;-A -r -e simpapp_txrpt.log &#8212; &#8220;</td>
</tr>
</table>
<p>Because we&#8217;re only specifying standard Tuxedo CLOPT options, we didn&#8217;t have to put the &#8220;&#8211;&#8221; marker in our CLOPT options, but it&#8217;s there to reinforce exactly what we&#8217;re doing there. Whenever we request a service advertised by simpserv now, a record will be logged in <code>simpapp_txrpt.log</code>, giving us start and stop times for that service.</p>
<p>That&#8217;s why this is a great feature for profiling performance, but <u>not</u> for production environments: the overhead in disk I/O for a high volume system can be quite high. So in attempting to profile performance, you degrade it horribly.</p>
<p>&nbsp;</p>
<p><i>So far, so good, but how do we get at this delicious information?</i></p>
<p>&nbsp;</p>
<p>The <i>easy</i> way to do this is via the txrpt utility. Given a file like our <code>simpapp_txrpt.log</code> containing txrpt logging (and potentially a date and time range) txrpt will produce a report giving you a low-resolution indication of overall performance. Like this:</p>
<p><code><br />
kevinpowe@yamamoto:~/tux10_0/tuxedo10.0/samples/atmi/simpapp$ txrpt -d 08/09 < toupper_txprt</p>
<table>
<tr>
<td colspan="5" style="text-align: center">SERVICE SUMMARY REPORT</td>
</tr>
<tr>
<td colspan="5">&nbsp;</td>
</tr>
<tr>
<td>
SVCNAME
</td>
<td>
16p-17p
</td>
<td>
18p-19p
</td>
<td/>
<td>TOTALS</td>
</tr>
<tr>
<td/>
<td>
Num/Avg
</td>
<td>
Num/Avg
</td>
<td/>
<td>
Num/Avg
</td>
</tr>
<tr>
<td>
---------------
</td>
<td>
-------
</td>
<td>
-------
</td>
<td>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</td>
<td>
-------
</td>
</tr>
<tr>
<td>
TOUPPER
</td>
<td>
1/0.00
</td>
<td>
1/0.00
</td>
<td/>
<td>
2/0.00
</td>
</tr>
<tr>
<td>
---------------
</td>
<td>
-------
</td>
<td>
-------
</td>
<td/>
<td>
-------
</td>
</tr>
<tr>
<td>
TOTALS
</td>
<td>
1/0.00
</td>
<td>
1/0.00
</td>
<td/>
<td>
2/0.00
</td>
</tr>
</table>
<p></code></p>
<p>&nbsp;</p>
<p>So you get the number of executions in that timeframe, broken down into hourly intervals, and with a handy total. A get a high-level view of what your application usage pattern is over time, at an individual service level. You also get service execution time, down to 100ths of a second. That takes us a long way for not a lot of effort, and may give you everything you need.</p>
<p><i>If</i> you did want to go for extra credit though, you might be interested to know that the txrpt log file contains execution times at a <u>millisecond</u> level of precision. Here&#8217;s a snippet of a txrpt log file:</p>
<p><code><br />
@CheckExpDate 6529       1014617897   225306420    1014617897   225306421<br />
@UsrAuthenticate 6591       1014617897   225306417    1014617897   225306421<br />
@GetErrorMesg 6366       1014617897   225306423    1014617897   225306424<br />
@GetUsrPermission 6591       1014617897   225306422    1014617897   225306424<br />
@GetMyLocation 6591       1014617897   225306424    1014617897   225306426<br />
</code></p>
<p>The columns in the file, from left to right respectively, are:</p>
<ul>
<li>Service name
<li>Process ID
<li>Start date (in milliseconds since epoch)
<li>Start time
<li>End date (in milliseconds since epoch)
<li>End time
</ul>
<p>&nbsp;</p>
<p>For each service request, you can get the service execution time in milliseconds by subtracting the start time from the end time. If you want a handy online converter for sanity-checking start and end dates online, you can find an easy to use conversion tool <a href="http://www.epochconverter.com/" target="_blank">here</a>.</p>
<p>If you were the kind of person who found parsing log files amusing, you could get each individual service call at a millisecond-level resolution, allowing you to get laser precision on what&#8217;s going on in your server over time.</p>
<p><b>Don&#8217;t forget though:</b> You&#8217;ll be getting all the information logged to stderr for that server in your txrpt file. As well as txrpt logging, you&#8217;ll get any error text generated. You only want the lines prefixed by a <b>@</b></p>
<p>&nbsp;</p>
<p>So that&#8217;s txrpt. It gives you a great tool to go from no idea to a clear picture of what&#8217;s going on inside your application. It&#8217;s a great tool to use in pre-production performance profiling, and I have used it with clients before in production environments where they were desperate to get an understanding of how their application was being used.</p>
<p>Next we&#8217;ll look at the .TMIB, which is the runtime store of everything Tuxedo knows about <u>everything</u>. We&#8217;ll look at how we can get access to that information via SNMP monitoring, and also how we can use a command line tool called the unit driver (ud or ud32) to access this awesome store, and any other service that fulfills some basic requirements.</p>
]]></content:encoded>
			<wfw:commentRss>http://kevin-powe.nerdfu.net/blog/?feed=rss2&amp;p=43</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Good Stuff Becomes Transparent</title>
		<link>http://kevin-powe.nerdfu.net/blog/?p=42</link>
		<comments>http://kevin-powe.nerdfu.net/blog/?p=42#comments</comments>
		<pubDate>Wed, 01 Jul 2009 02:40:20 +0000</pubDate>
		<dc:creator>Kevin Powe</dc:creator>
				<category><![CDATA[Nerd Thoughts]]></category>
		<category><![CDATA[Plain English]]></category>

		<guid isPermaLink="false">http://kevin-powe.nerdfu.net/blog/?p=42</guid>
		<description><![CDATA[While I&#8217;m closing out the next Tuxedo post, this is almost more of a note to myself more than anyone else. It&#8217;s about useability and acclimatisation, and may well be blindingly obvious to you. I had an experience this week that really drilled home how we acclimatise to interfaces, internalise the positive stuff, and only [...]]]></description>
			<content:encoded><![CDATA[<p>While I&#8217;m closing out the next Tuxedo post, this is almost more of a note to myself more than anyone else. It&#8217;s about useability and acclimatisation, and may well be blindingly obvious to you. I had an experience this week that really drilled home how we acclimatise to interfaces, internalise the positive stuff, and only really think consciously about what&#8217;s left visible and apparent &#8211; the negative.</p>
<p><img src="http://farm1.static.flickr.com/205/468187320_29430e89c8.jpg?v=0"/></p>
<div style="text-align: center; font-size: smaller; font-weight: bold">My Hordemobile
</div>
<p>I drive a 2004 Holden Astra hatch. It is not a <i>glamorous</i> or luxury car. I will never drive it down winding forest roads or through oil-black rainslick streets while my eerily coiffed European model wife sleeps, elegantly arranged next to me. (cue sweeping strains of classical music) But it does me just fine, thank you very much. I like the car so much that, after someone killed my last black Holden Astra, I brought pretty much the same car again. Then someone tried to kill <i>this</i> one in Melbourne, but that&#8217;s <a href="http://www.flickr.com/photos/fengshuiguy/sets/72157602036601299/" target="_blank">another story entirely</a></p>
<p>Recently, my car was kind enough to suggest that a new fuel pump might be in order, by way of killing the old one. While I was procrastinating over getting the car fixed, my partner was kind enough to let me do a substantial amount of driving in her car. I&#8217;ve driven her car around a number of times before, as you do in regular  life. But this was a long enough stretch to <i>acclimatise</i> to her car as my regular driving experience. And it is a neat, practical car &#8211; it&#8217;s compact, corners fantastically, has more pick-up than mine in first gear, and has awesome cup-holders. And for coffee freaks, cup-holders are important.</p>
<p>But the experience when I got my car fixed was like driving a completely new car again. I saw my car through the eyes I had when I first bought it, and remember why I love the act of driving it, and why its been a great companion relocating interstate twice. Why I like sitting a little closer to the road, how comfortable the seats really are, how the interior design is put together in a way to melt away when you&#8217;re driving at night, and the sense of space and comfort it gives, even though it&#8217;s a smallish four-door hatch.</p>
<p>The lesson for myself here, which you&#8217;re welcome to take away too if it resonates, is this: when we use products, we often assume the positive parts of the experience as a given, and they become transparent &#8211; it&#8217;s difficult to appreciate them on a day to day basis. We can still see the negative though, and focus on that. It&#8217;s only when we move away from a product that the positive becomes clear, often by contrast. So I&#8217;m going to do my damnedest to remember that, if the only feedback for something is negative, it doesn&#8217;t <b>necessarily</b> mean it&#8217;s bad, if it&#8217;s still doing its job and being used widely.</p>
<p>It could just mean that the good stuff has become transparent.</p>
]]></content:encoded>
			<wfw:commentRss>http://kevin-powe.nerdfu.net/blog/?feed=rss2&amp;p=42</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting More Out of Oracle Tuxedo Part One: The ULOG And TMTRACE</title>
		<link>http://kevin-powe.nerdfu.net/blog/?p=41</link>
		<comments>http://kevin-powe.nerdfu.net/blog/?p=41#comments</comments>
		<pubDate>Mon, 18 May 2009 17:18:34 +0000</pubDate>
		<dc:creator>Kevin Powe</dc:creator>
				<category><![CDATA[Gobbledygook]]></category>
		<category><![CDATA[Tuxedo]]></category>

		<guid isPermaLink="false">http://kevin-powe.nerdfu.net/blog/?p=41</guid>
		<description><![CDATA[Things have been a little quiet around here, my dear imaginary audience, and for that I apologise profusely. I&#8217;ve been finding most of my spare time taken over by a pet programming project which I&#8217;m perched on the edge of revealing and quite excited about, despite its tiny scope. (more on that soon, I promise!)
As [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kevin-powe.nerdfu.net/blog/images/20090519-GettingTheMostOutOfTuxedo.jpg"/></p>
<p>Things have been a little quiet around here, my dear imaginary audience, and for that I apologise profusely. I&#8217;ve been finding most of my spare time taken over by a pet programming project which I&#8217;m perched on the edge of revealing and quite excited about, despite its tiny scope. (more on that soon, I promise!)</p>
<p>As I find myself for the first time in quite a long time on a plane without the girl as company, it seemed high time to furnish you with a blog post. Post-production has taken a LOT longer than I&#8217;d hoped in making this available post-flight, but here we are finally.</p>
<p>My last post was about the general principle of <a href="http://kevin-powe.nerdfu.net/blog/?p=40" target="_blank">reading the log files</a>, so I thought I&#8217;d jump into specifics about where to find useful information with Tuxedo. I had intended this to be one complete post, but due to the wonderful fractal quality of explaining things, I&#8217;ll need to break this up into a series.</p>
<p>For those of you unfamiliar with Tuxedo, this post is unlikely to have much interest or benefit. Before we possibly part ways though, I&#8217;ll take a moment to explain exactly what Tuxedo is, as it&#8217;s somewhat rarified knowledge nowadays, but the market seems to be pushing to make it and similar products popular again. From my less cynical vantage point, it looks at the moment like a healthy step backwards from making the solution to EVERYTHING a web service, or SOA.</p>
<h2>So what is Tuxedo?</h2>
<p>Tuxedo is what&#8217;s referred to as an Online Transaction Processing system. (OLTP, if you&#8217;re looking for a sexy acronym for your new tattoo) It&#8217;s also commonly referred to as a Transaction Processisng system, but that&#8217;s a shorter version of the same thing fundamentally.That means that it processes a <i>huge</i> volume of small operations. Because those operations are things that need to either work or fail consistently, we call those <i>transactions</i>. Transactions can be anything from processing a credit card charge, to updating the location of a package in transit for delivery, to transferring funds between accounts.</p>
<p>One of the big advantages of Tuxedo in particular is that it offers clients a set of available services, each with a unique name. Those services can be provided by a large, complex group of interconnected machines, or all of those services can be provided by one single machine. Clients don&#8217;t know and don&#8217;t care about the <i>exact</i> location of an available service. They connect to a central point, and request services by name. The exact process that provides that service is unknown to them, which lets you be much more flexible with how you structure the internals of a Tuxedo application.</p>
<p>Because OLTPs are so good at processing these high volumes of transactions (and typically have other technological benefits that make them attractive) they&#8217;re used by some big companies, often in preference to newer, &#8216;cooler&#8217; technology like web services or JEE applications, for example. Just to drop two names, last time I heard both American Express and Fedex were Tuxedo users.</p>
<p>Thus ends the general part of the post. Thanks for listening!</p>
<p>Now&#8230; how to get more useful information out of Tuxedo?</p>
<h2>ULOG</h2>
<p>The pimp-mack-super-daddy of information in Tuxedo is the ULOG file. This is where Tuxedo logs all of its own information, and also where any calls to the <userlog> function write data. if you&#8217;re having problems with Tuxedo, this should always be your first port of call. By default, the ULOG file lives in the directory pointed to by the <code>APPDIR</code> environment variable. If you haven&#8217;t set <code>APPDIR</code> explicitly, then the ULOG file lives in the same directory as your TUXCONFIG file.</p>
<p>The ULOG file is <i>actually</i> a series of files, one for each day. The format of ULOG files is as below:</p>
<ul><code>ULOG.mmddyy</code></ul>
<p>where <code>mm</code> is the current month, <code>dd</code> is the current day of the month, and <code>yy</code> is the last two digits of the current year. Frustratingly, that leaves those files just short of sorting perfectly in chronological order. But I&#8217;m sure there&#8217;s a solid historical American reason for that convention, possibly involving <a href="http://en.wikipedia.org/wiki/American_cheese" target="_blank">orange cheese</a>. As it stands, they&#8217;ll sort fine inside one year.</p>
<p>You can also control the location of ULOG files with the ULOGPFX environment variable. If you want to keep log files somewhere specific, you can specify a directory and filename like the following:</p>
<ul><code>export ULOGPFX=/var/log/tuxedo/VERYSPECIAL</code></ul>
<p>With that convention, you&#8217;d get a file created on the 12th of April 2009 called <code>/var/log/tuxedo/VERYSPECIAL.041209</code>.</p>
<p>Every message that Tuxedo places in the ULOG file comes from a message catalog. You can find a starting point for the Tuxedo message catalog reference <a href="http://download.oracle.com/docs/cd/E13161_01/tuxedo/docs10gr3/messages/index.html" target="_blank">here</a>. Nine times out of ten, if you have some cryptic message in the ULOG file, the message catalog documentation will shed some light on what&#8217;s going on, or at least give a hint of the general area of the problem. Unfortunately, one time out of ten, you&#8217;ll get a &#8220;Contact BEA Support&#8221; message, or a repeat of exactly what you&#8217;re seeing in the ULOG file.</p>
<p>One thing that gets overlooked sometimes when troubleshooting behaviour between a client and server is that the client gets their own ULOG file too. The same variables (<code>APPDIR</code> and <code>ULOGPFX</code>) control where it&#8217;s created. Oftentimes, <i>especially</i> with connectivity issues or situations where nothing appears to be happening in the Tuxedo application itself, it&#8217;s the logs for the client and server <i>together</i> that form the complete picture.</p>
<h2>TMTRACE: The Firehose</h2>
<p>Now, the standard information in the ULOG file is often enough to solve simple problems. But, sometimes a problem comes  along that&#8217;s complex enough that you need more. That&#8217;s where <code>tmtrace</code> comes in. It&#8217;s a facility in Tuxedo that allows you to provide more detailed information about what&#8217;s happening at runtime. It&#8217;s a very lightly documented feature, and I have to confess that my understanding of it borders on hoodoo. But I&#8217;ve found that even that hoodoo level of understanding is tremendously useful.</p>
<p>It works on a trace specification, which essentially allows you to specify three things:</p>
<ul>
<li>A trace category, identifying what area of Tuxedo you want more information on.
<li>Where you want information to go, which has to be the ULOG file.
<li>Whether you want your particular service request to &#8216;dye&#8217;, meaning that all work done as part of your service request will use the same trace configuration you&#8217;ve specified, or just use the current configuration for that server.
</ul>
<p>I&#8217;ll explain each of those in a little more detail to shed some light:</p>
<p>The trace category can be as broad as a number of key areas that the documentation provides, or specific as an individual function. Personally, I tend to use the broader areas that are documented, because it means not having to adjust trace specifications constantly. I&#8217;m a big fan of the firehose.</p>
<p>The documented categories are:</p>
<ul>
<li><code>atmi</code> &#8211; Specific ATMI functions
<li><code>iatmi</code> &#8211; work done implicitly on behalf of an ATMI function, or as part of administration. This is a superset of the <code>atmi</code> category.
<li><code>xa</code> &#8211; work done to manage XA transactions
<li><code>trace</code> &#8211; work done related to managing trace functionality
</ul>
<p>The first three areas tend to be the most useful. In fact, you can just set the firehose to pulverize, use &#8216;*&#8217;, and get everything.</p>
<p>In terms of destinations for trace information, there&#8217;s an exciting new change with the more recent versions of Tuxedo: you can now specify <code>utrace</code> as a destination, which can send trace information to a custom destination. <i>That was certainly new to me.</i> The <a href="http://download.oracle.com/docs/cd/E13161_01/tuxedo/docs10gr3/rf3c/rf3c.html#wp2186264">documentation</a> is a little unclear on the specific limits of <code>utrace</code>, and seems to indicate that it can only be used with tmtrace information.</p>
<p>Now, dyeing behaviour. I can set trace configuration as surgically as on a server by server basis. So individual processes can have either their own or no current trace configuration. They could be the quiet, introspective server that lives next door.</p>
<p>Because Tuxedo works on the concept of services, the work done in order to process my service call to process a credit card charge might not be as simple as I think. The one server that takes my service call might make two service calls of its own. One of those service calls might turn into another three service calls. The flow could end up looking like this:</p>
<p><img src="http://kevin-powe.nerdfu.net/blog/images/20090519-ServiceCallFlow.jpg"/></p>
<div style="text-align: center; font-size: smaller; font-weight: bold">One service calls five others in turn
</div>
<p>If we only want to use tracing for a specific flow of logic, to find out what happens with the full flow of processing, using dye allows us to follow processing not just for server A (where we&#8217;d set trace) but all the way through to servers D, E and F.</p>
<p>You can set trace configuration either using the <code>TMTRACE</code> environment variable, or using <a href="http://download.oracle.com/docs/cd/E13161_01/tuxedo/docs10gr3/rfcm/rfcmd.html#wp1971834" target="_blank">changetrace</a> from inside <code>tmadmin</code>. The simplest way to enable tracing is flick everything on, using <code>changetrace on</code>, or you could just enable tracing for ATMI functions and send trace info to the ULOG file, as follows:</p>
<ul>
<code>changetrace "atmi:ulog"</code>
</ul>
<p>For more information on trace specification formats, the best reference is the <a href="http://download.oracle.com/docs/cd/E13161_01/tuxedo/docs10gr3/rf5/rf5.html#wp1529614" target="_blank">documentation for tmtrace</a>.</p>
<p>So that&#8217;s the ULOG file, and TMTRACE. Both of these together will form the first and and best line of investigation when something is going wrong with your Tuxedo application. Typically, your ULOG file is kind enough to provide some idea of what is going wrong with your application without any additional work. If not, you can coax more useful information out via TMTRACE.</p>
<p>Next up, we&#8217;ll have a look at txrpt, and the .TMIB service in Tuxedo &#8211; both great tools that provide us with the basics of performance and runtime monitoring in Tuxedo.</p>
]]></content:encoded>
			<wfw:commentRss>http://kevin-powe.nerdfu.net/blog/?feed=rss2&amp;p=41</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Read The Log Files&#8230;</title>
		<link>http://kevin-powe.nerdfu.net/blog/?p=40</link>
		<comments>http://kevin-powe.nerdfu.net/blog/?p=40#comments</comments>
		<pubDate>Fri, 06 Feb 2009 09:19:19 +0000</pubDate>
		<dc:creator>Kevin Powe</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[Plain English]]></category>

		<guid isPermaLink="false">http://kevin-powe.nerdfu.net/blog/?p=40</guid>
		<description><![CDATA[I don&#8217;t claim to be a Top Gun consultant by any stretch of the imagination. Sadly, the Val Kilmer of IT consulting (whoever that might be) is unlikely to offer to let me ride his tail any time. (seriously, how could you deliver that dialogue with a straight face? Even in the 80s?)
But, I have [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kevin-powe.nerdfu.net/blog/images/20090205-evidence.jpg"/></p>
<p>I don&#8217;t claim to be a Top Gun consultant by any stretch of the imagination. Sadly, the Val Kilmer of IT consulting (whoever that might be) is unlikely to offer to <a href="http://www.youtube.com/watch?v=33Wbxh3Xz9c#t=2m31s" target="_blank">let me ride his tail any time</a>. (seriously, how could you deliver that dialogue with a straight face? Even in the 80s?)</p>
<p>But, I have gotten a <i>lot</i> of wins on client site by following one deceptively simple rule: <i>read the log files</i>. When strange things are happening intermittently, the first and best port of call is the log files for the system you&#8217;re debugging. Now, I don&#8217;t claim to be a genius in having discovered this rule. But it&#8217;s somewhere between surprising and depressing the number of times I&#8217;ve worked with really smart people and get a blank stare when I&#8217;ve asked &#8216;what do the log files say?&#8217;</p>
<p>And it&#8217;s wisdom I&#8217;ve come by the hard way myself. One of my first jobs was installing a HRMS system on client sites, and while troubleshooting a major hiccup with an install on client site, I was on the phone to our guru in the office. He asked if I&#8217;d checked the log files. I realised&#8230; I didn&#8217;t even know where the log files <i>were</i>. It turned out, if I&#8217;d checked them, I would have saved myself and the client a lot of grief, including a day&#8217;s work restoring from an old backup.</p>
<p>Log files are the forensic evidence of technical troubleshooting. And if we want to be the <a href="http://www.youtube.com/watch?v=5VxCmOfCo64" target="_blank">Grissoms of our own CSI</a>, then there&#8217;s a few pointers it&#8217;s worth following.</p>
<h3>Know where your log files are</h3>
<p>It might sound like an obvious rule of thumb, but cases often have more than one crime scene, and the most important one might not be particularly obvious. You might be driving requests to an application through an interface that&#8217;s not giving you much more than an &#8216;Error occurred&#8217;, but chances are a log file somewhere is dutifully scribing reams of text about the problem that&#8217;s occurring.</p>
<p>For JEE applications, for example, you&#8217;ve got your default server log file, and application-specific log files at the very least. In the case of WebLogic Server, you&#8217;ve got your domain log file as well, and if you&#8217;re having problems with your back-end database, then the real answer might be in XA trace logs on your database server.</p>
<p>Once you&#8217;ve established where your log files are, understand where you can go to get additional context on problems that are occurring, as well. If you&#8217;re fortunate enough to have a unique message id associated with the error that&#8217;s occurring, understand where to find the specific documentation for your product stack so you can get more information on that specific error. And if that doesn&#8217;t give you a satisfactory answer, your next step might be a good solid Googling.</p>
<h3>Don&#8217;t search on text strings</h3>
<p>If there&#8217;s one thing my years of intensive crime show watching have taught me, it&#8217;s that forensics are all about understanding the problem that&#8217;s there, not the one you think you have. Almost invariably, if you search on a text string to try and troubleshoot, you&#8217;ll miss something.</p>
<p>A bit part of troubleshooting is understanding specific problems or errors in the context of anything else that might be happening at runtime, as well. So searching for keywords or text strings will catapult you past pages of logging that may contain that vital clue that will crack the case.</p>
<h3>Look for patterns</h3>
<p>Individual error messages by themselves may not mean much, but combining error messages and application behaviour can be a telling sign. It could well be that a specific server-side component is causing database connection leaks. Or, maybe it&#8217;s accessing a particular page in your web application that is causing all of those JNI crashes.</p>
<p>Understanding the patterns of behaviour in an application (if you&#8217;re lucky enough to have several days of log file information to debug from) can be crucial to finding the core problem.</p>
<h3>Know how to turn on the fire hose</h3>
<p>Once you&#8217;ve gotten a fairly clear idea of what the problem is, knowing how to configure more verbose levels of debug information can be very important. Keeping a reference handy on the debug switches supported for the product you&#8217;re troubleshooting is never a bad idea. In the case of WebLogic Server, for example, from WebLogic Server 9.0 onward, a number of configurable debug switches can be selected from inside the Administration Console. Handy! (it&#8217;s important to note though that these switches are far from the complete list you can use)</p>
<p>I&#8217;d like to talk about some rules of thumb that I think are good to follow to make a log file to be proud of as an application developer, and also how to troubleshoot some specific technologies, but that&#8217;s enough for now. I&#8217;ll come back to the other stuff.</p>
<p>Got any log file experiences? Bizarre error messages involving processes being sent insane by zombie children or the like? Times where you&#8217;ve saved the day and come out a hero, all thanks to a few choice log file messages? Share them in the comments, or just drop me a line and let me know what you think!</p>
]]></content:encoded>
			<wfw:commentRss>http://kevin-powe.nerdfu.net/blog/?feed=rss2&amp;p=40</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thoughts on Training Delivery Part Three: The Venue</title>
		<link>http://kevin-powe.nerdfu.net/blog/?p=39</link>
		<comments>http://kevin-powe.nerdfu.net/blog/?p=39#comments</comments>
		<pubDate>Mon, 19 Jan 2009 13:53:59 +0000</pubDate>
		<dc:creator>Kevin Powe</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[Plain English]]></category>

		<guid isPermaLink="false">http://kevin-powe.nerdfu.net/blog/?p=39</guid>
		<description><![CDATA[Hello! Once again, profuse apologies for the silence. Moving to Perth, technical issues on the project I&#8217;m working on, and a crunch for deadlines for one of the products I&#8217;m involved in developing has meant that things have been a little disrupted for a while. But I&#8217;ve been thinking big thoughts&#8230; mostly about Tuxedo and [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://kevin-powe.nerdfu.net/blog/images/20090119-training-venue.jpg"></p>
<p>Hello! Once again, profuse apologies for the silence. Moving to Perth, technical issues on the project I&#8217;m working on, and a crunch for deadlines for one of the products I&#8217;m involved in developing has meant that things have been a little disrupted for a while. But I&#8217;ve been thinking big thoughts&#8230; mostly about Tuxedo and ALSB at the moment. They&#8217;re a rarified taste, but I&#8217;ll try to pass on some of what I&#8217;ve been dealing with in time.</p>
<p>For the moment though&#8230; now that I&#8217;ve found my notebook again, here&#8217;s a post I&#8217;ve had queued for a little while now and have been meaning to get around to.</p>
<p><br/></p>
<hr />
<br/></p>
<p>This is a much shorter post than the lengthy screeds on the <a href="http://kevin-powe.nerdfu.net/blog/?p=35">material</a> and <a href="http://kevin-powe.nerdfu.net/blog/?p=37">delivery</a> aspects of training, for three key reasons.</p>
<ul>
<li>One, I&#8217;m trying to learn my lesson about long posts.
<li>Two, I have less to say about this aspect of training delivery.
<li>Three, admittedly it&#8217;s the aspect of training you have the least amount of control over.
</ul>
<p>Fundamentally, a good training venue is one that can keep the trainer mobile, and the students awake. And, given that keeping the instructor mobile is about keeping students awake, it fundamentally boils down to keeping the students awake. The rest largely takes care of itself.</p>
<h3>Air conditioning and lighting</h3>
<p>There&#8217;s no greater recipe for sending students off to sleep than a warm, dimly lit room. Except maybe if you handed out pillows first. A good training venue should have reliable air conditioning. Without creating a welcoming environment for the penguins, err on the side of cooler. Also, bright lighting helps it feel less like Sleepytown.</p>
<h3>Snack time!</h3>
<p>It&#8217;s understandable that training venues often don&#8217;t allow students to eat food, given the mess it makes. But, even with the possibility of spills, good training venues let students (and the trainer) have drinks in the room. Water helps concentration, and coffee and tea helps students (and you as the trainer) fight through the tiredness as the week draws on.</p>
<p>Also, while sugar has a crash to go with its rush, the better training venues provide bowls of lollies for students to nibble on. Lollies like Minties or Fantales give students sugar to keep them awake, something to do besides listening, and something to eat that doesn&#8217;t make a mess.</p>
<h3>Remote mouse and projector</h3>
<p>If you can stay mobile as a trainer, you&#8217;ll be more awake and alert, and you&#8217;ll be able to be more engaging and dynamic in your delivery as a result. Being able to move around the room lets you interact with students directly &#8211; to be more dramatic, and vary how your delivery is physically arranged. But that requires two things.</p>
<p>First and foremost, the venue should use a projector to display the slides being talked to at the front of the room. That way, you can address the course material while still moving about. A laser pointer can help here as well, but that&#8217;s a matter of personal preference.</p>
<p>Second, some sort of remote to be able to interact with the PC displaying the slideware. I&#8217;ve used both a radio mouse and a laptop remote to good effect in the past. Being able to interact with the slideware remotely stops you having to continually dash back to press a key to move between slides &#8211; it lets your presentation flow more smoothly.</p>
<p>The other big bonus from having the slides projected to the front of the room is that it gives everyone a shared, central focal point, rather than staring at individual monitors.</p>
<h3>Internet-capable, well-spaced PCs</h3>
<p>The student&#8217;s PCs should, in the interests of comfort, be spaced far enough apart that students aren&#8217;t cramped together. A gap the size of a monitor between student&#8217;s monitors is a good starting rule.</p>
<p>Also, and this is a bit of a divided topic, the students should have internet access, and be able to use their PCs while you&#8217;re delivering training. It can mean that student&#8217;s minds will wander the internet rather than listen to you, but students are more likely to stay awake if they&#8217;re not forced into a passive role. I&#8217;ve delivered training for a partner where the students PCs were turned into passive broadcasters of the training material while the trainer is presenting, and it&#8217;s not great. It makes staying focused and awake more difficult for students, not to mention preventing them from tinkering or playing catchup with exercises.</p>
<p>Well, that&#8217;s it for thoughts on training venues, and training overall. Hope you&#8217;ve enjoyed the posts, as slow as they&#8217;ve been to arrive. Here&#8217;s to a better posting schedule in 2009 now that I&#8217;m settled down!</p>
]]></content:encoded>
			<wfw:commentRss>http://kevin-powe.nerdfu.net/blog/?feed=rss2&amp;p=39</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
