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

<channel>
	<title>Teeeeejirrrrr &#187; Nerding</title>
	<atom:link href="http://www.beanos.com/~tsoutij/wp/category/nerding/feed" rel="self" type="application/rss+xml" />
	<link>http://www.beanos.com/~tsoutij/wp</link>
	<description>I like food. I like hammers. I like bunnies.</description>
	<lastBuildDate>Tue, 20 Jul 2010 02:05:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Access Control Blues</title>
		<link>http://www.beanos.com/~tsoutij/wp/2010/05/access-control-blues</link>
		<comments>http://www.beanos.com/~tsoutij/wp/2010/05/access-control-blues#comments</comments>
		<pubDate>Fri, 21 May 2010 18:50:14 +0000</pubDate>
		<dc:creator>Tijger Tsou</dc:creator>
				<category><![CDATA[Information Technology]]></category>
		<category><![CDATA[Nerding]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[access control]]></category>
		<category><![CDATA[physical security]]></category>

		<guid isPermaLink="false">http://www.beanos.com/~tsoutij/wp/?p=963</guid>
		<description><![CDATA[Around this time last year, I had been in up to my neck dealing with a messy repair job at work. Every day my team and I had to work with issues revolving  The Tickler, The Reacharound, and The Dumptruck. No, this isn&#8217;t some unsavory gay porno I&#8217;m talking about&#8230; these are real project names [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1033" class="wp-caption alignnone" style="width: 510px"><img class="size-medium wp-image-1033" title="Perspective Matters" src="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2010/05/perspective_matters-500x375.jpg" alt="Perspective matters. Particularly when you're not terribly sure which way you are heading." width="500" height="375" /><p class="wp-caption-text">Perspective matters. Particularly when you&#39;re not terribly sure which way you are heading.</p></div>
<p>Around this time last year, I had been in up to my neck dealing with a messy repair job at work. Every day my team and I had to work with issues revolving  The Tickler, The Reacharound, and The Dumptruck. No, this isn&#8217;t some unsavory gay porno I&#8217;m talking about&#8230; these are real project names we have given to various software components of a fairly complex job. Specifically, these are the functional pieces of a physical access control system that we use at work which needed some significant tuning.</p>
<p><span id="more-963"></span>By now, if you&#8217;re still reading this you are probably involved in some capacity with the access control or security industry. Thanks for sticking around. I will try to make this whole rant of mine worth your time.</p>
<p>In hindsight, I really wish we had just taken the plunge to be rid of this particular system completely and started over from scratch. It really has been nothing more than a headache for us, but at least I&#8217;ve learned a quite a few things about access control and physical ID card production. So here I am sharing these valuable nuggets of information to you, at no cost whatsoever&#8230; except that if you find them useful, you owe me a beer (or two). I&#8217;m not a heavy drinker. I promise.</p>
<blockquote>
<h2><em>&#8230;access control functionality is a rather mature feature set, and  everyone at this point is supposed to be doing it right&#8230; but you would  be surprised because some vendors still get it horribly wrong.</em></h2>
</blockquote>
<p>I had though long and hard about making any comments about this sort of thing publicly. But after having been asked why I had locked myself in a cage for many months last year, it seemed like a good time to vent a little bit and share some of the mistakes we made so that others can&#8217;t make them. This is part of the coolness of working at a university. I wouldn&#8217;t dare discuss these sort of issues in the open otherwise, if this was corporate America.</p>
<p>So here goes. I broke these tips down in pieces for you:</p>
<h3>Card Production</h3>
<ul>
<li><em><strong>Wear Your Overcoat.</strong></em> If you use ribbon printers (Fargo, MagiCard, Zebra, Evolis, etc), don&#8217;t cheap out and avoid using an overcoat. You will be left with ID cards which will wear the hell out and look like garbage within the space of a few months. Spend the extra dough and use a proper overcoat. In the words of the great Mister T&#8230; &#8220;I pity the fool who wants to be a cheap bastard&#8221;&#8230; or something like that.</li>
<li><em><strong>Tune Your Oven.</strong></em> When you use a printer that supports overcoats, you must properly tune it. This isn&#8217;t just some fire-and-forget solution&#8230; you need to find the proper temperature that the overcoat likes to be applied to the card. Too hot, and the card warps. Too cold, and the overcoat doesn&#8217;t bond properly. These printers can be like petulant little electric toasters rather than the grand pizza ovens that their vendors advertise them as. They require occasional inspection and maintenance in order to minimize errors during printing.</li>
<li><em><strong>Automating RFID Input Fail.</strong></em> Automated RFID/HID tag reading is one of those things that a good number of the smaller access control software vendors advertise &#8211; &#8220;It&#8217;s all automatic!&#8221;&#8230; and you will have to accept  that this process will most often not work properly at all. This is one feature which is bullshat around the most. Be prepared to enter these values in by hand. Someone&#8217;s going to have to do it.</li>
<li><em><strong>Strip Permissions Out.</strong></em> Proper delegation. You DO NOT want your card production staff to have the ability to change access control groups or to do ANY of that sort of thing. Why? It&#8217;s not about trust. It&#8217;s about accountability. Make it easier for everyone and don&#8217;t let them have that burden/responsibility. Make sure your production environment makes it impossible for them to do anything other than perhaps correcting typos of a person&#8217;s name, or editing data that they would only use, such as barcodes or magstripe data. They and everyone else will thank you in the long run for it.</li>
</ul>
<h3>Access Control Software/Hardware</h3>
<ul>
<li><strong><em>Core Access Control Functionality Is Easy-Peasy.</em></strong> For every big vendor like Lenel, AMAG, Software House, or S2, there are are a bunch of smaller companies who eke out a living building accordingly smaller software packages. There is nothing wrong with that. However access control functionality is a rather mature feature set, and everyone at this point is supposed to be doing it right&#8230; but you would be surprised because some vendors still get it horribly wrong. In other words what I am saying is that while it may not be as simple a procedure as boiling water- a vendor better not totally fuck shit up when it comes to making doors open when a proper card is presented to them. So if you are stuck with a system which requires you to constantly restart intelligent controllers or door modules&#8230; or has trouble updating cardholder state changes across the system&#8230; you had best kick them to the curb and find someone else who can do this sort of thing properly.</li>
<li><em><strong>Scalability Blah Blahblahblah.</strong></em> Unfortunately the refrain is similar to above. A lot of the smaller vendors simply don&#8217;t have this functionality done properly. What works well when you are a single building with less than a hundred card readers, and a fixed population will most likely turn into a vat of boiling vomit when you double or quadruple the cardholder population. There are some things which simply can&#8217;t be reproduced in a lab environment. When talking to a vendor, get their references and seriously grill them. Ask these references what sort of problems they encountered with scaling up, and home in on the usual suspect issues&#8230; such as server requirements, hardware costs, additional feature costs, and the reliability of each additional component when added to the system as a whole. Do your homework and do not be afraid to dig in.</li>
<li><em><strong>System Monitoring&#8230; Don&#8217;t Underestimate It.</strong></em> Make sure you have some way to monitor your smart controllers. Industry standard stuff like SNMP would be nice, but most of them don&#8217;t support it, so you are left with the only option of ping monitoring. This is complicated by a lot of the controllers having Ethernet/TCP/IP support as an afterthought, with their roots from RS-485 or similar serial connections, so the Ethernet module might fail, but the underlying controller will resume functionality.</li>
<li><em><strong>Go Heavy On Smart Controller RAM.</strong></em> There is a temptation to cheap out on the memory available for transactions or card data for your smart controllers- in particular the ones you will regard as being low-traffic. Don&#8217;t do it. You will be doing yourself a huge disservice. Think about what happens if access to a set of readers changes because of a department move, and suddenly many more people need access to a set of doorways. Understand that many vendors do not have truly drop-and-replace system boards&#8230; they will need to be reprogrammed and one of the side effects to that is system downtime. We all know how pissed of people can be if they can&#8217;t access their corporate computing resources. Now think of what happens if you deny them access to their bathroom doors.</li>
<li><em><strong>Proprietary Schmoprietary.</strong></em> Some of the intelligent controllers available on the market allow you to run any vendor&#8217;s software on them. Of course this is used as a selling point. Guess what though&#8230; just like any other technology, you can get royally screwed by this. The caveat usually falls in line with&#8230; &#8220;Oh, you can run our new software on these boards&#8230; but you would have to have the latest version of the board to do it&#8221;. Sound familiar? Sure! You can upgrade to Windows Version XXX but your motherboard and CPU are too slow, so you need to upgrade to something newer&#8230; The moral of this story is that it really doesn&#8217;t matter if a vendor&#8217;s hardware is proprietary or open- if you plan on switching vendors with an open system you are going to get screwed in some fashion. As for the war between choosing a proprietary or open system&#8230; so long as the damn thing works properly, these sort of issues really falls into oblivion.</li>
<li><em><strong>Think Like A Boulder.</strong></em> If rocks and dirt could actually talk&#8230; what would they say? Other than expressing displeasure at being buried without anything interesting to look at for hundreds of millions of years, only to be exposed to the elements, perhaps without a good view for hundreds of thousands of years&#8230; only to be covered over again by a mudslide or whatnot for another few million years&#8230; okay, the point is&#8230; you need to take a long term perspective on how long the hardware installation is going to last. Instead of just thinking on three year level, you need to really look further down the road and scale things to the lifetime of the building, or at the very least, the full length term of your lease. You will not be a happy camper if you are faced with the prospect of replacing hardware mounted in door jambs or walls on a frequent basis.</li>
<li><em><strong>Don&#8217;t Overlook The Installer Selection.</strong></em> Shady installers will underbid their initial installation contracts because they know once they have you locked in, they can charge $$$ for any service related work in the future. Chances are&#8230; you will have lots of service work. I think it goes without saying that you cannot simply assume that the installer vendor search is going to be straightforward. This is probably the most critical piece of the whole vendor search process.</li>
<li><em><strong>Beware of Mom &amp; Pop Shop Disease.</strong></em> This is mainly applicable to the access control software vendor&#8230; but if they are too small of a company, or if the product is run by a single super-intelligent guru (who doubles as a single point of failure), then you need to be careful. Veeeery careful. This is your physical security we are talking about, right?</li>
</ul>
<p>Well, as abruptly as I started ranting, I will end it. I guess I&#8217;ll quit when I&#8217;m ahead, right? As a disclaimer, the people at my job who I continue to work with on security related capacities are awesome people, and they know I&#8217;m not railing at any of them. If anything they&#8217;re probably wondering why I haven&#8217;t said anything about this sooner.</p>
<p>Anyhow, this is my attempt to distill my however short involvement with access control and security into some meaningful nuggets of knowledge. I hope they don&#8217;t appear like floating poop logs&#8230; but even lodged within the poop there are kernels of wisdom. Thanks again for reading.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beanos.com/~tsoutij/wp/2010/05/access-control-blues/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Cost of Incompetent Programmers</title>
		<link>http://www.beanos.com/~tsoutij/wp/2009/06/the-cost-of-incompetent-programmers</link>
		<comments>http://www.beanos.com/~tsoutij/wp/2009/06/the-cost-of-incompetent-programmers#comments</comments>
		<pubDate>Mon, 29 Jun 2009 21:58:59 +0000</pubDate>
		<dc:creator>Tijger Tsou</dc:creator>
				<category><![CDATA[Fail]]></category>
		<category><![CDATA[Fotzepolitic]]></category>
		<category><![CDATA[Information Technology]]></category>
		<category><![CDATA[Nerding]]></category>
		<category><![CDATA[Scribbles]]></category>
		<category><![CDATA[php script kiddies]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[the bellcurve]]></category>
		<category><![CDATA[underqualified programmer]]></category>

		<guid isPermaLink="false">http://www.beanos.com/~tsoutij/wp/?p=921</guid>
		<description><![CDATA[This topic comes up for me not necessarily as a rant, but as I was going through some old notes before tossing them away, and this issue came up. How much damage can an organization do to themselves by hiring discount, unqualified programming resources?
The answer: A hell of a lot.
If you own a small software [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2009/06/php_diagram.jpg"><img class="alignnone size-medium wp-image-922" title="PHP New Hire Diagram" src="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2009/06/php_diagram-387x499.jpg" alt="PHP New Hire Diagram" width="387" height="499" /></a></p>
<p>This topic comes up for me not necessarily as a rant, but as I was going through some old notes before tossing them away, and this issue came up. How much damage can an organization do to themselves by hiring discount, unqualified programming resources?</p>
<p>The answer: A hell of a lot.</p>
<p>If you own a small software development shop, do yourself a huge favor and keep reading.</p>
<p><span id="more-921"></span></p>
<blockquote>
<h2>Stupidity cost us about $250,000 over a 9 month period. Another $250,000 was lost for us in other means.</h2>
</blockquote>
<p>A previous company that I worked at had a habit of hiring low-cost coding staff to handle production quality servers- Not just any production machines&#8230; but the very hardware which was responsible for 100% of the revenue being generated for said company. This makes no sense as their client side programmers were generally top-notch, and among the more creative and competent that I have had the pleasure to work with.</p>
<p>Management also had a habit of protecting these junior staff members voraciously- for various reasons, but mainly economic. A single server-side programmer could cost two or three times more in salary to maintain. Also, some in the management felt that this staff member was a &#8216;worthy project&#8217; that could become a superstar programmer someday. I mean, it worked for Darko Milicic during his stint with the Pistons, didn&#8217;t it?</p>
<p>I calculated that my previous employer definitely cost themselves <strong>$250,000</strong> in lost cashmoney over a 9 month period for the mishaps they had in retaining ONE very junior server-side engineering resource. This was absolutely staggering to me. Another <strong>$250,000</strong> could easily be accounted for in other means. I&#8217;ll get to that in a moment.</p>
<p>The other sources for my numbers are the assumptions that:</p>
<ol>
<li>Yes, this programmer was causing problems nearly EVERY SINGLE DAY.</li>
<li>Five client/server development resources were utilized, at $20/hr in wage costs each time a bug needed to be fixed.</li>
<li>Eight QA staff were utilized, at $15/hr in wage costs to confirm said bug fix.</li>
<li>This underqualified developer introduced one bug per day, which took an average of six hours per bug to fix.</li>
<li>This individual worked for a period of 9 months, before finally being axed for causing a systemwide outage of all revenue generating products for a significant part of a business day.</li>
<li>Not entirely relevant, but said individual produced on average 15 lines of code per day, with the assumption of 21 working days per month. Vacation time is included in this count because this individual only really took one, and worked some weekends as well &#8211; so it all balances out.</li>
</ol>
<p>The numbers I am leaving out are:</p>
<ol>
<li>Costs to management salaries. The reason for this is twofold- one is that I don&#8217;t know how many staff members were involved in back-room decisionmaking each time we suffered downtime events. This ranges from one to four. Who knows&#8230;</li>
<li>Costs to my productivity. I was a systems admin, so it was my job to support the engineering staff. I had the unique experience of being able to read/understand code, but full well knew that I could not hold a candle to the proper engineers. In a nutshell, I could talk shop with them, and help diagnose problems. I was a bit faster than a plain old sysadmin at doing this. I was a good cheerleader at times. That&#8217;s about it.</li>
<li>Costs of contractors: During most of this 9 month period, we had consulting/contracting staff on board who had to shift gears to help fix problems on a near-regular basis. I simply did not accurately keep track of how often they had to drop whatever they were doing and scramble to help us.</li>
<li>The damage caused by spaghetti code. This is utterly incalculable. Each time new server-side programming staff were added they faced an absolute nightmare of a learning curve.</li>
<li>The amount of time lost by production server uptime &#8211; According to my notes we were down (and by that I mean not being able to process subscription material) for a period of nine total business days during that 9 month period. To this day I still don&#8217;t exactly know how many dollars per hour in transactions were being handled by those servers, so I can&#8217;t guess there. I won&#8217;t even bother to put a price tag on it, but it is the elephant in the room.</li>
</ol>
<p>If I really do have to hazard a guess at the total cost of damage over 9 months, then I&#8217;ll say that stupidity cost us about USD <strong>$500,000</strong> total. There is also the untold damage done to the reputation of the company, as subscribers probably grew tiresome of outages and took their business somewhere else.</p>
<blockquote>
<h2>How much damage can one incompetent programmer do to an organization? A hell of a lot.</h2>
</blockquote>
<p>In the end it isn&#8217;t my intention to throw anyone under the bus for the mistakes that were made. Guilty parties all know who they are, and to some degree or another, they all paid for it already, so there&#8217;s no need to flog that dead horse all over again.</p>
<p>The underqualified individual who boasted of general programming expertise which he did not have faced the prospect of never finding work in a proper engineering environment again. Management who felt they were saving money by having this resource around because of cost-effectiveness are facing the prospect of their entire company going down the tubes because the server-side codebase is nearly unmaintainable, among other things. Those of us who stuck around trying to fix the situation paid for it with a few sleepless nights, and the agony of <a href="http://en.wikipedia.org/wiki/Unusual_software_bug" target="_blank">&#8216;Heisenbug&#8217; </a>code which was nigh near unpossible to debug or maintain effectively.</p>
<p>I learned many things myself. I used to never document very well. Because of the insanity I was forced to deal with, I feel I have come a long way in that regard. I enjoy documenting now. It&#8217;s saved my ass a number of times since then.</p>
<blockquote>
<h2>Over a year after the staff member was let go, the server programmers were still fixing bugs.</h2>
</blockquote>
<p>Also, a young and promising programmer who was forced to help debug and manage the fix processes on a regular basis learned a hell of a lot from these failures, and it will serve him tremendously in his career as time goes on. This is the type of education you just can&#8217;t get in college. Over a year after the staff member was let go, he was still fixing bugs. The thing is, he&#8217;s already bailed on this company and isn&#8217;t looking back. If there was someone worth focusing on and making into your future team nucleus&#8230; this guy was the one.</p>
<p>What&#8217;s done is done, and hopefully dear reader, if you&#8217;re in management or if you own a small company, you won&#8217;t make the same mistakes that they did. I implore you to hire competent people. Don&#8217;t cheap out in that regard. It will cost you a whole lot more than you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beanos.com/~tsoutij/wp/2009/06/the-cost-of-incompetent-programmers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Table BitValue &#8211; NoYes, DisabledEnabled, FalseTrue</title>
		<link>http://www.beanos.com/~tsoutij/wp/2009/05/table-bitvalue-noyes-disabledenabled-falsetrue</link>
		<comments>http://www.beanos.com/~tsoutij/wp/2009/05/table-bitvalue-noyes-disabledenabled-falsetrue#comments</comments>
		<pubDate>Fri, 01 May 2009 21:35:43 +0000</pubDate>
		<dc:creator>Tijger Tsou</dc:creator>
				<category><![CDATA[Fotzepolitic]]></category>
		<category><![CDATA[Information Technology]]></category>
		<category><![CDATA[Nerding]]></category>
		<category><![CDATA[bit value abuse]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[microsoft SQL server]]></category>

		<guid isPermaLink="false">http://www.beanos.com/~tsoutij/wp/?p=892</guid>
		<description><![CDATA[Warning- this may not be really all that funny unless you are a database administrator or a geek with the right knowledge. This rather silly product I am working with stores its data in the backend via a Microsoft SQL Server database. There&#8217;s nothing wrong with that&#8230; but on further examination of the schema I [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2009/05/ridiculous_product.png"><img class="alignnone size-medium wp-image-893" title="Screenshot from the ridiculous product" src="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2009/05/ridiculous_product-499x384.png" alt="Screenshot from the ridiculous product" width="499" height="384" /></a></p>
<p>Warning- this may not be really all that funny unless you are a database administrator or a geek with the right knowledge. This rather silly product I am working with stores its data in the backend via a Microsoft SQL Server database. There&#8217;s nothing wrong with that&#8230; but on further examination of the schema I found a pretty ridiculous jewel of a table setup. Click on the picture to see the bloody details.</p>
<p>For those not technically inclined- this is precisely NOT how you would utilize a relational database server. It&#8217;s poor design, and rather an extreme and laughable example.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beanos.com/~tsoutij/wp/2009/05/table-bitvalue-noyes-disabledenabled-falsetrue/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ODBC SQLState:42000 Error, Or Why Microsoft Sucks, Reason #42000</title>
		<link>http://www.beanos.com/~tsoutij/wp/2009/02/odbc-sqlstate42000-error-or-why-microsoft-sucks-reason-42000</link>
		<comments>http://www.beanos.com/~tsoutij/wp/2009/02/odbc-sqlstate42000-error-or-why-microsoft-sucks-reason-42000#comments</comments>
		<pubDate>Thu, 26 Feb 2009 16:00:26 +0000</pubDate>
		<dc:creator>Tijger Tsou</dc:creator>
				<category><![CDATA[Information Technology]]></category>
		<category><![CDATA[Nerding]]></category>
		<category><![CDATA[linux will consume windows' soul]]></category>
		<category><![CDATA[micro$oft]]></category>
		<category><![CDATA[mssql server 2005 DTS]]></category>
		<category><![CDATA[odbc]]></category>
		<category><![CDATA[ole error 42000]]></category>

		<guid isPermaLink="false">http://www.beanos.com/~tsoutij/wp/?p=367</guid>
		<description><![CDATA[You&#8217;re probably here because you searched for this:
Microsoft SQL-DMO (ODBC SQLState:42000)
[Microsoft][ODBC SQL Server Driver][SQL Server] To connect to this server you must use SQL Server Management Studio or SQL Server Management Objects (SMO).

Bonus points if you&#8217;re using the Data Transformation Services and are now looking at an error screen similar to this:

Well, I unfortunately don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>You&#8217;re probably here because you searched for this:</p>
<blockquote><p>Microsoft SQL-DMO (ODBC SQLState:42000)</p>
<p>[Microsoft][ODBC SQL Server Driver][SQL Server] To connect to this server you must use SQL Server Management Studio or SQL Server Management Objects (SMO).</p></blockquote>
<p><span id="more-367"></span></p>
<p>Bonus points if you&#8217;re using the Data Transformation Services and are now looking at an error screen similar to this:</p>
<p><img class="size-full wp-image-368 alignnone" style="border: 1px solid black;" title="ms_sql_error" src="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2009/02/ms_sql_error.png" alt="ms_sql_error" width="558" height="231" /></p>
<p>Well, I unfortunately don&#8217;t have much substantial solutions to offer you. I apologize.</p>
<p>Connectivity MAY work if you use the SQL Native Client (SQLNCLI)  instead  of an OLE DB connection, but this is shaky at times and a much more complicated solution when wrapped into DTS.</p>
<p>If you&#8217;re looking to copy entire databases, then look here:</p>
<p><a href="http://blogs.msdn.com/euanga/archive/2006/07/18/668916.aspx" target="_blank">http://blogs.msdn.com/euanga/archive/2006/07/18/668916.aspx</a></p>
<p>If you&#8217;re looking to only pick and choose a few tables at a time, then that&#8217;s a different story altogether.</p>
<p>My solution was to use a horrifying transmogrifying method of SQL to CSV and back to SQL again for the few tables that we needed.</p>
<p>I try to be vendor-agnostic when it comes to any sort of IT solutions, but Microsoft has become increasingly infuriating and difficult to defend over the years.</p>
<p>It seems that they just wanted to stick a way in to make data interoperability between SQL 2005 and older versions in order to force their customers upgrade. In our case it might just work from them. The particular server that we have still running SQL 2000 is tied to an archaic legacy application which is poorly supported. We SHOULD upgrade it, but we can&#8217;t without breaking it.</p>
<p>This is another example of how they are not only shooting themselves in the foot, but their dwindling enterprise customer base as well.</p>
<p>So in the end, all I can offer is this diagram, while I prepare an upgrade path that does not ultimately involve Windows or  MSSQL Server:</p>
<div class="wpg2tag-image"><a href="http://www.beanos.com/gallery/v/users/tsoutij/scribbles/mssql_2000_and_2005.JPG.html" title="mssql_2000_and_2005"><img src="http://www.beanos.com/gallery/d/46577-4/mssql_2000_and_2005.JPG" width="700" height="525" id="IFid2" class="ImageFrame_none" alt="mssql_2000_and_2005"/></a></div>
<p><!-- patch in wpg2embed.inc to make this work. --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.beanos.com/~tsoutij/wp/2009/02/odbc-sqlstate42000-error-or-why-microsoft-sucks-reason-42000/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xythos Broken Advanced Upload Functionality</title>
		<link>http://www.beanos.com/~tsoutij/wp/2009/02/xythos-broken-advanced-upload-functionality</link>
		<comments>http://www.beanos.com/~tsoutij/wp/2009/02/xythos-broken-advanced-upload-functionality#comments</comments>
		<pubDate>Mon, 23 Feb 2009 16:29:18 +0000</pubDate>
		<dc:creator>Tijger Tsou</dc:creator>
				<category><![CDATA[Information Technology]]></category>
		<category><![CDATA[Nerding]]></category>
		<category><![CDATA[Scribbles]]></category>
		<category><![CDATA[advanced upload broken]]></category>
		<category><![CDATA[java.lang.ClassFormatError]]></category>
		<category><![CDATA[xythos]]></category>

		<guid isPermaLink="false">http://www.beanos.com/~tsoutij/wp/?p=362</guid>
		<description><![CDATA[
We use Xythos at our workplace to provide a file repository for students and eventually faculty and staff. It&#8217;s basically a web front end for a file system.
My personal feelings about the product are somewhat ho-hum and indifferent. It makes funny noises under the hood, it&#8217;s a bit clunky, but it works, runs on Linux [...]]]></description>
			<content:encoded><![CDATA[<div class="wpg2tag-image"><a href="http://www.beanos.com/gallery/v/users/tsoutij/scribbles/i_eat_tapes.JPG.html" title="i_eat_tapes"><img src="http://www.beanos.com/gallery/d/46541-4/i_eat_tapes.JPG" width="400" height="267" id="IFid4" class="ImageFrame_none" alt="i_eat_tapes"/></a></div>
<p><!-- patch in wpg2embed.inc to make this work. --></p>
<p>We use <a href="http://www.xythos.com" target="_blank">Xythos</a> at our workplace to provide a file repository for students and eventually faculty and staff. It&#8217;s basically a web front end for a file system.</p>
<p>My personal feelings about the product are somewhat ho-hum and indifferent. It makes funny noises under the hood, it&#8217;s a bit clunky, but it works, runs on Linux and it&#8217;s reliable.</p>
<p>So you&#8217;re probably here because you searched on this error:</p>
<pre>java.lang.ClassFormatError: Truncated class file</pre>
<p>The problem is that you&#8217;re probably running your Xythos installation over port 443 (as you should) but there are still components trying to pull files down from port 80. With Xythos, if SSL is enabled, any requests to port 80 get dumped over to 443, and you will get truncated errors like above.</p>
<p><span id="more-362"></span></p>
<p>The fix is to feed some hardcoded variables for your site name into the application so it does not do that, and use port 443 isntead.</p>
<p>We use version 7.1, and in our case the error was addressed by editing the following file, in your Xythos installation:</p>
<p>/path_to_xythos/wfs&lt;version&gt;/webapps/xythoswfs/upload_advanced.jsp</p>
<p>Now look for the text &#8220;UPLOAD Applet&#8221;, and you should see some source that looks like this:</p>
<pre>&lt;!-- UPLOAD Applet --&gt;</pre>
<pre>&lt;% if (l_showApplet) { %&gt;</pre>
<pre>&lt;div class="xy_content" style="margin-top: 5px;"&gt;</pre>
<pre>  &lt;div id="uploadAppletDiv"&gt;</pre>
<pre>    &lt;script type="text/javascript"&gt;</pre>
<pre>      var l_altMessage = "&lt;%= p_msgBun.getString("NO_JAVA_PLUGIN_MESSAGE") %&gt;";</pre>
<pre>      printUploadApplet("uploadAppletDiv",</pre>
<pre>        "&lt;%= l_codeContext %&gt;",</pre>
<pre>        "&lt;%= l_sessionID %&gt;",</pre>
<pre>        "&lt;%= ServletUtil.makeHtmlSafe(l_baseWebdavServerURL) %&gt;",</pre>
<p>Change the following lines, so it looks like this:</p>
<pre>&lt;!-- UPLOAD Applet --&gt;</pre>
<pre>&lt;% if (l_showApplet) { %&gt;</pre>
<pre>&lt;div class="xy_content" style="margin-top: 5px;"&gt;</pre>
<pre>  &lt;div id="uploadAppletDiv"&gt;</pre>
<pre>    &lt;script type="text/javascript"&gt;</pre>
<pre>      var l_altMessage = "&lt;%= p_msgBun.getString("NO_JAVA_PLUGIN_MESSAGE") %&gt;";</pre>
<pre>      printUploadApplet("uploadAppletDiv",</pre>
<pre>&lt;%--        "&lt;%= l_codeContext %&gt;",  --%&gt;</pre>
<pre>        "https://yournamehere/xythoswfs",</pre>
<pre>        "&lt;%= l_sessionID %&gt;",</pre>
<pre>&lt;%--        "&lt;%= ServletUtil.makeHtmlSafe(l_baseWebdavServerURL) %&gt;",  --%&gt;</pre>
<pre>        "https://yournamehere",</pre>
<p>You won&#8217;t need to restart the Xythos service, but now give your setup a whirl. Advanced Upload functionality should work now. Be aware that if you do this, drop-in upgrades might break this functionality, and you&#8217;ll need to edit the new files again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beanos.com/~tsoutij/wp/2009/02/xythos-broken-advanced-upload-functionality/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pixel Peeping Absurdity &#8211; Brand vs. Brand Color Rendition</title>
		<link>http://www.beanos.com/~tsoutij/wp/2008/11/pixel-peeping-absurdity-brand-vs-brand-color-rendition</link>
		<comments>http://www.beanos.com/~tsoutij/wp/2008/11/pixel-peeping-absurdity-brand-vs-brand-color-rendition#comments</comments>
		<pubDate>Mon, 10 Nov 2008 11:44:25 +0000</pubDate>
		<dc:creator>Tijger Tsou</dc:creator>
				<category><![CDATA[Camera Gear]]></category>
		<category><![CDATA[Nerding]]></category>
		<category><![CDATA[measurebators]]></category>
		<category><![CDATA[photography gone wrong]]></category>
		<category><![CDATA[Pixel Peeping]]></category>

		<guid isPermaLink="false">http://www.beanos.com/~tsoutij/wp/?p=182</guid>
		<description><![CDATA[
I&#8217;m generally for the practice of pixel peeping, as long as it is done in moderation. In case you don&#8217;t know what pixel peeping entails, it&#8217;s real simple and roughly goes along these steps:

Get two or more cameras that you want to compare. Let&#8217;s use one that you love, and one that you hate.
Pick a [...]]]></description>
			<content:encoded><![CDATA[<div class="wpg2tag-image"><a href="http://www.beanos.com/gallery/v/tsoutij/stuff/mona_lisa.JPG.html" title="The Mona Lisa"><img src="http://www.beanos.com/gallery/d/32050-7/mona_lisa.JPG" width="400" height="400" id="IFid6" class="ImageFrame_none" alt="The Mona Lisa"/></a></div>
<p><!-- patch in wpg2embed.inc to make this work. --></p>
<p>I&#8217;m generally for the practice of pixel peeping, as long as it is done in moderation. In case you don&#8217;t know what pixel peeping entails, it&#8217;s real simple and roughly goes along these steps:</p>
<ol>
<li>Get two or more cameras that you want to compare. Let&#8217;s use one that you love, and one that you hate.</li>
<li>Pick a subject to photograph, preferably a still life or something that won&#8217;t move much or change colors between shots.</li>
<li>Set one camera up on a tripod, and take a shot.</li>
<li>Set up the other camera to replace the first, using the same settings, and take a shot.</li>
<li>Load the images from both cameras to your computer.</li>
<li>Zoom into one section with high detail and compare the hell out of both images side by side.</li>
<li>Linger around at step 6 or repeat EVERYTHING until you feel that the camera you love and always wanted to &#8216;win&#8217; all along gets better results than the other one that you hate.</li>
</ol>
<p>Okay, i&#8217;m being a bit sarcastic. But seriously, this is how pixel peeping usually ends up happening.</p>
<p>It&#8217;s not that pixel peeping isn&#8217;t without its merits, but if you have taken more pictures of $20 bills taped to a wall compared with actually interesting subject matter, you have chosen the wrong hobby. Perhaps chainsaw juggling would be a more suitable endeavor instead.</p>
<p><span id="more-182"></span></p>
<p>Some people also consider pixel peeping to be an Internet sport. If you do choose to engage in this giant tub of fail, at least don&#8217;t go around on discussion boards making quotes like this:</p>
<blockquote><p><span class="forumsindent0">&#8220;in my eyes nikon colors look more fake&#8230;that is why i never switched to nikon, even though they make amazing cameras a lot of times the color look too saturated, not natural at all canon has the opposite tendency, which i prefer&#8230;&#8221;</span></p></blockquote>
<blockquote><p>&#8220;for my eyes,  Nikon&#8217;s color looks more natural, no?   From the examples,  the tree and lawn has a warmer green.&#8221;</p></blockquote>
<p>So what exactly is wrong with those quotes? They seem like perfectly legitimate critiques of color, right?</p>
<p>Here&#8217;s what&#8217;s wrong- when the image that is being pixel peeped is that of a Bailey&#8217;s Irish Cream bottle label with a <strong><em>painted rendition of a pastoral nature scene</em></strong>.</p>
<p><a href="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2008/11/d300_iso8001.jpg"><img class="alignnone size-medium wp-image-184" title="50d_nr-std_iso800" src="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2008/11/50d_nr-std_iso800.jpg" alt="" width="240" height="180" /><img class="alignnone size-medium wp-image-185" title="d300_iso8001" src="http://www.beanos.com/~tsoutij/wp/wp-content/uploads/2008/11/d300_iso8001.jpg" alt="" width="240" height="180" /></a></p>
<p>Yup. Every time I think I have seen something silly, the Internet shows me how much I have to learn about silliness.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beanos.com/~tsoutij/wp/2008/11/pixel-peeping-absurdity-brand-vs-brand-color-rendition/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gallery2 Upgrade Error &#8220;Unable to selectAdminUser for core upgrade&#8221;</title>
		<link>http://www.beanos.com/~tsoutij/wp/2008/11/gallery2-upgrade-error-unable-to-selectadminuser-for-core-upgrade</link>
		<comments>http://www.beanos.com/~tsoutij/wp/2008/11/gallery2-upgrade-error-unable-to-selectadminuser-for-core-upgrade#comments</comments>
		<pubDate>Thu, 06 Nov 2008 15:43:29 +0000</pubDate>
		<dc:creator>Tijger Tsou</dc:creator>
				<category><![CDATA[Information Technology]]></category>
		<category><![CDATA[Nerding]]></category>
		<category><![CDATA[errors]]></category>
		<category><![CDATA[gallery2]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[wpg2]]></category>

		<guid isPermaLink="false">http://www.beanos.com/~tsoutij/wp/?p=163</guid>
		<description><![CDATA[
I use Gallery2 for the backend service of photos. It works rather well, despite a few quirks. But none of these issues are nearly as bad as something in the world of a closed-source vendor.
I recently tried to upgrade the Gallery software and found this nasty error in the logs right around when I was [...]]]></description>
			<content:encoded><![CDATA[<div class="wpg2tag-image"><a href="http://www.beanos.com/gallery/v/users/tsoutij/random/no_poodles.JPG.html" title="SVP - No Poodles!"><img src="http://www.beanos.com/gallery/d/32062-4/no_poodles.JPG" width="400" height="267" id="IFid8" class="ImageFrame_none" alt="SVP - No Poodles!"/></a></div>
<p><!-- patch in wpg2embed.inc to make this work. --></p>
<p>I use Gallery2 for the backend service of photos. It works rather well, despite a few quirks. But none of these issues are nearly as bad as something in the world of a closed-source vendor.</p>
<p>I recently tried to upgrade the Gallery software and found this nasty error in the logs right around when I was trying to push the big red &#8216;Upgrade&#8217; button:</p>
<pre>...Unable to selectAdminUser for core upgrade...</pre>
<p>Hopefully if you are reading this, it is because you found this page on a web search and are grasping for some answers. I&#8217;m not saying I have all of them, but this is the process I used to figure things out.</p>
<p><span id="more-163"></span></p>
<p>First I determined that when logged in as my site admin for Gallery, i did not see the &#8216;Site Admin&#8217; functionality that is normally present for that user&#8230; which is a BAD thing. Try this now. You might experience the same.</p>
<p>Then I looked at the database itself. There was no corruption as far as I could tell, but of interest was the gallery group and user mappings. Open up a command prompt and use whatever you use to interface with your database to run the following SQL query:</p>
<pre>select * from g2_UserGroupMap where g_userID=6;</pre>
<p>You should see something that looks like this:</p>
<pre>+----------+-----------+
| g_userId | g_groupId |
+----------+-----------+
|        6 |         2 |
|        6 |         4 |
|        6 |         3 |
+----------+-----------+
3 rows in set (0.00 sec)</pre>
<p>Note the last row, where it shows &#8216;6&#8242; and &#8216;3&#8242;. If that row does not appear, then your admin user is not set up to actually have admin privileges!</p>
<p>A quick and dirty fix to enable the default user you created when you installed Gallery is to run this query:</p>
<pre>insert into g2_UserGroupMap values (6,3);</pre>
<p>You have now just given user ID number 6 admin privileges.</p>
<p>Now make sure you know who that user ID 6 is:</p>
<pre>select g_userName from g2_User where g_id=6;</pre>
<p>Now you can login as that user and try the upgrade again. Bingo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.beanos.com/~tsoutij/wp/2008/11/gallery2-upgrade-error-unable-to-selectadminuser-for-core-upgrade/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
