<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUYNSHw_eip7ImA9WxBbE0w.&quot;"><id>tag:blogger.com,1999:blog-30950679</id><updated>2010-03-11T06:19:59.242-08:00</updated><title>Regular Expressions</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://idcmp.linuxstuff.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/idcmp" /><feedburner:info uri="idcmp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>49.27</geo:lat><geo:long>-123.12</geo:long><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fidcmp" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fidcmp" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/idcmp" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fidcmp" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fidcmp" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fidcmp" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=Regular%20Expressions&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2Fidcmp&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><feedburner:feedFlare href="http://www.fwicki.com/users/default.aspx?addfeed=http%3A%2F%2Ffeeds.feedburner.com%2Fidcmp" src="http://www.fwicki.com/images/ui/fwicki_clicklet.png">Subscribe with fwicki</feedburner:feedFlare><entry gd:etag="W/&quot;DUcNSHw6cCp7ImA9WxBbEks.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-6631377669491664896</id><published>2010-03-10T15:55:00.003-08:00</published><updated>2010-03-10T16:24:59.218-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-10T16:24:59.218-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="interviews" /><category scheme="http://www.blogger.com/atom/ns#" term="resumes" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="rants" /><title>What Your Hiring Process Says About You</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;What's your hiring experience like? &amp;nbsp;How many "hoops" do you make candidates go through? &amp;nbsp;Why do you make them go through them? &amp;nbsp;In this post I'll recount some hiring processes I&amp;nbsp;experienced&amp;nbsp;and chat a bit about what (as a candidate) they said about the company. At the end I have a potential checklist.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;1. Longest: Archiving Company&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;As a referral, I was spared an initial phone screen and instead was brought in person to meet an operations manager. &amp;nbsp;His questions were non-technical and focused along the "How well do you deal with conflict? &amp;nbsp;How well do you deal with challenging people to work with? &amp;nbsp;Have you been in an environment where people were difficult to get along with?". &amp;nbsp;We ran over time and I was asked to come back to talk to a project manager. &amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I returned a few days later and the interviewer was reading off situational HR questions, all with a tilt toward conflict resolution. &amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;A few days later, I was asked to complete an assignment - write a service with certain features, complete with documentation and tests. Unfortunately I received the assignment on a Friday and was told it had to be completed before Monday morning. &amp;nbsp;This was a surprise and a bit of a disappointment as it conflicted with birthday plans I had that weekend.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;A few days later I was brought in for a third interview with a developer, project manager and product manager. &amp;nbsp;Very few questions were asked about my assignment and the developer asked me some technical questions (some were unrelated to the problem domain they were in). &amp;nbsp;One was my own question that my previous co-worker had brought with him to the company! Further general questions about process followed from their project manager and product manager.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;As the interview was closing up, I discovered they'd like me to write two tests: a number matching test and an IQ test. &amp;nbsp;Both timed, both while a loud lunch party was happening through the adjacent wall. &amp;nbsp;The number matching was a doubled-sided, double-columned list. &amp;nbsp;Each entry had a hand written number and a printed number; I was to mark an X on the ones that differed. &amp;nbsp;The IQ test was pretty standard with tricky logic, English and math questions.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Two days later I received a call from their receptionist saying they were no longer interested. &amp;nbsp;Naturally I contacted my reference to find out more. &amp;nbsp;He responded that as far as he knew, they were still discussing it. He confirmed this later, it was a mistake on their part.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The next day he contacted me with their decision; they were no longer interested. &amp;nbsp;Infact, he said that it was a mistake to even begin the interview process with me as they weren't looking for me.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;(Had they been interested, I would have been asked back for an additional interview with the CEO.)&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Notes&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Needless to say I was disappointed in this process and if it wasn't for the initial reference, I would have given up on this path much sooner.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Explain the workflow to the candidate.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Before I started the process I was told it was similar to a previous company I worked at. &amp;nbsp;It was most definitely not. &amp;nbsp;Not knowing the steps in the hiring workflow, a candidate has no idea that he's about to invest a dozen hours.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Screen for culture.&lt;/b&gt;&amp;nbsp;Every organization has a different "culture", and it's important to double check that a person will fit in with the existing employees (or if they'll shake things up in a good way!)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Your questions will reflect what a candidate thinks is important to you.&lt;/b&gt;&amp;nbsp;&amp;nbsp;When three separate employees ask questions about navigating difficult people, constantly changing requirements and micromanagement, this is what your candidate will think your place is like. &amp;nbsp;If you ask questions about networking protocols or&amp;nbsp;multi-threaded&amp;nbsp;programming, then your candidate will feel the position will involve both. When I asked "Do you use the technology you're asking me about?", I was surprised their answer was "Not really.".&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Sell the company to the candidate. &lt;/b&gt;I was walked around the development area on two occasions and got the feel of the environment. &amp;nbsp;I was told about some of the unique perks of the company too. &amp;nbsp;This kept me interested.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Involve only the right people.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Out of the five people who interviewed me, one was for technical purposes and the other I would potentially be reporting to. &amp;nbsp;The other three were brought in "just to meet me" and "had no real serious questions to ask". &amp;nbsp;As a candidate, this tells me your decision making process requires people who may be uninvolved with a decision to approve.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Limit an interview time.&amp;nbsp;&lt;/b&gt;After about 90 minutes, my ability to continue to answer a barrage of questions begins to diminish. &amp;nbsp;After two hours, I really felt that writing a surprise number-matching and IQ test was quite unfair.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Hiring processes should be fail-fast.&lt;/b&gt;&amp;nbsp;&amp;nbsp;As soon as an organization realizes it's not interested, the process should stop. Clearly this one suffered from poor internal communication and lack of direction. Consuming not only my time, but employee time too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The "assignment" was an interesting project, but given the investment I made and how little it was referenced, I was quite disappointed to waste my time on it. &amp;nbsp;I got the feeling the developer hadn't had time to read it, or that this was just an extra step he disagreed with. &amp;nbsp;The length of this process gave me a lot of experience in what not to do. &amp;nbsp;Had I been accepted, refactoring the hiring workflow was going to be a personal side project. &amp;nbsp;&lt;/div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Shortest: Payment Company&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Reading up about the company, I figured that I would be a good fit. &amp;nbsp;I emailed a simple cover letter with some specifics of where I'd fit in. &amp;nbsp;Their CTO responded back and we set up an in-person interview.&lt;br /&gt;
&lt;br /&gt;
The interview with the CTO went well, but he was hoping to have me fill a different role than I was looking for. &amp;nbsp;I met after with two of their developers who were prepared to ask me questions relating to the other role and were ill-prepared to ask me Java related questions.&lt;br /&gt;
&lt;br /&gt;
The next day I heard back from the CTO; his team didn't feel I was Java-savvy enough.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Notes&lt;/span&gt;&lt;br /&gt;
Short, and sweet. &amp;nbsp;Within a few days this company came and left my radar. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Know what you're looking for. &lt;/b&gt;Before bringing in candidates, clearly define the role you're looking for. &amp;nbsp;If you're not sure (it happens sometimes), then spend time defining what you're &lt;i&gt;not&lt;/i&gt;&amp;nbsp;looking for.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Be prepared.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Having stock questions to get a conversation going is fine, but if you haven't read the candidate's resume and don't know what to expect, you'll be ill-prepared to ask the right questions to find out their skills, and most likely opt not to hiring them simply because of this.&lt;br /&gt;
&lt;br /&gt;
They did an excellent job explaining the technology, where they were going and what challenges were ahead for them. &amp;nbsp;The developers I chatted with were interesting, but since they had a "systems guy" and not a "Java guy" mindset, they didn't know what to ask.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Accepted: eCommerce Company&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Did some research to discover they'd been looking for someone to fill this position for a while, skipped their online application form and found the email address for hiring. &amp;nbsp;I had customized my cover letter to ensure they realized I was looking for a specific role and highlighted how my experience meshes with what I was looking for.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;I received a call back from their hiring team and we set up a phone screen. &amp;nbsp;During the phone screen we discussed what I was looking for, salary expectations, and more about what the company does. &amp;nbsp;From there I was told there was an online Java quiz to do.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;The quiz was timed and fairly wide reaching.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;I heard back a couple days later that they would like to schedule an in-person technical and HR interview. &amp;nbsp;I asked if this was &lt;b&gt;&lt;i&gt;the&lt;/i&gt;&lt;/b&gt; interview or if there were multiple steps. &amp;nbsp;At the time I was told that this was &lt;b&gt;&lt;i&gt;the&lt;/i&gt;&lt;/b&gt;&amp;nbsp;interview, so I fit it in the day before I left on a trip.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;I met with a developer there who knew his stuff, and he asked me a stock set of questions and asked me to clarify something from the quiz. &amp;nbsp;Apparently I had got one question wrong but they were still interested. &amp;nbsp;After, I met with the internal recruiter and we talked more about the company and where things were. &amp;nbsp;She let me know that there were two more steps: a refactoring exercise and a second interview. &lt;br /&gt;
&lt;br /&gt;
My first interview went well and I received the assignment while on my trip. &amp;nbsp;Once I returned I sent back my answer and a couple days later I was asked in for a second interview. &amp;nbsp;The assignment took probably an hour or two.&lt;br /&gt;
&lt;br /&gt;
This interview I met with their development manager and we discussed my solution, my decisions, alternatives, drawbacks and technology in general. &amp;nbsp;Later I met with their CTO who asked me some higher level questions.&lt;br /&gt;
&lt;br /&gt;
Then I waited. &amp;nbsp;After what seemed unusually long, I was asked to provide references. After I did, it took an additional week to check them; mid-week I was told why. &amp;nbsp;The company was making some internal changes and this role may not be exactly what it initially was. &amp;nbsp;After discussing it further, I was still on board and was asked for a third interview - more of a just a chat - with the person who would signoff on the hiring paperwork.&lt;br /&gt;
&lt;br /&gt;
I was in the next day and chatted with the VP in question for approximately 10 minutes and he was sold; an offer was made later that day.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Notes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Internal political changes made this hiring process a lot longer than it should have been, and being accidentally mislead about the hiring process was a bit of a disappointment. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Funnel Requests. &lt;/b&gt;A month prior to emailing them directly, I had filled out an online application form on their site and never heard from them. &amp;nbsp;Since I felt I was a strong potential, I skipped that step when I later saw the role was still unfilled. &amp;nbsp;I still wonder where my first application went.. &amp;nbsp;Make sure that all different interfaces candidates can apply through are given equal priority.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Have Discussions. &lt;/b&gt;In a previous company, I would bring whatever problem I was currently tackling to the interview and ask the candidate, providing as much background as I could. &amp;nbsp;We'd work through it together and see where we got. &amp;nbsp; Having a refactoring assignment to chat about simulated this and turned the interview from Q&amp;amp;A to more of a free flowing discussion of ideas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Summary&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The eCommerce Company with their phone screen and online quiz had a "fail-fast" process, and I met only with relevant people. &amp;nbsp;They mostly knew what they were looking for, but internal change made the hiring more challenging. &amp;nbsp;I only answered a handful of direct "fit" questions. &amp;nbsp;Everyone I chatted with was open about the challenges they were facing but also quick to highlight some of the great things they really liked. &amp;nbsp;I discovered that both the quiz and the assignment came from existing weaknesses in their team and code base.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;The Checklist&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;We explain our complete hiring workflow to candidates up front and keep them informed of their progress.&lt;/li&gt;
&lt;li&gt;We will stop the hiring process as soon as we feel the answer would be "no". &amp;nbsp;Our process is optimized to make this happen as soon as possible.&lt;/li&gt;
&lt;li&gt;We limit the time an interview will take, but will cut it short if the answer is a definite "yes" or "no".&lt;/li&gt;
&lt;li&gt;All potential candidates which enter our hiring system are treated equally, regardless of source.&lt;/li&gt;
&lt;li&gt;We ensure candidates will be a good fit with the rest of the people here, and we feel we can do this mostly by discussing relevant topics with them.&lt;/li&gt;
&lt;li&gt;Our interviewers always take time to prepare before an interview.&lt;/li&gt;
&lt;li&gt;Our questions are relevant to the company, technology and role we're looking to fill.&lt;/li&gt;
&lt;li&gt;We know the specific skills needed to succeed in the role we're looking to fill.&lt;/li&gt;
&lt;li&gt;Our hiring process includes conversations with candidates similar to the ones that we have internally already.&lt;/li&gt;
&lt;li&gt;We involve the fewest people necessary, each person adds unique value to the process.&lt;/li&gt;
&lt;li&gt;We're honest about our challenges, and we mention the great things about our company throughout the hiring process.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-6631377669491664896?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fKqqYw0QAUh_o868u0v28U1ppXg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fKqqYw0QAUh_o868u0v28U1ppXg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fKqqYw0QAUh_o868u0v28U1ppXg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fKqqYw0QAUh_o868u0v28U1ppXg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=OqbLEs129vA:EXBpxmKbOVY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/OqbLEs129vA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/6631377669491664896/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=6631377669491664896" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/6631377669491664896?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/6631377669491664896?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/OqbLEs129vA/what-your-hiring-process-says-about-you.html" title="What Your Hiring Process Says About You" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2010/03/what-your-hiring-process-says-about-you.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIDRn4yeCp7ImA9WxBUGEQ.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-6990644466253781709</id><published>2010-03-06T09:46:00.000-08:00</published><updated>2010-03-06T09:46:17.090-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-06T09:46:17.090-08:00</app:edited><title>Winner of the Worst Java API Award Goes To.....</title><content type="html">One of my Java interview questions revolves around the best/worst Java APIs a candidate has worked with. &amp;nbsp;Tiago Fernandez has thought to take this question to the next level and posted a poll. &amp;nbsp;While he had less than 100&amp;nbsp;respondents, it meshes pretty closely with my&amp;nbsp;experience, so I would say that the results are pretty accurate. &amp;nbsp;Check out the&amp;nbsp;&lt;a href="http://tiagofernandez.blogspot.com/2010/03/worst-java-apis-poll-results.html"&gt;winner of the worst Java API&lt;/a&gt;. &amp;nbsp;Now, how long will we have to wait for JSR-310?&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-6990644466253781709?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A5YYf-uE21RsocGligEcIadmWt8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A5YYf-uE21RsocGligEcIadmWt8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A5YYf-uE21RsocGligEcIadmWt8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A5YYf-uE21RsocGligEcIadmWt8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=MzQWm3G7KxQ:pF1npAO1h1I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/MzQWm3G7KxQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/6990644466253781709/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=6990644466253781709" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/6990644466253781709?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/6990644466253781709?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/MzQWm3G7KxQ/winner-of-worst-java-api-award-goes-to.html" title="Winner of the Worst Java API Award Goes To....." /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2010/03/winner-of-worst-java-api-award-goes-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QERH87eCp7ImA9WxBUEEk.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-7686701389836877995</id><published>2010-02-24T14:08:00.000-08:00</published><updated>2010-02-24T14:08:25.100-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-24T14:08:25.100-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="interviews" /><title>My Java Developer Interview Questions</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Here it is! Many people have asked for this list - it's one I built, borrowed and tweaked over the years.&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;I place a lot of value in "&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;I don't know&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;" over inventing answers as that's what I'd expect a colleague&amp;nbsp;to do. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;It's really important to tailor questions to each candidate. &amp;nbsp;I'm a strong believer that a smart, experienced developer can pickup new frameworks, APIs, etc, so a lot of these questions are not Java specific.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Know the answers to any of these? :)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Difference Questions&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;These are really great kinds of questions,&amp;nbsp;candidates can talk approach the answer however they feel comfortable and aren't required to give "definitions" of things.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's the difference between TCP and UDP? (if they know, follow up asking about&amp;nbsp;UDP vs ICMP)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's the difference between Bandwidth and Latency?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's the difference between an Inner Join and an Outer Join?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's the difference between NoClassDefFoundError &amp;nbsp;and ClassNotFoundException?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's the difference between SAX and DOM?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's the difference between a Thread and Process?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Order from slowest to fastest: register read, disk seek, context switch, read from main memory.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Design Questions&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Let's say you're reviewing (or writing) a simple system that requests an email address, a password and comments (in a textarea) then stores those values in a database. Pretending performance isn't an issue, what kinds of things would you ensure in place before it went live?&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Sometimes candidates would need some assistance on topics (security, usability, database schemas).&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Let's say McDonald's has asked you to develop their "N millions served" counter for their main website. &amp;nbsp;This value comes from a slower system (via HTTP). &amp;nbsp;Talk a bit about how you would design this. &amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;How do you traverse a cyclic graph?&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Java Specific Questions&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What is autoboxing? Had any problems with it?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Every worked with JMS topic/queue, clustered?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;How are Servlets and JSPs different?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What does 'final' mean? &amp;nbsp;Ever worked with a class marked final? (&lt;i&gt;bonus points if they laugh on the second question&lt;/i&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What does 'static' mean?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;List and describe different access modifiers.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;How would you diagnose a memory leak?&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Random Grab-Bag Questions&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;A bit of systems, object-orienteering, and such.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;How do you check error conditions in bash? (&lt;i&gt;If they list shell scripting&lt;/i&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's the difference between lazy and greedy regular expressions?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's a context switch?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Ever worked on an "AJAX"y system? &amp;nbsp;What challenges did you run into? (&lt;i&gt;a little bit dated now I guess!&lt;/i&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's a deadlock?&amp;nbsp; How do you prevent deadlocks?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What is Polymorphism?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What are the characteristics of a singleton?&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;General Opinion/Discussion Questions&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What makes a good build tool?&amp;nbsp; What makes a bad build tool?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What's your favourite/least favourite API/package? Why?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Have you worked on a high-volume system before? &amp;nbsp;What is "high volume" to you?&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;What have you been asked before?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-7686701389836877995?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qU_GXZhVCczDqzoh2hogDsYrPOI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qU_GXZhVCczDqzoh2hogDsYrPOI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qU_GXZhVCczDqzoh2hogDsYrPOI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qU_GXZhVCczDqzoh2hogDsYrPOI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=9WPcrgKs-QE:-qXdyF7usi8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/9WPcrgKs-QE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/7686701389836877995/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=7686701389836877995" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/7686701389836877995?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/7686701389836877995?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/9WPcrgKs-QE/my-java-developer-interview-questions.html" title="My Java Developer Interview Questions" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2010/02/my-java-developer-interview-questions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcNSX0_eyp7ImA9WxBVGEo.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-5123809186451034053</id><published>2010-02-22T12:53:00.002-08:00</published><updated>2010-02-22T12:54:58.343-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-22T12:54:58.343-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>97 Things Every Programmer Should Know</title><content type="html">Short on the heels of the now-lost 97 Things Every Software Architect Should Know comes a similar list for developers. &amp;nbsp;It covers a wide variety of ideas from ethics and requirements to code formatting and testing. &amp;nbsp;You can &lt;a href="http://oreilly.com/catalog/9780596809485/"&gt;buy it from O'Reilly&lt;/a&gt; or check out the &lt;a href="http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book"&gt;97 things online&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-5123809186451034053?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W52AZmN7t61Der7Hw23BluAW4_Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W52AZmN7t61Der7Hw23BluAW4_Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W52AZmN7t61Der7Hw23BluAW4_Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W52AZmN7t61Der7Hw23BluAW4_Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=-Jw6IyK1L4Q:ptfoOEdxKH4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/-Jw6IyK1L4Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/5123809186451034053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=5123809186451034053" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5123809186451034053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5123809186451034053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/-Jw6IyK1L4Q/97-things-every-programmer-should-know.html" title="97 Things Every Programmer Should Know" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2010/02/97-things-every-programmer-should-know.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EMQnkyeyp7ImA9WxBXFk4.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-1201668331325727657</id><published>2010-01-26T13:10:00.012-08:00</published><updated>2010-01-27T14:34:43.793-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-27T14:34:43.793-08:00</app:edited><title>Four Easy and Practical Tips When Visiting Vancouver for the 2010 Winter Olympics</title><content type="html">I've lived in Vancouver for a while now, and realize that you (and 2.3 million of your closest friends) may be coming to visit for the Winter Olympics.  Here are some dead easy tidbits that will make your stay more enjoyable. You may want to bookmark this post for while you're here.&lt;br /&gt;&lt;h2&gt;Tip #1: Eating&lt;/h2&gt;Typical Vancouver food is Japanese food, mainly &lt;a href="http://maps.google.ca/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=sushi&amp;amp;sll=49.278837,-123.134851&amp;amp;sspn=0.043339,0.073986&amp;amp;ie=UTF8&amp;amp;radius=1.67&amp;amp;rq=1&amp;amp;ev=zi&amp;amp;hq=sushi&amp;amp;hnear=&amp;amp;ll=49.277885,-123.130045&amp;amp;spn=0.04334,0.073986&amp;amp;z=14"&gt;sushi&lt;/a&gt;.  There are &lt;i&gt;many&lt;/i&gt; good, cheap Japanese/Sushi places all over the city. If you've never had Japanese food before (and you're nervous), check out the all-you-can-eat places that offer appetizer sizes of anything. Leaving Vancouver without at least trying would be pretty close to a crime.&lt;br /&gt;&lt;br /&gt;Once you've had your fill of sushi, use &lt;a href="http://www.urbanspoon.com/c/14/Vancouver-restaurants.html"&gt;Urban Spoon&lt;/a&gt; to find other places to eat (&lt;a href="http://dinehere.ca/vancouver/"&gt;Dine Here&lt;/a&gt; is good too - but a little less friendly).  If you like greasy-spoon breakfasts, try &lt;a href="http://www.urbanspoon.com/r/14/452299/restaurant/Robson-Street-West-End/Joes-Grill-Vancouver"&gt;Joe's Grill&lt;/a&gt; or &lt;a href="http://www.urbanspoon.com/r/14/180204/restaurant/Hastings-Sunrise/Bons-Off-Broadway-Vancouver"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Bon's&lt;/span&gt; Off Broadway&lt;/a&gt;. I like &lt;a href="http://www.urbanspoon.com/r/14/181802/restaurant/Downtown/Templeton-Vancouver"&gt;Templeton&lt;/a&gt; (don't let its appearance deceive you!) and &lt;a href="http://www.urbanspoon.com/r/14/180953/restaurant/Robson-Street-West-End/Kams-Place-Vancouver"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Kam's&lt;/span&gt; Place&lt;/a&gt; (tasty Singaporean food) but they're probably going to be packed while you're here. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;br /&gt;&lt;br /&gt;Kam's&lt;/span&gt; Place has had a two-for-one coupon near the back of the &lt;a href="http://www.straight.com/"&gt;Georgia Straight&lt;/a&gt; (weekly free Vancouver newspaper) every week for the past five years.  Lastly, there are a number of delicious restaurants in the Commercial Drive area.&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Your&lt;/span&gt; life will be just as fulfilling if you didn't go to Denny's or White Spot.&lt;br /&gt;&lt;br /&gt;Don't forget grocery stores for when you just want to pick up some snacks on the go. Vancouver has a few chains including &lt;a href="http://maps.google.ca/maps?q=iga,+vancouver"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;IGA&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://maps.google.ca/maps?q=safeway,vancouver"&gt;Safeway&lt;/a&gt;, &lt;a href="http://maps.google.ca/maps?q=save+on+foods,vancouver"&gt;Save On Foods&lt;/a&gt;, &lt;a href="http://maps.google.ca/maps?q=urban+fare,vancouver"&gt;Urban Fare&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you're from outside Canada and want to try "Canadian food", don't ask us. Most of us will have no idea. Look around for &lt;a href="http://en.wikipedia.org/wiki/Nanaimo_bar"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;nanaimo&lt;/span&gt; bars&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Poutine"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;poutine&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Bannock_%28food%29"&gt;bannock&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Tourti%C3%A8re"&gt;tourtiere&lt;/a&gt;, &lt;a href="http://images.google.ca/images?q=lobster%20rolls"&gt;lobster rolls&lt;/a&gt;, &lt;a href="http://images.google.ca/images?q=steamed+fiddleheads"&gt;steamed &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;fiddleheads&lt;/span&gt;&lt;/a&gt;, and &lt;a href="http://images.google.ca/images?q=maple+sugar+pie"&gt;maple sugar pie&lt;/a&gt; - all genuinely Canadian. (If you've got a sweet tooth, seek out &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;nanaimo&lt;/span&gt; bars).  Vancouver also has a number of local breweries, and BC has a number of wineries.&lt;br /&gt;&lt;br /&gt;With over 120 Starbucks in Vancouver, we're definitely a coffee-culture city. Other chains include Waves and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Blenz&lt;/span&gt; (both offering free &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;wifi&lt;/span&gt;), as well as the more ubiquitous Tim Horton's (origin of the term &lt;a href="http://www.urbandictionary.com/define.php?term=Double-Double"&gt;double double&lt;/a&gt;). If you're a Starbucks &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;fanboy&lt;/span&gt;, I encourage you to make your way to the corner of &lt;a href="http://maps.google.ca/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Robson+St+%26+Thurlow+St,+Vancouver,+BC&amp;amp;sll=49.276522,-123.12519&amp;amp;sspn=0.011633,0.018497&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Robson+St+%26+Thurlow+St,+Vancouver,+Greater+Vancouver+Regional+District,+British+Columbia&amp;amp;ll=49.284523,-123.124622&amp;amp;spn=0.002908,0.004624&amp;amp;z=18"&gt;Robson and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Thurlow&lt;/span&gt;&lt;/a&gt; - a famous intersection with &lt;span style="font-weight: bold;"&gt;two Starbuckseseses&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Tip #2: Getting Around&lt;/h2&gt;&lt;span style="font-weight: bold;"&gt;Don't Drive&lt;/span&gt;.  I really can't stress this enough.  The city has recently extended pay-parking hours to 10pm - seven days a week &lt;span style="font-style: italic;"&gt;everywhere&lt;/span&gt; in the city.  Even without the 2.3 million additional people, driving in Vancouver is a pain.  I've read somewhere that all tickets to Olympic events include transportation to/from the event.  Please check into this!&lt;br /&gt;&lt;br /&gt;Public transportation in Vancouver is run by &lt;a href="http://www.translink.ca/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;TransLink&lt;/span&gt;&lt;/a&gt;.  It includes buses, subways (Canada Line), light rail (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;SkyTrain&lt;/span&gt;) and ferries (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;SeaBus&lt;/span&gt;).  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;TransLink&lt;/span&gt; fares work on a "zone" system.  Your fare corresponds to how many zones you'll be travelling through.  I found a pretty good &lt;a href="http://members.shaw.ca/david.marlor/vrt2009.jpg"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;TransLink&lt;/span&gt; Map&lt;/a&gt;.  As a rule, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;SkyTrain&lt;/span&gt; and Canada Line stops have fare machines which accept &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Interac&lt;/span&gt;, credit card and Canadian cash. Buses are exact-fare.&lt;br /&gt;&lt;br /&gt;Google Maps has a "Directions by Transit" for getting around the city.  I encourage you to use this as a &lt;span style="font-style: italic;"&gt;backup&lt;/span&gt; during the Olympics as some operating changes just for the Olympics have been made and I'm not sure if Google has been updated.  Instead, use the pretty decent&lt;br /&gt;&lt;a href="http://tripplanning.translink.ca/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;TransLink&lt;/span&gt; Trip Planner&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you don't have prepaid tickets (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;FareCards&lt;/span&gt;), there will be a $5 surcharge (per person) traveling from the airport on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;TransLink&lt;/span&gt; (via the Canada Line).  It's still cheaper than taking a taxi.  If you see someone at the airport selling &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;FareCards&lt;/span&gt;, you may want to take them up on the offer.  To ensure it's legit, make sure the magnetic stripe side of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;FareCard&lt;/span&gt; doesn't already have an expiry time printed on it.&lt;br /&gt;&lt;br /&gt;If you use the Trip Planner and you see "get off one &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;SkyTrain&lt;/span&gt;, get on another &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;SkyTrain&lt;/span&gt;" around Broadway-Commercial, I will confess it is a bit confusing the first time you do so, but you won't be alone in the necessary confusion.  It's all well-marked.&lt;br /&gt;&lt;br /&gt;Looking for something kinda fun to do? There is a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;SeaBus&lt;/span&gt; that goes from &lt;a href="http://maps.google.ca/maps?f=d&amp;amp;source=s_d&amp;amp;saddr=Waterfront+Stn+SeaBus+Northbound&amp;amp;daddr=Lonsdale+Quay+SeaBus+Northbound&amp;amp;geocode=%3BFVdp8AIdrOap-ClbpOsjs3GGVDFaRk5fSs86sQ&amp;amp;hl=en&amp;amp;mra=ls&amp;amp;dirflg=r&amp;amp;date=10%2F01%2F26&amp;amp;time=14:25&amp;amp;ttype=dep&amp;amp;noexp=0&amp;amp;noal=0&amp;amp;sort=&amp;amp;tline=&amp;amp;sll=49.286084,-123.110213&amp;amp;sspn=0.002908,0.004624&amp;amp;ie=UTF8&amp;amp;ll=49.293953,-123.093052&amp;amp;spn=0.046517,0.073986&amp;amp;t=h&amp;amp;z=14&amp;amp;start=0"&gt;Waterfront to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;Lonsdale&lt;/span&gt;&lt;/a&gt;, it's a two-zone ride (cheaper on the weekends).  It's a fun little ride.  The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;Lonsdale&lt;/span&gt; side has a market with fresh food stuffs too.  You'll have a nice view of downtown from the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;Lonsdale&lt;/span&gt; side too.  Great on a sunny day!&lt;br /&gt;&lt;br /&gt;When walking downtown, streets that run NW/SE are just generally referred to as "North" or "South" by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;downtowners&lt;/span&gt;.  "If you can see the mountains, you're facing North." is a rule many locals have.  I think (at least downtown) locals are pretty happy to help a lost soul.&lt;br /&gt;&lt;br /&gt;Lastly, if you can avoid taking public transportation from 7am-10am and from 3pm-6pm, those of us going to work would greatly appreciate it. :-)&lt;br /&gt;&lt;br /&gt;If you are driving, and you're from outside BC, you'll want to know about our &lt;a href="http://blog.webfoot.com/2006/11/22/flashing-green-lights/"&gt;BC traffic lights&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Tip #3: Weather&lt;/h2&gt;Vancouver is generally a rainy city.  The outskirts are cold enough to get snow, but usually not a lot.  If you want to see what it looks like right now in Vancouver, the popular and mostly reliable &lt;a href="http://www.katkam.ca/"&gt;Kat &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;Kam&lt;/span&gt;&lt;/a&gt; web cam is a great start.&lt;br /&gt;&lt;br /&gt;I pretty much swear by Environment Canada's &lt;a href="http://www.weatheroffice.gc.ca/city/pages/bc-74_metric_e.html"&gt;Vancouver Seven Day Forecast&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dress in layers (guys too), but leave your umbrella at home.  Instead, bring a long a hooded rain jacket.  You'll navigate the sidewalks a lot more effectively and you're not likely to leave your jacket behind somewhere.&lt;br /&gt;&lt;br /&gt;Locals tend to need higher amounts of rain to trigger their "I should put my hood up" feeling.&lt;br /&gt;&lt;br /&gt;Vancouver is stunning when it's sunny out.  If you can, make your way to the &lt;a href="http://maps.google.ca/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=4608+Cypress+Bowl+Rd,+West+Vancouver,+BC&amp;amp;sll=49.35363,-123.179376&amp;amp;sspn=0.011615,0.018497&amp;amp;g=4608+Cypress+Bowl+Rd&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=4608+Cypress+Bowl+Rd,+West+Vancouver,+Greater+Vancouver+Regional+District,+British+Columbia&amp;amp;ll=49.351142,-123.17723&amp;amp;spn=0.011616,0.018497&amp;amp;t=h&amp;amp;z=16"&gt;Lookout at Cypress Mountain&lt;/a&gt; for pretty much the best view of Vancouver day or night.&lt;br /&gt;&lt;h2&gt;Tip #4: Blending In&lt;/h2&gt;Here are some random tips you may want to keep in mind:&lt;br /&gt;&lt;br /&gt;Just like the Tube, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;Vancouverites&lt;/span&gt; follow "Stand to the side to let people out before getting on" for public transportation.  If you do this too, you'll blend in a lot better.&lt;br /&gt;&lt;br /&gt;Most people here don't speak French; there are easily more Chinese/Japanese/Korean speakers than French speakers in Vancouver.&lt;br /&gt;&lt;br /&gt;Generally speaking in the rain, if you're without a hooded jacket or umbrella, walk nearest to buildings. If you've got an umbrella, walk &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_35"&gt;furthermost&lt;/span&gt; from buildings.&lt;br /&gt;&lt;br /&gt;On stairs and escalators, we follow the "stand on the right, walk on the left" rule.&lt;br /&gt;&lt;br /&gt;The weather is a popular conversation topic and can be used to talk to just about anyone - especially if it's nice out!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;That's It&lt;/h2&gt;Enjoy your trip!  And if you're looking for someone to go for sushi with, drop me an email. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-1201668331325727657?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rtAxLwuf6jPj4YGS6ZvKGIUqf6s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rtAxLwuf6jPj4YGS6ZvKGIUqf6s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rtAxLwuf6jPj4YGS6ZvKGIUqf6s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rtAxLwuf6jPj4YGS6ZvKGIUqf6s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=EnzU9pZbOOg:GrUwKEi1x1o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/EnzU9pZbOOg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/1201668331325727657/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=1201668331325727657" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/1201668331325727657?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/1201668331325727657?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/EnzU9pZbOOg/four-easy-and-practical-tips-when.html" title="Four Easy and Practical Tips When Visiting Vancouver for the 2010 Winter Olympics" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2010/01/four-easy-and-practical-tips-when.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQCRH4_eCp7ImA9WxVbF04.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-4187149614066667587</id><published>2009-04-02T22:35:00.002-07:00</published><updated>2009-04-02T22:42:45.040-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-02T22:42:45.040-07:00</app:edited><title>Xen vs KVM</title><content type="html">I wanted to chime in on the Xen vs. KVM discussions, and give you some food for thought.&lt;br /&gt;&lt;br /&gt;I've been using Xen now for years, having replaced UserModeLinux on my personal server, and it's seen a lot of production use at my current job.  &lt;br /&gt;&lt;br /&gt;That said, KVM is ultimately the right way to go. Constant maintenance of Xen's hypervisor kernel is what causes Linux distributions grief with Xen.  Those that keep doing it, do so because it's performant, tested and well-understood.&lt;br /&gt;&lt;br /&gt;So you're stuck wondering which virtualization technology you should pick.  Here it is: &lt;a href="http://libvirt.org/"&gt;libvirt&lt;/a&gt; (with Xen).&lt;br /&gt;&lt;br /&gt;Base your toolset, deployment, configuration, and maintenance on libvirt, and use the Xen hypervisor for now.&lt;br /&gt;&lt;br /&gt;libvirt provides an easy upgrade path from Xen to KVM once KVM's performance and stability have been battle hardened. Same virtual machine configuration, same provisioning, same disk images.  Just grab a new kernel, change which hypervisor you're using and you'll be in the land of tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-4187149614066667587?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/efhEUT4FRjMoCAbELlZuUlnATD8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/efhEUT4FRjMoCAbELlZuUlnATD8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/efhEUT4FRjMoCAbELlZuUlnATD8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/efhEUT4FRjMoCAbELlZuUlnATD8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=G0bWwEeEiO0:f0hFv58CUKc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/G0bWwEeEiO0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/4187149614066667587/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=4187149614066667587" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4187149614066667587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4187149614066667587?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/G0bWwEeEiO0/xen-vs-kvm.html" title="Xen vs KVM" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2009/04/xen-vs-kvm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIFR3s6fip7ImA9WxVSEU8.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-4456828730153334798</id><published>2009-01-04T16:46:00.007-08:00</published><updated>2009-01-04T17:55:16.516-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-04T17:55:16.516-08:00</app:edited><title>Provisioning Servers: An Afternoon with Cobbler</title><content type="html">I spent some time evaluating Fedora's &lt;a href="https://fedorahosted.org/cobbler/"&gt;Cobbler&lt;/a&gt; installation service. If you play with many machines - real or virtual - you should definitely take a look. Some handy features:&lt;br /&gt;&lt;br /&gt;* Kickstart Setup: For Red Hat &lt;i&gt;breed&lt;/i&gt; systems, existing Kickstart configurations (found on installation media) are exposed as &lt;b&gt;profiles&lt;/b&gt; in Cobbler.  You can add your own Kickstart configurations too (imagine a "rhel5-webserver" profile).&lt;br /&gt;&lt;br /&gt;* PXE Management: Tied in with a DHCP server, cobbler will offer profiles up for installation for servers during PXE boot (often called &lt;i&gt;Boot from network&lt;/i&gt;), since these profiles are tied with Kickstart configurations, servers can be setup or re-setup with just a few keystrokes. KVM seems to support PXE boots; less hoops for installation your VMs.&lt;br /&gt;&lt;br /&gt;* Repository Mirroring: Cobbler can take the URL to a repository and mirror it locally, both yum and apt style repositories (rpm and deb) are supported.  Use &lt;b&gt;cobbler reposync&lt;/b&gt; to keep local mirrors up to date.  &lt;br /&gt;&lt;br /&gt;* Distribution Swallowing: Cobbler can copy installation media and copy it locally.&lt;br /&gt;&lt;br /&gt;* Boot ISO / Live CD: If your server doesn't support PXE, or if tying into DHCP isn't an option, cobbler can make burnable ISOs (and thus USB thumb images) that can be used to perform network installs.&lt;br /&gt;&lt;br /&gt;* MAC Address to Profile Management: Cobbler can associate a particular MAC address with a particular profile.&lt;br /&gt;&lt;br /&gt;* Automatic Repository Setup: Cobbler can setup your local yum mirror in your newly created server automatically for you.&lt;br /&gt;&lt;br /&gt;* Triggers / Puppet Integration: Cobbler can be configured to register the new machine with puppet, or run other triggers (imagine automatic graphs in Cacti, monitoring in OpsView, etc, etc).&lt;br /&gt;&lt;br /&gt;* KOAN: Koan is a command line tool that talks with the Cobbler server. It can be used to set up new VMs (using libvirtd), or with a special &lt;b&gt;--replace-self&lt;/b&gt; option, cause an existing installation to reinstall itself.  (Only works with Red Hat breed systems.)&lt;br /&gt;&lt;br /&gt;* Zeroconf: Avahi is among one of the coolest technologies I've played with recently. Specifying &lt;b&gt;--server=DISCOVER&lt;/b&gt; on the koan command line will find the cobbler server on the network. I love stuff like that.&lt;br /&gt;&lt;br /&gt;* Configuration Cloning: Move your test environment configuration into production (or mirror for HA, etc)&lt;br /&gt;&lt;br /&gt;I really like the architecture of Cobbler too; an XMLRPC server that both the command line tools and web interface use.  The web interface is handled by Apache and mod_python, so authentication and authorization are handled by Apache (ie, basically anything you can think of).&lt;br /&gt;&lt;br /&gt;Lastly, one nice touch is &lt;b&gt;cobbler check&lt;/b&gt;.  Run right after a fresh install it checks your environment and lets you know of anything that could potentially hamper Cobbler from working.&lt;br /&gt;&lt;br /&gt;I haven't yet tried Cobbler with an existing DHCP server, and I'm not sure it supports ISC DHCP's failover capabilities (even with OMAPI).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-4456828730153334798?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QegixcmkCTufW-eOqraLIxAUo6g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QegixcmkCTufW-eOqraLIxAUo6g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QegixcmkCTufW-eOqraLIxAUo6g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QegixcmkCTufW-eOqraLIxAUo6g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=Hrl5rW7_7o4:jFoI89miHGg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/Hrl5rW7_7o4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/4456828730153334798/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=4456828730153334798" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4456828730153334798?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4456828730153334798?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/Hrl5rW7_7o4/provisioning-servers-afternoon-with.html" title="Provisioning Servers: An Afternoon with Cobbler" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2009/01/provisioning-servers-afternoon-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cMR3s9eCp7ImA9WxVTFUQ.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-4439859257237931845</id><published>2008-12-29T09:03:00.002-08:00</published><updated>2008-12-29T14:51:26.560-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-29T14:51:26.560-08:00</app:edited><title>Ye Olde Job: Technology That Wasn't</title><content type="html">Our system could accept transactions over the phone (via a clerk) or through our website.  The clerk on the phone used a semi-web based application to interact with the system.&lt;br /&gt;&lt;br /&gt;The headache with this was that the code base for the "semi-web" and "actual web" only became a common code path much, much deeper in the code. So the plan was simple, redo the website code such that it could eventually be leveraged to replace the semi-web code.&lt;br /&gt;&lt;br /&gt;We prototyped, mocked up, tested and developed a new part of the application on our website using &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt;. It went through load testing, SEO-approval and I believe we even did a couple in-company demos of the technology.&lt;br /&gt;&lt;br /&gt;The code was "done" (in the "given to QA to break" sense of the word) when I left, but when I check the website now I see it never made it to production.&lt;br /&gt;&lt;br /&gt;I cared about this for the first month or so after I left, so I pinged around to find out what happened.  The short version is that it got stuck in developer mythology, and with nobody there to lead it out, I knew it would never see the light of day.&lt;br /&gt;&lt;br /&gt;I wonder just how much technology is "done" that has never seen the real world?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-4439859257237931845?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Hv4elmAqxobWqAjJ_pkPHBCTvOQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Hv4elmAqxobWqAjJ_pkPHBCTvOQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Hv4elmAqxobWqAjJ_pkPHBCTvOQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Hv4elmAqxobWqAjJ_pkPHBCTvOQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=YC9jnuwfhic:Ix6ViEuC4xI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/YC9jnuwfhic" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/4439859257237931845/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=4439859257237931845" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4439859257237931845?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4439859257237931845?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/YC9jnuwfhic/ye-olde-job-technology-that-wasnt.html" title="Ye Olde Job: Technology That Wasn't" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/12/ye-olde-job-technology-that-wasnt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EEQn0_fCp7ImA9WxVTFUQ.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-2533826725614276009</id><published>2008-12-26T09:58:00.009-08:00</published><updated>2008-12-29T15:00:03.344-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-29T15:00:03.344-08:00</app:edited><title>Ye Olde Job: First Post - So You're the Boss</title><content type="html">It's been seven months since I left my old job, and I feel it's alright to talk about some things.&lt;br /&gt;&lt;br /&gt;If you're in a situation where you're finding yourself leading a team of developers without any mentoring from anyone on how the heck to do that, I offer you some food for thought.&lt;br /&gt;&lt;br /&gt;As a developer, you measure your own progress by the code you write, the bugs you fix, stored procedures you debug, problems you solve and features that get released.  You have days where you go home "having done nothing" because you have a dozen variables in your head and you've been nose deep in code, but whatever it is still isn't working.&lt;br /&gt;&lt;br /&gt;Or maybe you wouldn't debug the stored procedures, but instead really wish that you could replace them with something else; a nice cup of Java, easy to unit test and a breeze to step through.  &lt;br /&gt;&lt;br /&gt;One thing I figured out that really helped me: &lt;i&gt;When leading a team, put the team first.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;What the heck does that mean?&lt;br /&gt;&lt;br /&gt;It means getting to know the strengths and weaknesses of not only your team, but of the teams you interact with.  One developer has a knack at networking, another at databases, another one refactors code from a city dump into a gorgeous mansion.  When the work is important - major features on a tight timeline - use peoples strength. When it's less important - minor bugs, features that are 'nice to have' - let them work on their weaknesses. If other teams have weaknesses in areas, work to help them, or fortify against it.&lt;br /&gt;&lt;br /&gt;It means being two steps ahead of your team, knowing where you're going next.  If nobody else in your company can give you direction two steps ahead, then take matters into your own hands.  Don't just start piecemealing things; always have a vision.  If you don't know where you're going, you won't know when you've gone off course. Obviously, be flexible with your vision for that idle Wednesday when some manager presents his vision to you so you can embrace it and walk together.&lt;br /&gt;&lt;br /&gt;It means giving that improvement away. This was the hardest for me: giving up writing that feature you really wanted or fixing that bug that drives you nuts. You will write less code, but your team will write more code than you ever could. You will want to use a bit of the downtime you'll get to assign yourself some work, but you know you'll never get to it.  Use that downtime to better map out your plan, to make sure everyone has got the work they need and to fish around to see if maybe that company plan or vision is hiding somewhere... ..anywhere.. ..maybe?&lt;br /&gt;&lt;br /&gt;It means accepting shades of grey. There are many wrong ways to do things and few right ways. But there is definitely more than one right way.  The way someone on your team might craft something may not be bytecode-for-bytecode how you would do it, but it may still fall in the realm of right.  Accept that it's not how you would do it.  That's fine.  But is it wrong?&lt;br /&gt;&lt;br /&gt;It means keeping it in the team. Just like most code bases that earn a over a billion dollars, the code base I worked on was suboptimal. We all knew it, but we knew we were there not to whine about it, but to make it better. Bit by bit, day by day. Start with the biggest problems, work toward your vision.&lt;br /&gt;&lt;br /&gt;It means that stored procedure is going to stay; both the DBA and I know how to tune, monitor and troubleshoot it.  We've minimized the row locking in it and fixed a deadlock problem in the logic. Also, next week you'll be fixing it to be resilient against another team's code, because their code does table scans and table locks and it will soon be our busy season and the potential for headaches is not part of my vision.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Updated:&lt;/i&gt; While stored procedures vs ORM is part of a future post, I hope that people who are in the "You've been here the longest, you're in charge" situation can benefit a bit from keeping in mind that they need to put their team before themselves. I know it's hard to switch gears.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-2533826725614276009?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KmLgSqSTQ3gfvHFlpw1tMwtC0nE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KmLgSqSTQ3gfvHFlpw1tMwtC0nE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KmLgSqSTQ3gfvHFlpw1tMwtC0nE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KmLgSqSTQ3gfvHFlpw1tMwtC0nE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=RBRBY1goWVs:VzDUEfEiaWo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/RBRBY1goWVs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/2533826725614276009/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=2533826725614276009" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/2533826725614276009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/2533826725614276009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/RBRBY1goWVs/ye-olde-job-first-post-so-youre-boss.html" title="Ye Olde Job: First Post - So You're the Boss" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/12/ye-olde-job-first-post-so-youre-boss.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYNQ3Y_cSp7ImA9WxRVEko.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-7841236467567219617</id><published>2008-11-09T10:36:00.001-08:00</published><updated>2008-11-09T15:26:32.849-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-09T15:26:32.849-08:00</app:edited><title>Seven Reasons I Didn't Pick Your Open Source Project</title><content type="html">After a really relaxing summer, I've picked up a job as a Systems Architect at local company suffering from growing pains. After almost a decade, I've put down my debugger and picked up a budget..for now. I've found myself &lt;a href="http://freenas.org/"&gt;looking&lt;/a&gt; &lt;a href="http://wandisco.com/"&gt;at&lt;/a&gt; &lt;a href="http://www.opengroupware.org/"&gt;many&lt;/a&gt; &lt;a href="http://www.horde.org/groupware/"&gt;different&lt;/a&gt; &lt;a href="http://www.zimbra.com/"&gt;options&lt;/a&gt; &lt;a href="http://www.microsoft.com/exchange/default.mspx"&gt;of&lt;/a&gt; &lt;a href="http://www.dell.com/content/products/category.aspx/storage"&gt;products&lt;/a&gt; &lt;a href="http://www.netapp.com/us"&gt;some&lt;/a&gt; &lt;a href="http://www.digium.com/en/"&gt;open&lt;/a&gt; &lt;a href="http://openvpn.org/"&gt;source&lt;/a&gt; &lt;a href="http://www.cisco.com/en/US/products/sw/voicesw/index.html"&gt;some&lt;/a&gt; &lt;a href="http://openfiler.com/"&gt;not&lt;/a&gt;. I want to apologize to those open source projects I've rejected and wanted to let you know why:&lt;br /&gt;&lt;br /&gt;1. Capacity Planning: You lack any realistic guidelines for server sizing. I have no idea how much memory, disk, bandwidth or cpu cycles I need to support 250 users checking their email every morning and you have no tools to simulate load.&lt;br /&gt;&lt;br /&gt;2. You're Working On the "Next Gen" Version: You've stopped working on the version people are using in order to rewrite the application using technology that follows your new beliefs. The current version is now suffering from bitrot and your new version is undergoing its third major refactoring. &lt;br /&gt;&lt;br /&gt;3. Your Community: Your forums are an abandoned town with tumbleweed rolling through waking up the sleeping armadillos. Questions go unanswered for months at a time, most of the posts are spam or people asking if the project is dead (which it is).&lt;br /&gt;&lt;br /&gt;4. Installation: Your twelve-step installation process involving a different version of Perl, MySQL, and PHP plugins I don't have is a headache. This is the world of LiveCDs, embedded servlet containers, virtual machines, Web Start, VNC, hosted-demos or at least RPM/DEB packages.&lt;br /&gt;&lt;br /&gt;5. Your Features: They're geared towards other developers and not users.  I realize you're "not M$", and it's swell you think "Not Written in Java, so it's Fast!" is important, and it's sure great that you "use AOP extensively", but if those are the features you list instead of "works through NAT","supports 802.3ad bonding" or "integrates with iCal" then you're pretty far removed from your user base.&lt;br /&gt;&lt;br /&gt;6. Maintenance Headaches: According to your documentation, your upgrade process is "Backup all data. Install new version.  Restore all data."  That's fine if "all data" is the dhcpd leases file, but not so great when it's 9TB of files that users access all day.&lt;br /&gt;&lt;br /&gt;7. Price: Your project has a "commercially supported" version. That's cool, but when the rates listed are more expensive than the defacto standard you can pretty much guarantee I'm not going to be able to sell it upwards.&lt;br /&gt;&lt;br /&gt;I'll let you know what I've picked and how it turns out in the next few months. I'm also looking for a really good Linux sysadmin. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-7841236467567219617?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V5buDFXGGNc_LGGtjM2bsiVpihE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V5buDFXGGNc_LGGtjM2bsiVpihE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V5buDFXGGNc_LGGtjM2bsiVpihE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V5buDFXGGNc_LGGtjM2bsiVpihE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=FtLf4q23CNs:-5KU_WcjBNk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/FtLf4q23CNs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/7841236467567219617/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=7841236467567219617" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/7841236467567219617?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/7841236467567219617?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/FtLf4q23CNs/seven-reasons-i-didnt-pick-your-open.html" title="Seven Reasons I Didn't Pick Your Open Source Project" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/11/seven-reasons-i-didnt-pick-your-open.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcBQ3k7fip7ImA9WxRQF0g.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-2377623438054508630</id><published>2008-10-11T12:35:00.002-07:00</published><updated>2008-10-11T12:40:52.706-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-11T12:40:52.706-07:00</app:edited><title>Wave Tracing: Ray Tracing for Sound</title><content type="html">Here's the pitch: With &lt;a href="http://en.wikipedia.org/wiki/Ray_tracing_(graphics)"&gt;regular ray tracing&lt;/a&gt;, rays of light are traced backward from a pixel of the camera, to an object and eventually to a light source (or lack thereof).  If you can do that with light, why can't it be done with sound?&lt;br /&gt;&lt;br /&gt;Over ten years ago I was having breakfast with a friend and I sketched out the idea on a napkin. This kind of math is definitely not my strong point. But instead of a camera, have a microphone.  Instead of tracing rays, trace vibrations, and instead of light sources, there's air and friction; or so the napkin said.&lt;br /&gt;&lt;br /&gt;Instruments aren't the goal, but a simple model to test would be a &lt;a href="http://en.wikipedia.org/wiki/Recorder"&gt;&lt;br /&gt;grade school caliber recorder&lt;/a&gt;. After modeling materials, blown air resonates down the tube of the recorder generating sound.&lt;br /&gt;&lt;br /&gt;As different quality of air and different materials are created, artists build wireframes of different instruments. The effects of room acoustics could be modeled too.&lt;br /&gt;&lt;br /&gt;This would culminate in a completely rendered orchestra performing a wave traced rendition of Beethoven's Symphony No 5.&lt;br /&gt;&lt;br /&gt;As I mentioned earlier, instruments aren't the goal: Voices are.&lt;br /&gt;&lt;br /&gt;After modeling complex instruments, the next step is to model and animate the speech pathway from lungs to lips. The speech animated model (or "Sam" for short) would start with simple vowels like the [a:] sound in raw, or the [æ] sound in "bad".  (Wikipedia's page on the &lt;a href='http://en.wikipedia.org/wiki/International_Phonetic_Alphabet'&gt;IPA&lt;/a&gt; has some good introductory information). Eventually Sam would be animated to fluidly pronounce most phonemes. Linguistics are also not my strong point.&lt;br /&gt;&lt;br /&gt;I'd imagine that Sam would sound very lifeless and flat. So we would capture data from sensors attached to voice model actors. Voice capture artists would smooth out the data and bring Sam to life.  Motion capture is also not my strong point.&lt;br /&gt;&lt;br /&gt;With only a handful of voice model actors, spoken phrases could be captured for an entire movie or video game! The captured data could be applied to dozens or hundreds of different sounding models by adjusting Sam's variables. Accents would easy to add by changing the way Sam enunciates words. Playing with Sam's breathing rate would simulate a person out of breath or scared. Sam's voice could be lowered or raised or even modeled after a real person.&lt;br /&gt;&lt;br /&gt;Eventually the captured data could be used to animate 3D model too!&lt;br /&gt;&lt;br /&gt;This would be a perfect for RPG games like &lt;a href='http://www.elderscrolls.com/home/home.php'&gt;Oblivion&lt;/a&gt; or &lt;a href='http://en.wikipedia.org/wiki/Grand_Theft_Auto'&gt;GTA&lt;/a&gt; that can benefit from an almost endless supply of different voices.&lt;br /&gt;&lt;br /&gt;Let me know if you ever do anything with this, or find something that does.  Especially if you're &lt;a href='http://www.bethsoft.com/'&gt;Bethesda&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-2377623438054508630?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VJQF1OJtI04cl6ZqPl9o-SrSKlA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VJQF1OJtI04cl6ZqPl9o-SrSKlA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VJQF1OJtI04cl6ZqPl9o-SrSKlA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VJQF1OJtI04cl6ZqPl9o-SrSKlA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=ypUM45MssiA:AwkKFnPAW3k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/ypUM45MssiA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/2377623438054508630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=2377623438054508630" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/2377623438054508630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/2377623438054508630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/ypUM45MssiA/wave-tracing-ray-tracing-for-sound.html" title="Wave Tracing: Ray Tracing for Sound" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/10/wave-tracing-ray-tracing-for-sound.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUNRHk5eCp7ImA9WxRRFEs.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-2704391621386087854</id><published>2008-09-26T14:08:00.000-07:00</published><updated>2008-09-26T14:08:15.720-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-26T14:08:15.720-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><title>GWT: Generators HowTo (BuildStamp)</title><content type="html">If you're curious what generators are, or have never used them with GWT, this simple generator will give you a quick introduction to get your hamster wheels turning.&lt;br /&gt;&lt;br /&gt;I do a lot of prototyping in GWT before I build the backend and I've recently had the need to generate a "build version" for my GWT interface.  While there are about fiftybazillionmillion different ways to do this, I've chosen a GWT generator to create a buildstamp.  This&lt;br /&gt;lets me tar up the www results of clicking on "Compile/Browse" and fire them off for others to play.  &lt;br /&gt;&lt;br /&gt;In your Java code, you just add:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;          ...&lt;br /&gt;          BuildStamp buildStamp = GWT.create(BuildStamp.class);&lt;br /&gt;          yourLogo.setTitle(buildStamp.getBuildStamp());&lt;br /&gt;          ... &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This will add a tooltip to &lt;b&gt;yourLogo&lt;/b&gt; which looks like: "&lt;b&gt;Built on kikai.linuxstuff.org at Tue Jul 29 19:07:05 PDT 2008&lt;/b&gt;".  &lt;br /&gt;&lt;br /&gt;When you compile your GWT application the generator is compiled and run. It generates Java code which is converted to JavaScript along with the rest of your application.  When this happens the timestamp is "frozen".&lt;br /&gt;&lt;br /&gt;Code and wiring follows. Imports omitted, use your favourite IDE to fill them in. This makes a pretty simple Hello World example.&lt;br /&gt;&lt;br /&gt;Comments are more than welcome. &lt;br /&gt;&lt;pre style="background-color:white; overflow:scroll;width:440px;border: 1px solid black;"&gt;package org.example.rebind;&lt;br /&gt;&lt;br /&gt;public class BuildStampGenerator extends Generator {&lt;br /&gt;&lt;br /&gt;        private String className;&lt;br /&gt;        private String packageName;&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public String generate(TreeLogger logger, GeneratorContext context, String typeName)&lt;br /&gt;                        throws UnableToCompleteException {&lt;br /&gt;&lt;br /&gt;                try {&lt;br /&gt;&lt;br /&gt;                        TypeOracle typeOracle = context.getTypeOracle();&lt;br /&gt;                        JClassType classType = typeOracle.getType(typeName);&lt;br /&gt;                        packageName = classType.getPackage().getName();&lt;br /&gt;                        className = classType.getSimpleSourceName() + "Impl";&lt;br /&gt;&lt;br /&gt;                        generateClass(logger, context);&lt;br /&gt;&lt;br /&gt;                } catch (Exception e) {&lt;br /&gt;                        logger.log(TreeLogger.ERROR, "Exception during BuildStamp creation.", e);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                return packageName + "." + className;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private void generateClass(TreeLogger logger, GeneratorContext context) {&lt;br /&gt;&lt;br /&gt;                PrintWriter printWriter = context.tryCreate(logger, packageName, className);&lt;br /&gt;&lt;br /&gt;                /* Returns null if the package has already been generated. */&lt;br /&gt;                if (printWriter == null) {&lt;br /&gt;                        return;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                ClassSourceFileComposerFactory composer =&lt;br /&gt;                  new ClassSourceFileComposerFactory(packageName, className);&lt;br /&gt;&lt;br /&gt;                // shouldn't magic just happen here?&lt;br /&gt;                composer.addImplementedInterface(BuildStamp.class.getCanonicalName());&lt;br /&gt;&lt;br /&gt;                SourceWriter sourceWriter = composer.createSourceWriter(context, printWriter);&lt;br /&gt;&lt;br /&gt;                writeGetBuildStamp(sourceWriter);&lt;br /&gt;&lt;br /&gt;                sourceWriter.outdent();&lt;br /&gt;                sourceWriter.println("}");&lt;br /&gt;&lt;br /&gt;                context.commit(logger, printWriter);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * Write the source code for {@code BuildStamp#getBuildStamp()}.&lt;br /&gt;         */&lt;br /&gt;        private void writeGetBuildStamp(SourceWriter sourceWriter) {&lt;br /&gt;                sourceWriter.println("public String getBuildStamp() {");&lt;br /&gt;                sourceWriter.println(" return \"" + Generator.escape(getBuildStamp()) + "\";");&lt;br /&gt;                sourceWriter.println("}");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /**&lt;br /&gt;         * Executed at *compile* time, this generates a string that is embedded in the&lt;br /&gt;         * generated class. In hosted mode, this code is rebuilt each Refresh.&lt;br /&gt;         *&lt;br /&gt;         * @return A user-friendly build string, good for hiding in tooltips.&lt;br /&gt;         */&lt;br /&gt;        String getBuildStamp() {&lt;br /&gt;                StringBuilder msg = new StringBuilder();&lt;br /&gt;                msg.append("Built on ");&lt;br /&gt;                try {&lt;br /&gt;                        String hostname = InetAddress.getLocalHost().getCanonicalHostName();&lt;br /&gt;                        msg.append(hostname);&lt;br /&gt;                } catch (UnknownHostException e) {&lt;br /&gt;                        msg.append("(hostname not available)");&lt;br /&gt;                }&lt;br /&gt;                msg.append(" at ");&lt;br /&gt;                msg.append(new Date());&lt;br /&gt;                return msg.toString();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You will need a BuildStamp interface:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color:white; overflow:scroll;width:440px;border: 1px solid black;"&gt;package org.example.client;&lt;br /&gt;public interface BuildStamp { public String getBuildStamp(); }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And wire it up in your .gwt.xml:&lt;br /&gt;&lt;pre style="background-color:white; overflow:scroll;width:440px;border: 1px solid black;"&gt;&amp;lt;generate-with class="org.example.rebind.BuildStampGenerator"&amp;gt;&lt;br /&gt;  &amp;lt;when-type-assignable class="org.example.client.BuildStamp" /&amp;gt;&lt;br /&gt;&amp;lt;/generate-with&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-2704391621386087854?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zssAfX3Y0i0YwoxWm08pNdvNBd8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zssAfX3Y0i0YwoxWm08pNdvNBd8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zssAfX3Y0i0YwoxWm08pNdvNBd8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zssAfX3Y0i0YwoxWm08pNdvNBd8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=j8DrRoDMcEY:WHgjQhHxFls:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/j8DrRoDMcEY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/2704391621386087854/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=2704391621386087854" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/2704391621386087854?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/2704391621386087854?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/j8DrRoDMcEY/gwt-generators-howto-buildstamp.html" title="GWT: Generators HowTo (BuildStamp)" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/09/gwt-generators-howto-buildstamp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMFSHk8eip7ImA9WxRSFEs.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-4251323027291805850</id><published>2008-09-15T00:16:00.003-07:00</published><updated>2008-09-15T00:40:19.772-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T00:40:19.772-07:00</app:edited><title>Spore on Linux</title><content type="html">If you're a Linux user wondering if Spore works, the answer is: Sorta.&lt;br /&gt;&lt;br /&gt;I bought the download version from the EA Store.  Nothing mentioned until after my purchase was complete that I needed a Windows-only downloader.  I didn't test this under Wine.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Aside: The EA Store website allows &lt;b&gt;+&lt;/b&gt; in email addresses, but the Spore online login does not.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I'm using Ubuntu 8.04 with a custom build of Wine 1.1.4 (includes a patch needed to make Spore run).  The installer runs fine in Wine.  Skip the DirectX install. While the game works, piracy prevention code doesn't.  You'll need to find a cracked SporeApp.exe floating around to work around the issue. I believe a similar workaround is needed if you purchase the boxed game.&lt;br /&gt;&lt;br /&gt;I'm still on the creature level, I've found a few graphical glitches:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Minor: Turn "Shadows" to "Low" to reduce some of the bizarre sploches of blackness.&lt;br /&gt;&lt;li&gt;Minor: The icon by the mouse pointer seems to not be transparent properly&lt;br /&gt;&lt;li&gt;Minor: Text describing your goals overlaps the text describing items you've picked up.&lt;br /&gt;&lt;li&gt;Medium: The water isn't rendered.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Check the &lt;a href="http://appdb.winehq.org/objectManager.php?sClass=version&amp;iId=13652"&gt;the WineHQ page about Spore&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-4251323027291805850?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9qxxgSbJjIzmv_XiBDwB1x_DHL4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9qxxgSbJjIzmv_XiBDwB1x_DHL4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9qxxgSbJjIzmv_XiBDwB1x_DHL4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9qxxgSbJjIzmv_XiBDwB1x_DHL4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=fn2Kxm3Ggjo:7JOhQe2kdd0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/fn2Kxm3Ggjo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/4251323027291805850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=4251323027291805850" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4251323027291805850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/4251323027291805850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/fn2Kxm3Ggjo/spore-on-linux.html" title="Spore on Linux" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/09/spore-on-linux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMFQnk-eSp7ImA9WxRTFEo.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-403798459687629689</id><published>2008-09-03T12:28:00.005-07:00</published><updated>2008-09-03T13:06:53.751-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-03T13:06:53.751-07:00</app:edited><title>Chromium and Bees</title><content type="html">Watching what Google does feels like watching X-Files. I want to believe there's some grand master plan, but I'm pretty sure they're just making things up as they go.&lt;br /&gt;&lt;br /&gt;Hank Williams over at &lt;a href="http://www.whydoeseverythingsuck.com/"&gt;Why Does Everything Suck&lt;/a&gt; pretty much covers my thoughts on Google's new web browser in his &lt;a href="http://whydoeseverythingsuck.com/2008/09/who-cares-about-chrome-ie6-has-25.html"&gt;Huh?&lt;/a&gt; and &lt;a href="http://whydoeseverythingsuck.com/2008/09/redefining-operating-system.html"&gt;Huh!&lt;/a&gt; posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-403798459687629689?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ehC8xWQx537q-8QWz28pwjE_SV0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ehC8xWQx537q-8QWz28pwjE_SV0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ehC8xWQx537q-8QWz28pwjE_SV0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ehC8xWQx537q-8QWz28pwjE_SV0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=LelfPIEo6aQ:YSW07hUsvKU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/LelfPIEo6aQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/403798459687629689/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=403798459687629689" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/403798459687629689?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/403798459687629689?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/LelfPIEo6aQ/chromium-and-bees.html" title="Chromium and Bees" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/09/chromium-and-bees.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08CQXw4fip7ImA9WxdVEUk.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-5672734053272664779</id><published>2008-07-15T11:10:00.003-07:00</published><updated>2008-07-15T12:24:20.236-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-15T12:24:20.236-07:00</app:edited><title>Nine Handy Tips for Taking the Summer Off</title><content type="html">Six weeks ago I quit my job; six weeks later I've never been happier. I had grown jaded about technology and worn down about my work.  This post isn't about how to quit your job, how to budget for the summer or how to get your next job; it's what I've learned in the  brief oasis between those points in my life.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Beginning&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;1. Do Not Look For Your Next Job: You know internally if you're at the point in your career that taking the summer off is realistic. Don't start looking for your next job right away. You'll find it (or it will find you), and it will fill your mind space, or even shorten your planned sabbatical (then you'll need another one!).&lt;br /&gt;&lt;br /&gt;2. Break Your Old Routine: Three days and a plane ride after quitting my job I was crashing out on a friends couch across the country (thanks Lori!). Shake your life up enough that you don't realize you've left your job.  You'll forget about your BlackBerry in two days.&lt;br /&gt;&lt;br /&gt;3. Leave Your Identity Behind:  If you've ever moved cities, you've said "Back home at &lt;span style="font-style:italic;"&gt;originalCity&lt;/span&gt;....".  It takes time to adjust to big changes, so correct yourself if you refer to your old team/workplace/etc in present tense.  Many people and social circles define will assess your value based solely on your job; you'll need to feel comfortable telling people you're taking a break. It took me a while to really let go of this. &lt;br /&gt;&lt;br /&gt;4. Travel: Find something interesting going on in a different city and go there. One friend suggested I go tour around Europe for a few months; if you can do it, go for it.&lt;br /&gt;&lt;br /&gt;5. Turn Off Your Alarm Clock:  Unless you already have a morning ritual, turn it off.  Wake up when you feel like it. As new-agey as this sounds, give yourself permission to do nothing.  All those "if I had time, I would do it" things can wait (see below).&lt;br /&gt;&lt;br /&gt;6. Don't Code: Or if you do, don't code in your normal language (admit it: you really want to learn ActionScript :-).  Your skills &lt;span style="font-weight:bold;"&gt;will&lt;/span&gt; still be around in two months.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Middle&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;7. Turn On Your Alarm Clock: So, it's been a few weeks of laziness, make yourself a daily ritual.  Set your alarm clock again. It's okay if you were up late the night before, just take a nap. Now is the time to make and start working through that list you've been ignoring.&lt;br /&gt;&lt;br /&gt;8. Resist Gossip: I still hear from friends at my old job; nothing has changed.  Each time, I I feel stress returning in my back muscles.  When we hang out now, I try to guide the conversation away from all the usual rants. "You sound like you could use some time off to relax."&lt;br /&gt;&lt;br /&gt;9. Hobby: Pick up a hobby or two to fill your time. Unlikely retirement, these can be hobbies you have no intention of keeping after the summer, so go out on a limb and try something really different.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The End&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;I still have six more weeks of planned vacation left before I start really getting into job hunting mentality. Time will tell how it ends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-5672734053272664779?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GTN6LbsYCKVcEA6GXzkTFOAEkIE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GTN6LbsYCKVcEA6GXzkTFOAEkIE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GTN6LbsYCKVcEA6GXzkTFOAEkIE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GTN6LbsYCKVcEA6GXzkTFOAEkIE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=DWCcY_AFi2A:UQ1RSP3ETas:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/DWCcY_AFi2A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/5672734053272664779/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=5672734053272664779" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5672734053272664779?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5672734053272664779?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/DWCcY_AFi2A/nine-handy-tips-for-taking-summer-off.html" title="Nine Handy Tips for Taking the Summer Off" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/07/nine-handy-tips-for-taking-summer-off.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AGRHs6cSp7ImA9WxdQFko.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-514900216617857856</id><published>2008-06-16T20:02:00.000-07:00</published><updated>2008-06-16T20:02:05.519-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-16T20:02:05.519-07:00</app:edited><title>Google's Conference on Scalability</title><content type="html">This is the second year I've attended Google's conference on scalability, the talks were more academic this time around. One organizer indicated that this was indeed the goal of this year's conference.  I enjoyed last year how much of the information was really hands on, but there's some value in seeing what's coming down the research pipe.&lt;br /&gt;&lt;br /&gt;The conference is an example of what googlers do with their "20% time".&lt;br /&gt;&lt;br /&gt;I took lots of notes, but I'll summarize just the overarching concepts:&lt;br /&gt;&lt;br /&gt;* Go Scale Yourself: Everyone seems to suffer from interruptions and it can take up to 1/2 hour to refocus after one.  Asking the interrupter to file a ticket was suggested (something I've had lackluster success at).  A better idea: keeping a pad of post it notes and writing down their request and telling them you'll get to it. The physical demonstration of accepting their request makes the requester feel they're being heard.&lt;br /&gt;&lt;br /&gt;Good quote: "We're too busy mopping the floor to turn off the faucet."  Sounds familiar.&lt;br /&gt;&lt;br /&gt;* P2P: Lots of talk directly and indirectly on peer-to-peer, on the desktop, in the datacenter and under-water.  Lots of interesting issues with lots of potential on both the small and large scale.&lt;br /&gt;&lt;br /&gt;* Distributed Hashtables: Many talks mentioned distributed hashtables as a solution for one problem or another.  I haven't read up on the details, so I don't have much to add.&lt;br /&gt;&lt;br /&gt;* Multi-Core: We write a lot of plumbing code now to handle multiple threads, and really, we shouldn't have to.  Cray's talk on Chapel showed how brittle our code is (because Doing It Right Is Hard) and Google had a presentation on Transactional Memory.  If you've never heard of TM, then the talk is a great introduction.  &lt;br /&gt;&lt;br /&gt;I had an interesting chat with a database developer on the effects of solid state storage on database engines and a guy from Microsoft who had done a fair bit of P2P research.  &lt;br /&gt;&lt;br /&gt;The talks and slides will be up on YouTube over the next week.  The talks were brought down a manageable 30 minutes from the originally scheduled hour, so if the presenters seem rushed, they probably were.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-514900216617857856?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/h8oAcrAOzT9REOhwpaiHMQS6GMI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h8oAcrAOzT9REOhwpaiHMQS6GMI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/h8oAcrAOzT9REOhwpaiHMQS6GMI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h8oAcrAOzT9REOhwpaiHMQS6GMI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=fAOS-n_USD4:ZRBfDE2Z_qg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/fAOS-n_USD4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/514900216617857856/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=514900216617857856" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/514900216617857856?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/514900216617857856?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/fAOS-n_USD4/googles-conference-on-scalability.html" title="Google's Conference on Scalability" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/06/googles-conference-on-scalability.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYBRXc5eSp7ImA9WxdTEEk.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-7197974776417864950</id><published>2008-05-03T14:02:00.005-07:00</published><updated>2008-05-05T20:22:34.921-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-05T20:22:34.921-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title>Four Days of Spring: Spring Core Training</title><content type="html">The other week I was fortunate enough to grab an extra freebie spot on Spring Source's "Spring Core" course.  It's a marathon. Four days jam-packed with just about everything you could imagine Spring-related. I thought I'd post a bit about my impressions...&lt;br /&gt;&lt;br /&gt;First the good side; the &lt;a href="http://www.springsource.com/web/guest/training/spr001"&gt;course material&lt;/a&gt; is exhaustive and the instructor knew his stuff cold.  While I was the only one in the course with no practical Spring experience, those that had been using it extensively carried on some pretty detailed conversations; the kinds of conversations you have when you're shoulder deep in some technology and you're having esoteric problems with it.&lt;br /&gt;&lt;br /&gt;The material was well organized and the instructor did a really good job at calibrating to the overall skill level of the class.  As much as I believe in substance-before-style he also remained refreshingly professional the entire time.&lt;br /&gt;&lt;br /&gt;The labs were really well prepared containing problem solution and sometimes alternative solution sets. As someone who gleans more from a 3 line example than a four page reference chapter, this was really worthwhile.  Everyone got a copy of Spring In Action too which was a nice bonus.&lt;br /&gt;&lt;br /&gt;The only fault I found with the course was its length; drinking from the firehose for four days is a lot of drinking.  If I was more familiar with the underlying framework, or if I was still in school "input mode", my mental integration would have been higher. &lt;br /&gt;&lt;br /&gt;A two-day introduction course would have definitely been enough.  Any organization planning on flying an instructor out for four days would be better off bootstrapping twice as many developers with a double shot of the two day introduction.  Only those who have already muddled through some of the integrations would get a lot more from the full course.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-7197974776417864950?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rVNCB7jPX2xDt6-MYM4StSX3llg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rVNCB7jPX2xDt6-MYM4StSX3llg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rVNCB7jPX2xDt6-MYM4StSX3llg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rVNCB7jPX2xDt6-MYM4StSX3llg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=jonpsU4fIsQ:zcav_UAXd5g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/jonpsU4fIsQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/7197974776417864950/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=7197974776417864950" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/7197974776417864950?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/7197974776417864950?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/jonpsU4fIsQ/four-days-of-spring-spring-core.html" title="Four Days of Spring: Spring Core Training" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/05/four-days-of-spring-spring-core.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIBR3w4eCp7ImA9WxZbFEs.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-6426463016011726043</id><published>2008-04-03T18:35:00.008-07:00</published><updated>2008-04-17T14:09:16.230-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-17T14:09:16.230-07:00</app:edited><title>Six PDFs You May Find Interesting</title><content type="html">1. &lt;b&gt;Failure Trends in a Large Disk Drive Population&lt;/b&gt; [ &lt;a href="http://research.google.com/archive/disk_failures.pdf"&gt;PDF&lt;/a&gt; ] A popular Google paper from 14 months ago, but a good read if it's something you may have to deal with.  Fairly readable language too.  &lt;i&gt;Summary:&lt;/i&gt; Really burn your drives in for the first few months.  Few metrics are good indicators of failure.&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;Pinpoint: Problem Determination in Large, Dynamic Internet Services&lt;/b&gt; [ &lt;a href="http://roc.cs.berkeley.edu/papers/roc-pinpoint-ipds.pdf"&gt;PDF&lt;/a&gt; ] Tracing requests and statistical analysis to find faults.  They wrote a framework for root cause analysis.  &lt;i&gt;Summary:&lt;/i&gt; Complex systems fail in complex ways.  "What went wrong?" is easy to ask, hard to answer.&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;Deconstructing Paxos&lt;/b&gt; [ &lt;a href="http://www.google.com/search?q=deconstructing+paxos"&gt;Google&lt;/a&gt; | &lt;a href="http://en.wikipedia.org/wiki/Paxos_algorithm"&gt;Wikipedia&lt;/a&gt; ] Protocol for achieving group consensus over unreliable links.  The PDF itself is hard to digest, the Wikipedia page does a much better job. &lt;i&gt;Summary:&lt;/i&gt; I still think clustering sucks.&lt;br /&gt;&lt;br /&gt;4. &lt;b&gt;The importance of understanding distributed system configuration&lt;/b&gt; [ &lt;a href="http://roc.cs.berkeley.edu/papers/dsconfig.pdf"&gt;PDF&lt;/a&gt; ] An easy read, claiming (and I'd agree), that human error when adjusting system configuration is an extremely common reason for system outages.  The paper discusses why that is and some ways to minimize it.&lt;br /&gt;&lt;br /&gt;5. &lt;b&gt;Addressing Human Error with Undo&lt;/b&gt; [ &lt;a href="http://roc.cs.berkeley.edu/talks/pdf/undo.pdf"&gt;PDF&lt;/a&gt; ] A set of powerpoint slides in MS Comic from 2001. They discuss solving human error problems with having an undo facility. &lt;i&gt;Summary:&lt;/i&gt; Font selection aside, this is a &lt;i&gt;really good simple read&lt;/i&gt;, it pleads for you to stop trying to prevent human error, and give people ways to recover from it.  I 100% agree.  &lt;i&gt;(Explodie was born from this.)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;Release It! Design and Deploy Production-Ready Software&lt;/b&gt; [ &lt;a href="http://www.pragprog.com/titles/mnee"&gt;Site&lt;/a&gt; ] Wow.  This book (PDF download, $22) reads like a history of the company I'm at.  Cascading failures, database contention, developers not understanding the Big Picture, simple changes with dire consequences, the works.  If your software runs in a production environment, skip the movie and popcorn and buy this book instead.  It's broken into patterns and anti-patterns with some great war stories. &lt;I&gt;Summary:&lt;/I&gt;  There's a good reason this won a Jolt award.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-6426463016011726043?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xMUw5kTTxGHlGPLjQCiEBUYyxk0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xMUw5kTTxGHlGPLjQCiEBUYyxk0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xMUw5kTTxGHlGPLjQCiEBUYyxk0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xMUw5kTTxGHlGPLjQCiEBUYyxk0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=NocjhCPwfGI:IjseetZUTOM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/NocjhCPwfGI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/6426463016011726043/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=6426463016011726043" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/6426463016011726043?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/6426463016011726043?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/NocjhCPwfGI/six-pdfs-you-may-find-interesting.html" title="Six PDFs You May Find Interesting" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/04/six-pdfs-you-may-find-interesting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8DRXo-eCp7ImA9WxZWFk8.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-3929228047994656940</id><published>2008-03-15T17:22:00.004-07:00</published><updated>2008-03-15T17:37:54.450-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-15T17:37:54.450-07:00</app:edited><title>Logging Performance Exceptions (Part 1)</title><content type="html">You've probably wished you could find out why a certain block of code was &lt;i&gt;occasionally&lt;/i&gt; slow in production.  Wouldn't it be nice to turn on extra logging only when things were acting up? You can!&lt;br /&gt;&lt;br /&gt;With a bit of logging in your code, you can get an output like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; [135ms] request share purchase&lt;br /&gt;   [5ms] validate purchase request&lt;br /&gt;   [40ms] check account balances&lt;br /&gt;    [39ms] synchronous balance request&lt;br /&gt;   [30ms] read uncommitted share availability check&lt;br /&gt;   [55ms] queue request&lt;br /&gt;     [30ms] persist message to queue&lt;br /&gt;     [15ms] write audit log&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The oddly named &lt;a href="http://hatch-timer.googlecode.com/"&gt;hatch-timer&lt;/a&gt; tool, will give you a breakdown by putting simple &lt;b&gt;push&lt;/b&gt; and &lt;b&gt;pop&lt;/b&gt; methods in your code.  It's not as fancy as doing it with AOP, but it's trivial to add.&lt;br /&gt;&lt;br /&gt;One cool feature is configuring Hatch to only log when your code takes &lt;i&gt;over&lt;/i&gt; a certain duration.  For example, to log if &lt;b&gt;businessMethod&lt;/b&gt; takes 1 second or longer:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   public void businessMethod() {&lt;br /&gt;     TimerStackUtil.enableAndPush("businessMethod");&lt;br /&gt;     ...&lt;br /&gt;     TimerStackUtil.setThreadLocalMetricsLogger(&lt;br /&gt;        new ExceedsDurationMetricsLogger(BasicMetricsLogger.LOGGER,999));&lt;br /&gt;     TimerStackUtil.pop("businessMethod");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Check out the &lt;a href="http://code.google.com/p/hatch-timer/wiki/GettingStarted"&gt;getting started&lt;/a&gt; to try it yourself!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-3929228047994656940?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YflE25Txg7WhWM_cgOs4-OnWVIw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YflE25Txg7WhWM_cgOs4-OnWVIw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YflE25Txg7WhWM_cgOs4-OnWVIw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YflE25Txg7WhWM_cgOs4-OnWVIw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=tnynMfg9aCA:NyKRFKTAGVQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/tnynMfg9aCA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/3929228047994656940/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=3929228047994656940" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/3929228047994656940?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/3929228047994656940?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/tnynMfg9aCA/logging-performance-exceptions-part-1.html" title="Logging Performance Exceptions (Part 1)" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/03/logging-performance-exceptions-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEMQHk_fip7ImA9WxZXF0U.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-3094723278343126148</id><published>2008-03-05T19:29:00.003-08:00</published><updated>2008-03-05T22:24:41.746-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-05T22:24:41.746-08:00</app:edited><title>Java Developer Performance Reviews</title><content type="html">Despite years of promises to the contrary, I've found myself in the unfortunate situation of having to write performance reviews for my developers.  For those other poor souls in this situation, I've collected my thoughts and present them here. This post is split into two parts.  The first part I vent a bit, the second part has the useful content.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Before You Get Here&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Warning: If you find yourself with a Technical Lead title and you would rather be doing technical things than dealing with politics, human resource issues, sitting in meetings discussing how to set up training programs or writing performance reviews, then keep your eyes open for how far you drift into management.&lt;br /&gt;&lt;br /&gt;My experience has shown that nobody will understand that you aren't interested in pushing paper and you'd rather solve interesting problems. Find someone to take the management side of stuff off your plate yourself if you must.&lt;br /&gt;&lt;br /&gt;&lt;span id="java-developer-technical-review" style="font-size:130%;"&gt;The Technical Review&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since this review is for developers, I've focused my efforts on technical skills as super-smart developers tend to come with idiosyncrasies.  Since those idiosyncrasies don't cause 3am phone calls about memory leaks, database deadlocks or network saturation, they're secondary to me. I wasn't given any guidance on how to do this, so if you've heard other ones, please comment!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Requirements&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The start of most development processes involves gathering one, some, most or all of the requirements for whatever you're working on.  Sometimes these are technical ("Make this code faster."), sometimes they're business oriented ("Add baseball support."). &lt;br /&gt;&lt;br /&gt;&lt;i&gt;I ask myself:&lt;/i&gt; How well do you handle vague or changing requirements?  How well do you seek out the details you need?  How much forethought do you have to determine potential problems and ask key questions to flush them out?  How often do you misinterpret requirements? How good is your intuition or background reading on the task at hand?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Coding&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The syntax, type usage, commenting, method names, scoping, etc of your code.  Most senior developers will be naturally strong in this area, only sometimes suffering from a desire to use their own coding conventions or lacking documentation on more complex areas.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I ask myself:&lt;/i&gt; When others code against your APIs, how many problems do they have with documentation?  When I read your code, how useful are the comments to me? Do you link to relevant other parts in the code?  Do you leave waste in your code?  Do you catch exceptions properly?  Are your error messages useful?  Do you (not) synchronize when you should(n't)? &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Beyond compilable code, there is an art to development.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I ask myself:&lt;/i&gt; How well does the code follow best practices (as they vary from year to year)?  Do you use proper patterns when appropriate?  Do you follow good OO design (encapsulation is a big one for me)?  How well do you package your code? Is your code enjoyable to read?  Are things intuitively in the right place?  Do your classes do what you would expect (and nothing more)?  Is your code testable, without he expense of it being usable?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Integration&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Your code talks with other systems.  How good is your "out of the JVM" skill? This includes networking, databases, security, message queues, mail servers, etc.  Not everyone will have code that interacts with all other systems, so this section can be very specific to your environment.&lt;br /&gt;&lt;br /&gt;&lt;I&gt;I ask myself:&lt;/i&gt; Do you make proper use of the database?  Do you cache query results?  Do you try to use indexes when you can?  Do you understand network concepts (ARP requests, DNS lookups, TCP / UDP, firewalling, NAT, latency, packet loss, TTLs, etc)? Do you handle database failures well?  Do you consider what the effects of your code are on other components in the system? Do you understand (a)symmetric  encryption and when to use both?  PKI?  Do you understand "be strict in what you send, forgiving in what you receive"?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Release&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Not only does your code have to work and play nice, but it needs to make it out of the development sandbox and into the real world. &lt;br /&gt;&lt;br /&gt;&lt;I&gt;I ask myself:&lt;/i&gt; How often does your code gum up our load testing?  How often does QA get stuck with your features?  Do you forget to flag database updates for our release?  Is your code backward compatible?  Do you understand the effects of releasing your code in the real world?  Is your code serviceable without hand editing web.xml and restarting our servers?  Can it be monitored through our existing monitoring infrastructure?  Would it &lt;a href="http://www.pragprog.com/titles/mnee"&gt;make Michael Nygard happy&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Operational&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Once your code is running in production, it may catch fire.  If it does, this section deals with your ability to find the root cause and split your time coming up with a quick bandaid while ultimately fixing your bugs.  If you don't have any code in production then I use this section on how well a developer finds and fixes bugs found by QA.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I ask myself:&lt;/i&gt; How quickly and accurately do you rule out red herrings?  Do you have good troubleshooting toolset knowledge?  Can you triage haystacks of log files to find the needle?  Are you able to work around the issue creatively, or do you just rollback / reboot?  When it's not your code, how quickly can you come up with a solution that doesn't involve a rewrite?  Can you reverse engineer a cascading failure?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="java-developer-technical-review" style="font-size:130%;"&gt;That's All&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hope this helps someone else out there that has been asked to do as I have.  I'm curious to hear what others have done in the past.  Oh, and of course, if this doesn't suit your needs, use something that does!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-3094723278343126148?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/I24VpmhH0CENz-L7qFP1LeIyHf4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I24VpmhH0CENz-L7qFP1LeIyHf4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/I24VpmhH0CENz-L7qFP1LeIyHf4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/I24VpmhH0CENz-L7qFP1LeIyHf4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=s60g-TNEKYI:iX2At7NGQiM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/s60g-TNEKYI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/3094723278343126148/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=3094723278343126148" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/3094723278343126148?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/3094723278343126148?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/s60g-TNEKYI/java-developer-performance-reviews.html" title="Java Developer Performance Reviews" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/03/java-developer-performance-reviews.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4GR384eyp7ImA9WxZQEk0.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-5373069929548173506</id><published>2008-02-16T13:59:00.004-08:00</published><updated>2008-02-16T15:02:06.133-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-16T15:02:06.133-08:00</app:edited><title>Testing Network Effects on Your Code</title><content type="html">Testing is a big deal.  Very often though, we spend days writing unit tests only to forget that our code must play well with others.  In the real world, how responsive will a new AJAX interface or RMI Swing application be?&lt;br /&gt;&lt;br /&gt;In our load testing environment, we've introduced a &lt;a href="http://networknightmare.net/"&gt;network nightmare&lt;/a&gt; bridge.  This handy little box sits between us and our server (or between any two networked devices).  We enter maximum bandwidth, milliseconds of round trip delay, and percentage of packet loss and instantly we feel the effects.   Most versions include monitoring and statistic interfaces.&lt;br /&gt;&lt;br /&gt;We can simulate long links across multiple countries, poor people on dialup, a lossy VPN connection, WiFi, etc.  Really, anything we can think of.&lt;br /&gt;&lt;br /&gt;Thinking of opening a new data centre and wondering what the latency effects will be?  Got a customer who's using your WAN replicating software over a lossy VPN link and wonder how it performs?  This little box is excellent for all these sorts of things and more.&lt;br /&gt;&lt;br /&gt;The best part is It Just Works™.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-5373069929548173506?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cK06QVUtAEdk9nViIDRKNvqQkSA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cK06QVUtAEdk9nViIDRKNvqQkSA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cK06QVUtAEdk9nViIDRKNvqQkSA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cK06QVUtAEdk9nViIDRKNvqQkSA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=ZybUGzGKmoA:6tQyvpVCKjA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/ZybUGzGKmoA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/5373069929548173506/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=5373069929548173506" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5373069929548173506?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5373069929548173506?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/ZybUGzGKmoA/testing-network-effects-on-your-code.html" title="Testing Network Effects on Your Code" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2008/02/testing-network-effects-on-your-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8GRXs4fyp7ImA9WB9UEkk.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-5061698859565597043</id><published>2007-12-08T21:11:00.000-08:00</published><updated>2007-12-09T14:53:44.537-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-09T14:53:44.537-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="oql" /><title>Using SQL on Java Collections</title><content type="html">On the project I work on, we have an in memory model of some particularly useful data (a POJO model as it were).  A situation that regularly occurs with this useful data is that various groups want the data sliced and diced in various manners.&lt;br /&gt;&lt;br /&gt;Each time a request comes in we have to write a new method that iterates through our collection, sometimes making a new comparator and then return a subset of the objects.  I've often wished for a way to just query those objects without having to put them in a database or writing my own domain specific language. Anyone who tells you domain specific languages (DSLs) are a good idea is trying to &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=42078"&gt;sell you a DSL framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html"&gt;Hibernate's&lt;/a&gt; HQL looks pretty sweet, and if there was a way I could just toss objects into a second level cache without a database and do HQL on the cache, that would solve my problem.  But I can't.&lt;br /&gt;&lt;br /&gt;Java 6's &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html"&gt;jmap&lt;/a&gt; tool has OQL support, but it seems to be a custom OQL implementation for jmap.  I did some digging around and the closest thing I could find that would OQL on a collections of objects was &lt;a href="http://www.db4o.com/default.aspx"&gt;db4o&lt;/a&gt; which is effectively commercial for my purposes.&lt;br /&gt;&lt;br /&gt;Then I ran across &lt;a href="http://josql.sourceforge.net/"&gt;JoSQL&lt;/a&gt;.  It's exactly what I'm looking for.  From some poking around, it's fairly decent performing. A large amount of time is spent parsing queries so preparsed queries are in order.  Plus, the query objects are not thread safe, so those preparsed queries will need to be in an object pool.  Not a big deal.&lt;br /&gt;&lt;br /&gt;Lastly, its syntax for handling objects with lists is a bit awkward. As an example, instead of "&lt;span style="font-weight: bold;"&gt;SELECT * FROM recipes WHERE ingredients.name = 'butter'&lt;/span&gt;", you would need to write "&lt;span style="font-weight: bold;"&gt;SELECT * FROM recipes WHERE (SELECT * FROM ingredients WHERE name='butter')&lt;/span&gt;".  These sub-selects continue to nest as long as your model has collections of collections.&lt;br /&gt;&lt;br /&gt;It's nice since most decent developers know enough SQL to get by, and it's a lot faster to write a query to say "show the top five most popular recipes with butter in them posted in the past 30 days" in SQL than it is in Java.  JoSQL supports returning queries as a TableModel too, which could potentially solve some "I want to see my data in fifteen different configurations" issues I'm dealing with too.&lt;br /&gt;&lt;br /&gt;Overall, I was quite impressed!  If I get time to add it into my project, I'll post an update.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-5061698859565597043?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G9Ns28fD-Hcylg5yGZZg1RXr8uY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G9Ns28fD-Hcylg5yGZZg1RXr8uY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G9Ns28fD-Hcylg5yGZZg1RXr8uY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G9Ns28fD-Hcylg5yGZZg1RXr8uY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=dhO0c17g1Cw:QHRI7zi9G5I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/dhO0c17g1Cw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/5061698859565597043/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=5061698859565597043" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5061698859565597043?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5061698859565597043?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/dhO0c17g1Cw/using-sql-on-java-collections.html" title="Using SQL on Java Collections" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2007/12/using-sql-on-java-collections.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8CRnk9cCp7ImA9WB9UEkk.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-5043612656599756477</id><published>2007-11-21T20:45:00.001-08:00</published><updated>2007-12-09T14:54:27.768-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-09T14:54:27.768-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="passwords" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="rants" /><title>Security Anti-Pattern #1: The Very Secure Password</title><content type="html">Our security department decided to change passwords of some "common accounts" (anti-pattern #2) we have at work on our load testing network.  They started this process without letting anyone know and set the new password to &lt;span style="font-style: italic;"&gt;&lt;/span&gt;"G2xi]$7jB;".   This leads to security anti-pattern #1: The Very Secure Password.&lt;br /&gt;&lt;br /&gt;A &lt;span style="font-weight: bold;"&gt;good&lt;/span&gt; password has to meet four criteria:&lt;br /&gt;&lt;br /&gt;     1) It must be easy for you to remember.&lt;br /&gt;     2) It must be hard for others to guess.&lt;br /&gt;     3) It must be relatively immune to brute-force attacks&lt;br /&gt;     4) It must be as secure as what it protects.&lt;br /&gt;&lt;br /&gt;For a load testing password, "$scale2Day?" meets all four of these criteria.  As it's meaningful, it's easy to remember.  As it has punctuation and slang in it, it would make it harder for others to guess, and since it has some punctuation and mixed characters and numbers, so it's relatively resilient to brute-force attacks.&lt;br /&gt;&lt;br /&gt;The new password fails the first test, so it risks being "kept" somewhere; written down on paper, emailed to other people, in a text file on your desktop or otherwise circumvented with ssh keys or "remember this password locally" (making our load test network as secure as&lt;span style="font-style: italic;"&gt; your&lt;/span&gt; password).   This makes people work &lt;span style="font-style: italic;"&gt;around&lt;/span&gt; security instead of work &lt;span style="font-style: italic;"&gt;with&lt;/span&gt; security.&lt;br /&gt;&lt;br /&gt;This opens point #2 to a social problem.   The old password was easy to remember.  So if someone sketchy  feigned forgetfulness, it was suspicious.  Since the new one is nearly impossible to remember, it becomes extremely easy to trick someone into giving you the password since "they forgot".  Also, if it's on paper or your desktop, or in your "Secret Passwords" mailbox, then it's listed way more places than before.&lt;br /&gt;&lt;br /&gt;Of course it's less likely to be brute force attacked, but it's way more complex than it needs to be.&lt;br /&gt;&lt;br /&gt;So before you go and change passwords based on some insane line noise criteria, remember those four rules of thumb.  If you need something more secure, then consider two factor authentication choices (and steer away from PKI. Honest.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[ All passwords are made up, and details are altered. If you &lt;span style="font-weight: bold;"&gt;really&lt;/span&gt; want our passwords, send me your resume, we're hiring! ]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-5043612656599756477?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KOF4748299vSi7qBx1pwHkiZ460/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KOF4748299vSi7qBx1pwHkiZ460/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KOF4748299vSi7qBx1pwHkiZ460/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KOF4748299vSi7qBx1pwHkiZ460/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=LH_ciA8Vyd4:542oZDjJvi8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/LH_ciA8Vyd4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/5043612656599756477/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=5043612656599756477" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5043612656599756477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5043612656599756477?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/LH_ciA8Vyd4/security-anti-pattern-1-very-secure.html" title="Security Anti-Pattern #1: The Very Secure Password" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2007/11/security-anti-pattern-1-very-secure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4FQnw5eCp7ImA9WB9UEkk.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-5186655457538314818</id><published>2007-11-18T19:02:00.000-08:00</published><updated>2007-12-09T14:55:13.220-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-09T14:55:13.220-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="bamboo" /><category scheme="http://www.blogger.com/atom/ns#" term="ideas" /><category scheme="http://www.blogger.com/atom/ns#" term="continuous integration" /><title>Breaking Continuous Integration Servers (Part 2)</title><content type="html">I wrote a few posts ago about how &lt;a href="http://idcmp.blogspot.com/2007/10/dog-food-not-enough-for-ci-servers.html"&gt;easily continuous integration servers break&lt;/a&gt;.  This post got quite a bit of response!&lt;br /&gt;&lt;br /&gt;Jon from &lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Atlassian&lt;/a&gt; felt bad for the ordeal and sent over a couple of "&lt;span style="font-weight: bold;"&gt;I'M WELL BUILT&lt;/span&gt;" t-shirts.  Thanks Jon!  Owen over at Unreasonable Entertainment ran an initial version of the "&lt;a href="http://www.unreasonent.com/index.php/2007/11/15/hudson-and-the-hell-build/"&gt;hell build&lt;/a&gt;" maven plugin idea from my post against &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; with less than stellar results.  Damn!&lt;br /&gt;&lt;br /&gt;Owen and I were discussing the results when I found a post from Donnie Pinkston on using &lt;a href="http://www.donniepinkston.net/pages/programming-notes/simple-java-profiler/"&gt;premain to write a Java agent&lt;/a&gt;.  While his post is about a code profiler, the idea is perfect for a VM monitor, taking &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/jmx/index.html"&gt;performance information exposed via JMX&lt;/a&gt;, wiring up &lt;a href="http://java.sun.com/javase/6/docs/api/javax/management/monitor/package-summary.html"&gt;monitors&lt;/a&gt; and a &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/jmx/tutorial/essential.html"&gt;custom MBean&lt;/a&gt; to kill the build.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/jmx/index.html"&gt;&lt;/a&gt;I guess all the ingredients are there, it's only a matter of time for someone to cook them all together.  Since switching from Ant to Maven, my releases have gone from 6 minutes to 133 minutes, so maybe I'll put that time to good use...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-5186655457538314818?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Wdsz9TQQLOgCsS96uHYv-_vxqgs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wdsz9TQQLOgCsS96uHYv-_vxqgs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Wdsz9TQQLOgCsS96uHYv-_vxqgs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wdsz9TQQLOgCsS96uHYv-_vxqgs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=2NOG4tHz3kQ:BtAoytS88Vs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/2NOG4tHz3kQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/5186655457538314818/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=5186655457538314818" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5186655457538314818?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/5186655457538314818?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/2NOG4tHz3kQ/breaking-continuous-integration-servers.html" title="Breaking Continuous Integration Servers (Part 2)" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2007/11/breaking-continuous-integration-servers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4HQns_eSp7ImA9WB9UEkk.&quot;"><id>tag:blogger.com,1999:blog-30950679.post-1983778304762766448</id><published>2007-10-29T23:47:00.000-07:00</published><updated>2007-12-09T14:55:33.541-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-09T14:55:33.541-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rants" /><title>Cutting Through "Technological Mythology"</title><content type="html">"Java is slow."  "Windows always crashes."  "We have to do it this way; it's the way we've always done it!"&lt;br /&gt;&lt;br /&gt;As we grow at work, I find the rules of thumb that I usually follow and ask others to do the same have become carved in stone.  Those who don't fully understand "why" they're doing it have taken it as immutable doctrine.  When I ask for minor deviations in these rules of thumb, I'm met with resistance!  My own words are  fighting against me!&lt;br /&gt;&lt;br /&gt;Years ago, when I also wore the "build master" hat, I would put a cut of our weekly release to server #13 for QA to smoke test.  Thirteen is a lucky number for me.  Eventually we hired some poor soul who now does our builds.   They still smoke test on server #13 every week.&lt;br /&gt;&lt;br /&gt;When I suggested the other week that they rotate which server smoke testing is done on (as we've got a fair number now), I was met with "but we *always* test on #13!  We have to test on that server!"  QA wasn't quite sure why though.&lt;br /&gt;&lt;br /&gt;Technological mythology forms when people are dealing with a complexity they don't understand.  It forms easily, spreads like wildfire through all kinds of mediums (email, wikis, conference calls) and is hard to combat.  Education doesn't work.  It can be more painful to untangle than your CIO's SOA plans..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30950679-1983778304762766448?l=idcmp.linuxstuff.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9ktflW-gxqFK-EpVZssjNAEn5qg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9ktflW-gxqFK-EpVZssjNAEn5qg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9ktflW-gxqFK-EpVZssjNAEn5qg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9ktflW-gxqFK-EpVZssjNAEn5qg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/idcmp?a=K3m_4HK3JZU:XOrg4vdQF2c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/idcmp?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/idcmp/~4/K3m_4HK3JZU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://idcmp.linuxstuff.org/feeds/1983778304762766448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=30950679&amp;postID=1983778304762766448" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/1983778304762766448?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/30950679/posts/default/1983778304762766448?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/idcmp/~3/K3m_4HK3JZU/cutting-through-technological-mythology.html" title="Cutting Through &quot;Technological Mythology&quot;" /><author><name>Idcmp</name><uri>http://www.blogger.com/profile/10737882461734024589</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17601816689650581356" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://idcmp.linuxstuff.org/2007/10/cutting-through-technological-mythology.html</feedburner:origLink></entry></feed>
