<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Developer, CodeOgre™, book consumer, cross country/downhill cyclist, trance aficionado, lover of fine wine.




new TWTR.Widget({
  profile: true,
  id: 'twtr-profile-widget',
  loop: true,
  width: 200,
  height: 250,
  theme: {
    shell: {
      background: '#444444',
      color: '#ffffff'
    },
    tweets: {
      background: '#ffffff',
      color: '#444444',
      links: '#1985b5'
    }
  }
}).render().setProfile('mlaccetti').start();

table.lfmWidgetchart_401860724ca4de06735342530925853c td {margin:0 !important;padding:0 !important;border:0 !important;}table.lfmWidgetchart_401860724ca4de06735342530925853c tr.lfmHead a:hover {background:url(http://cdn.last.fm/widgets/images/en/header/chart/recenttracks_regular_grey.png) no-repeat 0 0 !important;}table.lfmWidgetchart_401860724ca4de06735342530925853c tr.lfmEmbed object {float:left;}table.lfmWidgetchart_401860724ca4de06735342530925853c tr.lfmFoot td.lfmConfig a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/grey.png) no-repeat 0px 0 !important;;}table.lfmWidgetchart_401860724ca4de06735342530925853c tr.lfmFoot td.lfmView a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/grey.png) no-repeat -85px 0 !important;}table.lfmWidgetchart_401860724ca4de06735342530925853c tr.lfmFoot td.lfmPopup a:hover {background:url(http://cdn.last.fm/widgets/images/en/footer/grey.png) no-repeat -159px 0 !important;}


 















var pkBaseURL = (("https:" == document.location.protocol) ? "https://rando.laccetti.com/admin/piwik/" : "http://rando.laccetti.com/admin/piwik/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));

try {
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 2);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
} catch( err ) {}

</description><title>laccetti.com - ramblings of a madman</title><generator>Tumblr (3.0; @mlaccetti)</generator><link>http://www.laccetti.com/</link><item><title>Unit Testing Aspects</title><description>&lt;p&gt;Something that I haven’t really run into is how to unit test an aspect - given how unique the circumstances are required to invoke such an event, I was at a bit of a loss.  After some thinking and trial/error, I came up with a cut-down version of what the application uses - a limited Spring configuration, the Spring test suite, JUnit and a lot of assertions.&lt;/p&gt;
&lt;p&gt;The Spring config is actually pretty trivial, as most of the magic happens using Annotations (@Component, @Aspect and @Order) - very little configuration lives in an XML file.  Since I use Spring 3, I might even do away with the config file - we’ll see how that goes.&lt;/p&gt;
&lt;p&gt;The interesting part is the unit test, which you can see here:&lt;/p&gt;
&lt;p&gt;
&lt;script type="syntaxhighlighter" class="brush: java"&gt;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/spring-aspect-test.xml"})
public class CachingAspectTest {
	private final Logger log = LoggerFactory.getLogger(getClass());
	
	@Autowired
	private UserDao ud;
	
	@Autowired
	private CacheManager cacheMgr;
	
	@Test
	public void testCacheGet() {
		log.info("Starting get test.");
		LimoneUser u = ud.getUser("michael@laccetti.com");
		assertNotNull("Could not retrieve user with e-mail address michael@laccetti.com", u);
		
		Cache c = cacheMgr.getCache("LimoneUser");
		assertNotNull("LimoneUser cache not found.", c);
		
		Element e = c.get("LimoneUser-michael@laccetti.com");
		assertNotNull("Cache element with key LimoneUser-michael@laccetti.com not found.", e);
		assertNotNull("Cache element found, but value was null.", e.getValue());
		assertEquals("Cached user did not match DAO provided user.", u, e.getValue());
	}
}
&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;I use the Spring test runner, which means I can inject my configuration file, and can also autowire the necessary objects.  In this case, I’m injecting a user DAO along with the Ehcache manager.  My test then invokes the DAO and checks to see if the item was actually cached.  Pretty simple, but took a while to get right.  The one caveat is that you need to turn off things like Terracotta, or else things may be considered valid when they actually are not.&lt;/p&gt;</description><link>http://www.laccetti.com/post/507457990</link><guid>http://www.laccetti.com/post/507457990</guid><pubDate>Fri, 09 Apr 2010 00:53:56 -0400</pubDate></item><item><title>Drink the Kool-Aid</title><description>&lt;p&gt;“Perhaps the best announced feature of iAds, though, is that it doesn’t 
take you outside of the app you’re using to view the ads. Dismiss the ad
 whenever you want, and you’re right back where you left off.”&lt;br/&gt;&lt;br/&gt;Seriously?  This is the best announced feature of an advertising platform that can ram things down to you at will, probably blocking the entire UI until you dismiss it?  Gee, thanks!&lt;br/&gt;&lt;/p&gt;</description><link>http://www.laccetti.com/post/506724306</link><guid>http://www.laccetti.com/post/506724306</guid><pubDate>Thu, 08 Apr 2010 19:18:11 -0400</pubDate></item><item><title>Code Attrition</title><description>&lt;p&gt;Given my day job as a software developer, I tend to get asked random questions by family and friends about computers.  On this occasion, my dad was asking me how to make some C# code work, since he’s working on a C# based project.  I popped open the project in Visual Studio, noticed that it compiled, and ran it.  It fires up a window that asks you what directory you want to search in, and what file type(s) you want to search for.  You click the button, and off it goes.  Relatively simple, as they go, though I took off points for not using a standard dialog box to select the directory, and the lack of recursion.&lt;br/&gt;&lt;br/&gt;I selected a drive, I selected a folder (separate fields, wee), entered a pattern (“*.txt”), and hit the button.  Immediately, I got a nice UnauthorizedAccessException - something that I haven’t really dealt with, as the last time I seriously used C# was probably in 2003/2004, back when .NET 2.0 was just showing up.  I threw in a try/catch around the offending block, and gave it a whirl.  “No files found.”&lt;br/&gt;&lt;br/&gt;At that point in time, I had the usual conundrum: do I spent time trying to figure out what the person in 2001 was thinking, and then what the person in 2010 who “cleaned it” actually did?  Or, did I just bite the bullet, create a quick new project, go spelunking in the .NET 4 API docs (yes, I have Visual Studio 2010) and find a better way?&lt;br/&gt;&lt;br/&gt;I went for the latter.&lt;br/&gt;&lt;br/&gt;Here is the result (click for bigger):&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/nihilist/4502027224/sizes/o/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2726/4502027224_69a44715b2.jpg"/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;I have less stuff going on in mine since I wrote a Console app, but still.  It shouldn’t be that hard.&lt;br/&gt;&lt;br/&gt;Hat tip to Jamie for the title.&lt;/p&gt;</description><link>http://www.laccetti.com/post/504888712</link><guid>http://www.laccetti.com/post/504888712</guid><pubDate>Thu, 08 Apr 2010 00:31:00 -0400</pubDate></item><item><title>Bullying and You</title><description>&lt;p&gt;Read this and tell me why District Attorney Elizabeth Scheibel (the ‘she’ in the following quote) needs to re-think her worldview, especially in light of the fact that they could probably have saved somebody from suicide.&lt;/p&gt;
&lt;blockquote&gt;She said the investigation looked at whether the adults’ failure to  help Phoebe amounted to criminal behavior.&lt;/blockquote&gt;
&lt;blockquote&gt;“In our opinion, it did not,” she said. “Nevertheless, the actions or  inactions of some adults at the school are troublesome.”&lt;/blockquote&gt;
&lt;p&gt;Read the full story here: &lt;a title="http://bit.ly/axCKDR" href="http://bit.ly/axCKDR" target="_blank"&gt;&lt;a href="http://bit.ly/axCKDR" target="_blank"&gt;http://bit.ly/axCKDR&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;</description><link>http://www.laccetti.com/post/482746040</link><guid>http://www.laccetti.com/post/482746040</guid><pubDate>Mon, 29 Mar 2010 19:37:08 -0400</pubDate></item><item><title>NoSQL vs. SQL</title><description>&lt;p&gt;The backlash against NoSQL has begun!  After enjoying a solid rise in popularity over the last 12-18 months, people are starting to fight back.  The problem is that, as always, people are missing the point.  NoSQL became popular quickly because it addressed an area that DB servers do not: scalability.  Of course many businesses have been running on database servers and have managed to scale them to handle huge volumes of requests and data - they just paid a LOT of money to do so.  NoSQL allows your average bootstrapped startup to do the same thing with a far smaller out of pocket expense.&lt;br/&gt;&lt;br/&gt;For example, let us consider a serious Oracle setup - I’m using Oracle because most companies feel that if it doesn’t cost them an arm and a leg it isn’t good.  Personally, I’d suggest PostgresSQL, but hey.  Creating a single Oracle DB server that will support 10k TPS will require a hefty outlay to by a dual CPU server with a very large/fast IO subsystem.  When you start hitting the ceiling with the single node (and realize you have a nice single point of failure) you start looking at things like Oracle RAC.  Now you want to play in the big leagues!  You buy a second server, upgrade from a local RAID 10 to a SAN, and pay Oracle more money.  Now you can handle more transactions!  Every time you hit the ceiling, you can try to grow your RAC by adding nodes or updating servers to more powerful hardware.&lt;br/&gt;&lt;br/&gt;NoSQL takes a different approach to this problem.  Instead of requiring expensive hardware and software, it leverages commodity hardware and free software.  You can now achieve scalability on a far more modest budget.  There are tradeoffs, of course - the application you write has to know how to join the data, data is synchronized ‘eventually’, etc, etc.&lt;br/&gt;&lt;br/&gt;In the end, there shouldn’t be any real fight - each technology addresses a very different problem; both technologies can co-exist and grow.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;br/&gt;&lt;div class="zemanta-pixie"&gt;&lt;img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=0c718120-0401-842a-937f-5c3e0662699a"/&gt;&lt;/div&gt;</description><link>http://www.laccetti.com/post/479471169</link><guid>http://www.laccetti.com/post/479471169</guid><pubDate>Sun, 28 Mar 2010 12:26:18 -0400</pubDate></item><item><title>DSi XL</title><description>&lt;p&gt;“Many gamers only play their Nintendo DS games at home—in bed, in front of the TV while their parents or spouse watch something they’re not interested in.” - &lt;a href="http://bit.ly/dBuRNf" target="_blank"&gt;http://bit.ly/dBuRNf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I play mine while I’m at the PC waiting for games to load, or while doing something in EVE and there is no action.  Gaming while waiting for games.&lt;/p&gt;</description><link>http://www.laccetti.com/post/420243391</link><guid>http://www.laccetti.com/post/420243391</guid><pubDate>Mon, 01 Mar 2010 13:42:33 -0500</pubDate></item><item><title>Wicket Bug</title><description>&lt;p&gt;I’ll have to file a bug report for this, since it is so interesting, though more investigation is required to see how pervasive it is.&lt;/p&gt;

&lt;p&gt;Generally, when I use Wicket, I don’t use a FeedbackPanel to display error messages to the user. Instead, I use a FormComponent.IVisitor that walks through all the FormComponents for the form that was submitted (via AJAX, natch).  Each component is check to see if it is failed, enabled, and required, and then pulls the error message from the component.&lt;/p&gt;

&lt;p&gt;That message is then fed back to the browser via the AjaxRequestTarget as a call to a JavaScript method that’ll pop up an error, or whatever special sauce I require.  Usually I pass back the ID of the failed element and the message, and then use jQuery to build some sort of error bubble.&lt;/p&gt;

&lt;p&gt;While implementing the above, I ran into an interesting bug - this part gets a bit technical, so I forgive you if you click away.  I have a Wizard that renders a form containing DynamicWizardStep.  The DWS then has a RadioGroup with a DropDownChoice embedded within it.&lt;/p&gt;

&lt;p&gt;Here’s the bug: if I hit the “next” button on my wizard, both (required) components fail.  That’s expected - the unexpected part is that the RadioGroup error message is…  null!  If I move the DropDownChoice outside of the RadioGroup, both work properly again.&lt;/p&gt;

&lt;p&gt;Now, it isn’t great design to nest one within the other (I did fix that part), but the lack of validation message is just weird.  It does fire the validation, just loses the error.&lt;/p&gt;

&lt;p&gt;I wonder if I can make a quickstart for that…&lt;/p&gt;</description><link>http://www.laccetti.com/post/393924749</link><guid>http://www.laccetti.com/post/393924749</guid><pubDate>Tue, 16 Feb 2010 22:09:33 -0500</pubDate></item><item><title>HTML5 - Expanded</title><description>&lt;p&gt;My HTML 5 &lt;a&gt;tweet&lt;/a&gt; needs a bit of expanding - one that 140 characters won’t allow for.&lt;br/&gt;&lt;br/&gt;One of the blogs I follow is Dive into HTML5 as it provides some great insight and explores some of the new features that HTML5 provides. The most recent entry (that I read) was called &lt;a&gt;A Form of Madness&lt;/a&gt;, detailing the new input types that will be brought to the table. As a (terrible) web designer, these fields interest and excite me - it’d be great to have the browser take care of stuff for me.&lt;br/&gt;&lt;br/&gt;However, that is where the problem lies - relying on the browser, especially on the browser supporting the feature. Having it degrade nicely is awesome, but the fact that apparently no browser with a large market share (Firefox or IE) supports any of the HTML5 features (in a production release) means that I just don’t have the energy to bother. As you read the article, you’ll see that there are little boxes showing the different browsers currently available, and their level of support for the HTML5 feature/field - notice that the only ones that support them are Safari 4, Chrome (which version?) or Opera (again, which version?). Combined, let us say that they cover 15% of the market (and I’d say I’m being generous with that) - that means that 85% of the people visiting your website will have a completely different experience. So, as always, the question is: cool technology, or building my site so that the majority all see the same thing.&lt;br/&gt;&lt;br/&gt;Age old conundrum, I know.&lt;br/&gt;&lt;br/&gt;On a side note, would it be wrong to suggest that the people running Chrome/Opera/Safari are the ones ahead of the curve and usually the people you don’t have to worry about? Ah, the joys of stereotypes! I don’t use any of those browsers - I’m still using Firefox 3.5 quite happily, since I’m ever so plugin happy.&lt;/p&gt;</description><link>http://www.laccetti.com/post/313663305</link><guid>http://www.laccetti.com/post/313663305</guid><pubDate>Sat, 02 Jan 2010 19:31:13 -0500</pubDate></item><item><title>µTorrent UI Changes Bad Idea</title><description>&lt;p&gt;The new µTorrent UI just doesn’t do it for me; replacing the ‘play’ start button with that weird up-down icon, the other icons, the menu bar style itself - they just don’t fit well together.  Changing a UI to make it more functional is one thing, but breaking something that was pretty perfect makes no sense to me.&lt;/p&gt;</description><link>http://www.laccetti.com/post/305736996</link><guid>http://www.laccetti.com/post/305736996</guid><pubDate>Tue, 29 Dec 2009 01:43:00 -0500</pubDate></item><item><title>Math Problem</title><description>&lt;p&gt;If Ana leaves point A at 9AM and Michael leaves point A at 9:50AM, what speed is Ana’s fist moving at when she hits Michael for arriving at point B at the exact same moment?&lt;/p&gt;</description><link>http://www.laccetti.com/post/266355976</link><guid>http://www.laccetti.com/post/266355976</guid><pubDate>Wed, 02 Dec 2009 10:17:00 -0500</pubDate></item><item><title>Dead Trees and eBooks</title><description>&lt;p&gt;Last night, as I wrestled with Monday night insomnia, I was thinking about how I prefer reading a dead tree to trying to scan pixels on a screen.  My thought process usually ends there - I accepted my preference and moved on.  Last night I happened to have a lot of time to kill, so I pondered the root cause - why do I find it difficult to process information from an eBook.&lt;/p&gt;

&lt;p&gt;After a while, it finally clicked!  I have a very specific reading style - I’m not linear in any way.  When I open a book, I’m actually looking at two pages at the same time, taking all of it in.  I don’t so much read each word as take a snapshot of the pages.  I also flip around - when something catches my eye, I’ll stick my finger into the book as a placeholder, and search for more information about whatever I noticed.&lt;/p&gt;

&lt;p&gt;An eBook is a different beast - if I want to be able to read the text, I can only see a paragraph or two on screen at the same time.  When I want to see the full page, I have to zoom out so far that the text might as well be hieroglyphics - certainly doesn’t enable me to see two pages at the same time.&lt;/p&gt;

&lt;p&gt;Based on that, I’ve decided to try to fiddle around with Acrobat and try to re-create my preferred knowledge hoovering style.  I’ll see if I can shrink/widen thing, maybe rotate a monitor or two, maximize across multiple monitors, etc.  Unfortunately, dead tree printing won’t be around forever, and all signs point to eBooks in one form or another.  Time to adapt.&lt;/p&gt;

&lt;p&gt;All of this came about because I snagged a few books about Drools and jBPM - the physical medium had the virtual as a bonus.  While I’m waiting for my books to arrive, I’m trying to glean some knowledge from the digital edition.&lt;/p&gt;</description><link>http://www.laccetti.com/post/255756540</link><guid>http://www.laccetti.com/post/255756540</guid><pubDate>Tue, 24 Nov 2009 11:15:29 -0500</pubDate></item><item><title>Business Etiquette</title><description>&lt;p&gt;You know what - yes, I was printing a big ole’ document. You wanted to do something using the same multifunction device at the same time?  Guess what, you didn’t have to cancel what I was doing!  It can scan AND print at the same time!  I know that it is a pretty crazy scenario, but still.  Next time, just let it go - I promise we can both be happy.&lt;/p&gt;</description><link>http://www.laccetti.com/post/254776392</link><guid>http://www.laccetti.com/post/254776392</guid><pubDate>Mon, 23 Nov 2009 17:17:55 -0500</pubDate></item><item><title>This is Interesting</title><description>&lt;p&gt;Apparently there is another Michael Laccetti in the world - seems he lives in the US and went to UAlbany.  I can still claim to be somewhat unique as Michael is my anglicized name, but still.  The interesting part is that it would appear that he is donates money to UAlbany.&lt;/p&gt;
&lt;p&gt;How do I know this?  Well, this is where the fun comes in - Google is screwing up pretty hard.  You see, I have michael.laccetti -at- gmail.com, and it would seem that my counterpart has michaellaccetti -at- gmail.com.  Google is busy sending me his e-mail.&lt;/p&gt;
&lt;p&gt;I actually thought it was spam, until I realized it was thinking me for a donation, not asking for one.  I looked at the message headers, and yup, it is actually coming from the right place.  That means that Google cannot figure out that an e-mail with a period goes to me, and without goes to him.&lt;/p&gt;
&lt;p&gt;Seems to be &lt;strike&gt;a pretty big problem&lt;/strike&gt; entirely a feature.&lt;/p&gt;
&lt;p&gt;Edit:&lt;br/&gt;As it has been pointed out (some times more politely than others - I don’t quite understand why people miss out on being polite, costs nothing), this isn’t actually Google’s fault.  Their MTA actually does this on purpose.  Yip yay Google.  Just means that whomever donated to UAlbany forgot their e-mail address.&lt;/p&gt;</description><link>http://www.laccetti.com/post/225198201</link><guid>http://www.laccetti.com/post/225198201</guid><pubDate>Tue, 27 Oct 2009 17:21:00 -0400</pubDate></item><item><title>A Computer in Pictures</title><description>&lt;p&gt;&lt;img style="max-width: 800px;" src="http://lian-li.com/v2/tw/product/upload/image/x2000/x2000f003.jpg" height="524" width="350"/&gt;&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://www.pcpower.com/images/products/b/1200W_TC_3835.jpg" height="256" width="350"/&gt;&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://www.xicomputer.com/products/prodimages/Tyan_S7002WGM2NR-LE.jpg" height="206" width="351"/&gt;&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://www.zolvip.com/images/upload/image/intel_xeon_5500.jpg" height="296" width="350"/&gt; x 2&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://www.chip.pl/images/testy/podzespoly-pc/pamieci-ddr3/kingston-valueram-2gb-pc3-10600-cl9-kit-kvr1333d3n9k2-2g/50760.jpg/image_preview/50760.jpg" height="201" width="350"/&gt; x 4&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://www.quietpcusa.com/images/th-core-i7-cooler.jpg" height="386" width="350"/&gt;&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://media.bestofmicro.com/,C-D-193549-3.jpg" height="318" width="350"/&gt; x 4&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://ecx.images-amazon.com/images/I/41ymHZ-M7wL.jpg" height="241" width="350"/&gt; x 3&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://www.scan.co.uk/Images/Products/1046756-a.jpg" height="350" width="350"/&gt;&lt;br/&gt;&lt;img style="max-width: 800px;" src="http://pcnews.ro/wp-content/uploads/2007/06/xonar-d2_3d2_l.jpg" height="225" width="350"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=8a1f6335-0ac3-84f6-8fbd-07db6cf91176"/&gt;&lt;/div&gt;</description><link>http://www.laccetti.com/post/182419945</link><guid>http://www.laccetti.com/post/182419945</guid><pubDate>Mon, 07 Sep 2009 17:13:42 -0400</pubDate></item><item><title>Quote of the Day</title><description>&lt;p&gt;“We’re working against opponents who make politics personal—who distort and deny the truth and put partisan gain ahead of the national interest.”&lt;/p&gt;

&lt;p&gt;— Michael Ignatieff&lt;/p&gt;</description><link>http://www.laccetti.com/post/177290187</link><guid>http://www.laccetti.com/post/177290187</guid><pubDate>Tue, 01 Sep 2009 15:08:20 -0400</pubDate></item><item><title>Getting Solaris 10 to Authenticate Against OpenLDAP</title><description>&lt;p&gt;Brief History:&lt;br/&gt;I’m busy setting up a new debug/staging environment at work so that we can consolidate the many tens of old FreeBSD 4.4 (ohgod) and Solaris 9/10 servers into a few distinct Solaris 10 servers.  Personally, I would have gone with some sort of Linux distro, but for some reason somebody thinks that Solaris is the way to go.  Now, if we were switching to OpenSolaris, I might not complain too much, as it has a proper package management system and recent versions of applications, but Solaris 10?  Short of me becoming a certified Solaris admin, it is pretty painful to deal with - the install is designed more as a right of passage than an application, finding out what went wrong where is better left to those with an ability to see into the ninth dimension, etc.  However, Solaris 10 is what I have to work with, so on we go.&lt;br/&gt;&lt;br/&gt;The Servers:&lt;br/&gt;The idea is relatively simple - one Sun V40z with a large RAID 5 array running openfiler connected two two networks, one for debug and one for staging.  The debug environment would then have two V40zs with an iSCSI mount that stores data that needs to be shared between the servers (configuration files, J2EE apps and the like) along with some zones to allow us to run WebLogic 9.2 and 10.3 side by side plus zones for Apache/Perl/PHP stuff.  There are also two V20zs that will be setup with an iSCSI setup to support an Oracle RAC instance.  There is a final pair of V20zs that are to be used for any Windows-specific services (we have one or two).  All of these servers will be setup to talk to the OpenLDAP server that openfiler ships with, so that we can have a centralized location to store credentials.&lt;br/&gt;&lt;br/&gt;The Implementation:&lt;br/&gt;After doing some digging, it appeared that there were two ways of setting Solaris 10 to use LDAP - use PADL’s pam_ldap module, or configure Solaris natively using a tool called ‘ldapclient.’  After doing some digging, I chose the former, since it is the native way of doing things, and I didn’t want to download/compile/manage anything special.  More digging ensues, and I run into a ton of documentation talking about setting ldapclient up under Solaris 8 or 9, but not much for setting up Solaris 10.  This is pretty odd, since Solaris 10 is four years old at this point; not exactly new.  Thus began the travails into trial and error - and into seeing how far I could push myself before I lost my grip on reality.  With that noted, on we go!&lt;br/&gt;&lt;br/&gt;The first step is to setup openfiler to use LDAP - not a very difficult task to do!  You just need to login to the openfiler administration UI, tell it to use LDAP, and off you go.  Some of the defaults that openfiler used didn’t sit well, so I hacked at it for a bit.  Pop open the file &lt;font face="monospace"&gt;/opt/openfiler/var/www/includes/ldap.inc&lt;/font&gt; in a text editor; I changed the home directory from &lt;font face="monospace"&gt;“/dev/null”&lt;/font&gt; to &lt;font face="monospace"&gt;“/export/home/”.$username&lt;/font&gt; so that the directory would be valid.  I also changed the shell from &lt;font face="monospace"&gt;/bin/false&lt;/font&gt; to &lt;font face="monospace"&gt;/bin/bash&lt;/font&gt; as I actually wanted my users to be able to login to remote places.  I also modified the &lt;font face="monospace"&gt;create_slapd()&lt;/font&gt; function as the LDAP config will be (re)written when you enable LDAP and Solaris needs a more special setup.  You need to download the &lt;a href="http://www.unixpeople.com/%7Eabarclay/nisdomainobject.schema" target="_blank"&gt;nisdomainobject schema&lt;/a&gt;, &lt;a href="http://web.singnet.com.sg/%7Egaryttt/DUAConfigProfile.schema.txt" target="_blank"&gt;DUAConfigProfile schema&lt;/a&gt; and &lt;a href="http://www.bolthole.com/solaris/new.solaris.schema" target="_blank"&gt;solaris schema&lt;/a&gt; to &lt;font face="monospace"&gt;/etc/openldap/schema/&lt;/font&gt; and then add them as includes to the &lt;font face="monospace"&gt;slapd.conf&lt;/font&gt; file.  I also added in a section at the bottom of the config generator to add in TLS support as transmitting credentials in cleartext is a no-no.  (Of course, I discovered that ldapclient has issues talking TLS, but that’s a problem for later.)&lt;br/&gt;&lt;br/&gt;So, openfiler is now serving up our LDAP content, time to modify the LDAP itself!  Step one, your root DSE needs to have two additional object classes added to it - domainRelatedObject and nisDomainObject.  Both will require new attributes to be set, and both should have the same value, corresponding to your domain name.  So, if your root DSE is dc=blah,dc=me the attributes would both be set to blah.me.  With the root DSE added, you need to add a profile that ldapclient will use to configure itself.  This requires two entries to be created - a new OU and an entry underneath it.  Here is the LDIF - change the IPs and off you go!&lt;br/&gt;&lt;br/&gt;&lt;font face="monospace"&gt;dn: ou=profile,dc=blah,dc=me&lt;br/&gt;objectClass: organizationalUnit&lt;br/&gt;objectClass: top&lt;br/&gt;ou: profile&lt;br/&gt;&lt;br/&gt;dn: cn=Solaris,ou=profile,dc=blah,dc=me&lt;br/&gt;objectClass: DUAConfigProfile&lt;br/&gt;objectClass: top&lt;br/&gt;cn: Solaris&lt;br/&gt;authenticationMethod: simple&lt;br/&gt;bindTimeLimit: 2&lt;br/&gt;credentialLevel: proxy&lt;br/&gt;defaultSearchBase: dc=blah,dc=me&lt;br/&gt;defaultSearchScope: sub&lt;br/&gt;defaultServerList: 10.10.10.10&lt;br/&gt;followReferrals: TRUE&lt;br/&gt;preferredServerList: 10.10.10.10&lt;br/&gt;profileTTL: 0&lt;br/&gt;searchTimeLimit: 30&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;Next step - configure LDAP on Solaris!  Run this magic little command, replacing the password with the openfiler password, and the correct IP of the openfiler server:&lt;br/&gt;&lt;font face="monospace"&gt;ldapclient init -a proxyPassword=somepassword -a proxyDN=cn=openfiler,dc=blah,dc=me -a domainname=blah.me -a profileName=Solaris 10.10.10.10&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;When it is done (may take a while, and doesn’t tell you SQUAT about what it is doing), you should see this:&lt;br/&gt;&lt;font face="monospace"&gt;System successfully configured&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;If you don’t, you are in problem town; run the previous command, but throw a &lt;font face="monospace"&gt;-v&lt;/font&gt; in there so you can see what it is doing.  On one of the RAC clients the LDAP service (svc:/network/ldap/client:default) was stuck in maintenance mode, which was hoofing everything up.  I had to manually create the &lt;font face="monospace"&gt;/var/ldap/ldap_client_cred&lt;/font&gt; and &lt;font face="monospace"&gt;/var/ldap/ldap_client_file&lt;/font&gt; files, fire the service up, then try again.  Hopefully you don’t have any issues as it is very difficult to figure out what is going on and how to fix it - I wasted a HUGE chunk of time yesterday trying to get the ldapclient command to work.&lt;br/&gt;&lt;br/&gt;At this point in time, you should be done, and should be able to create a user in openfiler and login to using that user on your Solaris 10 machine.  Two notes to this little guide: I still haven’t figured out how to get Solaris/TLS to work yet, and I also need to find out how to have a user’s non-existent home directory created automatically when they login for the first time.  But hey, that is what Friday is for!&lt;br/&gt;&lt;br/&gt;Good luck!&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;div class="zemanta-pixie"&gt;&lt;img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=2e776f3b-6462-8298-ae70-ed20a954601c"/&gt;&lt;/div&gt;</description><link>http://www.laccetti.com/post/173942370</link><guid>http://www.laccetti.com/post/173942370</guid><pubDate>Fri, 28 Aug 2009 07:45:30 -0400</pubDate><category>solaris</category><category>ldap</category><category>openfiler</category><category>insanity</category></item><item><title>I unlocked the Coming Down! achievement on Red Faction: Guerrilla! http://ping.fm/1wBha</title><description>&lt;p&gt;I unlocked the Coming Down! achievement on Red Faction: Guerrilla! &lt;a href="http://ping.fm/1wBha" target="_blank"&gt;http://ping.fm/1wBha&lt;/a&gt;&lt;/p&gt;</description><link>http://www.laccetti.com/post/163947680</link><guid>http://www.laccetti.com/post/163947680</guid><pubDate>Sun, 16 Aug 2009 00:40:12 -0400</pubDate></item><item><title>DoneDone guys got back to me - seems that there is a cookie coming back that I need to rip out and...</title><description>&lt;p&gt;DoneDone guys got back to me - seems that there is a cookie coming back that I need to rip out and send back in with other requests.  Eek!&lt;/p&gt;</description><link>http://www.laccetti.com/post/163945149</link><guid>http://www.laccetti.com/post/163945149</guid><pubDate>Sun, 16 Aug 2009 00:35:59 -0400</pubDate></item><item><title>I unlocked the Bling achievement on Trials HD! http://ping.fm/rxjFl</title><description>&lt;p&gt;I unlocked the Bling achievement on Trials HD! &lt;a href="http://ping.fm/rxjFl" target="_blank"&gt;http://ping.fm/rxjFl&lt;/a&gt;&lt;/p&gt;</description><link>http://www.laccetti.com/post/163910238</link><guid>http://www.laccetti.com/post/163910238</guid><pubDate>Sat, 15 Aug 2009 23:35:35 -0400</pubDate></item><item><title>I unlocked the Tank Buster achievement on Red Faction: Guerrilla! http://ping.fm/6hEDt</title><description>&lt;p&gt;I unlocked the Tank Buster achievement on Red Faction: Guerrilla! &lt;a href="http://ping.fm/6hEDt" target="_blank"&gt;http://ping.fm/6hEDt&lt;/a&gt;&lt;/p&gt;</description><link>http://www.laccetti.com/post/163860404</link><guid>http://www.laccetti.com/post/163860404</guid><pubDate>Sat, 15 Aug 2009 22:05:59 -0400</pubDate></item></channel></rss>
