<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Bill Benac</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/" />
    <link rel="self" type="application/atom+xml" href="http://blog.billbenac.com/blog/atom.xml" />
    <id>tag:blog.billbenac.com,2008-07-25:/blog//1</id>
    <updated>2010-02-27T21:25:45Z</updated>
    <subtitle>Doing my part to improve your Google search results.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Personal 4.12</generator>

<entry>
    <title>WCI Settings Files: rules for construction</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2010/02/wci-settings-files-requirement.html" />
    <id>tag:blog.billbenac.com,2010:/blog//1.56</id>

    <published>2010-02-27T21:15:55Z</published>
    <updated>2010-02-27T21:25:45Z</updated>

    <summary>The world is full of rules. I was amused at a local Austin grocery store to find rules against something that seem pretty obvious: food trays are not sleds. Other rules though can be harder to figure out. In case...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="config" label="config" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="settings" label="settings" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wci" label="WCI" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="rules.jpg" src="http://blog.billbenac.com/blog/2010/02/27/rules.jpg" class="mt-image-right" style="float: right; margin: 0pt 0pt 20px 20px;" height="387" width="250" /></span>The world is full of rules. I was amused at a local Austin grocery store to find rules against something that seem pretty obvious: food trays are not sleds. Other rules though can be harder to figure out. In case you need to know some of these less obvious rules:<br /><br />I'm working on an effort to restructure WCI settings files, and a piece of this required understanding the rules for putting together a valid settings file. I hope to later explain the whole project, but until then, here's a subset of what I learned.<br /><br /><b>The Loose</b><br />WCI applications read in everything in the %WCI_HOME%\settings directory on startup. A default system would have these in c:\oracle\wci or some such location. That everything is read means WCI neither cares what your file names are nor what subfolders they may be in. For example, you can move .\settings\configuration.xml to .\settings\do-not-use\disabled.xml, and it will still work just fine. The system treats all information across all files as a single settings definition.<br /><br />You can also break apart the out-of-the-box XML files into new smaller files, or you can rearrange their content entirely. This explains how it is that systems run WCI 10.3.0.0 equally well for fresh installs versus upgraded installs even though each has differently structured XML files (for example, fresh installs store settings in configuration.xml that upgraded installs keep only in portal\portalconfig.xml and common\serverconfig.xml).<br /><br />You can add settings in the XML files that are not required and not used by the system. For example, you can have a context or a component defined but never used.<br /><br /><b>The Strict</b><br />Within the config files, however, you'll find tightly linked context, component, and client sections. Some rules are:<br /><ol><li>A context cannot be defined more than once.</li><li>A component name cannot be used more than once.</li><li>A component cannot have a subscribed client that is not a defined context.</li><li>A client cannot subscribe to two different contexts of the same component type.</li></ol><b>An Example</b><br />Now is a great time for an example. The following file sits on my system as %WCI_HOME%\settings\example.xml. When the system starts, this file is read into the settings definition, though nothing in it will be used by my applications. The system runs just fine, and it will continue to do so unless I uncomment any of the sections of the config file that are designed to break the four strict rules I previously listed.<br /><br /><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.billbenac.com/blog/2010/02/27/example.zip">Download the file</a></span> so you can load it in a readable XML parser, load it on your system, or tweak it. You can also try reading it in less readable format below.<br /><br />Enjoy!<br /><br />
<code>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;OpenConfig xmlns="http://www.plumtree.com/xmlschemas/config/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;context name="example-context"/&gt;<br />
	&lt;!-- ERROR 1: uncomment the below client to create "context with this name already exists" error --&gt;<br />
	&lt;!--	<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;context name="example-context"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- include the below context to illustrate that listed contexts need not be used --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;context name="example-context-unused"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component name="example-component" type="http://www.plumtree.com/config/component/types/example-type"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;setting name="sometype:something"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value xsi:type="xsd:boolean"&gt;true&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/setting&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;client name="example-context"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- ERROR 2: uncomment the below client to create "context could not be opened" error --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;client name="undeclared-context-breaks-system"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/component&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- include the below component to illustrate that components need not have clients --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component name="example-component-no-clients" type="http://www.plumtree.com/config/component/types/example-type"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;setting name="sometype:something"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value xsi:type="xsd:boolean"&gt;true&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/setting&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/component&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- ERROR 3: uncomment the below component to create "component with this name already exists" error --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component name="example-component-no-clients" type="http://www.plumtree.com/config/component/types/example-type2"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;setting name="sometype:something"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value xsi:type="xsd:boolean"&gt;true&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/setting&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/component&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- ERROR 4: uncomment the below component to create "context already subscribes to component of type" error --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component name="example-component-duplicate-type" type="http://www.plumtree.com/config/component/types/example-type"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;setting name="sometype:something"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value xsi:type="xsd:boolean"&gt;true&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/setting&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;client name="example-context"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/clients&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/component&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br />
&lt;/OpenConfig&gt;<br />

</code>
<br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>ALUI/WCI SSO Login Sequence and Log Files</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2010/01/aluiwci-sso-login-sequence-and.html" />
    <id>tag:blog.billbenac.com,2010:/blog//1.55</id>

    <published>2010-01-20T19:27:53Z</published>
    <updated>2010-01-20T20:02:47Z</updated>

    <summary>You can&apos;t trust your web server logs to tell you how many pages your portal users view. When logging in, especially under SSO, the login sequence generates several &quot;GET /portal/server.pt &quot; lines. I dug into this today, and the results...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="alui" label="alui" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="sequence.gif" src="http://blog.billbenac.com/blog/2010/01/20/sequence.gif" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;" height="191" width="327" /></span>You can't trust your web server logs to tell you how many pages your portal users view. When logging in, especially under SSO, the login sequence generates several "<i>GET /portal/server.pt </i>" lines. I dug into this today, and the results may be helpful as you look to infer portal usage from log files.<br /><br />Yesterday I turned to IIS logs to determine some usage patterns in the portals I work with where users can enter through two different SSO systems. I started my search by looking at how many times SSOLogin.aspx occurred for each SSO system (hosted on different servers). When the results appeared material, today I wondered whether the load for the systems are different. Do the users of one SSO system have a more engaged portal session?<br /><br />First I counted simply "<i>GET /portal/server.pt</i>" in the log files, and I though one set of users had far more pages per session than did the other. However, I then realized that gateway images were returned by my search pattern, so I added a space: "<i>GET /portal/server.pt </i>" This made the traffic look much more similar.<br /><br />But I still didn't know how many actual pages the user sees. What happens in the login sequence?<br /><br />What I found was:<br /><br />* It is hard to identify actual pages per visit because the IIS log sometimes shows 3 and sometimes 4 requests per login.<br />* A user's login generates three lines in the IIS log with "GET /&lt;virtualdirectory&gt;/server.pt/ "&nbsp; when the user enters the portal through http(s)://&lt;portalhost&gt;/<br />* A user's login generates four lines in the IIS log with "GET /&lt;virtualdirectory&gt;/server.pt/ "&nbsp; when the user enters the portal through http(s)://&lt;portalhost&gt;/&lt;virtualdirectory&gt;/server.pt<br /><br />The login sequence as found in IIS logs looks similar to this:
<br />
<br />1. The unidentified user enters without specifying the 
&lt;virtualdirectory&gt;/server.pt, then redirects to the SSO login <br /><i>/&nbsp; 

</i><br /><br />2. The SSO-authenticated user is redirected to the portal from the WSSO 
login
<br /><i>/portal/server.pt&nbsp; 

</i><br /><br />3. The SSO-authenticated user is directed to the portal's SSOLogin 
sequence to process the SSO token and become portal-authenticated
<br /><i>/portal/sso/SSOLogin.aspx</i>&nbsp; 

<br /><br />4. The portal-authenticated user runs a login sequence to determine the 
proper home page behavior
<br /><i>/portal/server.pt open=space&amp;name=Login&amp;dljr=&nbsp; 

</i><br /><br />5. The user lands on the proper home page
<br /><i>/portal/server.pt/community/superstuff/204&nbsp; 

</i><br /><br />I hope that's helpful.<br />]]>
        
    </content>
</entry>

<entry>
    <title>Love at First Boot: The D-Link DNS 323 NAS</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/12/love-at-first-boot-the-dlink-d.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.54</id>

    <published>2009-12-09T19:09:21Z</published>
    <updated>2009-12-09T21:15:06Z</updated>

    <summary>Remember that giddy feeling when in high school you first ate lunch on the grass with that special someone, the object of your springtime infatuation? Ahhh. So sweet. I&apos;m reliving that feeling with my newly installed NAS. I tenderly call...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="Off Topic Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dns323" label="DNS 323" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="nas" label="NAS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="networking" label="networking" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="storage" label="storage" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="D-Link_DNS-323[1].jpg" src="http://blog.billbenac.com/blog/2009/12/09/D-Link_DNS-323%5B1%5D.jpg" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;" height="280" width="280" /></span>Remember that giddy feeling when in high school you first ate lunch on the grass with that special someone, the object of your springtime infatuation? Ahhh. So sweet. I'm reliving that feeling with my newly installed NAS. I tenderly call her "323" for short, but her parents call her "D-Link DNS-323 2-Bay Network Storage Enclosure." I can see beyond her toaster looks...<br /><br />I don't blog about every early Christmas present, but this NAS is so geek-winningly hackable, and I wound up doing such a number on my home network for it that I can't help but share the story. This may be helpful to other web wanderers, just as I relied on many blog posts, discussion forums, and so forth to get set up.<br /><br /><b><font style="font-size: 1.25em;">Benefits</font></b><br /><br />First the benefits of this relationship:<br /><br />1. Network Attached Storage -- You know at the office how nice it is to always have access to those never-ending shared drives that corporate IT provides. I now have it at home. Instead of keeping only select music stored on my computer and the rest locked away on that external USB drive in my wife's office, it's all available. The old cables and plugs were a barrier to access.<br /><br />2. Peace of Mind -- With RAID-1 and two SATA drives, my data won't get lost when a hard drive fails.&nbsp; And every hard drive fails sooner or later.<br /><br />3. Openness -- The 323 runs an embedded Linux, and D-Link built a hook to let folks access the core. Extend it with Subversion, SSH, MySQL, or if you're crazy enough you can even install a new Debian.<br /><br />4. FTP -- The built-in FTP server and granular security model lets me access, share, or backup content from outside the home.<br /><br />5. iTunes Server -- The device can discover its music then broadcast it to iTunes clients on the network.<br /><br />6. Scheduled Downloads -- It can schedule downloads of files and folders from an FTP server, web server, or local network share. I don't want to fully rely on my web hosting providers to backup my data, and this lets me keep a copy too.<br /><br />The feature list is rich, but not all of it applies to me -- yet. We'll see how my thinking shifts as she and I get to know each other better. Other people though are interested in its BitTorrent feature, UPnP AV server, or others<br /><br />Now for some details.<br /><br /><font style="font-size: 1.25em;"><b>The Hard Drives</b></font><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kermit[1].jpg" src="http://blog.billbenac.com/blog/2009/12/09/Kermit%5B1%5D.jpg" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;" height="400" width="347" /></span>In keeping with the do-it-yourself offering, the 323 doesn't come with hard drives. It's just an enclosure. So what did I buy? I admit that I was driven by price rather than features, but I still wound up with a pair great drives. Amazon was selling Western Digital's energy efficient WD10EADS drives cheaper than any of the other 1TB options, at least with 7200 rpm. It's cool to be green (no matter what Kermit says), but I'm more excited about the cool temperature than the green energy savings. As drives heat up, the probability of failure increases dramatically. More on failures later. The 323 has a feature to monitor the temperature and at high levels, send an email alert and then shut down. I want this feature, but I also don't want it to ever be triggered. The drives were $69 each when I bought, but perhaps for the holidays they have since risen to $84. <br /><br />Installing the drives to the 323 was easy. I just tore open the drive packages from Amazon, slid the front plate off the 323, and pushed in the drives. No tools required.<br /><br /><font style="font-size: 1.25em;"><b>Improving the Home Network</b></font><br /><br />In order for my wife and me to share the NAS, our laptops need IP addresses from the same network. Previously, we didn't have this. The Internet drop and primary wireless router (an old WRT54g) are in my office. Since her office is on the other side of the house, and since the house has built-in ethernet wiring from the location of the Internet drop, we put a secondary wireless router (an older BEFW11S4) near her office that pulls data from the ethernet port.That router though was configured the easy way, with DHCP enabled and placing her on a different network. I was on 10.1.10.x, and she was on 10.1.11.x. So here's what I did:<br /><br />1. Made sure the primary router ran normally, with our ISP's Internet provided through the router's WAN port<br />2. Made sure the secondary router ran normally, with the primary router's Internet provided through the secondary router's WAN port<br />3. Changed the secondary router to use a static IP, which in retrospect may not have been necessary<br />4. Configured the secondary router's Setup-&gt;Advanced Routing page to both send and receive RIP 1, which may not have been necessary but one blog suggested<br />5. Moved the secondary router's ethernet cable from the WAN port to port 1 which does uplink.<br /><br />That was it. Now when my wife connects to the secondary router by her office, it acts as a switch to get to the primary router, and the primary router gives her an IP address in 10.1.10.x so we can both communicate with the NAS.<br /><br /><b><font style="font-size: 1.25em;">Improving the 323</font></b><br /><br />Out of the box the 323 is nice, but it really starts to get cool once you start treating it as a customizable Linux box instead of just a hard drive. The device has a thriving community supporting it, and it's a great example of how a company's decision to open their product up can improve its usefulness and cultivate buzz (e.g. this blog post). The best site for the product may be <a href="http://wiki.dns323.info/">http://wiki.dns323.info/</a>. I proceeded cautiously installing my first "fun_plug" file to execute my commands at startup based on instructions at that site. Once my feet were wet, I installed a package of Unix tools called "ffp" (Fonz fun_plug) following the instructions at <a href="http://nas-tweaks.net/CH3SNAS:Tutorials/fun_plug">nas-tweaks.net</a>. <br /><br />In no time at all, I had logged in through telnet, disabled that insecure service, set up SSH, and begun looking around. I then followed the instructions at <a href="http://www.horto.ca/?p=27">another blog</a> to install the usb-storage.ko module allowing me to mount Fat32 USB devices through the 323's USB port. I got my wife's old iPod Mini loaded up with little effort. <br /><br /><b><font style="font-size: 1.25em;">Breaking Up, not Backing Up, with Standard USB Hard Drives</font></b><br /><br />After setting up a few directories on the hard drives with proper security, I powered up the old 250 gb USB drive that started all this. The prior time my wife started it was ten days ago, and that time like this time it behaved the same way: a few minutes of near-silent, slow clicking, then an awakening and normal operation. We suspect it's on the verge of death. Before going to sleep, I dragged the old drive's folders to the 323, and let it run through its 10 hour transfer from sinking skiff to reliable coast guard cutter.<br /><br />What's the problem with standard USB drives, and why should you not rely on them? Every drive fails, and you don't want to backup to a device with a fuse burning toward self destruction. Before moving to the RAID solution and while looking for a replacement for the old USB drive, I realized that every drive Amazon sells, given enough reviews, will have some frightening proportion of customers saying this like "It died after two weeks and I lost all my data! I'm never buying from this company again! Avoid this drive!" Every drive does this. Really?<br /><br />I did a little research, and I found a great paper put together by some Google engineers. The guys who support the Google infrastructure have to buy a lot of drives and must know something about failure rates, right? <a href="http://labs.google.com/papers/disk_failures.pdf">Failure Trends in a Large Disk Drive Population</a> may be more scientific than you're interested in, but at least consider this picture:<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="drive-failure.jpg" src="http://blog.billbenac.com/blog/2009/12/09/drive-failure.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="318" width="400" /></span>Enough said.<br /><br />Anyway, that's my personal tech journal for the week.<br /><br />Enjoy!<br /><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>MySQL Slave Revolt: Avoid &apos;Duplicate entry for key 1&apos;</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/11/mysql-slave-revolt-avoid-dupli.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.53</id>

    <published>2009-11-15T10:44:50Z</published>
    <updated>2009-11-24T23:30:31Z</updated>

    <summary>Here&apos;s a post that will be of little interest to my normal readers but that may be helpful to Googlers. If this helps you, please drop a comment letting me know. I need encouragement to go so far off topic...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="Off Topic Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="replication" label="replication" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="slaves" label="slaves" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="amistad.jpg" src="http://blog.billbenac.com/blog/2009/11/15/amistad.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="415" width="700" /></span><br clear="all" />Here's a post that will be of little interest to my normal readers but that may be helpful to Googlers. If this helps you, please drop a comment letting me know. I need encouragement to go so far off topic from my normal posts.<br /><br />Several years ago I bought the history book on which the movie Amistad had been based. The Amistad was a ship carrying slaves to the Americans, and its captives revolted. The movie, which I didn't see, was apparently exciting enough, but the book was tedious. I wanted to never revisit it or anything like it again. But alas, I've encountered what could be called a slave revolt.<br /><br />MySQL has a strange behavior on slaves with the CHANGE MASTER command that cost me a few hours of sleep. Sometimes when values are set with the command, those values merge into the master.info file. However in other cases after using the command, the values in master.info are lost. A sequence of commands that seemed reasonable to me left me without the proper master bin-log and offset log position, and this caused my slave to get errors like 'Duplicate entry for key 1.'<br /><br />Here's how I discovered this behavior:<br /><br />First, I created a dump using the syntax that places within the dump an update statement to set the master's position:<br /><br /><i>mysqldump --all-databases --master-data=1 --add-locks -u myuser -p &gt; full.db.`date +"%F"`.dmp</i><br /><br />Afterward, I can check my dump and find that indeed, it provides the master's bin-log and position:<br /><br /><i>CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000494', MASTER_LOG_POS=169;</i><br /><br />I then bring the dump to my slave server. If I first import the dump and rely on its values to set the master's position, I'll get errors when replication begins. The errors are caused because the replication picks up at the oldest bin-log instead of the right one. The errors, found after running "show slave status\G;" are like this:<br /><br /><i>Last_Error: Error 'Duplicate entry '3363837' for key 1' on query. Default database: 'myapp'. Query: 'INSERT INTO mytable (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blah,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blah2,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blah3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) VALUES(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '1',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '2009-11-01T00:06:16-05:00',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'stuff'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )'</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />What I really should have done to avoid the errors would have been to run a CHANGE MASTER command that stated everything rather than skipping the details that the dump included.<br /><br />After looking into this further, I find that as expected, the dump creates a master.info file with the master's proper bin-log and offset, and that master.info doesn't yet have the server connection details. Then after providing just the connection details through CHANGE MASTER, contrary to my expectation it then wipes out the bin-log and offset values rather than properly merging. I can fix this by then providing just the bin-log and offset values, which are properly merged into master.info.<br /><br />Commands illustrating this are below:<br /><i><br />[root@myhost ~]# # import the master's data<br />[root@myhost ~]# mysql -u root -p{secret} &lt; /tmp/full.db.2009-11-14.dmp<br />[root@myhost ~]# # see what the dump put into master.info<br />[root@myhost ~]# cat /var/lib/mysql/master.info <b># notice this first iteration of the file has no connection info</b><br />14<br />bin-log.000494<br />169<br /><br />test<br /><br />3306<br />60<br />0<br /><br /><br /><br /><br /><br />[root@myhost ~]# # set the partial details as documented<br />[root@myhost ~]# mysql -u root -p{secret} --execute="CHANGE MASTER TO MASTER_HOST='10.1.1.14', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='supersecret';"<br />cat /var/lib/mysql/master.info<br />[root@myhost ~]# # check if that put anything in master.info<br />[root@myhost ~]# cat /var/lib/mysql/master.info <b># notice this second iteration dropped the bin-log and log position</b><br />14<br /><br />4<br />10.1.1.14<br />repl<br />supersecret<br />3306<br />60<br />0<br /><br /><br /><br /><br /><br />[root@myhost ~]# # set the remaining details as though nothing had been in dump<br />[root@myhost ~]# mysql -u root -p{secret} --execute="CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000494', MASTER_LOG_POS=169;"<br />[root@myhost ~]# # check if that put anything in master.info<br />[root@myhost ~]# cat /var/lib/mysql/master.info <b># notice this third iteration merged in the bin-log and log position</b><br />14<br />bin-log.000494<br />169<br />10.1.1.14<br />repl<br />supersecret<br />3306<br />60<br />0<br /><br /><br /><br /><br /><br />[root@myhost ~]# # set everything and see the results:<br />[root@myhost ~]# mysql -u root -p{secret} --execute="CHANGE MASTER TO MASTER_HOST='10.1.1.14', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='supersecret', MASTER_LOG_FILE='bin-log.000494', MASTER_LOG_POS=169;"<br />cat /var/lib/mysql/master.info<br />[root@myhost ~]# cat /var/lib/mysql/master.info <b># notice this fourth iteration that sets everything looks like the third iteration</b><br />14<br />bin-log.000494<br />169<br />10.1.1.14<br />repl<br />supersecret<br />3306<br />60<br />0<br /><br /></i><br /><br />So in short, don't rely on the dump to set master.info values for you. Just put them all into your mysql prompt similar to this:<br /><i><br />mysql&gt; CHANGE MASTER TO MASTER_HOST='10.1.1.14',<br />&nbsp;&nbsp;&nbsp; -&gt; MASTER_PORT=3306,<br />&nbsp;&nbsp;&nbsp; -&gt; MASTER_USER='repl',<br />&nbsp;&nbsp;&nbsp; -&gt; MASTER_PASSWORD='supersecret',<br />&nbsp;&nbsp;&nbsp; -&gt; MASTER_LOG_FILE='bin-log.000494',<br />&nbsp;&nbsp;&nbsp; -&gt; MASTER_LOG_POS=169;</i><br /><br />Enjoy!<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Cache Portlet Content on 10gR3 (Workaround to bug 8689121)</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/10/cache-portlet-content-on-10gr3.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.52</id>

    <published>2009-10-30T15:42:54Z</published>
    <updated>2009-10-30T15:52:19Z</updated>

    <summary>Here&apos;s another workaround. Download this post, the batch file it refers to, and the wget utility from CachedPortletContent-Workaround.zip.Overview=========This describes a way to get results similar to the ALUI portal&apos;s Cached Portlet Content feature of the ALUI portal. This is useful...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bug" label="bug" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[Here's another workaround. <br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="" src="http://blog.billbenac.com/blog/2009/10/30/work-around%5B1%5D.jpg" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;" width="400" /></span><br />Download this post, the batch file it refers to, and the wget utility from <br /><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.billbenac.com/blog/2009/10/30/CachedPortletContent-Workaround.zip">CachedPortletContent-Workaround.zip</a></span>.<br /><br />Overview<br />=========<br />This describes a way to get results similar to the ALUI portal's Cached Portlet Content feature of the ALUI portal. This is useful for users of Oracle's WebCenter Interaction 10gR3, a release that has a bug (No.&nbsp; 8689121) that causes this feature to otherwise be unavailable. As the bug database describes it, "WHEN "RUNNING PORTLETS AS JOBS", THE JOB WILL FAIL."<br /><br />Cached Portlet Content Feature<br />=========<br />You can read about the Cached Portlet Content feature at http://download.oracle.com/docs/cd/E12529_01/ali65/AdministratorGuide_ALI_6-5/tsk_portlets_cachingcontent.html. As that page describes, "You might occasionally want to run a job to cache portlet content (for example, if the portlet takes a couple minutes to render). When the job runs, it creates a snapshot of the portlet content (in the form of a static HTML file) that can be displayed on a web site. The file is stored in the shared files directory (for example, C:\bea\ALUI\ptportal\6.5) in \StagedContent\Portlets\&lt;portletID&gt;\Main.html. You can then create another portlet that simply displays the static HTML."<br /><br />Workaround<br />==========<br />The alternate way to get cached portlet content is to create an external operation that will call the URL of the desired content and then will save it to the automation server's file system. This uses wget.exe, a program that is standard on UNIX environments and that is distributed with this workaround for Windows. The port I use is from <a href="http://sourceforge.net/projects/unxutils/">http://sourceforge.net/projects/unxutils/</a>. <br /><br />Installation<br />==========<br />1. Put wget.exe into the %WCI_HOME%\ptportal\10.3.0\scripts directory of your automation server (e.g. D:\bea\alui\ptportal\10.3.0\scripts). This application allows you to access web pages from the command line and then to save them to the file system.<br />2. Put the wget-extop.bat file into the %WCI_HOME%\ptportal\10.3.0\scripts directory of your automation server.<br />3. Test that it works by opening a command prompt on your automation server to %WCI_HOME%\ptportal\10.3.0\scripts, then running a command like this one:<br /><br />"wget-extop.bat" http://www.target.com target-homepage<br /><br />When that command finishes, you should see a success message similar to the following:<br /><br />20:46:28 (104.98 KB/s) - `..\StagedContent\portlets\target-homepage\Main.html' saved [80621]<br /><br />4. Make sure logging works properly. You should find a file in %WCI_HOME%\ptportal\10.3.0\scripts named wget-extop.log. Open that file and see that it recorded your recent action.<br /><br />5. Make sure the action downloaded the webpage. You should find it in a location like %WCI_HOME%\ptportal\10.3.0\StagedContent\portlets\target-homepage\Main.html.<br /><br />6. Open the portal and create an external operation object. On the main settings page, enter an Operating System Command like this:<br /><br />"wget-extop.bat" http://www.target.com target-homepage<br /><br />The command has three parts. First it names the batch file you'll use. Second, it gives the URL to download. Third it gives the identifer for this download that will be the directory in which the downloaded content will be stored. Be careful to use only characters in the identifer name that work as directory names. An identifer like "http://www.target.com" will not work because you cannot have slashes in a directory name. Your command may be this:<br /><br />"wget-extop.bat" http://www.my-company.com/about.html about-our-company<br /><br /><br />7. In the portal, create a job that will run your external operation. Schedule it to run at the appropriate interval.<br /><br />wget-extop.bat<br />==========<br />The contents of wget-extop.bat should be as follows:<br /><br />@REM BEGIN WGET-EXTOP.BAT<br /><br />set arg1=%1<br />set arg2=%2<br /><br />md ..\StagedContent\portlets\%arg2%<br /><br />echo %date% - %time% --- wget %arg1% -O ..\StagedContent\portlets\%arg2%\Main.html &gt;&gt; wget-extop.log<br />wget %arg1% -O ..\StagedContent\portlets\%arg2%\Main.html<br /><br />@REM END WGET-EXTOP.BAT<br /><br /><br />Limitations<br />==========<br />This workaround does not offer all the features that the Cached Portlet Content feature normally has. The main reason for limitations is that this request uses wget rather than the portal engine to request content. The request therefore has no access to portlet preferences and so forth. While this workaround is sufficient in some cases, it does not claim to work in all.<br /><br />Enjoy.<br /><br />Bill Benac<br />October 2009 <div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Is that a [BLANK] or a Bug? Resetting Login Tokens.</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/09/is-that-a-blank-or-a-bug-reset.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.51</id>

    <published>2009-09-17T18:55:46Z</published>
    <updated>2009-09-17T19:38:42Z</updated>

    <summary>In software development, we can sometimes have maddening debates about whether something is a feature or a bug. This reminds me of an old Phish song: Windora Bug.&quot;Is that a wind? Or a bug? It&apos;s a Windora bug.&quot; In other...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bug" label="bug" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[In software development, we can sometimes have maddening debates about whether something is a feature or a bug. This reminds me of an old Phish song: Windora Bug.<br /><br />"Is that a wind? Or a bug? It's a Windora bug." In other words, it's both. While troubleshooting your system, you might want to listen to the <span class="mt-enclosure mt-enclosure-audio" style="display: inline;"><a href="http://blog.billbenac.com/blog/2009/09/17/windora_bug.mp3">mp3</a></span>. <br /><br />In WCI 10gR3, we find the collision of two reasonable features. I think together they make a bug. Or at least, a badly designed feature. So let's start with the old feature:<br /><br />Sometimes agents outside the portal need to authenticate in. Users count as agents, and so do remote portlets. To allow the agent to log in without providing a password each time, the portal can send a login token that the agent can use for future portal connections. Two old examples of this are [1] when a person uses the "Remember my Password" feature of the portal login screen (usually valid for many days) and [2] when a remote portlet web service sends a login token to the remote service (usually valid for five minutes). The login token held on the remote tier by the agent can be decrypted by the server using its key. This works fine in both the old use cases I provided because the remote tier is handed this value by the portal server.<br /><br />For whatever reason, you may decide every once in a while that there is a security issue related to saved passwords. The portal had a great feature in the old days to let you update the login token's root key and thereby invalidate these old login tokens forcing users to reauthenticate. The tool for the reset is in the administrative portal under the Portal Settings utility, and it looks something like this:<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="update-login-token-key.jpg" src="http://blog.billbenac.com/blog/2009/09/17/update-login-token-key.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="96" width="503" /></span>When you click that "Update" button, it connects to the portal database and generates a new login token root key, stored in PTSERVERCONFIG with settingid 65.<br /><br />The trouble comes in with the new feature. In 10gR3, the portal introduces new applications that encrypt passwords based on the login token root key, but this is done at configuration time in the remote application's Configuration Manager. The problem is that those applications are built apparently assuming that the login token root key will never change. The configuration manager requires that you provide the login token root key to it directly. Applications that do this include but are not limited to the Common Notification Service and Analytics. For example:<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="update-login-token-analytics.jpg" src="http://blog.billbenac.com/blog/2009/09/17/update-login-token-analytics.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="346" width="696" /></span>The upshot of all this is that if you choose to click that button in the Portal Settings utility, then you get a new login token root key that no longer matches the one relied on by your remote applications. <br /><br />If this part of the portal were reconceived, then perhaps the database would have one login token root seed used for agents with a transient token such as those given to users and through remote web service calls that are used to let the agent come back. Those keys basically say, "you've been here before, and you can come back." Then the database might have a second root seed for applications that need permanent access to the portal. In that case, the update feature would be fine, and it would only apply to the key for transient agents.<br /><br />Oh well. We have to live with it. So to avoid administrators accidentally breaking remote applications, I suggest you update the portal UI to explain the full effect of this particular feature (if you don't want to go through the headache of an involved UI modification to entirely remove it). I did this and now have the following:<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="update-login-token-key-new.jpg" src="http://blog.billbenac.com/blog/2009/09/17/update-login-token-key-new.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="177" width="497" /></span>I got there by modifying this file on the admin servers:<br /><blockquote>d:\bea\alui\ptportal\10.3.0\i18n\en\ptmsgs_portaladminmsgs.xml<br /></blockquote>Within it I changed strings 2134, 2135, 2136, and 2964. My file has no other modifications in it from the vanilla 10.3.0 version. You can <span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.billbenac.com/blog/2009/09/17/ptmsgs_portaladminmsgs.xml">download it here</a>.</span><br /><br />Enjoy.<br /><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>How to Better Revive a Failed Search Node (and Why)</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/09/how-to-better-revive-a-failed.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.50</id>

    <published>2009-09-03T18:59:13Z</published>
    <updated>2009-09-03T20:02:32Z</updated>

    <summary>I&apos;ve been working with the same technology stack for an amazingly long nine years. This has given me much opportunity to work with the same types of issues over and over, and in doing so, I&apos;ve refined my approach quite...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="alui" label="alui" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bug" label="bug" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[I've been working with the same technology stack for an amazingly long nine years. This has given me much opportunity to work with the same types of issues over and over, and in doing so, I've refined my approach quite a bit. Thus, here's a post that is essentially an improvement on a two year old post, <a href="http://blog.billbenac.com/blog/2007/11/how-to-revive-a-failed-search.html">How to Revive a Failed Search Node</a>. I hope this post will offer both a better description of the problem and a better solution to it.<br /><br />The WebCenter Interaction search product has two features that can interfere with each other. First, on the search cluster, you can schedule checkpoints to essentially wrap up and archive the search index to give you the ability to later restore it. Second, on the search nodes, at startup the node's index looks to the directories on the search cluster to synchronize in a copy of the latest index. <br /><br />Customers running both checkpoints and multiple nodes periodically encounter trouble because the checkpoint process removes old search cluster request directories that the nodes want to access. So if you have one of your search nodes go down, but the other node keeps working and checkpoints continue to run on a daily schedule, then after a few days and by the time you realize one node had failed, then it won't start. It fails when it tries to access the numbered directory that had existed last time it had run properly. The errors in your %WCI_HOME%\ptsearchserver\[version]\[node]\logs&nbsp; may look like these in such a case:<br /><br /><blockquote><i>Cannot find queue segment for last committed index request: \\servername\SearchCluster\requests\1_1555_256\indexQueue.segment<br /></i></blockquote><br />Indeed, if you look at the path that was shown in the error, you'll find that the numbered folder no longer exists. Perhaps the latest folder will be SearchCluster\requests\1_1574_256. <br /><br />The fix is to reset the search node so that it no longer expects that specific folder upon which it had been fixated. I wrote about a way to do this with several manual steps in my prior post. This time, however, and after encountering the problem perhaps tens of times, I'm sharing a batch file that I place on Windows search servers to automate the reset process (and this works on both ALUI 6.1 and WCI 10gR3):<br /><br /><blockquote><i>set searchservice1=myserver0201</i><br /><i>set search_home=c:\oracle\wci\ptsearchserver\10.3.0</i><br /><i>@rem </i><br /><i>@rem configure the above two variables</i><br /><i>@rem </i><br /><i>net stop %searchservice1%<br /></i><i>c:</i><br /><i>rmdir /s /q %search_home%\%searchservice1%\index\</i><br /><i>mkdir %search_home%\%searchservice1%\index\1</i><br /><i>echo 1 &gt; %search_home%\%searchservice1%\index\ready</i><br /><i>cd %search_home%\%searchservice1%\index\1</i><br /><i>..\..\..\bin\native\emptyarchive lexicon archive</i><br /><i>..\..\..\bin\native\emptyarchive spell spell</i><br /><i>net start %searchservice1%</i><br /></blockquote><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="search-panel.jpg" src="http://blog.billbenac.com/blog/2009/09/03/search-panel.jpg" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;" width="300" /></span>To find the name of the search service that goes in the first parameter, open your Windows services panel, find your search node, right-click into its properties page, and find the "service name" value. This is not the same as the display name. The service name by default is [machine][node] as far as I can tell. So on my box (bbenac02) as the first node, my service name is bbenac0201. This is different from the display name, which defaults to something like "BEA ALI Search bbenac0201."<br /><br />Enjoy!<br />]]>
        
    </content>
</entry>

<entry>
    <title>The Phantom Menance: Errors From Obsolete User IDs</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/09/the-phantom-menance-errors-fro.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.49</id>

    <published>2009-09-01T14:47:46Z</published>
    <updated>2009-09-01T17:29:30Z</updated>

    <summary>I&apos;ll stick with the Star Wars theme from my past post because today&apos;s issue is quite similar (even though I haven&apos;t bothered to watch all the movies in the series). Do you occasionally encounter errors that are tied to phantom...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bug" label="bug" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="phantom.jpg" src="http://blog.billbenac.com/blog/2009/09/01/phantom.jpg" class="mt-image-none" style="" align="left" height="424" hspace="10" vspace="10" width="312" /></span>I'll stick with the Star Wars theme from my past post because today's issue is quite similar (even though I haven't bothered to watch all the movies in the series). Do you occasionally encounter errors that are tied to phantom users?<br /><br />My customer tried propagating security into a WCI admin folder using the async job option today, but they got an error similar to this in the job log:<br /><br /><blockquote><i>Sep 1, 2009 9:56:39 AM- *** Job Operation #1 of 1 with ClassID 20 and ObjectID 334 cannot be run, probably because the operation has been deleted.<br /></i></blockquote><br />In the error log on the automation server, we found something like this:<br /><br /><blockquote><i>Error creating operation 20:302</i><br /><i>com.plumtree.server.marshalers.PTException: -2147204095 - InternalSession.Connect(): UserID (205) not found.</i><br /></blockquote><br />Indeed, user 205 didn't exist. Where did the portal get the idea it should look for the user? It turns out that at the time the particular admin folder was created (folder ID 302), it was created by user 205. Later, that user was deleted from the system, but just as in my last post, sometimes when an object is deleted, references to that object are left in certain tables of the database. In this case, the deletion of a user does not trigger a removal of that user's ownership of certain objects like admin folders. I ran this query to look for all instances of the problem:<br /><br /><blockquote><i>select folderid from ptadminfolders where ownerid not in (select objectid from ptusers)</i><br /></blockquote><br />The fix here is to set the ownership of that particular folder (and all others) to the administrative user:<br /><br /><blockquote><i>update ptadminfolders set ownerid=1 where ownerid not in (select objectid from ptusers)</i><br /></blockquote><br />While we're thinking about this class of problem, we can look for others cases where a phantom user remains, since in some of these cases it will become a menace. The following is a list of queries that found phantom users at my current customer:<br /><br /><blockquote><i>select folderid from ptadminfolders where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptcards where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptcrawlers where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptcommunities where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptdatasources where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptdocumenttypes where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptfilters where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptgadgetbundles where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptgadgets where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptgcservers where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptjobs where ownerid not in (select objectid from ptusers)</i><br /><i>select objectid from ptwebservices where ownerid not in (select objectid from ptusers)</i><br /></blockquote><br />I suggest in each of the above cases that you replace the phantom user with the administrator user. This will cause no harm, and in some cases it allows you to avoid errors:<br /><br /><blockquote><i>update ptadminfolders set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptcards set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptcrawlers set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptcommunities set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptdatasources set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptdocumenttypes set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptfilters set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptgadgetbundles set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptgadgets set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptgcservers set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptjobs set ownerid=1 where ownerid not in (select objectid from ptusers)<br />update ptwebservices set ownerid=1 where ownerid not in (select objectid from ptusers) </i><i></i><br /></blockquote><br />Again, like the problem I last wrote about with the phantom footer ID, this one with users is a bug. The fix would be to add to the deleteUser() method a command to clean up each of these tables. Since no fix is provided, you might set up a nightly job on your database to run these cleanup queries.<br /><br />Enjoy!<br /><br />PS: you might like this sed example that converts the list of select statements from this post (saved as select.txt) into the list of update statements:<br /><br /><blockquote><i>sed -r s/.*("objectid|folderid")" from "(.*)("where.*")/"update "\2"set ownerid\=1 "\3/g select.txt</i><br /></blockquote><br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Create your own army (of users for testing)</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/08/create-your-own-army-of-users.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.48</id>

    <published>2009-08-26T17:05:27Z</published>
    <updated>2009-08-26T17:30:27Z</updated>

    <summary>Recently a colleague brought up the common question of how one might have sufficient users for load testing. There are many solutions to the problem, but one I put together all the way back in 2004 is a server API...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="star_wars_clone_army.jpg" src="http://blog.billbenac.com/blog/2009/08/26/star_wars_clone_army.jpg" class="mt-image-none" style="" vspace="10" width="300" align="right" height="351" hspace="10" /></span>Recently a colleague brought up the common question of how one might have sufficient users for load testing. There are many solutions to the problem, but one I put together all the way back in 2004 is a server API csharp application that creates bulk users. <br /><br />I've updated the application for WCI 10gR3, and <span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.billbenac.com/blog/2009/08/26/bulkusers-10gR3.zip">you can download it here</a>.<br /><br />From the readme file:<br /><br />This is a small web application that can create and delete users in bulk. This may be useful in certain test situations.<br /><br />To install:<br /><br />&nbsp;&nbsp;&nbsp; * Unzip the bulkusers directory on your web server.<br />&nbsp;&nbsp;&nbsp; * Configure it as an application. It can be made an application from the properties page of the IIS console.<br />&nbsp;&nbsp;&nbsp; * Be sure the new IIS application uses .NET 2.0.<br /><br />To configure:<br /><br />&nbsp;&nbsp;&nbsp; * Create a folder in your portal that you will put these new users in. It is important that this folder only be used for this bulk users.<br />&nbsp;&nbsp;&nbsp; * Note the folder id of the new folder you created. You might do this by clicking into the folder then examining the query string.<br />&nbsp;&nbsp;&nbsp; * Open web.config for this web application. Put the appropriate values into the appSettings section so the web application will know how to connect, where to create users, group memberships, password, and so forth.<br /><br />To use:<br /><br />This web application is quite rudimentary in that all instructions are given through its query string. Examples are shown here:<br /><br />&nbsp;&nbsp;&nbsp; * To create 25 users, browse to http://server/bulkusers/index.aspx?action=create&amp;count=25<br />&nbsp;&nbsp;&nbsp; * To show all users in the folder, browse to http://server/bulkusers/index.asp?action=show<br />&nbsp;&nbsp;&nbsp; * To delete all users in the folder (regardless of how they were created), browse to http://server/bulkusers/index.aspx?action=delete<br /><br />You should be very aware of the consequence of running the delete command. It deletes all users in the folder you specify in web.config. If you make the mistake of using an existing user folder for these bulk users, then the delete command will delete the pre-existing users who probably shouldn't be deleted.<br /><br />Bill Benac<br />Written December, 2004<br />Updated August, 2009 <br /><div><br /></div></span>]]>
        
    </content>
</entry>

<entry>
    <title>Clean up footers before running WCI 10gR3</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/08/clean-up-footers-before-runnin.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.47</id>

    <published>2009-08-25T16:22:53Z</published>
    <updated>2009-08-25T19:32:44Z</updated>

    <summary>It turns out that ALUI 6.1 was more forgiving than WCI in at least one way: if a community was set to use a custom footer, and then if that custom footer was deleted, the community would continue to display...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[It turns out that ALUI 6.1 was more forgiving than WCI in at least one way: if a community was set to use a custom footer, and then if that custom footer was deleted, the community would continue to display properly. However, in WCI 10gR3, a bug exists such that when the custom footer isn't found, the page displays this unhelpful message under the portal's navigation:<br /><br />Error - The server has experienced an error. Try again or contact your portal administrator if you continue experiencing problems.<br /><br />When you open the HTML source of the page, you find this somewhat unhelpful message in all its impenetrable detail:<br /><textarea rows="6" cols="60">&lt;pre id="line636"&gt;&lt;span class="comment"&gt;Object reference not set to an instance of an object.: com.plumtree.openfoundation.util.XPNullPointerException: Object reference not set to an instance of an object.&lt;br /&gt;   at com.plumtree.openfoundation.util.XPException.GetInstance(String strErrorMsg, Exception e)&lt;br /&gt;   at com.plumtree.openfoundation.util.XPException.GetInstance(Exception e)&lt;br /&gt;   at com.plumtree.uiinfrastructure.interpreter.Interpreter.HandleError(Exception e, Boolean bDisplayErrorInComments, RequestData tempData) in e:\buildroot\Release\portalui\10.3.0.x\ptwebui\uiinfrastructure\dotnet\prod\src\com\plumtree\uiinfrastructure\interpreter\Interpreter.cs:line 1372&lt;br /&gt;   at com.plumtree.uiinfrastructure.interpreter.Interpreter.HandleError(Exception e, RequestData tempData) in e:\buildroot\Release\portalui\10.3.0.x\ptwebui\uiinfrastructure\dotnet\prod\src\com\plumtree\uiinfrastructure\interpreter\Interpreter.cs:line 1344&lt;br /&gt;   at com.plumtree.uiinfrastructure.interpreter.Interpreter.HandleRequest(IXPRequest request, IXPResponse response, ISessionManager session, IApplication application) in e:\buildroot\Release\portalui\10.3.0.x\ptwebui\uiinfrastructure\dotnet\prod\src\com\plumtree\uiinfrastructure\interpreter\Interpreter.cs:line 643&lt;br /&gt;   at com.plumtree.uiinfrastructure.interpreter.Interpreter.DoService(IXPRequest request, IXPResponse response, ISessionManager session, IApplication application) in e:\buildroot\Release\portalui\10.3.0.x\ptwebui\uiinfrastructure\dotnet\prod\src\com\plumtree\uiinfrastructure\interpreter\Interpreter.cs:line 200&lt;br /&gt;   at com.plumtree.uiinfrastructure.web.XPPage.Service(HttpRequest httpRequest, HttpResponse httpResponse, HttpSessionState httpSession, HttpApplicationState httpApplication) in e:\buildroot\Release\httpmemorymanagement\10.3.0.x\dotNET\src\com\plumtree\uiinfrastructure\web\XPPage.cs:line 75&lt;br /&gt;   at com.plumtree.portaluiinfrastructure.activityspace.PlumHandler.ProcessRequest(HttpContext context) in e:\buildroot\Release\portalui\10.3.0.x\ptwebui\portal\dotnet\prod\src\web\PlumHandler.cs:line 36&lt;br /&gt;   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()&lt;br /&gt;   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously)&lt;br /&gt;   at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(Exception error)&lt;br /&gt;   at System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)&lt;br /&gt;   at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)&lt;br /&gt;   at System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)&lt;br /&gt;   at System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType)&lt;br /&gt;Caused by: System.NullReferenceException: Object reference not set to an instance of an object.&lt;br /&gt;   at com.plumtree.portalpages.browsing.myportal.MyPortalModel.MyPortalModelTempData.InitializePortletContent(MyPortalModel _model, Int32[] nPortletIds)&lt;br /&gt;   at com.plumtree.portalpages.browsing.myportal.MyPortalModel.InitializePortletContent()&lt;br /&gt;   at com.plumtree.portalpages.common.uiparts.NavigationModel.InitializePortletContent()&lt;br /&gt;   at com.plumtree.portalpages.common.uiparts.PlumtreeDP.Display(IWebData pageData)&lt;br /&gt;   at com.plumtree.uiinfrastructure.interpreter.Interpreter.HandleDisplayPage(Redirect myRedirect, RequestData tempData) in e:\buildroot\Release\portalui\10.3.0.x\ptwebui\uiinfrastructure\dotnet\prod\src\com\plumtree\uiinfrastructure\interpreter\Interpreter.cs:line 1909&lt;br /&gt;   at com.plumtree.uiinfrastructure.interpreter.Interpreter.HandleRequest(IXPRequest request, IXPResponse response, ISessionManager session, IApplication application) in e:\buildroot\Release\portalui\10.3.0.x\ptwebui\uiinfrastructure\dotnet\prod\src\com\plumtree\uiinfrastructure\interpreter\Interpreter.cs:line 60&lt;/span&gt;&lt;/pre&gt;</textarea><br /><br />The problem is easy enough to fix as a one-off: Open the community editor, observe that no custom footer appears to be set, add a custom footer, save the community, edit the community, remove the custom footer, and you're good.<br /><br />You can quickly check whether any communities in your system are affected by this bug by running this query to find those meeting the condition:<br /><br /><blockquote><i>select objectid, name, footerid from ptcommunities where footerid not in (select objectid from ptgadgets) and footerid &gt; 0</i><br /></blockquote><br />And fortunately, you can fix them all in one fell swoop by updating them to discontinue their attempted display of that bogus footer:<br /><br /><blockquote><i>update ptcommunities set footerid=0 where&nbsp; footerid not in (select objectid from ptgadgets) and footerid &gt; 0 <br /></i></blockquote><br />Finally, you can rerun the query to check for communities with the error, and you will now find all is well.<br /><br />How should this be fixed in the product?<br /><br />1) The portal should forgive communities that use a bad footer ID. A simple try/catch should do the trick.<br />2) The portal should change its steps when deleting a portlet When a portlet is removed from the portal, part of the cleanup should be to update the ptcommunities table to use footerid 0 in the place of the deleted gadgetid.<br /><br />We'll see whether this is ever done. In the meantime, you need to get your portal running, and the approach I outlined here should do it.<br /><br />Enjoy!]]>
        
    </content>
</entry>

<entry>
    <title>Changing Ports: Reconfiguring Configuration Manager</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/06/changing-ports-reconfiguring-c.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.46</id>

    <published>2009-06-02T17:00:56Z</published>
    <updated>2009-06-02T17:42:36Z</updated>

    <summary>Sometimes you just need to change ports. When I was a kid, it was the port of New York: In search of love, I tried the port of Syndey (from which I supported a Plumtree portal system): Later I found...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[Sometimes you just need to change ports. When I was a kid, it was the port of New York: <br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="port-newyork-400.jpg" src="http://blog.billbenac.com/blog/2009/06/02/port-newyork-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span><br /><br />In search of love, I tried the port of Syndey (from which I supported a Plumtree portal system): <br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="port-syndey-400.jpg" src="http://blog.billbenac.com/blog/2009/06/02/port-syndey-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="207" /></span><br /><br />Later I found true love in the port of Seattle (from which I supported a BEA ALUI portal system):<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="port-seattle-400.jpg" src="http://blog.billbenac.com/blog/2009/06/02/port-seattle-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="260" /></span><br /><br />And now the local port is San Francisco (from which I support an Oracle WCI portal system).<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="port-sanfran-400.jpg" src="http://blog.billbenac.com/blog/2009/06/02/port-sanfran-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span><br /><br />And speaking of those portals and changing ports, sometimes you realize that your Configuration Manager service would suit you better if it ran on a different port. You can change the port by following these steps:<br /><br />1. Remove the existing configuration manager service:<br /><br />%PT_HOME%\configmgr\2.0\bin\configmgr.bat remove<br /><br />2. Backup then edit %PT_HOME%\configmgr\2.0\settings\config\private.xml. Set the "EAS:httpsport" to the desired port.<br /><br />3. Backup then edit %PT_HOME%\configmgr\2.0\settings\config\wrapper.conf. Edit the wrapper.ntservice.name and wrapper.ntservice.displayname to reflect the desired port.<br /><br />4. Install the configuration manager service:<br /><br />%PT_HOME%\configmgr\2.0\bin\configmgr.bat install<br /><br />5. Start the configuration manager service.<br /><br /> <div>Enjoy!<br /></div><div><br /></div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Tunings for the LDAP IDS Sync</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/05/tunings-for-the-ldap-ids-sync.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.45</id>

    <published>2009-05-08T14:48:25Z</published>
    <updated>2009-05-08T15:29:26Z</updated>

    <summary>Are you worried about your LDAP IDS sync&apos;s running time? If your system is relatively small, you may not think much about it. You run them each night, or maybe even several times during the day, and life is good....</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="BEA/Oracle" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="alui" label="alui" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ldap" label="LDAP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wci" label="WCI" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="gone_running.jpg" src="http://blog.billbenac.com/blog/2009/05/08/gone_running.jpg" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;" width="320" height="320" /></span>Are you worried about your LDAP IDS sync's running time? If your system is relatively small, you may not think much about it. You run them each night, or maybe even several times during the day, and life is good. However, on systems that push beyond several hundred thousand users, the performance of this product may become important. An obscure setting can cut the time in half.<br /><br />This week I reinstalled the IDS, and after running it with default settings, my sync ran in about eight hours. After some tunings though, the job usually finishes in three and a half hours.<br /><br /><b>Cached Objects</b><br />The most important tuning done in %WCI_HOME%\ptldapaws\2.2\settings\config\ldap\properties.xml. I increased the MAX_CACHED_USER_OBJECTS setting from the meager <span class="tx">20000 to instead </span><span class="tx">1000000. <br /><br /><b>Memory</b><br />With this increased cache setting, you may also find you need to increase memory allocation. Do this in </span>%WCI_HOME%\<span class="tx">ptldapaws\2.2\settings\config\wrapper.conf:<br /><br /># Initial Java Heap Size (in MB)<br />wrapper.java.initmemory=1024<br /><br /># Maximum Java Heap Size (in MB)<br />wrapper.java.maxmemory=1024<br /><br /><b>Session Timeout</b><br />Another tuning we use that may be necessary when you run larger synchronization batches is to increase the session timeout period within the ldapws.war file's web.xml. The default session-timeout is 60 minutes, but we run at 600.<br /><br />Enjoy!<br /></span>]]>
        
    </content>
</entry>

<entry>
    <title>A Secret to Install Pandora on Blackberry</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/04/a-secret-to-install-pandora-on.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.44</id>

    <published>2009-05-01T00:14:14Z</published>
    <updated>2009-05-01T00:44:34Z</updated>

    <summary>To my normal readers, don&apos;t worry! This blog will soon return to its regular programming!While installing Pandora on my Blackberry Pearl, I hit an obscure error message. Google only knew of a single page in the whole wide world wide...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="Off Topic Tech" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="blackberry" label="Blackberry" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="pandora_blackberry.png" src="http://blog.billbenac.com/blog/2009/04/30/pandora_blackberry.png" class="mt-image-none" style="" width="180" align="right" height="306" /></span>To my normal readers, don't worry! This blog will soon return to its regular programming!<br /><br />While installing Pandora on my Blackberry Pearl, I hit an obscure error
message. Google only knew of a single page in the whole wide world wide web that
discussed this error, but that page had no solution. So now for the perfect stranger who came here from Google, who doesn't care about Oracle software, who doesn't know me, and who just wants to listen to his or her reggae/polka/rap/country/classical music through the Blackberry,  I bring you this special announcement:<br /><br />Pandora provides different application downloads based on which device it thinks you're using, and it determines your device by your browser's emulation mode. So if you're not using the Blackberry emulation mode, then your device may try to download the wrong one. In my case, I saw the error "Unsupported media type: application/x-cabinet," and the device wanted to download pandora.cab. I was using MS Pocket IE mode when that happened. You may be using a different but still wrong mode, so try setting it properly. To do so:<br /><br /><ol><li>Open your browser (and it must be the default browser--don't try Opera Mini or some such thing)<br /></li><li>Click the Blackberry menu button<br /></li><li>Select "Options"</li><li>Select "Browser Configuration"</li><li>Set your emulation mode to Blackberry</li><li>Navigate to http://www.pandora.com (or refresh if you had already been there)</li><li>Download, and you'll be in business</li><li>For good sound, use a headset of some sort<br /></li><li>Give me a comment if this really did help you</li></ol>Enjoy!<br />]]>
        
    </content>
</entry>

<entry>
    <title>Book Response: Curing their Ills</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/04/book-response-curing-their-ill.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.43</id>

    <published>2009-04-17T03:01:22Z</published>
    <updated>2009-05-01T01:03:25Z</updated>

    <summary>I&apos;m in an anthropology class called &quot;The Politics of Humanitarianism,&quot; and I&apos;ve just toppled one of its reading assignments. I tried posting a 140 character review on Twitter, but it wasn&apos;t successful--someone asked me to try again. Since the professor...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
        <category term="School" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="anthropology" label="anthropology" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="book" label="book" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="curing.jpg" src="http://blog.billbenac.com/blog/2009/04/30/curing.jpg" class="mt-image-right" style="margin: 0pt 0pt 20px 20px; float: right;"  height="350" /></span>I'm in an anthropology class called "The Politics of Humanitarianism," and I've just toppled one of its reading assignments. I tried posting a 140 character review on Twitter, but it wasn't successful--someone asked me to try again. Since the professor too requires more than just a tweet in response, I wrote up a couple pages. I share those here for Neema and for the rest of you portal junkies who need a break. <br /><br /><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 12"><meta name="Originator" content="Microsoft Word 12"><link rel="File-List" href="file:///C:%5CWINDOWS%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
 <o:OfficeDocumentSettings>
  <o:RelyOnVML/>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]--><link rel="themeData" href="file:///C:%5CWINDOWS%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"><link rel="colorSchemeMapping" href="file:///C:%5CWINDOWS%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>X-NONE</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:DontVertAlignCellWithSp/>
   <w:DontBreakConstrainedForcedTables/>
   <w:DontVertAlignInTxbx/>
   <w:Word11KerningPairs/>
   <w:CachedColBalance/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="-->
   <m:smallfrac m:val="off">
   <m:dispdef>
   <m:lmargin m:val="0">
   <m:rmargin m:val="0">
   <m:defjc m:val="centerGroup">
   <m:wrapindent m:val="1440">
   <m:intlim m:val="subSup">
   <m:narylim m:val="undOvr">
  </m:narylim></m:intlim>
</m:wrapindent><!--[endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="0" Name="footnote text"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="0" Name="footnote reference"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]--><style>
<!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
	{mso-style-noshow:yes;
	mso-style-unhide:no;
	mso-style-link:"Footnote Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman","serif";
	mso-fareast-font-family:"Times New Roman";}
span.MsoFootnoteReference
	{mso-style-noshow:yes;
	mso-style-unhide:no;
	vertical-align:super;}
span.FootnoteTextChar
	{mso-style-name:"Footnote Text Char";
	mso-style-noshow:yes;
	mso-style-unhide:no;
	mso-style-locked:yes;
	mso-style-link:"Footnote Text";}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-size:10.0pt;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;}
 /* Page Definitions */
 @page
	{mso-footnote-separator:url("file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_header.htm") fs;
	mso-footnote-continuation-separator:url("file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_header.htm") fcs;
	mso-endnote-separator:url("file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_header.htm") es;
	mso-endnote-continuation-separator:url("file:///C:/WINDOWS/TEMP/msohtmlclip1/01/clip_header.htm") ecs;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
</style>
<![endif]-->

<p class="MsoNormal" style="line-height: 200%;"><span style="font-size: 11.5pt; line-height: 200%;">In <i style="">Curing their Ills</i>,
Cambridge anthropologist Megan Vaughan examines the difficulties faced by
African colonizers as they tried to find the best frame of reference from which
to approach African medical problems. Colonizers struggled in their own debates
to determine whether to perceive Africa and Africans in terms of difference as
well as whether to attribute behaviors and outcomes to African culture or
African nature. Vaughan conveys the idea of Jean Comaroff about biomedical
knowledge that "whilst it is ostensibly based on 'empirical objectivity', in
practice its underlying epistemology remains a 'cultural construct', existing
in 'dialectical relationship with its wider social context'."<a style="" href="#_ftn1" name="_ftnref1" title=""><span class="MsoFootnoteReference"><span style=""><!--[if !supportFootnotes]--><span class="MsoFootnoteReference"><span style="font-size: 11.5pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">[1]</span></span><!--[endif]--></span></span></a>
Though the colonizers may have had good intentions, it is problematic to
transplant a cultural construct.<o:p></o:p></span></p>

<p class="MsoNormal" style="line-height: 200%;"><span style="font-size: 11.5pt; line-height: 200%;"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal" style="line-height: 200%;"><span style="font-size: 11.5pt; line-height: 200%;">Vaughan explores "the African" as assumed by the medical
community in the context of missionary medicine, leprosy, insanity, sexually
transmitted disease, and didactic books and videos. A challenge with missionary
medicine was how much the care providers should link physical health with
spiritual health and "moral" practice. Perhaps no construct is as cultural as a
religious one. An interesting aspect of dealing with African leprosy patients
was that the colonizers seemed to view their primary identity as that of lepers
and only their secondary identity as that of Africans. The problem with
identifying insanity was that it was defined as an aberration from "normal" but
normal African behaviors themselves were viewed as pathological by many
colonizers. The growth (or at least persistence) of STDs was in part a result
of the traditional African systems being destabilized by those introduced by
European interaction, and some blamed it specifically on Christianity which
hoped to introduce its own moral code in the place of the indigenous one.
Regardless of the medical issue, the response would include propaganda of some
sort, and this propaganda whether in the form of written material or film could
not be created without first defining its audience and that audience's learning
styles.<o:p></o:p></span></p>

<p class="MsoNormal" style="line-height: 200%;"><span style="font-size: 11.5pt; line-height: 200%;"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal" style="line-height: 200%;"><span style="font-size: 11.5pt; line-height: 200%;">One response I had to the book was that when seen through an
anthropologist's critical eye, a cultural boundary-crosser can enter a no-win
situation. How shall the traveler interact with his host culture? To deny
difference is to deny the other, but to perceive difference is to wade into alligator
infested waters. Is it oppressive to even categorize another? Are stereotypes, useful
shorthand in themselves, always unacceptable because of their generality rather
than precision? If one cannot escape every influence of one's culture in making
a judgment, then can the judgment withstand the scrutiny of a deconstructing
anthropologist? Yes, colonialism is a concept with terrible connotations, but
not everything related to it is terrible. Individuals, groups, nations, and
cultures have asymmetric relationships, and within any asymmetric relationship
is found the potential for abuse and is often found colonialism either in fact
or in creative perception. However, such asymmetries and abuses existed within
pre-colonial societies as well (no footnote on this). A key factor magnifying
the disgraces of traditional colonialism as seen in <i style="">Curing their Ills</i> is that when cultures encounter each other,
especially when one has new technologies, then change occurs. Change is often
painful (e.g. for the Africans whose health deteriorated as they migrated to
work locations in response to the globalizing economy) but in other cases the
change alleviates problems (e.g. when transportation became available for the
migrants).<o:p></o:p></span></p>

<p class="MsoNormal" style="line-height: 200%;"><span style="font-size: 11.5pt; line-height: 200%;"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal" style="line-height: 200%;"><span style="font-size: 11.5pt; line-height: 200%;">Maybe I'm a bit defensive because I'm [1] white, [2] male,
[3] involved in international humanitarian efforts, [4] religious, and [5] carrying
a passport from the neocolonial power. In any case, this was a
thought-provoking book, and I write my critique with a smile!<o:p></o:p></span></p>

<div style=""><!--[if !supportFootnotes]--><br clear="all" />

<hr size="1" width="33%" align="left">

<!--[endif]-->

<div style="" id="ftn1">

<p class="MsoFootnoteText"><a style="" href="#_ftnref1" name="_ftn1" title=""><span class="MsoFootnoteReference"><span style=""><!--[if !supportFootnotes]--><span class="MsoFootnoteReference"><span style="font-size: 10pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">[1]</span></span><!--[endif]--></span></span></a> Vaughan,
Megan: <i style="">Curing their Ills.</i> Stanford
University Press: Stanford CA; 1991: p 6.</p>

</div>

</div>

<br /> </m:defjc></m:rmargin></m:lmargin></m:dispdef></m:smallfrac>]]>
        
    </content>
</entry>

<entry>
    <title>Find which load-balanced server you&apos;re on (.NET only)</title>
    <link rel="alternate" type="text/html" href="http://blog.billbenac.com/blog/2009/04/find-which-loadbalanced-server.html" />
    <id>tag:blog.billbenac.com,2009:/blog//1.41</id>

    <published>2009-04-08T01:47:19Z</published>
    <updated>2009-04-08T02:25:59Z</updated>

    <summary>When you&apos;re working with servers behind a load balancer, do you ever feel a bit lost about which server you&apos;re really on? I do. With the ALUI/WCI portal pages, you can find an HTML comment telling you which server rendered...</summary>
    <author>
        <name>bill</name>
        
    </author>
    
    <category term="wci" label="wci" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.billbenac.com/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="lost-and-found.jpg" src="http://blog.billbenac.com/blog/2009/04/07/lost-and-found.jpg" class="mt-image-none" style="width: 636px; height: 158px;" width="636" height="158" /></span><br clear=all /><br />When you're working with servers behind a load balancer, do you ever feel a bit lost about which server you're really on? I do. With the ALUI/WCI portal pages, you can find an HTML comment telling you which server rendered the page. But today I realized it's hard to know which imageserver I'm on. So here's a little file to put on each website. Place it at http://myhostname/whereami.aspx, and you can hit it whenever you want to know which physical server you've been routed to by the load balancer.<br /><br /><pre><br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <br />"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br /><br />&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt;<br />&lt;head id="Head1" runat="server"&gt;<br />&lt;title&gt;Machine:  &lt;%= System.Net.Dns.GetHostName() %&gt; <br />- URL: &lt;%= Request.Url.Host.ToString() %&gt;&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />This is machine &lt;b&gt; &lt;%= System.Net.Dns.GetHostName() %&gt;&lt;/b&gt;. <br />&lt;p&gt;You came here on URL &lt;b&gt; &lt;%= Request.Url.Host.ToString() %&gt;.&lt;/b&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</pre><br />This would be simple in Java too, but I've not written it. Add it as a comment if you'd like?<br /><br />Enjoy!<br /> ]]>
        
    </content>
</entry>

</feed>
