<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3710704267775157311</id><updated>2011-12-21T06:36:27.902-08:00</updated><category term='linux'/><category term='business ideas'/><category term='Tomcat'/><category term='soft skills'/><category term='fusioncharts'/><category term='tips'/><category term='network security'/><category term='perl'/><category term='automated deploys'/><category term='Repository'/><category term='software troubleshooting'/><category term='nagios'/><category term='random technical'/><category term='Windows'/><category term='vbscript'/><category term='cron'/><category term='emergency software fix'/><category term='tibco'/><category term='IIS'/><category term='CMS&apos;s'/><category term='databases'/><category term='software development'/><title type='text'>Continuously Learning</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>93</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7136048639898105</id><published>2011-07-18T22:40:00.000-07:00</published><updated>2011-07-18T22:40:48.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>Dell Latitude Diagnostic Error Code 2000-0142 Hard Drive Failure</title><content type='html'>'Apparently' the hard drive on my laptop failed yesterday. &amp;nbsp;Out of the blue I got a couple of popup windows complaining about some dll not being able to load, and then the windows blue screen of death. &amp;nbsp;I thought maybe my machine got too hot, but I tried rebooting after letting it cool off and it didn't do anything after the Dell splash page during the boot. &amp;nbsp;So I ran a BIOS diagnostic and got the following error:&lt;br /&gt;Msg: Error Code 2000-0142&lt;br /&gt;Msg: Unit 1: Drive Self Test&lt;br /&gt;Failed Status Byte=77&lt;br /&gt;I called Dell and they basically confirmed what the diagnostic test said - my hard drive was fried. &lt;br /&gt;&lt;br /&gt;Not wanting to give up on my hard drive that easily, I googled to see what I could do. &amp;nbsp;I discovered I could try to repair windows using the Windows Recovery Console. &amp;nbsp;So I found my Windows CD and booted from it and went to the Repair option. &amp;nbsp;Once I had entered the Admin password, I got a command prompt and after a bit of searching around I discovered that most of my hard drive seemed to be intact. &amp;nbsp;This, however, was still in the dos prompt of the Windows Recovery Console. &amp;nbsp;I couldn't back up my files to a USB from there. &lt;br /&gt;&lt;br /&gt;I tried chkdsk, chkdsk /p, and chkdsk /r - those all worked successfully. &amp;nbsp;Yet my machine still wouldn't book. &amp;nbsp;So I preused the list of commands available to the Windows Recovery Console (&lt;a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/recovery_console_cmds.mspx?mfr=true"&gt;here&lt;/a&gt;) and tried a few more - bootcfg, fixboot, and fixmbr. &amp;nbsp;In the end, it was fixmbr (which repairs the master boot record on the specified disk) that ended up working for me.&lt;br /&gt;&lt;br /&gt;My laptop is 4 years old now. &amp;nbsp;I removed the battery a couple of months ago, and with problems like this starting to happen, I going to start shopping for a new one. &amp;nbsp;Hopefully this info helps someone out there though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7136048639898105?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7136048639898105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7136048639898105' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7136048639898105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7136048639898105'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/07/dell-latitude-diagnostic-error-code.html' title='Dell Latitude Diagnostic Error Code 2000-0142 Hard Drive Failure'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4420772200726120880</id><published>2011-06-12T18:34:00.000-07:00</published><updated>2011-06-12T18:34:14.464-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>Business Idea - Automated Lawn Mowers</title><content type='html'>Similar to my business idea regarding automated window washers, yet I think this one would potentially be even easier to implement.  I was driving down our ring road here in Calgary and seeing all the grass growing very fast in the median and around the overpasses.  I also saw a tractor/lawn mower left by the city over the weekend in one of the medians and it sparked a thought...  Why couldn't lawn mowers be automated?  It turns out somebody already has that idea.  Check this link out:  &lt;a href="http://www.robomow.com/" target="_blank"&gt;http://www.robomow.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These aren't industrial size/strength machines, though.  I guess there are a couple of challenges with using an automated mower in an industrial/municipal context:&lt;br /&gt;- &lt;b&gt;Keeping them secure&lt;/b&gt; - they'd potentially be easy to steal.  You could get around this by putting a GPS tracker on the unit something like this:  &lt;a href="http://www.gpspolice.com/" target="_blank"&gt;http://www.gpspolice.com/&lt;/a&gt;&lt;br /&gt;- &lt;b&gt;More varied terrain&lt;/b&gt; - the mowers would have to content with steeper hills and soggy or muddy grass that they could get stuck in.  The unit would have to be able to manage/mitigate these.&lt;br /&gt;- &lt;b&gt;Safety&lt;/b&gt; - The units would need to be well tested with emergency shut offs logic in a bunch of places to ensure the public's safety.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4420772200726120880?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4420772200726120880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4420772200726120880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4420772200726120880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4420772200726120880'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/06/business-idea-automated-lawn-mowers.html' title='Business Idea - Automated Lawn Mowers'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3016356793022157897</id><published>2011-05-26T22:31:00.000-07:00</published><updated>2011-05-26T22:31:55.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>Two more business ideas</title><content type='html'>I've got two more business ideas.  &lt;br /&gt;&lt;br /&gt;1. I've seen and heard of several companies here in Calgary that have tried to outsource their software development to India and have failed for one reason or another.  I think it would be interesting to offer one's services as a liaison between a local client and an overseas outsourcing company to help with communication, expectation setting, and overall project management.  It seems to me like there could be a big opportunity there - reasonable and talented software development, and clients looking for cheaper ways to build and implement their software.  A boutique firm that acted as a 3rd party to help manage issues related to challenges with outsourcing projects like this overseas would be interesting to try.&lt;br /&gt;&lt;br /&gt;2. On a totally different vein, (this is going to sound a bit silly, but...) it bothers me when I throw away a perfectly piece of good seran-wrap/cling-wrap.  I doubt this would be a big money maker, but putting together a little utility/tool that stores the clean sheet of cling-wrap for re-use was my idea.  :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3016356793022157897?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3016356793022157897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3016356793022157897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3016356793022157897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3016356793022157897'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/05/two-more-business-ideas.html' title='Two more business ideas'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6069724759082321243</id><published>2011-05-22T22:24:00.000-07:00</published><updated>2011-05-22T22:25:35.516-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>Access Denied - Windows Service - StreamWriter- VB.Net</title><content type='html'>I'm going to cut right to the chase on this one. &amp;nbsp;&lt;i&gt;I didn't realize that Windows obfuscates error messages for security.&lt;/i&gt; &amp;nbsp;Without that gem of knowledge, I spent WAY more time than I should have last week trying to get a Windows Service to write a file to the local file system on a server. &amp;nbsp;(I have another post related to obfuscated error messages with Windows &lt;a target="_blank" href="http://continuouslylearning.blogspot.com/2010/08/common-obfuscated-error-messages-with.html"&gt;here&lt;/a&gt;, but it focuses on IIS).&lt;br /&gt;&lt;br /&gt;I was continually getting an access denied message trying to programatically create and write a file using a StreamWriter in VB.Net. &amp;nbsp;My Windows Service was running as a particular service account, and I had &amp;nbsp;given that particular account Modify access to the parent folder where the file was supposed to be created - but it would not write. &amp;nbsp;I tried pushing to a different server to see if it would work there - still no dice. &amp;nbsp;I tried adding security policies (run as a service, run as a batch job, run as part of the OS) to the service account running the service - again, the annoying message 'Access Denied'. &amp;nbsp;For a while it was thought that maybe the file size was an issue - it was a little over a Mb. &amp;nbsp;I deployed another version that wrote just one line. &amp;nbsp;No luck.&lt;br /&gt;&lt;br /&gt;In the end, I enlisted a colleague's help (thanks Dorina) and we discovered that the problem wasn't the user at all. &amp;nbsp;It was in the path that I was trying to write to. &amp;nbsp;I was using the Path.combine() method to put the path together which, in the debugger appeared to put the file name and path together correctly. &amp;nbsp;However when we used &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb896645"&gt;Procmon&lt;/a&gt; to look at the output it complained on a createFile command that the 'file' was 'isDirectory'. &amp;nbsp;Upon closer examination, it turned out that my Nunit test was calling one constructor that correctly used that Path.combine() method, and my Service called another constructor that did not use the Path.combine() method.&lt;br /&gt;&lt;br /&gt;So in the end, my AccessDenied error, was really an incorrect path issue. &amp;nbsp;Windows (apparently) doesn't display the correct error message so as not to advertise potentially sensitive paths. &amp;nbsp;And I need to ensure that my Nunits exercise the same methods that my implementation classes use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6069724759082321243?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6069724759082321243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6069724759082321243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6069724759082321243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6069724759082321243'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/05/access-denied-windows-service.html' title='Access Denied - Windows Service - StreamWriter- VB.Net'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5291175018881382722</id><published>2011-04-13T20:05:00.000-07:00</published><updated>2011-04-13T20:05:49.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>Hand-held application and smart board business ideas</title><content type='html'>I had a couple of new technology ideas recently. &amp;nbsp;In the last couple of weeks at work, all of our meeting rooms have been getting outfitted with &lt;a href="http://www.smart.ca/" target="_blank"&gt;Smart Boards&lt;/a&gt; - and quite a number of them with video conferencing features. &amp;nbsp;While we were trying to get set up for a meeting we were impressed to see the camera for the video conference realign itself after our PM had pointed it a different direction. &amp;nbsp;While he was continuing to get the display organized, I had the urge to help him from my seat using my fingers to zoom the image like it was an iPad or an iPhone. &amp;nbsp;Then I thought 'why couldn't I do that, given the &lt;a href="http://www.xbox.com:80/en-US/kinect" target="_blank"&gt;Kinect technolog&lt;/a&gt;y now with the xbox?' &amp;nbsp;A touch-less touch screen? &amp;nbsp;Maybe in the future.....&lt;br /&gt;&lt;br /&gt;It wouldn't surprise me if there is an app already for the other idea I had. &amp;nbsp;I was quickly going over a hard copy of a chart of geological formations looking for a particular name. &amp;nbsp;I thought 'wouldn't it be great if I could just hit ctrl-F and find the word I'm looking for?' &amp;nbsp;and then I realized that something like that would be a great app for an iPhone or similar hand held. &amp;nbsp;Take a picture of the document, and write some logic to parse the text in the image and then search for the search term entered. &amp;nbsp;The idea is similar to the &lt;a href="http://itunes.apple.com/ca/app/word-lens/id383463868?mt=8" target="_blank"&gt;'Word Lens' app here,&lt;/a&gt; except that rather than translating text, your searching it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5291175018881382722?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5291175018881382722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5291175018881382722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5291175018881382722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5291175018881382722'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/04/hand-held-application-and-smart-board.html' title='Hand-held application and smart board business ideas'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7414438774271853976</id><published>2011-03-26T07:17:00.000-07:00</published><updated>2011-03-26T07:17:58.861-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>IIS and setting NTAuthenticationProviders and authNTLM</title><content type='html'>More than once now I've run into situations with the NTLM configuration in IIS where it seems that the GUI setting doesn't do all you need it to to properly configure integrated windows authentication for a web site. Earlier this week I was asked to look into a situation for a particular project team where &lt;b&gt;Firefox&lt;/b&gt; wasn't prompting them to enter a username/password in one environment (they'd just get an http 401.2 error), and yet it was giving them the prompt in another environment.&amp;nbsp; (IE was running fine in both environments, by the way).&lt;br /&gt;&lt;br /&gt;I went through all the IIS GUI configs in IIS and the two boxes looked identical.&amp;nbsp; Since this appeared to be an issue with integrated authentication, I ran this script:&lt;br /&gt;&lt;br /&gt;cscript c:\inetpub\Adminscripts\adsutil.vbs GET W3SVC/WEB_SITE_Number/ROOT/NTAuthenticationProviders&lt;br /&gt;&lt;br /&gt;which showed me that the working server had nothing set (wasn't set), while the server that was giving them problems returned with 'Negotiate,NTLM.'&amp;nbsp; I subsequently set NTAuthenticationProviders to '' and it worked by using 'set' instead of 'get' in the above script and providing an empty parameter.&lt;br /&gt;&lt;br /&gt;Note:&amp;nbsp; I understand the above setting to be &lt;b&gt;different&lt;/b&gt; than the one below.&amp;nbsp; In more than one instance at work I've had this issue and proven that this is the case.&amp;nbsp; The script below, from my understanding, the same as the Windows Integrated Authentication checkbox on the Directory Security tab in IIS.&lt;br /&gt;&lt;br /&gt;cscript c:\inetpub\adminscripts\adsutil.vbs SET W3SVC/WEB_SITE_Number/ROOT/vDir_Name/authNTLM TRUE&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7414438774271853976?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7414438774271853976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7414438774271853976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7414438774271853976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7414438774271853976'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/03/iis-and-setting-ntauthenticationprovide.html' title='IIS and setting NTAuthenticationProviders and authNTLM'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3739949562769840560</id><published>2011-03-03T21:31:00.000-08:00</published><updated>2011-03-09T18:31:10.067-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soft skills'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>IT Professional - Know Thyself</title><content type='html'>What are you good at?&amp;nbsp; It pays to know - literally.&amp;nbsp; It will also make you happier and more productive on the job.&lt;br /&gt;&lt;br /&gt;The more I work in IT, the more I see where I'm most effective. I also see in comparison where others blow past me in their individual skills.&amp;nbsp; It's important for multifunctional teams to have a good idea of different team member's areas of expertise.&amp;nbsp; Leveraging (knowing when and who to ask for a specific kind of help) these team skills can greatly improve the effectiveness of a team.&lt;br /&gt;&lt;br /&gt;Here's some real life examples:&lt;br /&gt;&lt;br /&gt;I'm rather weak on writing complex sql statements.&amp;nbsp; I can profile sql, and can get most sql work done.&amp;nbsp; But if I've got a difficult query I'm working on, I'll go ask my team mate who is an expert on putting together complex sql.&amp;nbsp; Later on, he'll ask me for help with a visual studio or server/service configuration related question.&amp;nbsp; Its a good, productive working relationship that keeps everyone happy.&amp;nbsp; The BA's are happy because the data looks right.&amp;nbsp; My PM is happy because my task was finished on time. And my team mate and I our happy because we both learned something and did it faster than trying to google for it on our own.&lt;br /&gt;&lt;br /&gt;I'm great at problem solving software related issues - particularly in a domain I'm familiar with.&amp;nbsp; Whether it's missing permissions, configuration, network connectivity, everyone sitting around me will tell you I'm very, VERY persistent at solving problems that are brought to me.&amp;nbsp; My neighbor one cube west is fantastic at IIS/MSTDC/COM related bug/configuration debugging.&amp;nbsp;&amp;nbsp; She also knows our software domain better than almost anyone else in the building - she seems to have it memorized.&amp;nbsp; When I have an issue with our software that I don't know how to fix, or a business related problem in the software,&amp;nbsp; I talk to her without hesitation.&amp;nbsp; Conversely, when she is stuck on an issue that she doesn't know how to solve, she will buzz it past me.&amp;nbsp; Again, a productive working relationship that makes everybody happy.&amp;nbsp; The business is happy they got their patch as fast as they did.&amp;nbsp; Once again our PM is happy, etc....&lt;br /&gt;&lt;br /&gt;In meetings I will keep quiet and not say very much unless I feel there is an important point being missed.&amp;nbsp; I'm not super great at arguing a point.&amp;nbsp; I'm not the person that's always called on to go to a meeting to convince another group of people that 'our way is the right way'.&amp;nbsp; Part of this is my personality, part of it is my belief that there is multiple ways to get 'a good enough' answer for the problem we are looking to resolve.&amp;nbsp; However, we have another fellow in our group that will absolutely blow you away with his gift of logical persuasion.&amp;nbsp; He's the guy that gets sent to those 'convince the group' meetings.&amp;nbsp; On the other hand, I'm called on when diplomacy and a consensus is required.&lt;br /&gt;&lt;br /&gt;Know what you are good at.&amp;nbsp; Seek to know what your team mate's strengths are.&amp;nbsp; Become a happier, more productive development team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3739949562769840560?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3739949562769840560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3739949562769840560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3739949562769840560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3739949562769840560'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/03/it-professional-know-thyself.html' title='IT Professional - Know Thyself'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5474773484691171862</id><published>2011-02-14T08:14:00.000-08:00</published><updated>2011-02-14T08:14:56.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Excessive logging kills AppPool (log4net)</title><content type='html'>We had an issue where one of our Application Pools (IIS 6) was 'dying'.&amp;nbsp; The interesting thing about it was while the application itself was dead (error page, sometimes showing an outOfMemory exception, other times showing a meaningless exception), the appPool itself appeared in the GUI to be running.&amp;nbsp; The more troubleshooting I do with Windows OS's, the more I do not trust what the GUI says.&amp;nbsp; Appearances in Windows can be deceiving.&amp;nbsp; For several weeks - until we understood the root cause of the issue - are resolution to the dead application was to restart the 'running' appPool.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;A side note - this appPool was running on a Network Load-balanced server, on the dominant node.&amp;nbsp; The appPool for this particular application only ever failed on the dominant node.&amp;nbsp; It never failed on the other node of the cluster, so we had reason to believe that the 'load' had something to do with the root issue. &lt;br /&gt;&lt;br /&gt;In the end, we discovered the root cause of our dying application by accident.&amp;nbsp; We were cleaning up our files on the prod servers when it became apparent to us that log4net on another application (and another appPool) was set to log 'ALL'.&amp;nbsp; This resulted in 1.5Mb of log created about every 5 minutes.&amp;nbsp; I had a hunch that all this logging was having a memory impact on the server - we certainly didn't want to be logging at the 'ALL' level anyway, so we created a change request and fixed that issue ASAP.&amp;nbsp; Then we crossed our fingers, hoping that our dying AppPool issue would go away as well.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;It's been more than two weeks since we implemented this log4net change and our flaky appPool hasn't died once.&amp;nbsp; Lessons learned:&lt;br /&gt;&lt;br /&gt;- Watch for excessive logging on prod servers&lt;br /&gt;- Excessive logging can apparently cause other appPools to through outOfMemory Exceptions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5474773484691171862?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5474773484691171862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5474773484691171862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5474773484691171862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5474773484691171862'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/02/excessive-logging-kills-apppool-log4net.html' title='Excessive logging kills AppPool (log4net)'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6580662140253626180</id><published>2011-02-09T22:20:00.000-08:00</published><updated>2011-02-09T22:20:18.354-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Windows VM False Performance Monitor Stats</title><content type='html'>We almost exclusively run VM's now in most of our environments. Recently, we added two new Windows VM's in production for a particular solution.&amp;nbsp; Thinking we were being prudent, we asked to have the boxes provisioned with 4 Gigs of Memory since that's what the old 'hardware' boxes had. We deployed our solutions to the new boxes and tested them without a hitch.&amp;nbsp; So a week later a switch was flipped and the new VM's went live while the old boxes no longer took requests.&amp;nbsp; After a few days, we discovered (by looking at the task manager) that we were getting some conflicting and concerning readings for memory utilization. Check this out:&lt;br /&gt;&lt;br /&gt;- the task manager graph said we were using 3.7 gigs of memory&lt;br /&gt;- looking at the actual numbers below the graph, we only had 300Mb of memory available on the machine&lt;br /&gt;- looking in the processes tab, none of the processes were using a significant amount of memory (several were using between 200-300MB, but that was within normal tolerances when compared with servers running the same system in other environments.&amp;nbsp; However these same processes where paging memory like they shouldn't have been!&amp;nbsp; Page faults were very high.&lt;br /&gt;- Totaling the memory used in the individual processes, we were NOT using 3.7 Gigs of memory.&lt;br /&gt;&lt;br /&gt;After doing some more investigation, we asked the team that built the server how the memory had been provisioned for these new boxes.&amp;nbsp; It turned out that they both had originally been given 1Gig of memory and then later (after they were running) 3 more Gigs were added.&amp;nbsp; At this point our hunch was that these&amp;nbsp; boxes weren't seeing the additional 3Gigs that had been subsequently added.&amp;nbsp; After doing a hard reboot on both boxes, this turned out to be the case.&lt;br /&gt;&lt;br /&gt;Lesson learned: make sure you follow VM procedure (hard re-boots) for adding/removing resources to VM servers.&amp;nbsp; Short-cuts can create some pretty confusing statistics in the OS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6580662140253626180?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6580662140253626180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6580662140253626180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6580662140253626180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6580662140253626180'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/02/windows-vm-false-performance-monitor.html' title='Windows VM False Performance Monitor Stats'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6229681743618225221</id><published>2011-01-28T11:24:00.000-08:00</published><updated>2011-01-28T11:24:55.038-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Debugging/Troubleshooting SQL performance/blocking issues</title><content type='html'>I picked up a good tip from one of our DBA's yesterday.&amp;nbsp; He uses sp_who2 to see which users have active threads/processes running against a particular database.&amp;nbsp; This stored proc returns the PIDs as well (Process ID number).&amp;nbsp; I had known about this previously.&amp;nbsp; What was new to me was he also used:&lt;br /&gt;&lt;br /&gt;dbcc inputbuffer(pidNumberHere)&lt;br /&gt;&lt;br /&gt;to get the database to tell him which stored proc was being executed by that PID.&amp;nbsp; That seems to me like a handy trick.&amp;nbsp; It certainly solved the problem I was having.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6229681743618225221?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6229681743618225221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6229681743618225221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6229681743618225221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6229681743618225221'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/01/debuggingtroubleshooting-sql.html' title='Debugging/Troubleshooting SQL performance/blocking issues'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2259095276126633215</id><published>2011-01-27T07:12:00.000-08:00</published><updated>2011-01-27T07:12:55.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>WCF and Large Result sets</title><content type='html'>Dealing with oil resource data across several disparate systems and also trying to make our API's more generic and consistent, we use WCF a lot (web services with windows apps). We've had a couple of instances where we've had to tweak the config settings for either our publishers or our clients to return some large datasets over WCF. &lt;br /&gt;For the most part, I have found the error messages relating to constrained WCF config settings refreshingly to the point.&amp;nbsp; They pretty much pointed me directly to the attribute in the file that I needed to change in order to fix my issue.&lt;br /&gt;For memory related errors on the client, I found that juggling with the maxBufferPoolSize and maxReceivedMessageSize in my binding to help.&amp;nbsp; I moved the maxBufferPoolSize from 9999999 to 99999999, and changed the maxReceivedMessageSize to 350000000.&amp;nbsp; Sometimes after that I would get a timeout error on the client machine (depending on what kind of load the server was under).&amp;nbsp; So I'd have to make the timeout settings on the binding higher.&lt;br /&gt;Obviously it helps when the publisher has the same values for the same attributes on its binding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2259095276126633215?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2259095276126633215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2259095276126633215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2259095276126633215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2259095276126633215'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/01/wcf-and-large-result-sets.html' title='WCF and Large Result sets'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1281949817021377182</id><published>2011-01-18T17:52:00.000-08:00</published><updated>2011-01-18T17:53:17.076-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>SMTP email issue with hosts file</title><content type='html'>I had an interesting issue last week.&amp;nbsp; I had a website with a contact page that uses SMTP sendmail to email a list of people whatever was entered on a form.&amp;nbsp; The curious thing about this issue was it would send emails to everyone in the list &lt;i&gt;except&lt;/i&gt; email addresses that matched the domain name of the web site.&amp;nbsp; For example, it would send an email to perry.mckenzie@blah.com, but it wouldn't send an email to perry.mckenzie@continuouslylearning.blogspot.com, even though the server that was doing the sending was listed in the DNS as 'continuouslylearning.blogspot.com'.&lt;br /&gt;&lt;br /&gt;I tried changing the email provider by pointing the Email Host to a server that I knew accepted anonymous email pushes, but it did the opposite - sending the emails successfully for users from blah@continuouslylearning.blogspot.com, but not sending them for blah@anyOtherAddress.com!&lt;br /&gt;&lt;br /&gt;After looking through various logs (including /var/log/maillog), it seemed like sendmail was getting confused as the log was trying to associate the email address (someone@continuouslylearning.blogspot.com) with a user on the host and not finding the user.&lt;br /&gt;&lt;br /&gt;sendmail failed error: localhost: someone@continuouslylearning.blogspot.com user not found&lt;br /&gt;&lt;br /&gt;I tried removing an entry in the &lt;b&gt;/etc/hosts &lt;/b&gt;file that pointed the IP address to continuouslylearning.blogspot.com, but that didn't seem to work.&amp;nbsp; What I didn't realize until later (with the help of my hosting provider) is that this was the correct change to make, I just needed to restart two services after I made the change:&lt;br /&gt;&lt;b&gt;service network restart&lt;/b&gt;&lt;br /&gt;&lt;b&gt;service sendmail restart&lt;/b&gt;&lt;br /&gt;Then my email worked perfectly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1281949817021377182?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1281949817021377182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1281949817021377182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1281949817021377182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1281949817021377182'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2011/01/smtp-email-issue-with-hosts-file.html' title='SMTP email issue with hosts file'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2930656665022035333</id><published>2010-11-29T21:29:00.000-08:00</published><updated>2011-03-13T09:34:32.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Books I want to read soon...</title><content type='html'>Here's two books I want to read soon:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; float:left; padding-right:15px;"&gt;&lt;a imageanchor="1" target="_blank"  href="http://www.amazon.com/Nomadic-Developer-Surviving-Technology-Consulting/dp/0321606396?ie=UTF8&amp;tag=thgrgi-20&amp;link_code=bil&amp;camp=213689&amp;creative=392969"&gt;&lt;img alt="The Nomadic Developer: Surviving and Thriving in the World of Technology Consulting" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;ASIN=0321606396&amp;tag=thgrgi-20" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thgrgi-20&amp;l=bil&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=0321606396" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt;&lt;/div&gt;&lt;a target="_blank"  href="http://www.amazon.com/Nomadic-Developer-Surviving-Technology-Consulting/dp/0321606396?ie=UTF8&amp;tag=thgrgi-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;The Nomadic Developer: Surviving and Thriving in the World of Technology Consulting&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thgrgi-20&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=0321606396" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;And&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; float:left; padding-right:15px;"&gt;&lt;a imageanchor="1" target="_blank"  href="http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912?ie=UTF8&amp;tag=thgrgi-20&amp;link_code=bil&amp;camp=213689&amp;creative=392969"&gt;&lt;img alt="Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))" src="http://ws.amazon.com/widgets/q?MarketPlace=US&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL160_&amp;ASIN=0321601912&amp;tag=thgrgi-20" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thgrgi-20&amp;l=bil&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=0321601912" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a target="_blank"  href="http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912?ie=UTF8&amp;tag=thgrgi-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=thgrgi-20&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=0321601912" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2930656665022035333?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2930656665022035333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2930656665022035333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2930656665022035333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2930656665022035333'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/books-i-want-to-read-soon.html' title='Books I want to read soon...'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7071121145296266279</id><published>2010-11-25T12:04:00.000-08:00</published><updated>2011-03-27T08:44:30.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Thoughts on Design</title><content type='html'>I recently re-read The Last Lecture by &lt;a href="http://en.wikipedia.org/wiki/Randy_Pausch"&gt;Randy Pausch&lt;/a&gt; and was impressed with what he did with his classes that focused on User Interface Design.&amp;nbsp; The first day of class he would bring in an old VCR, put it on a table in front of class, and without saying a word he'd pull a sledgehammer from behind his desk and destroy it.&amp;nbsp; Needless to say it got the class's attention.&amp;nbsp; The message Randy was trying to convey in this demonstration is that poor end user design is detrimental to the product.&amp;nbsp; End User Design is critical.&lt;br /&gt;&lt;br /&gt;There is another person who is a strong proponent of excellence in End User Design.&amp;nbsp; He is still alive today and he's be a driving force in perfection in Design in the IT industry.&amp;nbsp; He designs have been flying off of store shelves for the last 25 years or so.&amp;nbsp; If you haven't guessed yet, I'm thinking of Steve Jobs from Apple. I ran across a &lt;a href="http://www.businessweek.com/magazine/content/10_44/b4201096309840.htm"&gt;very interesting article&lt;/a&gt; about him in Bloomsberg Businessweek.&amp;nbsp; It's basically an interview with John Sculley, the CEO of Apple from the mid-80's to the mid-90's, and what it was like 'Being Steve's Boss'.&amp;nbsp; He talks a lot of Steve's philosophy and background in design, and Steve's influence on Apple in this area.&amp;nbsp; It's a great article.&lt;br /&gt;&lt;br /&gt;It got me thinking...&amp;nbsp; In software I have not been super stringent about software design on the applications I've written.&amp;nbsp; Let me clarify - object oriented design is a must.&amp;nbsp; The train of thought I'm seeking to follow here is 'is it a requirement to implement design patterns in your code everywhere possible?' A major reason for this is I've worked with a number of people who think their job is refactoring and renaming classes and packages in a code base - to the determent of the project.&amp;nbsp; I often tell the students in my classes that there are numerous ways to 'skin a cat' as it were, when coming to a working solution in code.&amp;nbsp; I wonder though, is there always one perfect way?&amp;nbsp; Is this something to strive for?&amp;nbsp; Does it matter as long as the application works the way the client wants it to?&amp;nbsp; What do you think?&lt;br /&gt;&lt;br /&gt;Personally, I think that the answers to these questions depends on a lot of things, not the least of which are your client, the project, and your team.&amp;nbsp; Elegant solutions look and feel so good when your done - both for you and for you client.&amp;nbsp; Perhaps the motivation and context for the project need to be analyzed before a decision is made whether or not you should 'shoot for the best designed, most elegant solution' possible?&amp;nbsp; Obviously if your project has constraints like budget, resources, and time, there's a limit to how much effort you can put into evolving your project into the best design in can be.&amp;nbsp; That is one big reason why design patterns and frameworks are so prevalent (and pretty much a requirement) in software engineering.&lt;br /&gt;&lt;br /&gt;I like to read/sign out &lt;a href="http://www.fastcompany.com/"&gt;Fast Company&lt;/a&gt; from the Library - I'm actually thinking about getting a subscription.&amp;nbsp; Anyway, they have an annual 'Masters of Design' issue that is a lot of fun to read.&amp;nbsp; In it they highlight different world class designs and their designers.&amp;nbsp; &lt;a href="http://www.fastcompany.com/tag/mod"&gt;Here's a link&lt;/a&gt; to their MOD tag cloud.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7071121145296266279?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7071121145296266279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7071121145296266279' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7071121145296266279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7071121145296266279'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/thoughts-on-design.html' title='Thoughts on Design'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1281117762882146046</id><published>2010-11-21T09:12:00.000-08:00</published><updated>2010-11-21T09:12:38.060-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Windows OS Performance Guidelines</title><content type='html'>These are notes from a workshop I was able to be a part of a couple of weeks ago.&amp;nbsp; The workshop was on &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=31FCCD98-C3A1-4644-9622-FAA046D69214&amp;amp;displaylang=en"&gt;Windows Performance Monitor&lt;/a&gt; and monitoring vital signs on Windows Servers.&amp;nbsp; The windows performance monitor has a multitude of counters that a person could potentially monitor on a server.&amp;nbsp; I'm just going to point out a few critical ones that were highlighted in the workshop and what their tolerances are.&lt;br /&gt;&lt;br /&gt;Some points to note before I get into these values:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Don't always look at the graph first. The counter graphs can be scaled right out to lunch so they aren't necessarily a good first glance indicator.&amp;nbsp; For a particular counter, your focus should first be on the Minimum and Maximum values in perfmon just below the graph.&lt;/li&gt;&lt;li&gt;In the past, I would tend to keep an eye out for sympathetic counter relationships on the graphs.&amp;nbsp; However, keeping an eye out of inverse counter relationships is also a good idea (where one counter could be decreasing in value while another is increasing)&lt;/li&gt;&lt;li&gt;Counters can get corrupted.&amp;nbsp; Apparently this happens more often than one would think.&amp;nbsp; They can be rebuilt - directions are in &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;300956"&gt;this KB post.&lt;/a&gt;&lt;/li&gt;&lt;li&gt; You can attach a PID (process ID) to a perfmon counter in an OS older than Windows Server 2008 by modifying reg keys. Details are in &lt;a href="http://support.microsoft.com/kb/281884"&gt;this kb article&lt;/a&gt;. Versions of perfmon on 64bit OS's come with this already set up. &lt;/li&gt;&lt;/ol&gt;On to the objects/counters of note:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Process Object&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Handle Count - greater than 500 handles may point to a problem.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Private Bytes - greater than 250MB could be a problem.&amp;nbsp; I've seens procs over a Gig and they definitely were a problem (they can get that high). &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;li&gt;Working set - greater than 250MB could be a problem&lt;/li&gt;&lt;li&gt;Thread Count - Greater than 500 threads needs to be watched to ensure they aren't increasing over time&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&amp;nbsp;&lt;b&gt;Processor Object&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Processor Time - all core instances.&amp;nbsp; _Total can get you an overall trend.&amp;nbsp; Greater than 91% utilization is potentially an issue.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Network Interface Object&lt;/b&gt; - you need to know what the spec is for your network interface to determine it's capacity.&amp;nbsp; Anything over 80% of capacity could point to a problem&lt;/li&gt;&lt;ul&gt;&lt;li&gt; Current Bandwidth - help you determine the NIC's capacity&lt;/li&gt;&lt;li&gt;Output Queue Length - greater than 2 is an problem&lt;/li&gt;&lt;li&gt; Bytes Total - greater then 65% of capacity utilized is past the warning threashold (blinking read with siren)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&amp;nbsp;&lt;b&gt;Memory Object&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Free System Page Table Entries - the higher the better here.&amp;nbsp; Lower than 5000 is considered critical.&amp;nbsp; I've seen boxes 'run' (aka hobble) around 2500. &lt;/li&gt;&lt;li&gt;Available Megabytes - again higher here is desirable.&amp;nbsp; Less than 100 MB or 5% free is very problematic&lt;/li&gt;&lt;li&gt;Pool Non Paged Bytes - greater than 80% consumed is out of spec (not at all good)&lt;/li&gt;&lt;li&gt;Pool Paged Bytes - Same as non-pages bytes.&amp;nbsp; Anything between 60-80% should be watched.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Logical and Physical disk Objects&lt;/b&gt; - they have the same critical counters so I've put them together here&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Idle percentage - 19 to 0 percent is critical. Anything over 55 is warning.&lt;/li&gt;&lt;li&gt;Current or Avg Disk Queue Length - 3 to 31 in the queue - you need to keep an eye on it.&amp;nbsp; greater than 32 is an issue&lt;/li&gt;&lt;li&gt;%Avg Disk Sec Read or Write - 25ms and above is critical&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&amp;nbsp;Other interesting points of note:&lt;br /&gt;- Mark Russinovich was the original developer of Perfmon.&amp;nbsp; &lt;a href="http://blogs.technet.com/b/markrussinovich/"&gt;His blog&lt;/a&gt; is apparently pretty good and our facilitator was very impressed with him.&lt;br /&gt;- Windows Server 2008&amp;nbsp; does processor/core parking.&amp;nbsp; This means the server will 'retire' (effectively turn off to save power) CPU's when there isn't a heavy load on the box.&amp;nbsp; Our facilitator told us that one ISP moved all their boxes to Windows Server 2008 for this reason and their power bills were 15% less a month.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1281117762882146046?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1281117762882146046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1281117762882146046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1281117762882146046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1281117762882146046'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/windows-os-performance-guidelines.html' title='Windows OS Performance Guidelines'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-9101099723257132150</id><published>2010-11-19T07:06:00.000-08:00</published><updated>2010-11-19T07:06:32.608-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>Newbie Advice</title><content type='html'>&lt;span&gt;Having gone through an IT technical school, I realize they push a  lot of information and technology at you.  There's a lot to assimilate  in less than a year (depending on the school).  On this page I'd like to  point out some technologies that perhaps weren't covered much in  classes that are widely used by good shops in the industry, and also  offer some career advice for the future.  Before I delve deeper, let me  say that this information is based on my experience, which is mostly on  the Java technology side of the fence.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;Technical Heads Up&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;b&gt;1. Design Patterns&lt;/b&gt;. One thing many of the technical schools  don't have time to cover in their curriculum is code design patterns.   It doesn't matter if you doing .NET development or Java development,  design patterns can really make a difference in organizing, maintaining,  and the reusability of your code.  A great book to pick up for an  introduction on design patterns is published by O'Reilly and called &lt;a href="http://www.oreilly.com/catalog/hfdesignpat/" target="_blank"&gt;Head First Design Patterns&lt;/a&gt;.   If you don't have access to the book, a good place to start is to  google some popular patterns that are being used in code now.   Dependancy Injection is a pattern that is really big right now.  Two  frameworks that use it a lot are Spring and Google's Guice.  Other  pattern I've seen used frequently are the &lt;a href="http://en.wikipedia.org/wiki/Decorator_Pattern" target="_blank"&gt;decorator pattern&lt;/a&gt;, the &lt;a href="http://en.wikipedia.org/wiki/Abstract_Factory_pattern" target="_blank"&gt;abstract factory pattern&lt;/a&gt;, factory pattern, the &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern" target="_blank"&gt;singleton pattern&lt;/a&gt;, and the &lt;a href="http://en.wikipedia.org/wiki/Proxy_pattern" target="_blank"&gt;proxy pattern&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span&gt; &lt;b&gt;2. Using a Repository&lt;/b&gt;.  Using a repository, or a version control  system, should be required by every development shop.  Frankly, if  you're in a company where they aren't using one, either push to get one  installed, or start looking for another place to code.  A repository is  basically an application that functions as the premier  source/bank/datahub/repository for all code.  This application should be  on a server with lots of disk space and accessable to all developers in  the company.  Repositories allow developers to manage code changes at  many different levels allowing many developers to work on the same code  base at the same time.  Some repositories I've used in the past are &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;, &lt;a href="http://www.nongnu.org/cvs/" target="_blank"&gt;CVS&lt;/a&gt;, &lt;a href="http://www.borland.com/us/products/starteam/index.html" target="_blank"&gt;StarTeam&lt;/a&gt;, and &lt;a href="http://www.perforce.com/" target="_blank"&gt;Perforce&lt;/a&gt;.  Googling any of these will give you more information.    &lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span&gt; &lt;b&gt;3. Unit Testing&lt;/b&gt;.  &lt;a href="http://en.wikipedia.org/wiki/Unit-testing" target="_blank"&gt;Unit testing&lt;/a&gt;  is the development practice of coding 'tests' that validate individual  classes or 'units' of code, to ensure they are functioning as required.   This practice has developed over the past 4-5 years or so and has been  found to be very effective in giving developers the confidence to  refactor their code and ensure that it's functionality stays consistent  over time.  Some unit testing technologies are &lt;a href="http://www.junit.org/index.htm" target="_blank"&gt;JUnit&lt;/a&gt;, &lt;a href="http://jwebunit.sourceforge.net/" target="_blank"&gt;JWebUnit&lt;/a&gt;, &lt;a href="http://httpunit.sourceforge.net/" target="_blank"&gt;HttpUnit&lt;/a&gt;, &lt;a href="http://dbunit.sourceforge.net/" target="_blank"&gt;DBUnit&lt;/a&gt;, and &lt;a href="http://www.nunit.org/" target="_blank"&gt;NUnit&lt;/a&gt;&lt;a href=""&gt;.&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=""&gt;   &lt;/a&gt;&lt;div class="p1"&gt;&lt;span&gt; &lt;a href=""&gt;&lt;b&gt;4. Continuous Integration&lt;/b&gt;.  &lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration" target="_blank"&gt;Continuous integration&lt;/a&gt; is a process that automatically rebuilds and tests (with &lt;em&gt;unit tests&lt;/em&gt;) an application or code base.  Continuous integration employs an application like &lt;a href="http://cruisecontrol.sourceforge.net/" target="_blank"&gt;CruiseControl&lt;/a&gt; or Anthill Pro which is configured to automatically check out the code base from the &lt;em&gt;repository&lt;/em&gt;,  compile it, run it's unit tests, and sometime even deploy it to a test  environment.  It allows developers to check for integration problems in  the code, and warns developers of broken code, allowing and reminding  them to fix it ASAP.    &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;Soft Skills and Career Advice&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span&gt; &lt;b&gt;1. Change is GOOD&lt;/b&gt;.  Once you've gotten your feet wet in the  industry, being a Java developer in one company can mean something quite  different that being a Java developer in another company.  There is  such a vast variety of Java technology that two Java developers can have  quite different experiences in developing applications.  Whole  development processes and methodologies can be very different in  differenct companies.  One company could be flying by the seat of their  pants, developing with not backups or repository, and manually pushing  out code, while another is totally immersed in Agile methodology and  outsourcing everything but development.... etc.  Keeping this in mind,  my advice is to not get comfortable in any one company but move around a  bit - that is, after 18 months or two years at one place, &lt;em&gt;get a different job&lt;/em&gt;.   You'll be put into a position where you'll either learn a lot of new  stuff, or you'll be mentoring.  Either way, it'll be an experience that  will likely teach you more then if you had stayed put.  It'll also give  you some motivation to brush up on your resume writing, interview  skills, and expand you network.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span&gt; &lt;b&gt;2. Walk &amp;amp; Talk&lt;/b&gt;  While software developers, for the most part, end up working in cube farms, it should &lt;em&gt;not&lt;/em&gt;  mean that they need to stay in their cubby hole all day and do work.   This may be just my style, but I find when I'm working on a big  integration project or on a project with a lot of departments or teams  involved, getting up and talking to people really helps things move  along.  Whether it's getting socializing a new means of managing your  server configuration in the code base, or talking to a DBA about a  script that you'll need to release with you new code, talking face to  face is far more effective than emails, I've found.  I generally use  emails if I can't find the person, or I want to make sure there is hard  documented proof about a decision that is being made, or if I want to  include a bigger audience in my communication.  Successful software  development is more about relationships that a lot a people realize.   Relationships are more apt to be cultivated face to face... plus it's  good exercise.     &lt;/span&gt;&lt;/div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-9101099723257132150?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/9101099723257132150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=9101099723257132150' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/9101099723257132150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/9101099723257132150'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/newbie-advice.html' title='Newbie Advice'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7524963157604294821</id><published>2010-11-17T23:10:00.000-08:00</published><updated>2010-11-17T23:10:34.933-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>Career Paths in IT</title><content type='html'>I've been teaching at &lt;a href="http://www.sait.ca/"&gt;SAIT&lt;/a&gt; again this week.&amp;nbsp; Generally before every class gets going in the morning I like to do a little 'blurb' on concepts or thoughts that aren't covered in the course the students get.&amp;nbsp; One of the things I find is that the vast majority of students (and the population at large for that matter) don't realize how many different career paths there are in just the software side of IT.&amp;nbsp; Guaranteed there are some students in the course that I teach who, by the time I get the chance to teach them, are very concerned they made the wrong decision by getting into software programming.&amp;nbsp; They don't feel like they are cut out for programming.&amp;nbsp; I try to put their fears at rest by suggesting that there are other opportunities for them - careers that can utilize the coding experience that they are getting, but allow them to use talents that they are more comfortable with.&amp;nbsp; Here's a list (by no means exhaustive) of some other opportunities in the software field. &lt;br /&gt;&lt;br /&gt;- &lt;b&gt;Project Management.&lt;/b&gt;&amp;nbsp; Project managers who have coding experience or at least a technical background are a step ahead of PM's who aren't techies.&amp;nbsp; I myself have considered taking some project management courses or getting my &lt;a href="http://www.pmi.org/"&gt;PMP&lt;/a&gt;, but thought the better of it after seriously thinking about what I like to do at work.&amp;nbsp; PMs need to have a &lt;a href="http://continuouslylearning.blogspot.com/2010/10/importance-of-soft-skills-in-it.html"&gt;great soft-skill set&lt;/a&gt;.&amp;nbsp; While I don't think I'd have a problem with that, I would missing troubleshooting/solving problems.&amp;nbsp; They also have to be politically savvy and have patience for meetings.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;Business Analyst.&lt;/b&gt;&amp;nbsp; BA's also need to have a great soft-skill set, as they need to be talking with everyone (the business, the developers, and the PM) and writing down the requirements.&amp;nbsp; It also helps if they are technically competent, and they enjoy documenting/writing.&amp;nbsp; For some reason in Calgary right now, there have been a lot of postings for BAs over the past 6 months. I just found out today that a variety of institutions offer certificates/diplomas for a Business Analyst career path. (&lt;a href="http://www.nait.ca/program_home_16082.htm"&gt;NAIT&lt;/a&gt; and &lt;a href="http://www.mtroyal.ca/programscourses/continuingeducation/businesstraining/businessanalysis/"&gt;Mount Royal University&lt;/a&gt; are two local options)&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;Quality Assurance.&lt;/b&gt;&amp;nbsp; This field has been growing a lot over the past 8 - 10 years, and frankly I don't think projects that I've been on over the past 5 years would have been successful without our QA teams.&amp;nbsp; QA experts need to have a penchant for detail and process.&amp;nbsp; They need to be able to understand the business and relevant business rules well.&amp;nbsp; Most of the QA people I've worked with haven't had a certification, but you apparently can get more info on a software &lt;a href="http://www.softwarecertifications.org/qai_csqa.htm"&gt;QA certification here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;Release Management.&lt;/b&gt;&amp;nbsp; This is what I (like to think I) specialize in.&amp;nbsp; We ensure that teams are using a continuous integration server and QA has the builds they need for testing where and when then need them.&amp;nbsp; We have two main goals: 1. Keep downtime in production to a minimum and 2. Keep lost man days in QA to a minimum.&amp;nbsp; I like release engineering because I get to see the whole picture - I have to understand the code and it's dependencies, I need to understand the infrastructure, and I'm responsible for the product getting through all the environments to production.&amp;nbsp; For me (being a bit proactive), this has also lead to automating deployments of database objects and datascripts, server configurations, and code, as well as installing monitoring tools to ensure that every environment is ready to 'rock'.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- Security Analyst.&amp;nbsp;&lt;/b&gt; These dudes make sure the good people have access to everything they need access to, and the bad people are locked out.&amp;nbsp; They spend a lot of time combing though logs and configuring IPSec rules.&amp;nbsp; They also perform software audits on code, all kinds of different tests on web sites, and network audits.&amp;nbsp; I wouldn't mind moving my career this direction in the future as they also need to have a pretty good idea of the whole system/infrastructure/architecture.&amp;nbsp; Great web sites for more resources on these types of positions are &lt;a href="https://www.isc2.org/cissp/default.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://www.sans.org/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Even more specialized positions:&lt;br /&gt;- &lt;b&gt;GIS (Geographic Information System) developer or architect or analyst&lt;/b&gt;.&amp;nbsp; Working with digital 2d and 3d mapping systems.&amp;nbsp; Having some limited experience with this at the ERCB (deploying mapping systems that display reservoirs,etc in Alberta) I think this is pretty cool stuff.&lt;br /&gt;- &lt;b&gt;Search Engineer (Search Engine Optimization specialist)&lt;/b&gt;&amp;nbsp; I've dabbled in this off and on for my clients.&amp;nbsp; You definitely need to be on top of your game and know how the search algorithms are changing.&amp;nbsp;&lt;br /&gt;- &lt;b&gt;Business Process Specialist&lt;/b&gt; - there's lots of software to specialize in here.&amp;nbsp; Tibco, Agile Point, SAP, JDEdwards, etc.&amp;nbsp;&lt;br /&gt;- &lt;b&gt;Document Management Specialist&lt;/b&gt; - Sharepoint, Edocs, Documentum, etc.&amp;nbsp; This involves the automated management of documents - not the writing of them, but their storage.&amp;nbsp; Government bodies and law firms definitely have a need for these kinds of systems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7524963157604294821?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7524963157604294821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7524963157604294821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7524963157604294821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7524963157604294821'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/career-paths-in-it.html' title='Career Paths in IT'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6921349882172081631</id><published>2010-11-16T19:36:00.000-08:00</published><updated>2010-11-16T19:36:33.785-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='emergency software fix'/><title type='text'>Another emergency software fix</title><content type='html'>A couple of weeks ago I had another client take advantage of my &lt;a href="http://netfocusconsulting.com/Experts.jsp"&gt;Emergency Software Troubleshooting services&lt;/a&gt;.&amp;nbsp; They had a web site maintained by a popular CMS system.&amp;nbsp; Unfortunately, their scheduled backups weren't as scheduled or robust as they thought and they were left without a website (or backend database) after their hard disk died.&amp;nbsp; I was called to help.&lt;br /&gt;&lt;br /&gt;After some invesigation, we surmised we were left with:&lt;br /&gt;- a bunch of .myd, .myi file backups for MySql (they were a couple of months old)&lt;br /&gt;- another .sql file backup of the database 12 months old&lt;br /&gt;- a file system backup of the site a couple of months old&lt;br /&gt;- and another file system backup around 12 months old.&lt;br /&gt;&lt;br /&gt;We rebuilt the database using a combination of the most recent myd and myi files.&amp;nbsp; This was a bit of a trick as the .frm files were missing in some cases.&amp;nbsp; What we did in those cases was create a dummy .frm file, rebuild the tables from the myd/myi files and when we did that we had mysql replace the frm file (it's an option you can enable during this operation).&amp;nbsp; We then used the data from the older database to populate the tables that didn't have the frm files.&lt;br /&gt;&lt;br /&gt;With the file systems, it was a matter of patching together what worked between the two file system backups with the data we had in the database.&amp;nbsp; Since the old system was pretty much blown away, it was decided to upgrade the OS and the web server at the same time.&amp;nbsp; This meant reconfiguring the web server and ensuring the majority of the site worked.&amp;nbsp; In the end, the site was pretty much ready to go after 8.5 hours of work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6921349882172081631?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6921349882172081631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6921349882172081631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6921349882172081631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6921349882172081631'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/another-emergency-software-fix.html' title='Another emergency software fix'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-9054974589782391868</id><published>2010-11-14T13:40:00.000-08:00</published><updated>2010-11-14T13:40:58.316-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Licenses.Licx error with DevExpress in Visual Studio 2010</title><content type='html'>While refactoring a business solution at work to deploy using Visual Build rather than InstalShield, I ran into an issue with our DevExpress web components not seeing the correct licenses in the licenses.licx file.&amp;nbsp; After googling for a bit and discovering how the licenses.licx files are created and manged in VS2010, I started troubleshooting to see if I could resolve my issue - seeing the red text on every web page telling me that I'm using a 'trial' edition of the software when I clearly wasn't.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;I deleted the file to get VS to recreate it.&amp;nbsp; That didn't seem to work for me.&amp;nbsp; I renamed it.&amp;nbsp; I checked permissions on it.&amp;nbsp; I investigated how it got deployed and whether I needed it on the server or not (if I remember correctly, you don't have to explicitly move it to the server).&amp;nbsp; In the end, my solution sort of knocked my socks off.&amp;nbsp; I deleted all of the content in the file and left it blank.&amp;nbsp; I then built my msi and deployed.&amp;nbsp; Imagine my surprise when the blank licenses.licx file got rid of my trial license message!&amp;nbsp; I don't know if this is a bug with VS2010 or it's integration with DevExpress 8.2.2, but my fix seemed like a total hack.&amp;nbsp; However we've tested this in multiple environments and it's solid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-9054974589782391868?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/9054974589782391868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=9054974589782391868' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/9054974589782391868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/9054974589782391868'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/licenseslicx-error-with-devexpress-in.html' title='Licenses.Licx error with DevExpress in Visual Studio 2010'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5566830044183638288</id><published>2010-11-04T21:29:00.000-07:00</published><updated>2010-11-14T13:30:00.653-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>The Phoenix and Projectors</title><content type='html'>Two business ideas in this post.&amp;nbsp; Actually one is a business model, the other is an idea.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Phoenix&lt;/b&gt;&lt;br /&gt;The business model that I ran across I'd like to call 'The Phoenix'.&amp;nbsp; Basically the idea is to take a dead business or business idea, and resurrect it.&amp;nbsp; The tale of the Twin Otter, a Canadian built Short Takeoff and Landing Utility plane is a classic example of this business model.&amp;nbsp; Details of it's life, death, and resurrection can be read on &lt;a href="http://en.wikipedia.org/wiki/De_Havilland_Canada_DHC-6_Twin_Otter"&gt;Wikipedia here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/WestCoastAirFloatplane.jpg/300px-WestCoastAirFloatplane.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/WestCoastAirFloatplane.jpg/300px-WestCoastAirFloatplane.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In its first life, production ended on the Twin Otter in 1988.&amp;nbsp; The aircraft's versatility made it a bush pilot favorite and demand for the planes have increased.&amp;nbsp; Viking Air of Victoria, BC, picked up on this and bought the rights to build the plane again.&amp;nbsp; After nearly 20 years of being out of production, new Twin Otters are now being built in Calgary and the company has over &lt;a href="http://www.theaustralian.com.au/business/aviation/viking-air-wins-orders-for-updated-turboprop-plane/story-e6frg95x-1225889492197"&gt;50 orders from all over the world&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Nov 14 update - I just ran into an article in The Globe and Mail about another brand that did something similar.&amp;nbsp; In fact, some work colleagues and I had been musing about this turn-around in the summer as we found some Pop-Shoppe bottles in a nearby convenience store.&amp;nbsp; &lt;a href="http://www.theglobeandmail.com/report-on-business/your-business/start/financing/retro-cool-entrepreneur-revives-the-pop-shoppe/article1589947/"&gt;Here's the link&lt;/a&gt; to the article in the Globe and Mail.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Projectors&lt;/b&gt;&lt;br /&gt;The second idea isn't nearly as sexy.&amp;nbsp; Watching my project manager try juggle between a spreadsheet of software development stories and another of schedules and tasks, I got to thinking why can't there be a single projector with the ability to support and display like two monitors?&amp;nbsp; Or even right a button into the software/firmware of the projector so it can flip between screen instances.&amp;nbsp; For that matter, why hasn't windows come up with the ability to manage screen instances like Linux has? Maybe that functionality is there and I just haven't been paying attention...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5566830044183638288?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5566830044183638288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5566830044183638288' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5566830044183638288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5566830044183638288'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/11/phoenix-and-projectors.html' title='The Phoenix and Projectors'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3526978010820396278</id><published>2010-10-15T11:38:00.000-07:00</published><updated>2011-03-03T21:39:06.646-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soft skills'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>The importance of soft skills in IT</title><content type='html'>Soft skills are crucial to being a successful developer in the IT industry.&amp;nbsp; Some of the soft skills I've found beneficial in my career are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Being a good communicator.&lt;/b&gt;&amp;nbsp; It's not just about talking, but listening as well.&amp;nbsp; Dirareah of the mouth is never cool, especially when a job needs to get done.&amp;nbsp; Strive for mutual understanding in a conversation. Communicating in the IT world isn't just limited to talking and listening though.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Having the discernment to know when to write an email versus actually talking to a person is important as well. I do not recommend doing all your communication through email.&amp;nbsp; Communication in emails can easily be mis-understood or mis-construed and take on an entirely different meaning and tone than you originally intended.&amp;nbsp; Emails are great for documenting decisions. &amp;nbsp;&lt;/li&gt;&lt;li&gt;Make sure that the content of your email deals with the subject you've put in&amp;nbsp; your subject line.&amp;nbsp; For example, having a subject line of 'Quote for project XYZ' but then talking about quotes for that project AND other projects in that email is bad news.&amp;nbsp; Send you quotes for the other projects in a different email with a more relevent subject line (I know this from experience).&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Developing relationships.&lt;/b&gt;&amp;nbsp; Extending communication a bit further and actually developing relationship with people in the office is huge as well.&amp;nbsp; Questions like "How was your vacation?", "Where are you going on vacation?", or "What did you do over the weekend?" are great for this. When you've got a relationship in place, there's trust.&amp;nbsp; Many times I've been granted exceptional privileges and become more productive in my work because I've had a relationship with a key person who trusts me.&amp;nbsp; These relationships can also help in the future as well when you are looking for that next gig.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Having patience.&lt;/b&gt;&amp;nbsp; Whether it's letting somebody else go to the front of the 'line' for access to production, or having forbearance when dealing with a difficult client, patience can go a long way to strengthening that 'trust' in your relationships. &amp;nbsp;Sometimes work (or working with clients) in IT can get frustrating.&amp;nbsp; Things I do to help me step back and get some perspective are:&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;go for a walk&lt;/li&gt;&lt;li&gt;find something else to do for a while&lt;/li&gt;&lt;li&gt;talk to someone - use them as a sounding board&lt;/li&gt;&lt;li&gt;take a day off or go on vacation&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Positive Attitude.&lt;/b&gt; I like to keep my workplace fun, interesting, and upbeat. &amp;nbsp;To promote this around me I'll sometimes:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Bring baking from home to share&lt;/li&gt;&lt;li&gt;Audibly rejoice in small victories (getting a solution migrated and compiling from VS2005 to VS2010 for example)&lt;/li&gt;&lt;li&gt;Write thank-you notes (either hard or soft copy) to others who help me&lt;/li&gt;&lt;li&gt;Encourage people who are down. We had a large project I was helping with and the lead was concerned that between the time and the technical challenges he had, he wasn't going to be able to finish on time. &amp;nbsp;I believe he could and I told him so (and backed it up with my help). &amp;nbsp;In the end, he did finish.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Being Flexible.&lt;/b&gt; &amp;nbsp;Generally, you are always working for a client. &amp;nbsp;Invariably, they will change their mind or want an enhancement. &amp;nbsp;Microsoft will upgrade their software, the US president will change daylight savings time one more time, the CTO will be convinced that Tibco will solve all the business problems again. &amp;nbsp;I've found that being able to take these changes in stride is crucial to maintaining my mental health (avoid being overcome with frustration). &amp;nbsp;It's all part of the territory - and frankly, job security.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3526978010820396278?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3526978010820396278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3526978010820396278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3526978010820396278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3526978010820396278'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/10/importance-of-soft-skills-in-it.html' title='The importance of soft skills in IT'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3591018567732948454</id><published>2010-10-14T21:38:00.000-07:00</published><updated>2010-10-14T21:42:49.895-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>Business Idea - Jam Joint or Practice Pad</title><content type='html'>I was getting into some music on the commute home the other day, lamenting the fact that I don't have a drum set to practice on anymore when I was struck with this business idea.&amp;nbsp; Rent a smaller stand-alone building and renovate it to have reasonably sound-proof practice rooms.&amp;nbsp; Furnish smaller rooms with drum kits, leave some empty (for electric guitar/bagpipe/tuba practice), and make some bigger for bands to jam in.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_QysY4o3RaGI/TLfbt4RBt6I/AAAAAAAAABc/moi0xbriveU/s1600/guitar.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_QysY4o3RaGI/TLfbt4RBt6I/AAAAAAAAABc/moi0xbriveU/s320/guitar.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Many drummers, musicians in general have no where to practice in cities because it disturbs the peace.&amp;nbsp; Renting these practice/jam rooms out might be an interesting and franchise-able business opportunity.&amp;nbsp; My wife could only listen to me play the piano at home for so long (and I don't think I'm that bad - 11 years Royal Conservatory).&amp;nbsp; As soon as I started practicing technique, her patience got thin. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3591018567732948454?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3591018567732948454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3591018567732948454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3591018567732948454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3591018567732948454'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/10/business-idea-jam-joint-or-practice-pad.html' title='Business Idea - Jam Joint or Practice Pad'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QysY4o3RaGI/TLfbt4RBt6I/AAAAAAAAABc/moi0xbriveU/s72-c/guitar.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7739622450320443578</id><published>2010-10-13T12:25:00.000-07:00</published><updated>2010-11-27T12:34:13.565-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Log4Net performance issue with WCF</title><content type='html'>We ran into an interesting production problem recently that had an interesting resolution. After upgrading our application server to use WCF calls, we found that performance was lagging in production. We were able to replicate this problem in our development environments and spent a good deal of time trying to resolve the issue.&amp;nbsp; Avenues we explored included profiling calls to the databases (using Sql Server Profiler and filtering on database name and login Id), mining activity logs in the database, pouring over configuration files, utilizing &lt;a href="http://www.wireshark.org/"&gt;Wireshark&lt;/a&gt;,&amp;nbsp; &lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_1850415443"&gt;&lt;/span&gt;SysInternals Process Explorer&lt;span id="goog_1850415444"&gt;&lt;/span&gt;&lt;/a&gt; , &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;SysInternals ProcessMonitor&lt;/a&gt; (and filtering by processName and PID), and the Windows &lt;a href="http://www.computerperformance.co.uk/HealthCheck/GettingStarted.htm"&gt;PerfMon&lt;/a&gt; (performance Monitor - viewing the defaults and various performance objects).&lt;br /&gt;&lt;br /&gt;Interesting things I learned/discovered were:&lt;br /&gt;- IE browsers (IE 7 and older) default to only two connections to the web server &lt;a href="http://www.speedguide.net/read_articles.php?id=2448"&gt;See this link&lt;/a&gt;&lt;br /&gt;- It seems IE processes javascript before rendering a page while Firefox process javascript after the page is rendered in some cases&lt;br /&gt;- The default for WCF connections to the database is serializable rather the read committed!&lt;br /&gt;- WCF connections default to some low threasholds for ConcurrentCalls, ConcurrentSessions, and ConcurrentInstances.&amp;nbsp; These can be changed using the serviceThrottling node and attributes of a service behavior you create.&amp;nbsp; &lt;a href="http://merill.net/2008/10/wcf-performance-optimization-tips/"&gt;See this link for more detail &lt;/a&gt;&lt;br /&gt;- In dos, you can filter a netstat to only show specific ports and statuses like this:&lt;br /&gt;netstat /n | find "ESTABLISHED" | find "8085"&lt;br /&gt;- Use /n with netstat to not resolve dns names - without /n, dns name resolution can make netstat take a while.&lt;br /&gt;- In dos, you can use the 'tasklist' command to show something akin to a process list in the Task Manager&lt;br /&gt;- Retrieve IIS process names from the command line by executing this command:&lt;br /&gt;cscript c:\WINDOWS\system32\iisapp.vbs&lt;br /&gt;&lt;br /&gt;In the end, the resolution to our problem was to turn off a custom implementation of Log4Net that had running.&amp;nbsp; In the process monitor we saw that log4net was re-initializing, re-reading it's configs, and re-creating all the log files for EVERY page request.&amp;nbsp; We discovered this because it seemed that there was a several second lag time between when the request was executed on the browser and when the web server actually acted on it.&amp;nbsp; Disabling log4net entirely improved our performance by a significant amount. (10's of seconds)&lt;br /&gt;&lt;br /&gt;Update - Nov 26, 2010.&amp;nbsp; One of the reasons we were running into the issue above is the log4net configuration loader was placing a lock (being very pessimistic) on the configuration file every time it was loading.&amp;nbsp; Agreed, this solution should likely have been using a static logger - one instance for the application.&amp;nbsp; However, given the way it was implemented, I'm thinking that we could have avoided a bunch of hurt if we had made the configuration loader a little more optimistic and used:&lt;br /&gt;&lt;lockingmode type="log4net.Appender.FileAppender+MinimalLock"&gt;&amp;lt;lockingModel type="log4net.Appender.FileAppender+MinimalLock" /&amp;gt;&lt;br /&gt;&lt;/lockingmode&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7739622450320443578?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7739622450320443578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7739622450320443578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7739622450320443578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7739622450320443578'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/10/log4net-performance-issue-with-wcf.html' title='Log4Net performance issue with WCF'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7700018713313846292</id><published>2010-09-22T11:20:00.000-07:00</published><updated>2010-09-22T11:22:40.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Ms Sql Server Grant Execute against sub-set of stored procs</title><content type='html'>Thanks to Karlson for this -&lt;br /&gt;Here's a script that can grant execute (or whatever you wish to grant) to a set of stored procs based on a prefix in the stored proc name:&lt;br /&gt;&lt;br /&gt;Set nocount on &lt;br /&gt;Declare @proc_name as nvarchar(max)&lt;br /&gt;&lt;br /&gt;DECLARE procs CURSOR &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FOR Select [name] FROM&amp;nbsp;&amp;nbsp;&amp;nbsp; sysobjects WHERE [name] like '&lt;prefix here=""&gt;[sp prefix here]%' AND xtype = 'P'&lt;br /&gt;&lt;br /&gt;OPEN procs&lt;br /&gt;&lt;br /&gt;FETCH NEXT FROM procs &lt;br /&gt;INTO @proc_name&lt;br /&gt;&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exec('Grant Execute ON ' + @proc_name + ' TO &lt;rolename here=""&gt;[roleName here]')&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FETCH NEXT FROM procs &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTO @proc_name&lt;br /&gt;END&lt;br /&gt;CLOSE procs;&lt;br /&gt;DEALLOCATE procs;&lt;br /&gt;Set nocount off&lt;/rolename&gt;&lt;/prefix&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7700018713313846292?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7700018713313846292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7700018713313846292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7700018713313846292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7700018713313846292'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/09/ms-sql-server-grant-execute-against-sub.html' title='Ms Sql Server Grant Execute against sub-set of stored procs'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4427186059579455251</id><published>2010-09-20T20:01:00.000-07:00</published><updated>2010-09-20T20:01:08.556-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>Another business idea</title><content type='html'>One of my clients just moved into a brand new office tower.&amp;nbsp; Everyone was all pumped about the new digs - lights that have movement sensors that turn off automatically when no one is in the room and turn on when someone comes in, new desks and chairs, new faster elevators,etc.&amp;nbsp; However, upon using the 'facilities' for the first time, I couldn't help but notice a common problem I see in many public bathrooms around the city.&amp;nbsp; Paper towel fills up the garbage cans too fast.&amp;nbsp; Nobody wants to compact it with their hands.&amp;nbsp; Inevitably, it overflows before the janitors make their rounds.&lt;br /&gt;My business idea this go round is to import/sell garbage can compactors to these public buildings in the city that have this problem.&amp;nbsp; Other places where I've seen this issue (besides busy office tower washrooms) are airports and universities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4427186059579455251?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4427186059579455251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4427186059579455251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4427186059579455251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4427186059579455251'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/09/another-business-idea.html' title='Another business idea'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1128981187251859689</id><published>2010-09-09T10:55:00.000-07:00</published><updated>2010-09-09T10:55:31.902-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Open Source Bug/Issue Tracking System</title><content type='html'>In the last couple of weeks I've been helping facilitate the development process (through build &amp;amp; deployment automation, etc) on a new project, and I was asked to spin up a new instance of &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; for the project team. It didn't take me long to get it going.&amp;nbsp; I was amazed at the rate of adoption of this tool by the team as a whole.&amp;nbsp; The business was very positive about the tool and had no issues with learning it and beginning to log tickets.&amp;nbsp; I will definitely keep this tool in mind in the future as it is relatively easy to install, straight forward to use, integrates with Subversion and Active Directory, and fulfills all the basic requirements for a bug/issue tracking system that my project team was looking for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1128981187251859689?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1128981187251859689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1128981187251859689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1128981187251859689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1128981187251859689'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/09/open-source-bugissue-tracking-system.html' title='Open Source Bug/Issue Tracking System'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2674330574740782683</id><published>2010-08-31T07:23:00.000-07:00</published><updated>2010-08-31T07:23:27.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>Common Obfuscated Error Messages with IIS</title><content type='html'>I've noticed that IIS tends to obfuscate error messages - displaying messages that are different than the actual issue that is happening to the application.&amp;nbsp; This may very likely be because we are running a plethora of web sites with different architectures and history on one instance of IIS.&amp;nbsp; I thought I document some of those 'tricky' error messages here just in case someone else runs into them (or I forget what they really mean).&lt;br /&gt;&lt;br /&gt;1. 'An existing connection was forcibly closed by the remote host'&amp;nbsp; I ran into this error numerous times trying to configure a WCF web service to bring back a large result set (60k + rows).&amp;nbsp; Playing with the values for maxBuffer PoolSize and MaxReceivedMessageSize in the web.config, I came to discover that this error was really seemed to be masking was an out of memory error that forced the shutdown of the AppPool that was serving the web service.&lt;br /&gt;&lt;br /&gt;2. 'BinaryFormatter Version Incompatibility errror'&amp;nbsp; Generally I've seen this error when you have IIS site on a web server trying to communicate with another IIS site on an application server, and there is no response from the IIS site on the application server - either that web site isn't running, or your url pointing to the web site on the application server is wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2674330574740782683?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2674330574740782683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2674330574740782683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2674330574740782683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2674330574740782683'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/08/common-obfuscated-error-messages-with.html' title='Common Obfuscated Error Messages with IIS'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3473041253294797406</id><published>2010-08-23T06:59:00.000-07:00</published><updated>2010-08-23T06:59:24.057-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>Some good links (to blog articles) on Configuration Management</title><content type='html'>Here's some good links to blog articles on Configuration Management.&amp;nbsp; The first is about the importance of a CM person in a company.&amp;nbsp; I would tend to agree with one of the comments that talks about the size of the company making a difference.&amp;nbsp; Obviously a smaller startup doesn't need a dedicated CM person.&amp;nbsp; However, larger enterprises like the one I'm at now with numerous development environments, multiple servers, a GIS infrastructure, a document management infrastructure, and a beomoth of a mainframe legacy system needs a dedicated CM team.&amp;nbsp; Here's the link:&lt;br /&gt;&lt;a href="http://evgeny-goldin.com/blog/2010/08/21/configuration-management-position/"&gt;http://evgeny-goldin.com/blog/2010/08/21/configuration-management-position/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;The other link considers adding database automated deployment to you CM system.&amp;nbsp; I would highly recommend when I contrast my experience over the last two years with my previous release management experience.&amp;nbsp; Previously we automatically deployed database schema and data changes. In my more recent experience the DBA group has flatly declined any encouragement and offer to do this.&amp;nbsp; The difference in the amount of time to do database refreshes and debug issues with them is stark - like hours vs. days.&amp;nbsp; Here's the link:&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial; font-size: x-small;"&gt;&lt;a href="http://www.simple-talk.com/sql/t-sql-programming/when-database-source-control-goes-bad/" rel="nofollow" target="_blank"&gt;http://www.simple-talk.com/sql/t-sql-programming/when-database-source-control-goes-bad/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3473041253294797406?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3473041253294797406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3473041253294797406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3473041253294797406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3473041253294797406'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/08/some-good-links-to-blog-articles-on.html' title='Some good links (to blog articles) on Configuration Management'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3375207223431225935</id><published>2010-08-21T10:23:00.000-07:00</published><updated>2010-08-21T10:23:55.269-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Testing with IE 6 (on Linux!)</title><content type='html'>I have a requirement from a client to ensure that their website looks good in IE6.&amp;nbsp; None of the machines I normally work on have IE6 installed. So I googled IE6 emulators as I had used one in the past that was pretty good, and came up with:&lt;br /&gt;&lt;a href="http://tredosoft.com/Multiple_IE" target="_blank"&gt;http://tredosoft.com/Multiple_IE&amp;nbsp;&lt;/a&gt;&lt;br /&gt;and&lt;br /&gt;&lt;a href="http://www.browsercam.com/" target="_blank"&gt;http://www.browsercam.com/&lt;/a&gt;&lt;br /&gt;However you have to sign up to get a free time trial and I thought maybe there was something better for me out there.&amp;nbsp; Some of the forums talked about having an old laptop that they keep around just for testing with IE6.&amp;nbsp; I do have an old desktop running XP, so I checked it.&amp;nbsp; It turned out I have been keeping up with all the updates for the most part and one of the service packs (I don't remember if it was 2 or 3) installed IE7.&amp;nbsp; Bummer.&amp;nbsp;&lt;br /&gt;Googling a bit more, I discovered that you can install IE6 on Linux.&amp;nbsp; Pushing against this thread a bit more, I found this site:&lt;br /&gt;&lt;a href="http://www.tatanka.com.br/ies4linux/page/Main_Page"&gt;http://www.tatanka.com.br/ies4linux/page/Main_Page&lt;/a&gt;&lt;br /&gt;and went to this page:&lt;br /&gt;&lt;a href="http://www.tatanka.com.br/ies4linux/page/Installation:Fedora"&gt;http://www.tatanka.com.br/ies4linux/page/Installation:Fedora&lt;/a&gt;&lt;br /&gt;followed the directions and IE6 was installed and running, properly displaying my client's website within 10 minutes.&amp;nbsp; The Tatanka gives you the option to install IE5.5 and IE5 as well, but when I tried them, the installations were corrupt.&amp;nbsp; Since IE6 was all I really needed, I was happy with leaving things the way they stood.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3375207223431225935?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3375207223431225935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3375207223431225935' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3375207223431225935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3375207223431225935'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/08/testing-with-ie-6-on-linux.html' title='Testing with IE 6 (on Linux!)'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4345229357286431446</id><published>2010-08-20T10:04:00.000-07:00</published><updated>2010-08-20T10:07:21.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='vbscript'/><category scheme='http://www.blogger.com/atom/ns#' term='network security'/><title type='text'>Active Directory SPOF</title><content type='html'>We had a great example of an AD SPOF (single point of failure) recently.&amp;nbsp; A vbscript had been written by someone with no malicious intent to (for some reason) hook into AD and check service accounts.&amp;nbsp; What this script ended up doing though was locking out said service accounts.&amp;nbsp; Within the span of 30 minutes we were well on our way to locking out 400+ service accounts in the enterprise, irrespective of environment.&amp;nbsp; This took production out of commission.&lt;br /&gt;Seems like a bit of a hole to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4345229357286431446?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4345229357286431446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4345229357286431446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4345229357286431446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4345229357286431446'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/08/active-directory-spof.html' title='Active Directory SPOF'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4071407755425470709</id><published>2010-07-22T07:32:00.000-07:00</published><updated>2010-07-22T08:21:23.368-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Grep features</title><content type='html'>I was asked to search several teams' code-bases recently based on a list of over 270 different search strings.  We are a Windows OS organization and doing a search like that would take some time.  By the way, has anyone noticed that the Windows explorer search tool is flaky? Even if I used a tool like &lt;a href="http://www.midlinesoft.com/multifind"&gt;this&lt;/a&gt; it would still take a while.&lt;br /&gt;I have &lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt; installed, and I know grep works well - when I search for something I &lt;i&gt;know&lt;/i&gt; is in the file, I find it (unlike Windows sometimes).  What I didn't know was that there is a -f option on grep that allows you to provide a file with all you search terms separated by newlines.  An astute worker made me aware of this and I tried it out this morning.  It worked nicely and saved me some time.  Here's how I implemented it:&lt;br /&gt;&lt;br /&gt;grep -r -i -f file_of_search_strings.txt * | grep -v .svn | grep -v Assert | grep -v .sql &gt;&gt; resultFile.txt&lt;br /&gt;&lt;br /&gt;-r is a recursive search based on where I'm current sitting on the command line&lt;br /&gt;-i is a case insensitive search&lt;br /&gt;-f allows me to pass in my file of search strings&lt;br /&gt;* tells grep to search every folder/file at this level.  Used with -r it tells grep to search every single folder and file that is currently at my current cursor position, or a child of the folder I've cd'ed to.&lt;br /&gt;The | grep -v .svn tells grep to ignore/not display files with *.svn in the results&lt;br /&gt;and then &gt;&gt; allows me to pipe my results to a file for inspection.&lt;br /&gt;&lt;br /&gt;You may have to run the dos2unix command on the text file with your list of search items to get grep to see the new lines in the file correctly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4071407755425470709?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4071407755425470709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4071407755425470709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4071407755425470709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4071407755425470709'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/07/grep-features.html' title='Grep features'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7262688627284789564</id><published>2010-07-21T12:31:00.000-07:00</published><updated>2010-07-21T12:31:22.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>MS Sql Server Stored Proc Search Query</title><content type='html'>If you work in an org where there's a lot of business logic put into (MS Sql Server) stored procedures or you have an application that is stored proc intensive, you might find this code snipped helpful.&amp;nbsp; It searches all the stored procs in the database for a specific string&lt;br /&gt;&lt;br /&gt;select distinct o.name from syscomments c&lt;br /&gt;inner join sysobjects o&lt;br /&gt;on c.id = o.id&lt;br /&gt;where o.type = 'p'&lt;br /&gt;and c.text like '%string to search for%'&lt;br /&gt;order by o.name&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7262688627284789564?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7262688627284789564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7262688627284789564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7262688627284789564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7262688627284789564'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/07/ms-sql-server-stored-proc-search-query.html' title='MS Sql Server Stored Proc Search Query'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6934567706382245467</id><published>2010-07-12T11:56:00.000-07:00</published><updated>2010-07-12T12:03:18.705-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><category scheme='http://www.blogger.com/atom/ns#' term='vbscript'/><title type='text'>.Net Self Serve Automated deploy</title><content type='html'>There are a couple of prerequisites that need to be in place in order for a self serve automated deployment system to work.&lt;br /&gt;1. You should have a Nant, MsBuild, Visual Build, or a similar type of scripting file that is doing deploys for you already - see my previous posts on doing that &lt;a href="http://continuouslylearning.blogspot.com/search/label/automated%20deploys"&gt;here&lt;/a&gt;&lt;br /&gt;2. Your folder structure for every project you want to deploy should be similar. To have a good Self-Serve Deploy tool, it needs to work on the assumption that directory structures are consistent for certain types of projects.  This could be set up using your repository tags directory, or automatically copying deployment files to the required folder structure after the build is successful.  A folder structure I've used in the past is b:\deployment\projectname\version\   My build file(s).&amp;nbsp; Any other required folders and files reside in the version folder with a consistent folder structure.&lt;br /&gt;3. You need either a properties file or a DB table to manage which tag/version has been deployed to which environment.  We've used a symlink in the past to denote the current 'tip' build.  This example will use a file.  The file is structured like:&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;versions&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;serverType&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;server name="blahboxType" version="1.2" /&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;server name="fooboxType" version="1.0" /&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/serverType&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;blahboxType&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;project name="MyProject" version="3.1.0.23" /&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;project name="MyProject2" version="3.1.4.11" /&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/blahboxType&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;fooboxType&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;project name="fooProj1" version="6.2.123"/&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;project name="fooProj2" version="6.3.92"/&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/fooboxType&amp;gt; &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;/versions&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;Once the deploy is finished to a particular environment, logic in the deployment file automatically updates the respective project in the appropriate version file.&lt;br /&gt;&lt;br /&gt;Here's a bit of sample code for a client side asp page for a Self Serve app.&amp;nbsp; It passes some values to a server side asp page (deploy.asp) so that page will know which version of which project to deploy into which environment.&amp;nbsp; The onchange event of the env select control called an AJAX function that retrieves the currently deployed version of the project from the versions.xml file.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;form action="deploy.asp" method="get" name="MyProject"&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp; &amp;lt;input name="project" type="hidden" value="MyProject" /&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp; &amp;lt;input name="serverType" type="hidden" value="blahboxType" /&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp; &amp;lt;select name="version"&amp;gt;   &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value=""&amp;gt;--Select--&amp;lt;/option&amp;gt; &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value="" &amp;amp; version &amp;amp; ""&amp;gt;" &amp;amp; version &amp;amp; "&amp;lt;/option&amp;gt;   &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp; &amp;lt;/select&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;select id="MyProject" name="env" onchange="getVersions('MyProject',this.value)"&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value=""&amp;gt;--Select--&amp;lt;/option&amp;gt;     &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value="Test1"&amp;gt;Test 1&amp;lt;/option&amp;gt;     &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value="Test2"&amp;gt;Test 2&amp;lt;/option&amp;gt;     &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value="SB"&amp;gt;Sandbox&amp;lt;/option&amp;gt;     &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value="STG"&amp;gt;Staging&amp;lt;/option&amp;gt;     &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;option value="PRD"&amp;gt;Production&amp;lt;/option&amp;gt;   &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;/select&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;div id="MyProjecttarget" style="color: green;"&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;-&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;input type="submit" value="Deploy" /&amp;gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;lt;/form&amp;gt;&lt;/div&gt;&lt;br /&gt;Then on my deploy.asp page, the request parameters are set to variables which are then used to dynamically build the path to the deploy file (in this case a visual build file called Deploy-&amp;lt;serverName&amp;gt;-&amp;lt;component&amp;gt;.bld)&amp;nbsp; This could be a nant, msbuild, or ant file as well, you'd just have to change which executable you're using in the executeString.&amp;nbsp; The command is then executed in a Windows Shell and if it has a return code of '0' it was successful.&amp;nbsp; Successful or not, we do some very simple logging to show who tried to deploy what, where, and when.&lt;br /&gt;Here's the code:&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;' need a longer server timeout setting so our deploy can finish&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Server.ScriptTimeout=1200&lt;/div&gt;&lt;div style="color: #20124d;"&gt;'instantiate some vars&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; env = ""&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; version = ""&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; project = ""&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; severType = ""&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div style="color: #20124d;"&gt;'set the vars&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set version = Request.queryString("version")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set env = Request.queryString("env")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set project = Request.queryString("project")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set serverType = Request.queryString("serverType")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'gets the user&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set WSHNetwork = CreateObject("WScript.Network")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; user = WSHNetwork.UserName&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if version="" then&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write("Please ensure you chose a version &amp;lt;br/&amp;gt;")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif env="" then&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write("Please ensure you chose an environment")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif project="" then&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write("error occured - project required")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif LCase(env)="PRD" then&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write("We don't want to deploy to Production from this app")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write(version &amp;amp; " " &amp;amp; env &amp;amp; " " &amp;amp; project)&lt;/div&gt;&lt;div style="color: #20124d;"&gt;'set up a dynamic path here to the deployment file (nant or ant or visual build file)&amp;nbsp; This string assumes the&lt;/div&gt;&lt;div style="color: #20124d;"&gt;'build file is taking a parameter called Env - the environment to deploy to&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; execString = "&amp;lt;pathToVisualBuildExecutable&amp;gt;\VisBuildCmd.exe /b " &amp;amp; Chr(34) &amp;amp; version &amp;amp; "\visual build\Deploy-" &amp;amp; serverType &amp;amp; "-" &amp;amp; component &amp;amp; ".bld" &amp;amp; Chr(34) &amp;amp; " Env=" &amp;amp; env&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Response.Write("&amp;lt;br/&amp;gt;" &amp;amp; executeString)&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; set oFs = server.createobject("Scripting.FileSystemObject")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; set oTextFile = oFs.OpenTextFile("&amp;lt;pathOfFileToLogTo&amp;gt;\deploylog.txt", 8, True)&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Dim WshShell&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Set WshShell = CreateObject("WScript.Shell")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; proc = WshShell.Run(executeString,6,true)&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if proc="0" then&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.write("&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;div style='color:green;font-size:16px;'&amp;gt;Deploy of build " &amp;amp; component &amp;amp; " " &amp;amp; version &amp;amp; " to " &amp;amp; env &amp;amp; " as " &amp;amp; user &amp;amp; " was successful")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dt = now()&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logtext = dt &amp;amp; ":&amp;nbsp; Deploy of build " &amp;amp; component &amp;amp; " " &amp;amp; version &amp;amp; " to " &amp;amp; env &amp;amp; " was successful" &amp;amp; vbCrLf&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; oTextFile.Write logtext&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; oTextFile.Close&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.write("&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;div style='color:red;font-size:16px;'&amp;gt;Deploy of build " + component + " " + version + " to " + env + " failed using user " + user)&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dt = now() &lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logtext = dt &amp;amp; ":&amp;nbsp; Deploy of build " &amp;amp; component &amp;amp; " " &amp;amp; version &amp;amp; " to " &amp;amp; env &amp;amp; " failed as user " &amp;amp; user &amp;amp; vbCrLf&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; oTextFile.Write logtext&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; oTextFile.Close&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.write("&amp;lt;br/&amp;gt;Deploy times and results are logged at &amp;lt;pathOfFileToLogTo&amp;gt;\deploylog.txt")&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; set oTextFile = nothing&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; set oFS = nothing&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; set WshShell=nothing&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if&lt;/div&gt;&lt;div style="color: #20124d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.write("&amp;lt;br/&amp;gt;&amp;lt;a href='javascript:history.back()'&amp;gt;Back to deploy page&amp;lt;a/&amp;gt;")&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6934567706382245467?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6934567706382245467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6934567706382245467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6934567706382245467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6934567706382245467'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/07/net-self-serve-automated-deploy.html' title='.Net Self Serve Automated deploy'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1217074155238502461</id><published>2010-07-10T22:16:00.000-07:00</published><updated>2010-07-12T11:51:33.934-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Key Questions in Software Sustainment</title><content type='html'>Here are some of the questions I ask myself when a software system has stopped running properly...&lt;br /&gt;&lt;br /&gt;The first big question is: &lt;b&gt;What changed between when the application was running well, and the time the application stopped running well?&lt;/b&gt;&amp;nbsp; To get to the bottom of that question, there are a number of other questions that can help point the way.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question isolation&lt;/b&gt; - Is this problem isolated in any way?&amp;nbsp; Is it only on a specific network, environment, or group of servers?&amp;nbsp; Does it only happen for a specific group of users or a specific client?&amp;nbsp; Is there a period of time it's isolated to?&amp;nbsp; Is it isolated to a particular 'item' in your data?&amp;nbsp; I've seen users try to make an application&amp;nbsp; use a different browser version than the documented supported versions.&amp;nbsp; Some times it takes a while to get to the bottom of simple issues like that.&amp;nbsp; Also, we've run into situations where an organization will not have given users the rights on their machines to install third party active X components for their browser that the application they are trying to use requires.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question data integrity&lt;/b&gt; - Whether you are looking at legacy data or no logic to manage special characters in your data, you need to break the problem down. With legacy data, is the problem isolated to a particular user or group of users, or a particular item?&amp;nbsp; Or if it's an ETL function, does relational integrity from the first DB line up to the second DB correctly - are you missing or adding 'types' of data that the second DB either is or isn't expecting?&amp;nbsp; Sometimes you need to pinpoint the exact row or time when the issue occurred to determine what the problem was. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question continuity&lt;/b&gt; - Did something stop running or listening? A service, appPool, web site, 3rd party server?&amp;nbsp; Are your cron jobs or scheduled tasks still there? Monitoring would quickly and easily answer this question for you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question communication&lt;/b&gt; -&amp;nbsp; Are the lines of communication open to all of the dependencies that your application has?&amp;nbsp; Has a network cable been severed by a backhoe down the street? (I've seen that before)&amp;nbsp; Is there too much communication going on?&amp;nbsp; Too many calls from one routine can take you system down.&amp;nbsp; We had an issue like that with some javascript that called a data access function to a GIS server.&amp;nbsp; As soon as one too many layers got added to the map, performance died as there were too many round trip calls to the server in one request. Internal systems that need to do identity verification or IP Geolocation are heavily dependent on external third parties to operate.&amp;nbsp; These external vendors can in turn can be dependent on other external services.&amp;nbsp; Know all your dependencies and have monitoring and SLA's in place for all of them or you could be sweating bullets.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question dependencies&lt;/b&gt; - Here I'm thinking more in the context of internal dependencies - what internal 3rd party services are you dependent on?&amp;nbsp; Databases, reporting tools, monitoring systems, document management systems,&amp;nbsp; any internal system that your application depends on that you aren't responsible for fits into this category.&amp;nbsp; Are they up and running?&amp;nbsp; How do you know?&amp;nbsp; Are they running properly?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question the un-questionable&lt;/b&gt; - Is your hvac system working at your Co-Lo?&amp;nbsp; As redundant as your service provider tries to be, there will always be something under the radar.&amp;nbsp; Always.&amp;nbsp; I've seen an external hvac system take down an entire enterprise.&amp;nbsp; Many of you have likely seen a McAfee or a Norton patch take down an enterprise.&amp;nbsp; How secure is your UPS (Uninterrupted Power Supply) management console?&amp;nbsp; I've logged into one I've found by accident using username:admin password:password!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question known changes&lt;/b&gt; - software enhancements and patches, file or db permissions, config changes, etc. I've seen issues where a changed file path will take down a critical Ftp routine, a 3rd party software patch for a document management system crippled a production system by removing key indexes in the database, and an (unfortunately un-automated) database refresh will have missing roles or users or the db will still be restricted mode.&amp;nbsp; Doing anything manually can get you into trouble.&amp;nbsp; A fat finger can push a wrong dll/library or mis-type an entry in a config file.&amp;nbsp; Even fat fingering an automated deploy can get you into problems.&amp;nbsp; Automated deploys still depend on data that is manually entered.&amp;nbsp; We have pointer to app servers in our web.config files entered wrong and multiple entries in machine.config for a particular component.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Question security&lt;/b&gt; - Malicious changes are possible either internally or externally.&amp;nbsp; Unfortunately, the question of security is a larger one everyday.&amp;nbsp; And it has to be scrutinized at every level.&amp;nbsp; Does your system have a firewall and IP Sec rules in place?&amp;nbsp; Does you application provide you with an audit trail?&amp;nbsp; How secure is your production data?&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resources at your disposal that can help in your investigation:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Log files&lt;/b&gt; - event logs, server logs, if you're logging to tables in the DB, don't forget to look there.&lt;br /&gt;&lt;b&gt;Users&lt;/b&gt; - it's like CSI - you need to get ALL the information you can about their problem.&amp;nbsp; You cannot be afraid to ask.&lt;br /&gt;&lt;b&gt;Thread dumps&lt;/b&gt; - killing a hurting server and ensuring that it does a thread dump when it terminates can be very effective in your problem search&lt;br /&gt;&lt;b&gt;Networking tools&lt;/b&gt; - WireShark, telnet, ping, netstat - these are great for checking your communication.&lt;br /&gt;&lt;b&gt;Monitoring tools&lt;/b&gt; - Nagios, SCOM, GroundworkOpenSource&lt;br /&gt;&lt;b&gt;Books&lt;/b&gt; -&amp;nbsp; Michael Nygard's Release It! and Luke Hohmann's Beyond Software Architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1217074155238502461?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1217074155238502461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1217074155238502461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1217074155238502461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1217074155238502461'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/07/key-questions-in-software-sustainment.html' title='Key Questions in Software Sustainment'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3376879670012250622</id><published>2010-07-10T19:12:00.000-07:00</published><updated>2010-07-22T08:23:14.081-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>More ideas</title><content type='html'>Business idea:&amp;nbsp; Create a computer screen with removable sides so there's not space when you put it against another computer screen - they'll almost look like one screen instead of having the 1-2 inch separation between the two.&lt;br /&gt;&lt;br /&gt;Business idea: If I could create a machine/robot that would automatically wash windows I think I could make a lot of money. Every window I can think of besides one has to be washed manually by hand.&amp;nbsp; All the high rises downtown still have all their windows washed manually. The only place they use a different technique as far as I'm aware is with race cars where they use layers of thin plastic over the windshield.&amp;nbsp; They rip off a layer every time the car is in the pit and instantly the driver has a&amp;nbsp; clean windshield.&lt;br /&gt;&lt;br /&gt;Business idea: A new service industry helping people/seniors navigate their way around the health maze we have created for ourselves.&amp;nbsp; You need a Personal Medical Manager!&amp;nbsp; Here's why: There are significant disconnects between specialists who analyze medical tests, the lap techs who perform/analyze the tests, and the doctors who originally asked for the tests.&amp;nbsp; Then there's another layer of indirection at the pharmacy.&amp;nbsp; How does an older person manage all their prescriptions and make sure they aren't 'colliding' with each other, or even just remember to take them all and follow all the directions?&amp;nbsp; I've had my wife 2nd guess a doctor's prescription, ask the pharmacist about it, and have him adamantly agree with her that the prescription&amp;nbsp; was wrong.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Political idea: Why are we still running democracy the way we are?&amp;nbsp; The reason we elected people as 'representatives' long ago was so they could represent us in parliament (or the house, or congress) - or at least represent our vote.&amp;nbsp; Lobbyists have done away with our representation in the vote.&amp;nbsp; But why do we need a representative now anyway?&amp;nbsp; Technology could allow us to instantly vote on every single issue before parliament either using a computer or a phone.&amp;nbsp; We wouldn't need a representative to vote for us anymore.&amp;nbsp; Don't get me wrong, I'm all for democracy!&amp;nbsp; I just wonder if it can be done better now with technology and removing the 'middle man' and the lobbyists.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3376879670012250622?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3376879670012250622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3376879670012250622' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3376879670012250622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3376879670012250622'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/07/more-ideas.html' title='More ideas'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1886396120953093232</id><published>2010-06-04T10:05:00.000-07:00</published><updated>2010-07-12T11:58:23.049-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Repository'/><title type='text'>Code Repositories</title><content type='html'>Over lunch the other day, some collegues and I were jawing about different code repositories that we've used, and how clients/projects that we've worked with have evolved to use different VC products.&amp;nbsp; At one point, all six of us had worked together on a big (successful) online wallet system.&amp;nbsp; It was originally on Perforce.&amp;nbsp; We migrated the whole system to Subversion because we were having problems managing code/library dependencies between various projects.&amp;nbsp; Things worked great in Subversion for what we were doing at the time (this was 4 years ago or so).&amp;nbsp; One of the developers I worked with there was on the team for Monotone - a precurser of Mercurial - in that they both followed the distributed versioning system model.&lt;br /&gt;In the last year we made the change from ClearCase to Subversion, and for what we were doing it just felt (and continues to feel) so much better. &lt;br /&gt;A couple of guys that were eating with us at lunch are working with a client that switched from Subversion to Mercurial earlier this year.&amp;nbsp; They said it was a bit of a paradigm shift for all the developers in the organization as you have to think about how you manage your changes a little bit differently.&amp;nbsp; One of the guys also forwarded me &lt;a href="http://www.joelonsoftware.com/items/2010/03/17.html"&gt;this article&lt;/a&gt; that is really good at explaining the differences (and has a link to a tutorial the author wrote).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1886396120953093232?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1886396120953093232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1886396120953093232' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1886396120953093232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1886396120953093232'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/06/code-repositories.html' title='Code Repositories'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-920635949773664615</id><published>2010-06-03T07:52:00.000-07:00</published><updated>2010-07-12T11:59:39.688-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMS&apos;s'/><title type='text'>CMS systems</title><content type='html'>I found this good post &lt;a href="http://designtutorials4u.com/15-great-content-management-systems-for-designers/"&gt;http://designtutorials4u.com/15-great-content-management-systems-for-designers/&lt;/a&gt; on some of the more popular systems out there.&amp;nbsp; Unfortunately, it doesn't document specifically the technology they use or differentiate very well which ones are 'free' vs. which ones you have to pay to use.&amp;nbsp; I've also run into a couple others lately:&lt;br /&gt;&lt;a href="http://umbraco.codeplex.com/"&gt;Umbraco&lt;/a&gt; - an asp.net based cms &lt;br /&gt;and&lt;br /&gt;&lt;a href="http://wiki.alfresco.com/wiki/Main_Page"&gt;Alfresco&lt;/a&gt; - a java based cms&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-920635949773664615?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/920635949773664615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=920635949773664615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/920635949773664615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/920635949773664615'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/06/cms-systems.html' title='CMS systems'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6787186632739606055</id><published>2010-05-13T08:25:00.000-07:00</published><updated>2010-11-16T19:37:52.289-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='emergency software fix'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>More Software Emergency Fixing Experiences</title><content type='html'>I've recently helped two more clients with 'emergency fix' issues.&lt;br /&gt;&lt;br /&gt;The first issue was a problem a national grocery chain had with an export from a SAS program that did a pull from multiple database tables into an excel spreadsheet, and subsequently imported this data into a MS Access database using a SSIS (Sql Server Integration Services) package.&amp;nbsp; The SAS export seemed to be fine - that is, it executed without errors, but the SSIS package would fail. From my understanding, the client would run this process about every month or so, so there were a fair number of records (1000's).&amp;nbsp; However, they started having this issue in Dec. and I didnt' get called about the issue until late April, so there was a backup of data.&lt;br /&gt;The client didn't have the SQL BI studio installed, so we had to go through the idx file manually to see if there was anything obviously wrong.&amp;nbsp; There didn't appear to be.&amp;nbsp; The database and excel connections tested fine. There didn't appear to be anything riotously wrong with the data formatting or invalid characters in the excel spreadsheet.&amp;nbsp; So, what do you do?&lt;br /&gt;Well,&amp;nbsp; for one thing, don't test with the full dataset if you think it might be a data related issue.&amp;nbsp; Keep making your dataset smaller until you are sure that none of the data works.&amp;nbsp; In this case, we cut the dataset in half, started from Feb to the end of Apr and the import worked!&amp;nbsp; This confirmed for us that there were no permissions issues, or software upgrade issues (we were considering that software upgrades might be part of the problem as more than one piece of the software had been upgraded in that time period).&amp;nbsp; The successful test confirmed for us that we were dealing with a data related issue.&amp;nbsp; From there it was just a matter of determining exactly which rows of data couldn't be imported, and what it was about the data in those rows that botched things.&lt;br /&gt;Less than 5 hours of work to this point on this fix.&lt;br /&gt;&lt;br /&gt;With the second emergency, a telecom company was having issues getting an automated FTP (file transfer protocol) process to work.&amp;nbsp; They had changed the paths of where the ftp files were residing and they were voip experts, not so much into the bash shell scripting thing.&amp;nbsp; Their first problem was pathing in the bash file.&amp;nbsp; That was an easy fix.&amp;nbsp; Then there was a problem with sending a notification email that apparently they never got to work.&amp;nbsp; This was a little bit more tricky.&amp;nbsp; They originally had the email coded similar to this example.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;span class="com"&gt;       #!/bin/bash&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;       telnet smtp&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;example&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;org &lt;/span&gt;&lt;span class="lit"&gt;25&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pln"&gt;_EOF&lt;br /&gt;       HELO relay&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;example&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;org&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;MAIL FROM&lt;/span&gt;&lt;span class="pun"&gt;:&amp;lt;&lt;/span&gt;&lt;span class="pln"&gt;joe@example&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;org&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;RCPT TO&lt;/span&gt;&lt;span class="pun"&gt;:&amp;lt;&lt;/span&gt;&lt;span class="pln"&gt;jane@example&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;org&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;DATA&lt;/span&gt;&lt;span class="typ"&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="typ"&gt;From&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Joe&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pln"&gt;joe@example&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;org&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="typ"&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="typ"&gt;To&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Jane&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pln"&gt;jane@example&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;org&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="typ"&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="typ"&gt;Subject&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Hello&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="typ"&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="typ"&gt;Hello&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; world&lt;/span&gt;&lt;span class="pun"&gt;!&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="pun"&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;QUIT&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span class="pln"&gt;_EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;However, after a bit of work I discovered that the server this script was running on was processing all the command too quickly for the smtp server to get the email off.&amp;nbsp; In the end, I had to do something more like this:&lt;br /&gt;&lt;pre class="bash" style="font-family: monospace;"&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #666666; font-style: italic;"&gt;#!/bin/sh&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;(&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; HELO ccielogs.com&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: black;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; MAIL FROM:&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;test&lt;/span&gt;&lt;span style="color: black; font-weight: bold;"&gt;@&lt;/span&gt;somedomain.com&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: black;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; RCPT TO:&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;test&lt;/span&gt;&lt;span style="color: black; font-weight: bold;"&gt;@&lt;/span&gt;someotherdomain.com&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: black;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; DATA&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: black;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; Subject:Test-Mail&lt;span style="color: black; font-weight: bold;"&gt;!&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: black;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; If you can &lt;span style="color: #c20cb9; font-weight: bold;"&gt;read&lt;/span&gt; this, it Works&lt;span style="color: black; font-weight: bold;"&gt;!!!&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: black;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; .&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: black;"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; QUIT&lt;br /&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;)&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;|&lt;/span&gt; telnet XXX.XXX.XXX.XXX  &lt;span style="color: black;"&gt;25&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Then to set the bash script to run in a windows scheduler (using cygwin) I had to do something like this:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;span class="pln"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;span class="pln"&gt;       &lt;/span&gt;&lt;/code&gt;C:\cygwin\bin\bash.exe --login -c "/myfolder/myscript.sh"&amp;nbsp;&lt;/pre&gt;Less than 5 hours to fix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6787186632739606055?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6787186632739606055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6787186632739606055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6787186632739606055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6787186632739606055'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/05/more-software-emergency-fixing.html' title='More Software Emergency Fixing Experiences'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-834112054172444895</id><published>2010-04-26T20:48:00.000-07:00</published><updated>2010-04-26T20:49:47.537-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Param datatypes with Sql Server Stored Procs</title><content type='html'>I tried several times to save and post this blog entry earlier today and it would NOT save.  I have no idea what is wrong as I tried to email it to myself so I could do it later and I couldn't email it either.  I'm thinking there was a bad character in my original text, but I pasted in into (and copied it out of notepad) so...&amp;nbsp; I'm not sure what is going on.&amp;nbsp; Sometimes these tools in the 'cloud' seem to be in a 'fog'.&lt;br /&gt;&lt;br /&gt;Anyway, what I wanted to say was....&lt;br /&gt;I've been working with stored procs lately in Sql Server.&amp;nbsp; My stored procs take search parameters that I wanted to be very flexible - strings with wild characters on either end using a LIKE in the SQL.&amp;nbsp; Originally in my declaration for the parameters I used a char datatype.&amp;nbsp; What I didn't realize was if the param passed in is shorter than the length you specified, a char datatype will automatically add placeholder characters to fill up the rest of the space. So, if&amp;nbsp; you declared a char with 9 characters and passed the SP a 3 character string, SQL Server would automatically add 6 more characters to it.&amp;nbsp; I was then trying to prefix and append the percentage sign (wild character) on either end of my param, but it was getting ignored.&lt;br /&gt;&lt;br /&gt;In the end (with the help of my more DB inclined colleague, Karlson) I changed the datatype of my param to varchar and I could happily prefix and append wild characters to it.&lt;br /&gt;&lt;br /&gt;Got another interesting business idea over the weekend - it's based on a few assumptions, and it's for the investment/financial industry.&amp;nbsp; The assumptions are:&lt;br /&gt;- history repeats itself.&lt;br /&gt;- the stock market, like history, is cyclical in nature&lt;br /&gt;- investment funds are just as much marketing as they are statistical science&lt;br /&gt;- people will buy anything that is marketed well, whether it provides them with tangible value or not - (the value of stock is all about perception of value)&lt;br /&gt;The idea is simple - create a fund that is based on the cyclical nature of the stock market.&amp;nbsp; Predictable things happen when interest rates go up, or when commodities or high.&amp;nbsp; Convince people that you can harness the 'value' in the history of what happens to the stock market with certain indicators are up, and you'll have a winner fund.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-834112054172444895?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/834112054172444895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=834112054172444895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/834112054172444895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/834112054172444895'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/04/param-datatypes-with-sql-server-stored.html' title='Param datatypes with Sql Server Stored Procs'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-471294216196420305</id><published>2010-04-21T15:51:00.000-07:00</published><updated>2010-04-21T15:51:09.789-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='network security'/><title type='text'>Network isolation</title><content type='html'>For the second time this week, production has gone down for an extended period of time.  This time it was because of &lt;a href="http://news.cnet.com/8301-1009_3-20003074-83.html"&gt;this bug&lt;/a&gt; introduced by McAffee.  It was proliferated through all of our environments (apparently) by SSCM.  I'm not sure why we are putting McAffee fixes right into production without testing them in a staging environment first.  Seems to me like there is a wrong process there somewhere - Either on our side, McAffee's side, or both.&lt;br /&gt;Before we realized this was a McAffee bug, it seemed that this 'virus' got propagated to production from lower environments.  Having the production environment on an isolated network from the rest of our development and test environments would have protected us to some degree from this kind of propagation.  I have (officially) suggested this more than once, but resourcing and other priorities have gotten in the way of making it a reality.&lt;br /&gt;For future reference though, here's just another reason to have a production environment on an isolated network.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-471294216196420305?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/471294216196420305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=471294216196420305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/471294216196420305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/471294216196420305'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/04/network-isolation.html' title='Network isolation'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7430306973584773534</id><published>2010-04-20T21:50:00.000-07:00</published><updated>2010-07-12T11:57:47.026-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>Single Points of Failure</title><content type='html'>Within the last 8 months, all of the production servers for a client of mine were moved out of the building they've been in and into a 'bunker', or co-lo.  There was a variety of reasons for doing this.  As an architect choosing a Co-location provider, and planning the move, you would want to make sure as many systems there are as redundant as possible - power supply, UPS system, networking, etc.&lt;br /&gt;&lt;br /&gt;Well, this week everyone painfully discovered a system that wasn't redundant (or if it was, it wasn't as redundant as it should have been).  Apparently the HVac systems went down.  This resulted in servers getting too hot and consequently having to be shut down.  Production servers.  &lt;br /&gt;&lt;br /&gt;Everything was resolved in a couple of hours, but it just goes to show, it seems that there is always one system that is forgotten.&lt;br /&gt;&lt;br /&gt;I've actually run into another situation like this before. It wasn't nearly as big an issue for our shop as it only affected development environments. However, the Calgary airport(!!) along with  most of NE Calgary was without a network connection just as long as we were.  Apparently a construction crew was using a backhoe doing some digging at an intersection and accidentally cut a main networking cable that supplied most of NE Calgary with it's network connection.  Kind of makes you wonder if municipalities should be considering redundant underground networking, doesn't it?&lt;br /&gt;&lt;br /&gt;Networking Architects&amp;nbsp; work hard to eliminate as many single points of failure in their systems as they can.&amp;nbsp; Some are hard to control though.&amp;nbsp; Recently McAfee released a virus library update that wasn't tested properly and as a result shut down a plethora of systems across North America.&amp;nbsp; It thought a Windows dll was a virus (false positive) and sent thousands of systems into a perpetual reboot.&amp;nbsp; It would be an interesting bit of process engineering to figure out the best way protect your production systems from the most current viruses AND protect them from bugs like this sent out by the 'big' virus scanning companies at the same time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7430306973584773534?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7430306973584773534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7430306973584773534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7430306973584773534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7430306973584773534'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/04/how-redundant-is-your-co-lo.html' title='Single Points of Failure'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-985273293729747988</id><published>2010-04-19T09:36:00.000-07:00</published><updated>2010-04-19T09:36:46.310-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Google Tools post</title><content type='html'>Good link here that lists the top Google Tools for website developers:&lt;br /&gt;&lt;a href="http://sixrevisions.com/tools/the-top-15-google-products-for-people-who-build-websites/"&gt;http://sixrevisions.com/tools/the-top-15-google-products-for-people-who-build-websites/&lt;/a&gt;&lt;br /&gt;Personally, I start to get lost in the plethora of tools out there.  Just getting Adwords properly integrated with Analytics is a headache I don't really have time to deal with (when I have so many other higher priority things to manage).  I wish some of these tools where a little more straight forward to use.  &lt;br /&gt;My hesitation in making the investment to learning one well is that it will change too soon and too much for me to keep up with (I do have a 9-5 job along with at least half a dozen clients on the side).  I need to focus my attention on where I get the most return on my time investment - and learning how every single Google Tool works doesn't rate that high.&lt;br /&gt;It is a good post for reference, though.  I like knowing what all the different tools are out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-985273293729747988?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/985273293729747988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=985273293729747988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/985273293729747988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/985273293729747988'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/04/google-tools-post.html' title='Google Tools post'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-8179936067955110790</id><published>2010-04-14T19:09:00.000-07:00</published><updated>2010-04-14T19:09:01.920-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><title type='text'>More Ideas</title><content type='html'>Here's some more business ideas that I've had lately.  I want to write them down so I don't forget them as they are fun to discuss with people.&lt;br /&gt;- An automatic window washer for houses.  Living in Calgary with all the construction and wind, windows don't stay clean very long.  Wouldn't it be nice to have a little 'thing' (like the robot vacuum cleaner) that you could run on your windows?&lt;br /&gt;- A job website specifically targeted to the baby boomers and finding them good part-time work.&lt;br /&gt;- Any kind of inventions/devices that will help baby-boomers stay in the workplace longer.  I'm sure their feet would get sore after serving customers for a couple of hours in Tim Horton's.  Wouldn't it be interesting if you could install 'chairs' that ran on a 'track' behind the counter in fast food restaurants for the servers to sit on?&lt;br /&gt;- I learned at a conference this past weekend that apparently there is no Canadian company offering servers on demand in 'the cloud' like Amazon's EC2.  There is a potential business opportunity here for a smart Canadian company with a bit of infrastructure in place.  &lt;a href="http://open.eucalyptus.com/"&gt;Eucalytpus&lt;/a&gt; is basically a freeware version of the same software that Amazon uses to run it's cloud.  Set a few servers up with that and you're ready for Canadian customers.  The advantage here is other Canadian businesses are hesitant to use American cloud solutions because of the American Federal government's attitude toward privacy.  Host your cloud in Canada and don't worry about the American 'Fed's' keeping an eye on your business data. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-8179936067955110790?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/8179936067955110790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=8179936067955110790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8179936067955110790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8179936067955110790'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/04/more-ideas.html' title='More Ideas'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4358169407470563579</id><published>2010-04-06T06:45:00.000-07:00</published><updated>2010-04-06T06:45:39.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>More lessons learned (not mine though)</title><content type='html'>Here's another good link to a lessons learned article: &lt;a href="http://java.dzone.com/articles/lessons-learned-taking-project"&gt;http://java.dzone.com/articles/lessons-learned-taking-project&lt;/a&gt;  It talks about how to communicate, what to have in place, and how to manage client expectations on an 'emergency fix' project.  I have a special interest in this type of thing as I'm testing a new business idea here: &lt;a href="http://www.netfocusconsulting.com/Experts.jsp"&gt;http://www.netfocusconsulting.com/Experts.jsp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4358169407470563579?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4358169407470563579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4358169407470563579' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4358169407470563579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4358169407470563579'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/04/more-lessons-learned-not-mine-though.html' title='More lessons learned (not mine though)'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7271737285332200578</id><published>2010-03-27T10:39:00.000-07:00</published><updated>2010-04-06T06:45:51.006-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><title type='text'>Considerations with a site re-design</title><content type='html'>I just completed a site redesign for the Alberta Roofing Contractors Association.  They wanted to refresh the pages a bit, simplify the navigation and add Google Custom Search.  Here's some things I learned...&lt;br /&gt;&lt;br /&gt;We switched from static html pages to php pages that used simple includes for the header, footer, and navigation. We also reorganized the folder structure a bit to clean things up. Consequently all the pages/pdf's that were previously indexed on search engines 'disappeared'.  I wasn't sure what to do about this at first, but then I found an .htaccess file in the root of the ftp directory on the server and I made 301 redirects for all the old html pages and pdf files.  This worked great.  Lesson Learned: a simple site redesign on an established site isn't as simple as it would seem on first glance.  &lt;br /&gt;&lt;br /&gt;I found re-indexing Google custom search to be a pain.  I had to add the site into Google's webmaster tools (both www.arcaonline.ca and arcaonline.ca), set the old pages up to be removed from the cache, create a sitemap.xml file and upload it, create a robots.txt file and upload it, and add all the new url's for pages and pdf's in the 'explicit' indexer.  It was rather cumbersome, but I got it to work in the end.&lt;br /&gt;&lt;br /&gt;There were a number of issues with compatibility related to the search engine form and the flash on the home page that we had to work around using CSS hacks for IE ( *+html ).  &lt;br /&gt;&lt;br /&gt;Using a wrapper in CSS is a big help in some cases to make background images display properly in all situations.  Something similar to this:&lt;br /&gt;#wrapper {&lt;br /&gt;margin: 0px;&lt;br /&gt;padding: 0px;&lt;br /&gt;width: 100%;&lt;br /&gt;background-image: url(../images/bg.jpg);&lt;br /&gt;background-repeat: no-repeat;&lt;br /&gt;background-position: center top;&lt;br /&gt;margin-left: auto;&lt;br /&gt;margin-right: auto;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7271737285332200578?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7271737285332200578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7271737285332200578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7271737285332200578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7271737285332200578'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/03/considerations-with-site-re-design.html' title='Considerations with a site re-design'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1034328507064729434</id><published>2010-03-17T12:44:00.000-07:00</published><updated>2010-03-17T12:44:59.591-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>Automatic Deployments taken to a new level</title><content type='html'>I was doing some research for an article I was thinking about writing on Automated Deployment and came across &lt;a href="http://agiletesting.blogspot.com/2009/04/experiences-deploying-large-scale.html"&gt;this fantastic blog post&lt;/a&gt; by Grig Gheorghiu.  He talks about how OpenX uses Amazon EC2 (virtual machine cloud) to automatically provision and terminate servers of different types, different monitoring solutions they use, and in another post he talks about the different automated deployment technologies that can be used (push vs. pull, ruby, python, etc).&lt;br /&gt;I personally liked the comments about 'never having to log onto a production server', and "There's nothing like real-world network traffic, and I mean massive traffic -- we're talking hundreds of millions of hits/day -- to exercise your carefully crafted system infrastructure."&lt;br /&gt;All the comments at the bottom are really good as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1034328507064729434?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1034328507064729434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1034328507064729434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1034328507064729434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1034328507064729434'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/03/automatic-deployments-taken-to-new.html' title='Automatic Deployments taken to a new level'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1216661607884268675</id><published>2010-02-23T06:57:00.000-08:00</published><updated>2010-07-12T11:58:54.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>CPU's and Sql Server</title><content type='html'>Again in our staging environment getting ready for a release in production, we were seeing unexplained slow response times for our AgilePoint application when compared against production or development envs.  After some digging we discovered that our production DB server that serviced the AgilePoint DB had twice as many CPU's as the dev DB server, and 4 times as many CPU's as the staging server.&lt;br /&gt;&lt;br /&gt;What I didn't know is that in Sql Server you can assigned/limit how many CPU's the database can use.  This setting is in Server Properties on the Advanced tab, and is called 'Max Degree of Parallelism'.  Like many of the other settings with Server Properties in Sql Server, 0 equates to 'unlimited' or in this case 'all processors'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1216661607884268675?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1216661607884268675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1216661607884268675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1216661607884268675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1216661607884268675'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/02/cpus-and-sql-server.html' title='CPU&apos;s and Sql Server'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4173614311553310637</id><published>2010-02-18T10:13:00.000-08:00</published><updated>2010-02-18T10:13:01.964-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>The importance of Process (adodb.dll and SSRS)</title><content type='html'>We have a number of different development environments. Deployments follow a natural progression through these environments before they get put into production.  We were getting reading for a release and doing deploys and testing in our Staging environment (our env just before prod in our progression).  One morning recently, our Nunit tests failed after a run, complaining about not finding adodb.dll registered.&lt;br /&gt;&lt;br /&gt;We were surprised because adodb.dll is a Microsoft dll and we certainly weren't deploying any dll's like that - for that matter, we hadn't done any deploys in the last day or two.  So why were our Nunits failing suddenly?&lt;br /&gt;&lt;br /&gt;Quickly looking into the event logs, we discovered that SSRS (Sql Server Reporting Services) had been (unbeknowst to us) uninstalled on our transaction server during the evening.  I went and spoke with the infrastructure group who did the uninstall and they got very concerned as they were ready to uninstall SSRS in production the next evening.&lt;br /&gt;&lt;br /&gt;In the end, it appears that uninstalling SSRS did, in fact, remove adodb.dll from the Gac on our transaction server.  Our infrastructure group cancelled the uninstall from production.  We are trying to impress upon them and others the importance of communicating changes like this even if the assumption is there is no impact.  Fortunately, our process of percolating changes up in different environments managed to catch this change before it blew us up in production.  However, it wasn't caught in the lower environments because it was unadvertised.  Communication is key!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4173614311553310637?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4173614311553310637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4173614311553310637' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4173614311553310637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4173614311553310637'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2010/02/importance-of-process-adodbdll-and-ssrs.html' title='The importance of Process (adodb.dll and SSRS)'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3156309715833426096</id><published>2009-11-24T12:44:00.000-08:00</published><updated>2010-04-06T06:46:07.637-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Things learned from Website moves</title><content type='html'>I recently moved several client sites off of servers that they had been on for the better part of a decade to new VPS boxes. They had MySql backends and used Java/Velocity CMS system (InfoGlue) hosted on Tomcat with an AJP connector to apache web servers on the front end.  One site uses htdig for it's search implementation.&lt;br /&gt;&lt;br /&gt;Issues (with resolutions) that I ran into...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. GZIP'ing a running Tomcat instance&lt;/b&gt;&lt;br /&gt;Before one of the sites was moved, a client tried to make a backup of the Tomcat instance that they were running under.  They executed a:&lt;br /&gt;gzip -r filename.gz ./tomcat/ &lt;br /&gt;which ended up recursively zipping all files under the tomcat directory.  This crashed the running instance of Tomcat. (Perhaps trying to tar or gzip a running tomcat instance isn't a great idea.  Copy it first and then tar/gzip that) Everything was quickly unzipped and they tried to restart Tomcat but it wouldn't start.  After an hour of search, I was asked to help.  I poked and prodded for about 90 minutes and discovered that all the webapps were missing the &lt;br /&gt;/WEB-INF/web.xml &lt;br /&gt;file.  I don't know how/why gzip and upzipping would make these files disappear, but they were there anymore.  So I replaced them and tried restarting Tomcat and everything came up.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Problems with MysqlDump&lt;/b&gt;&lt;br /&gt;I had a couple of problems backing up the MySql database.  First MysqlDump would execute, but not put all of the tables into the backup file.  I discovered that I had run out of disk space.  Then it turned out that mysqldump doesn't care about relational integrity when it creates the backup script so when I tried to import it into the new database I ran into errors complaining about foreign keys.  To resolve this, I had to add set foreign_key_checks=0; at the top of my backup script.  This allowed me to import it successfully.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;3. Mysql connection pool Exhausted&lt;/b&gt;&lt;br /&gt;After getting the db imported and the web server moved over, the application seemed to be running fairly nicely on the new VM's.  Then I left it alone for a couple of hours.  When I came back it was throwing connection pool exhausted exceptions all over the place.  I could resolve this by logging back into InfoGlue's cms instance, but that wasn't the right resolution for me.  So I did some checking.  Many people suggest to set the wait_timeout parameter in the my.cfg file for mysql higher or lower.  I tried that and it didn't seem to work.  What I ended up doing was adding a line in my database.xml file:&lt;br /&gt;&amp;lt;param name="validation-query" value="select * from someTable" /&amp;gt;&lt;br /&gt;This helps keep the connection alive by pinging the db with the query every so often.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. MySql Data Directory Change&lt;/b&gt;&lt;br /&gt;While trying to resolve the previous issue I was changing/adding parameters into the mysql my.cfg file.  I did a copy/paste which had a number of properties, one of which was the pointer to the data directory for mysql.  This pointer was different than what I was using.  As a result, when I restarted mysql, all of my databases, tables, users, and data was gone.  I freaked.  Then after thinking about things for a little bit and checking through files one more time I realized the mistake I had made and commented that line out.  Restarting mysqld brought all my databases, users, and data back again.  Whew.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Getting HtDig going again&lt;/b&gt;&lt;br /&gt;The original installation of HtDig on the old server hadn't been indexed in over two years because cron had been broken.  I didn't have access to the root password to fix this problem so the client was very interested in getting it running again on the new server.  I had no previous experience with HtDig.&lt;br /&gt;I copied over all the files I could find related to HtDig off of the old server and installed them on the new box.  After a few tries, re-indexing worked, but I still had a problem with displaying the search results page in the web site.  It turned out that I was missing a virtual directory configuration in my httpd.conf file for the directory where htsearch was running from (as a cgi script).  The only reason I figured that out was by using lynx (linux CLI web browser). After fixing that, I got my newly indexed results displaying on the web site.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;6. Using /etc/hosts helps&lt;/b&gt;&lt;br /&gt;I've found that the /etc/hosts file is a big help in moving sites like this - whether you want to test the site while the live site is still running, or quickly configure pointers to a server dependency.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. MySql sql queries are case sensitive&lt;/b&gt;&lt;br /&gt;One of the website moves I did involved porting a MySql database from a Windows box to a CentOs box.  The dump on the Windows box made all characters for tables lower case.  I didn't pay too much attention to this at the time.  They imported the same way.&lt;br /&gt;When I started up my Tomcat server, it tried to start up, but threw errors related to jdbc connection pool and a ValidateObject.  After a bit of googling I discovered that this is related to the validate query (the query I wrote about earlier that checks the connection every so often to make sure it hasn't gone stale).  I tried running that query right on the mysql box and it would run because the table name was all lower case.  So I changed all my table names to camel case and things worked.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. Issues with unknownDefaultHost and serverNodeName in Tomcat&lt;/b&gt;&lt;br /&gt;My inability to set the serverNodeName was resolved by adding a line in my hosts file to point the IP of my box to the Host variable found when I run the 'set' comment in CentOS.  My issue with unknowDefaultHost was resolved by going into the server.xml file and editing the Engine element's defaultHost attribute - changing it from my old domain name to 'localhost'&lt;br /&gt;&lt;br /&gt;&lt;b&gt;9. MySql error 1153 - Got packet bigger than 'max_allowed_packet' bytes&lt;/b&gt;&lt;br /&gt;Got this error a couple of times with different DB imports.  To resolve I needed to go to the my.cnf file (found sometimes in /etc/) and set that property like this:&lt;br /&gt;max_allowed_packet=16M&lt;br /&gt;for the mysqld (mysql daemon).  Then I had to restart the daemon (/etc/init.d/mysqld restart) and I could run my import (mysql -p -h localhost dbname &lt; dbImportFile.sql)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3156309715833426096?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3156309715833426096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3156309715833426096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3156309715833426096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3156309715833426096'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/11/things-learned-from-website-moves.html' title='Things learned from Website moves'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5573734140392660864</id><published>2009-11-11T10:41:00.000-08:00</published><updated>2009-11-11T10:41:49.470-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>Musing on Automated Deployments</title><content type='html'>I have been a key player in big automated deployment strategies in two significantly sized organizations now. One used ant with a java code base, the other used Visual Build with a VB code base.  Both of these implementations deployed multiple dependent projects onto a variety of server types into development, testing, staging, and production environments.  With the exception of prod, each environment had more than one instance of the environment running.&lt;br /&gt;&lt;br /&gt;Some of my earlier musings on automated builds and deploys can be found &lt;a href="http://netfocusconsulting.com/buildsystem.jsp"&gt;by clicking here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One would think that an automated deployment would be deterministic.  In other words, given the logic in the deployment file(s), it should deploy the same every time.  Surprisingly, we have found this not always true.  Since many of these deploys are pushed to remote boxes, hiccups in the network end up throwing a proverbial wrench into things.  And (again) surprisingly, these can occur more often than I would've though.  We actually blamed these hiccups on increased solar activity for a while.  I have no solutions to getting around these network hiccups, except to say that if you see your deployments failing consistenly at a certain time during the day, schedule them for another time.  Our Sunday evening deploys lately have always been failing.  Yet when we kick them off Monday morning (with no changes to deployment logic) everything this fine.  We're thinking that there's possibly a weekly batch job or two that are running during our Sunday deploy that is bogging the network down....&lt;br /&gt;I've also seen automated deploys act inconsistently (only with Windows) with registering dll's in the assembly.  We can deploy and Gac things fine onto our bare metal, VM servers with no problem.  Yet, when we deploy the same software onto a legacy hardware server where the dll's are already gac'ed (our deployment logic un-gac'ing and re-gac'ing the dll's) they fail to register it seems.  I've wondered if perhaps the deployment moves through all the logic too fast?  The command is definitely correct.  Sometimes we'll even see the dll's in the assembly folder in the GUI, but the application can't.  Manually registering them from the command line fixes the problem, but we shouldn't have to do that.&lt;br /&gt;&lt;br /&gt;Something else to consider when implementing automated deploys - do you want to deploy everything from scratch (bare metal deploy) or do you want to deploy onto an already working image or server (overlay deploy)?  I have tossed this question around a number of times.  I think the correct answer for you depends on how you answer the following questions:&lt;br /&gt;Are you thinking about deploying to a system that's already running in production?  Are all the configurations that make that production system work documented?  Are you confident that you could rebuild the production server and getting it running without any major problems?  If you answer 'yes' to all of these questions, then you could probably save some time and implement overlaying automated builds.  If you are starting work on a greenfield (new) application or you aren't confident that you could rebuild you production server, then you should probably consider bare metal deploys.  Bare metal deploys done properly essentially become self documenting DRP's.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5573734140392660864?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5573734140392660864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5573734140392660864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5573734140392660864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5573734140392660864'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/11/musing-on-automated-deployments.html' title='Musing on Automated Deployments'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5349925426240065127</id><published>2009-11-11T09:53:00.000-08:00</published><updated>2009-11-11T09:53:56.955-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Cookies and Perl</title><content type='html'>I have a client who is using and old (outdated and unsupported) php/perl CMS as an intranet site.  In implementing a DRP (Disaster Recovery Plan) they switched all the server references in the code and on the server from the server IP address to a DNS name.  This was done using a search and replace :-(&lt;br /&gt;This effectively broke the intranet site. They were able to get most of it back up and running with the exception of logins and how sessions were managed.  For some reason, once this CMS saw a domain name instead of an IP address, it changed the path in the cookie to something like this:&lt;br /&gt;mywebserver/http://mywebserver/somesite&lt;br /&gt;from what worked before which was:&lt;br /&gt;mywebserver/somesite&lt;br /&gt;We searched through config files and didn't find anything conclusive to begin with.  Then we found some code where cookies were being created and modified it so that after the cookie string was created we did some string manipulation on it like this:&lt;br /&gt;$setcookie =~ s/http:\/\/mywebserver//m&lt;br /&gt;This resets the setcookie var by searching through the setcookie var (it's a multiple line string so we needed to use /m) for the string 'http://mywebserver', replacing it with nothing.&lt;br /&gt;It turned out that the CMS was creating more than one cookie, so we found this  bit of code in two more files, added our hack there, and sessions worked again!&lt;br /&gt;I have to confess, I was surprised that this little hack worked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5349925426240065127?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5349925426240065127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5349925426240065127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5349925426240065127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5349925426240065127'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/11/cookies-and-perl.html' title='Cookies and Perl'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5790782853204597768</id><published>2009-10-27T14:26:00.000-07:00</published><updated>2010-01-30T09:37:39.923-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>IIS default app pool proc terminated</title><content type='html'>Here's a great link to error codes for w3wp (event id 1009) and what they likely mean:&lt;br /&gt;&lt;a href="http://blogs.iis.net/brian-murphy-booth/archive/2007/03/22/how-to-troubleshoot-an-iis-event-id-1009-error.aspx"&gt;http://blogs.iis.net/brian-murphy-booth/archive/2007/03/22/how-to-troubleshoot-an-iis-event-id-1009-error.aspx&lt;/a&gt;&lt;br /&gt;My current issue is error 0x0 which is documented in this link but fairly sparse.  I checked the debugger flags with gflags and everything was unchecked.  I'm still looking for a resolution to my issue.&lt;br /&gt;&lt;br /&gt;***&lt;br /&gt;&lt;br /&gt;I did find a resolution to this issue.  I went through all the configs and our DRP (Disaster Recovery Procedure) document to see if a could figure it out.  No dice there.  I downloaded and hooked up &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;procmon&lt;/a&gt; to see if it would tell me which registry key or file was causing the issue.  No dice there either.  It turned out that since our app had a dependency on SoftArtisan's FileUpEe, the fileUpEe dll's were registered in the wrong order!  I had registered them 'com' folder first, 'dotnet' folder second (per the DRP).  They needed to be registered 'dotnet' first and 'com' second.  That made my IIS appPool stop cratering (it was definitely the issue).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5790782853204597768?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5790782853204597768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5790782853204597768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5790782853204597768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5790782853204597768'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/10/iis-default-app-pool-proc-terminated.html' title='IIS default app pool proc terminated'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6239058506538821812</id><published>2009-10-14T08:18:00.000-07:00</published><updated>2009-10-14T08:28:25.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Repository'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Tools for working with SVN &amp; Visual Studio</title><content type='html'>We're moving to Subversion as our code repo.  Tools that we are using are:&lt;br /&gt;- &lt;a href="http://www.visualsvn.com/server/"&gt;VisualSVN Server&lt;/a&gt; on the server box for maintaining the svn server (managing users, creating/importing new repos, etc)&lt;br /&gt;- &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; on client boxes.  This works in conjunction with windows explorer to tell you the status of files in your local copy of the repo.  We've found that the icons don't change status immediately - you need to be patient with them.&lt;br /&gt;- &lt;a href="http://ankhsvn.open.collab.net/"&gt;Collabnet AnkhSVN&lt;/a&gt; - Subversion plug-in for visual studio.  Allows you to see the status and check files in and out inside of VS.&lt;br /&gt;- &lt;a href="http://www.open.collab.net/downloads/subversion/"&gt;Collabnet SVN command line clien&lt;/a&gt;t.  We found we needed this (particularly svn.exe in the PATH environment variable) if we wanted to run the SVN steps in a Visual Build file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6239058506538821812?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6239058506538821812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6239058506538821812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6239058506538821812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6239058506538821812'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/10/tools-for-working-with-svn-visual.html' title='Tools for working with SVN &amp; Visual Studio'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3065496672704812890</id><published>2009-10-07T06:19:00.000-07:00</published><updated>2009-10-07T06:32:50.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Monitor the right things</title><content type='html'>I started re-reading &lt;a href="http://www.michaelnygard.com/"&gt;Release It! by Michael Nygard&lt;/a&gt; this morning on the commute into work.  In his first chapter he talks about a (very small) issue that turns into a colossus and takes down an airline's check-in system.  The system had a monitor configured and performing checks on it, but it turned out that it wasn't checking the right things (it was looking at the http port on transactional servers when it should have been looking at the RMI port).&lt;br /&gt;It totally reminded me of something that happened about a month ago.  We have a bunch of web applications that run on our production server.  After fine tuning our &lt;a href="http://groundworkopensource.com"&gt;monitoring&lt;/a&gt; to look at pages that the application has to apply logic to to server up (rather than a static home page) we found that our monitoring corresponded much closer to complaints from users.&lt;br /&gt;Think twice about what you want to monitor and where to point it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3065496672704812890?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3065496672704812890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3065496672704812890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3065496672704812890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3065496672704812890'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/10/monitor-right-things.html' title='Monitor the right things'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2352802227012200420</id><published>2009-10-05T13:53:00.000-07:00</published><updated>2009-11-11T09:55:35.913-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>MS Sql Server bug</title><content type='html'>We ran into an Sql Server bug today that was rather interesting.  We were implementing synonyms across a number of views, tables, and stored procs in a couple of DB's.  Everything was working fine until another team did a deploy and changed the index on a view that was referenced by one of our synonyms.  It turns out that there is a &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=378549"&gt;documented bug&lt;/a&gt; which requires that any time the DDL has changed on a view that is referenced by a synonym, that synonym looses it's connection to the view.  This includes just updating the index to the view.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2352802227012200420?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2352802227012200420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2352802227012200420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2352802227012200420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2352802227012200420'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/10/ms-sql-server-bug.html' title='MS Sql Server bug'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3773991943753252146</id><published>2009-09-03T07:19:00.000-07:00</published><updated>2009-09-03T07:26:09.958-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Handy Utilities for Windows</title><content type='html'>I don't want to forget about these handy software utilities for doing troubleshooting and debugging on the windows platform.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sixty-five.cc/sm/v1x.php"&gt;SpaceMonger&lt;/a&gt; is a tool that graphically displays how data is utilized in you hard drive.&lt;br /&gt;&lt;br /&gt;SysInternals software...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx"&gt;TcpView&lt;/a&gt; essentially provides a graphical view of a netstat on a windows box with a few extra handy features (counting the number of sockets in time_wait, for example).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"&gt;Procmon&lt;/a&gt; allows you to get information about what is happening with a specific process id.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3773991943753252146?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3773991943753252146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3773991943753252146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3773991943753252146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3773991943753252146'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/09/handy-utilities-for-windows.html' title='Handy Utilities for Windows'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2601161113018866262</id><published>2009-09-02T10:13:00.000-07:00</published><updated>2009-09-02T10:20:23.522-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>windows account security</title><content type='html'>The domain (active directory) policy will override any local security setup for a particular account on a server.  If the domain security policy says that an account will lock after 5 failed attempts and the local security policy says the account will lock after 3 attempts, the account will lock out after 5 attempts.  &lt;br /&gt;Here's the interesting thing:&lt;br /&gt;The account lockout counter is reset every 24 hours or with every passed login attempt.  So if you have two services using the same account, one with a correct password and one with an incorrect password, you can likely run indefinitely before the account will lock out.  One service will never work and you should get a lot of errors in the security event log.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2601161113018866262?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2601161113018866262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2601161113018866262' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2601161113018866262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2601161113018866262'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/09/windows-account-security.html' title='windows account security'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3405506955069625026</id><published>2009-08-26T07:39:00.000-07:00</published><updated>2009-09-09T08:14:10.644-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>More IIS automated deploys</title><content type='html'>Been working more with IIS automated deploys and found a couple of good posts in David Wang's Blog along with some other good blog posts.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/david.wang/archive/2004/12/02/273681.aspx"&gt;This one&lt;/a&gt; is related to how to manipulate IIS list data.  He provides a handy vbs script to do this that worked nicely for me in adding a new application mapping to IIS.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/david.wang/archive/2005/08/29/HOWTO_Understand_and_Diagnose_an_AppPool_Crash.aspx"&gt;This one&lt;/a&gt; talks about IIS App pool crashes - fatal communication errors between the Application Pool and IIS.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/david.wang/archive/2006/01/26/Thoughts-on-Application-Pool-Recycling-and-Application-Availability.aspx"&gt;This one&lt;/a&gt; talks about app pool recycling and IIS availability.  There's some great conversations past David's article further down the page.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/madhuponduru/archive/2006/04/17/577898.aspx"&gt;This one&lt;/a&gt; (not David Wang) shows how to change COM+ MSDTC settings programmatically.  This script worked great for me as well.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wssdemo.com/Blog/archive/2008/10/02/another-step-closer-to-the-100-scripted-sharepoint-installation-with-dcomperm-exe.aspx"&gt;This one&lt;/a&gt; (Ian Morrish) shows how to manipulate COM+ Security launch and activation permissions using DComPerm from the windows SDK.&lt;br /&gt;&lt;br /&gt;With all of these scripts, I found I had to carefully read the directions and make sure I had the parameters that were being passed in correct.  I was often passing in erroneous parameters on my first couple of tries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3405506955069625026?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3405506955069625026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3405506955069625026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3405506955069625026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3405506955069625026'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/08/more-iis-automated-deploys.html' title='More IIS automated deploys'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4060719019037345846</id><published>2009-08-21T13:11:00.000-07:00</published><updated>2009-08-21T13:14:57.118-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Windows bug with adding users to a group</title><content type='html'>I was using a script to try and add users to a local group today in an automated build script.  I was sent a script that worked, but when I plugged in my values, it didn't.  I always got a script syntax error, like one of my parameters was not in the right place, or had spaces or something.  Well the group name did have spaces, but that wasn't my issue.&lt;br /&gt;&lt;br /&gt;It turns out that there is a documented Windows bug (&lt;a href="http://support.microsoft.com/kb/324639"&gt;http://support.microsoft.com/kb/324639&lt;/a&gt;) that limits the username to be added to only 20 characters.  Any more and it won't run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4060719019037345846?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4060719019037345846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4060719019037345846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4060719019037345846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4060719019037345846'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/08/windows-bug-with-adding-users-to-group.html' title='Windows bug with adding users to a group'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7075059411189789128</id><published>2009-08-14T10:38:00.000-07:00</published><updated>2010-07-12T11:54:03.417-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><category scheme='http://www.blogger.com/atom/ns#' term='network security'/><title type='text'>Log parsing/network security tools</title><content type='html'>I discovered some new tools today that are useful for network security.  QRadar from Q1 labs (&lt;a href="http://www.q1labs.com/"&gt;http://www.q1labs.com/&lt;/a&gt;) is a really slick log parsing tool for organizations that are looking to implement a distributed log management offering to collect, archive, and analyze network and security event logs. It then parses this information into graphs and data that you can tune to alert you when things go awry.  You can configure it to look at firewall logs, web server access logs, event logs, etc.&lt;br /&gt;Splunk (&lt;a href="http://www.splunk.com/"&gt;http://www.splunk.com/&lt;/a&gt;) seems like it might be a competitor.  At a glance, I'd say that QRadar has a lot more features and might be a lot more expensive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7075059411189789128?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7075059411189789128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7075059411189789128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7075059411189789128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7075059411189789128'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/08/log-parsingnetwork-security-tools.html' title='Log parsing/network security tools'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-977218711508045168</id><published>2009-08-14T10:29:00.000-07:00</published><updated>2009-08-14T10:36:52.621-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='vbscript'/><title type='text'>XML manipulation in Visual Build (and vbscript)</title><content type='html'>We've been working on basically turning our Visual Build deployment files into DRP (Disaster Recovery Plan) scripts.  Essentially, everything required to get our applications running on a 'blank' server box is documented as a config, permission, or push in our Visual Build files.  This has required updating then machine.config and web.config files that reside under windows/microsoft.net/framework/v1.1.4322 or v2.0.50727/config at times.  Sometimes we're adding attributes to existing element, sometimes we're adding entirely new elements.&lt;br /&gt;&lt;br /&gt;It seems to me that adding entirely new elements in Visual Build (using the Write XML Action) has a bug in it.  It will add new attributes to existing elements no problem.  But it won't add new elements.  So we hacked around that and used the 'Run Script' Action with vbscript to add elements to our files.  To do this in vbscript it looks something like this:&lt;br /&gt;&lt;br /&gt;Dim objXMLDoc, objNewNode, objText, strXPath, objParentNode,  objChildNode, objCaseExist&lt;br /&gt;&lt;br /&gt;Set objXMLDoc  = CreateObject("Microsoft.XMLDOM")  &lt;br /&gt;objXMLDoc.async = False &lt;br /&gt;&lt;br /&gt;' load the XML file - make sure to include the fully qualified path&lt;br /&gt;fSuccess = objXMLDoc.load("\\%TARGET_SERVER%\c$\WINDOWS\Microsoft.NET\framework\v2.0.50727\config\web.config")&lt;br /&gt;If Not fSuccess Then&lt;br /&gt; wscript.echo ("error loading XML file")&lt;br /&gt;Else&lt;br /&gt; wscript.echo ("XML file loaded")&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;' set to proper node&lt;br /&gt;Set nodeList = objXMLDoc.getElementsByTagName("configuration/system.web/compilation/buildProviders")&lt;br /&gt;If nodeList.length &gt; 0 Then&lt;br /&gt;&lt;br /&gt; Set objParentNode = nodeList(0)&lt;br /&gt;&lt;br /&gt;' add the SGAS SecurityDisabled element/node&lt;br /&gt; Set objNewNode = objXMLDoc.createElement("add")&lt;br /&gt; objNewNode.setAttribute "extension", ".uplx"&lt;br /&gt; objNewNode.setAttribute "type", "System.Web.Compilation.PageBuildProvider"&lt;br /&gt; objParentNode.appendChild(objNewNode)&lt;br /&gt; objParentNode.appendChild objXMLDoc.createTextNode (vbCrLf)&lt;br /&gt;&lt;br /&gt; set objNewNode = Nothing&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;&lt;br /&gt; wscript.echo ("node list empty")&lt;br /&gt;&lt;br /&gt;end if&lt;br /&gt;&lt;br /&gt;' save the XML file&lt;br /&gt;objXMLDoc.save("\\%TARGET_SERVER%\c$\WINDOWS\Microsoft.NET\framework\v2.0.50727\config\web.config")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-977218711508045168?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/977218711508045168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=977218711508045168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/977218711508045168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/977218711508045168'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/08/xml-manipulation-in-visual-build-and.html' title='XML manipulation in Visual Build (and vbscript)'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-8462096105059406817</id><published>2009-08-06T07:11:00.000-07:00</published><updated>2010-07-12T11:54:19.965-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>Error 8510 and MSDTC...</title><content type='html'>We had the whole development environment down for a day.  After spending a good bit of time debugging, we discovered that we were getting a significant number of errors in our event logs saying:&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Inner: The transaction has aborted.&lt;br /&gt;Inner: Failure while attempting to promote transaction.&lt;br /&gt;Inner: Fatal error 8510 occurred at Aug  5 2009  1:09PM. Note the error and time, and contact your system administrator.&lt;br /&gt;A severe error occurred on the current command.  The results, if any, should be discarded.&lt;/span&gt;&lt;br /&gt;They were thrown against the running of several different stored procs and because of the architecture of our system, all of our COM+ components were rendered useless.&lt;br /&gt;&lt;br /&gt;I found a post that talks about 'fatal error 8510' that was interesting:&lt;br /&gt;http://blogs.msdn.com/asiatech/default.aspx - go to the bottom of the page (it's a ways down).  However that turned out to NOT be the resolution to our problem&lt;br /&gt;&lt;br /&gt;The resolution to our problem resided in the fact that SQL Server could not initiate a distributed transaction.  We had thought that there was a problem with the MSDTC cluster, but that turned out to not be an issue as other sql servers in the cluster could initiate distributed transactions.  Restarting services on the sql server that could not initiate distributed transactions resolved the problem&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-8462096105059406817?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/8462096105059406817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=8462096105059406817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8462096105059406817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8462096105059406817'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/08/error-8510-and-msdtc.html' title='Error 8510 and MSDTC...'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4083245789392453805</id><published>2009-07-31T21:35:00.000-07:00</published><updated>2010-07-12T11:52:51.952-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><title type='text'>linux reboot and chkconfig</title><content type='html'>Setting up a new linux server pair for clients, I've did some things I haven't done in a while, so I thought I'd document them here so I'd remember in the future.&lt;br /&gt;&lt;br /&gt;To set up a service in linux, use chkconfig.  Running the chkconfig --list command shows all the potential daemons that are sitting in /etc/init.d/ and whether they are set to on|off|etc for each linux run level.  The main run levels to set are 2,3,4,5.  You can set the to on for http like this:&lt;br /&gt;chkconfig --level 2345 httpd on&lt;br /&gt;&lt;br /&gt;It's also a good idea to go to the script for that service in /etc/init.d (httpd in this case) and modify the chkconfig line at the top of the file to add those changed params.&lt;br /&gt;&lt;br /&gt;To reboot the server you can run reboot.  It actually calls shutdown -r or shutdown -h depending on the linux implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4083245789392453805?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4083245789392453805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4083245789392453805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4083245789392453805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4083245789392453805'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/07/linux-reboot-and-chkconfig.html' title='linux reboot and chkconfig'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7654475925172124018</id><published>2009-07-20T13:25:00.000-07:00</published><updated>2009-08-06T11:03:46.486-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>Automated Windows Deploy scripts and tricks</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Permissions (domain is optional):&lt;/span&gt;&lt;br /&gt;cacls drive:\folder /T /E /G "domain\username:C"      - :C modify permissions&lt;br /&gt;cacls drive:\folder /T /E /G "domain\username:R"      - :R read permissions&lt;br /&gt;cacls drive:\folder /T /E /G "username:F"             - :F full permissions&lt;br /&gt;&lt;br /&gt;net localgroup "IIS_WPG" "domain\username" /add       - adds user to IIS_WPG localgroup&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;IIS configs:&lt;br /&gt;Set the friendly name for an IIS website:&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ROOT/AppFriendlyName IIS_WEB_SITE_Name&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set the port of a website:&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ServerBindings ":8080:"&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Install an IIS Application pool:&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs CREATE w3svc/AppPools/AppPoolName MyApplicationPool&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set identity type on AppPool&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/AppPools/WebSiteName/AppPoolIdentityType 3  (2 is the predefined network service account)&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set appPool username&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/AppPools/WebSiteName/WAMUserName username &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set appPool password&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/AppPools/WebSiteName/WAMUserPass password&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Delete a web site:&lt;/span&gt;&lt;br /&gt;cscript c:\windows\system32\iisweb.vbs /delete "WebSite name"\&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Create a web site:&lt;/span&gt;&lt;br /&gt;cscript c:\windows\system32\iisweb.vbs /create "IIS File Path" "WebSite name" /dontstart&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set server bindings&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ServerBindings :80:myWebSite :80:myWebSite.com&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set virtual directory permissions&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ROOT/vDir_Name/AccessFlags 513&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set enable anonymous user for vDir&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ROOT/vDir_Name/AuthAnonymous TRUE&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set vDir anonymous username&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ROOT/vDir_Name/AnonymousUserName username&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set vDir anonymous password&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ROOT/vDir_Name/AnonymousUserPass password&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set vDir to use integrated windows authentication&lt;/span&gt;&lt;br /&gt;cscript drive:\path-to\adsutil.vbs SET W3SVC/WEB_SITE_Number/ROOT/vDir_Name/authNTLM TRUE&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Set vDir ASP.NET version&lt;/span&gt;&lt;br /&gt;C:\WINDOWS\Microsoft.NET\Framework\version_number\aspnet_regiis -s W3SVC/WEB_SITE_Number/root/vDir_Name&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7654475925172124018?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7654475925172124018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7654475925172124018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7654475925172124018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7654475925172124018'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/07/automated-windows-deploy-scripts-and.html' title='Automated Windows Deploy scripts and tricks'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-8936658661544758150</id><published>2009-06-09T09:44:00.000-07:00</published><updated>2009-06-09T12:37:07.260-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><title type='text'>Troubleshooting</title><content type='html'>Things to always watch out for when troubleshooting:&lt;br /&gt;- locked out users - users who have been locked out of the system because the wrong password has been entered 3 consecutive times&lt;br /&gt;- out of disk space (proper monitoring would fix this problem)&lt;br /&gt;- GUI display that is contrary to what is actually happening on the system.  Gac'ed dll's that really aren't gac'ed.  In other words, assume nothing.&lt;br /&gt;- inconsistent application of permissions across environments.&lt;br /&gt;- duplicate libraries/dll's on machines.&lt;br /&gt;- closed ports or ports/services not listening/running.  Also port conflicts.  More than one service wanting to use the same port.&lt;br /&gt;- services, IO connections, db connections not getting closed/terminated properly.&lt;br /&gt;- logic between functions or classes that creates infinite loops&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-8936658661544758150?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/8936658661544758150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=8936658661544758150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8936658661544758150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8936658661544758150'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/06/troubleshooting.html' title='Troubleshooting'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-7629547794480899383</id><published>2009-06-05T07:09:00.000-07:00</published><updated>2009-06-05T07:19:47.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>IIS binary formatting error</title><content type='html'>Oh man, did I get a slap in the face yesterday.  I was helping/coordinating a patch into production for our team and was asked if we needed to 'drainstop' (read turn off load balancing) to deploy to our app servers.  I said no, I had never done that before here.  Later I realized that I probably haven't done a prod patch to the app servers here period.  &lt;br /&gt;Anyway, we pushed our change onto running servers and everything appeared to deploy fine until we actually tried to use them.  It seemed that even though we pushed new components and gac'ed them, that was ignored because the server still had a running request on the old one.  Once that request was gone, our app servers were down.  When our app servers go down and our web servers try to access them in that state, we get this wonderfully intuitive error called a 'binary formatter error' with a bunch of junk that doesn't make any sense.&lt;br /&gt;So, in the end, two lessons learned:&lt;br /&gt;1. Always drainstop servers when you're deploying onto a live system&lt;br /&gt;2. Binary Formatter errors can mean that you communication with a remote servers is down.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-7629547794480899383?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/7629547794480899383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=7629547794480899383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7629547794480899383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/7629547794480899383'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/06/iis-binary-formatting-error.html' title='IIS binary formatting error'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5003743071963020198</id><published>2009-05-24T14:32:00.000-07:00</published><updated>2009-08-06T11:12:31.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Tomcat Alias</title><content type='html'>As my previous post says, I went live with a new website on Friday.  Well, within minutes of going live I realized we didn't have an alias set up for www.myNewSite.com and got my client's administrator to add it.  Once it was made live, the alias still didn't work.  I had it configured in my tomcat server.xml file, but no dice.  What was going on?&lt;br /&gt;&lt;br /&gt;When I installed tomcat, I got rid of all the default sites it comes with (and I thought I had gotten rid of all their configs as well.  It turned out I hadn't.  In the server.xml file the host was configured correctly, but the 'engine' configuration was still pointing to 'localhost' which wasn't in my host configuration anymore. So I pointed it to my new 'root' configuration for the server - so now it looks something like this:&lt;br /&gt;&lt;br /&gt;    Engine name="Catalina" defaultHost="www.myNewSite.com"&lt;br /&gt;&lt;br /&gt;and the host lookes like this:&lt;br /&gt;&lt;br /&gt;      Host name="www.myNewSite.com" appBase="webapps"&lt;br /&gt;       unpackWARs="true" autoDeploy="true"&lt;br /&gt;       xmlValidation="false" xmlNamespaceAware="false"&lt;br /&gt;  alias myNewSite.com alias&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5003743071963020198?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5003743071963020198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5003743071963020198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5003743071963020198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5003743071963020198'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/05/tomcat-alias.html' title='Tomcat Alias'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2924613962204517402</id><published>2009-05-24T14:23:00.000-07:00</published><updated>2010-07-12T11:53:46.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><category scheme='http://www.blogger.com/atom/ns#' term='CMS&apos;s'/><title type='text'>MySQL service restart, InfoGlue</title><content type='html'>I have MySQL running behind Infoglue for a new web app one of my clients has.  We went into production on Friday with that web site.  Saturday evening the hosting providing had a scheduled update and so all the boxes got rebooted.  Unfortunately, the MySQL service which was configured to autorestart didn't come back up.  In the application event logs (I've got it running on a Windows server) it said:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;...MySQL Server 5.1\bin\mysqld: unknown option '--enable-pstack'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I searched the MySQL forums and Google for this error and nothing.  I reinstalled the service a couple of times.. and nothing - same error.  I was sweating by this time.&lt;br /&gt;&lt;br /&gt;Then I started looking at the my.ini file for Mysql in the installation folder (sibling of the bin folder).  I saw these lines at the very bottom:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;#Print a symbolic stack trace on failure.&lt;br /&gt;enable-pstack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ah ha.  So here's where that 'unknown option' was coming from.  I had no idea what was making a failure happen on startup to make it print out this 'stack trace' so I just commented out that line.  ...And low and behold, MySQL started up happily and things worked.&lt;br /&gt;&lt;br /&gt;Whew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2924613962204517402?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2924613962204517402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2924613962204517402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2924613962204517402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2924613962204517402'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/05/mysql-service-restart.html' title='MySQL service restart, InfoGlue'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5467387692643743459</id><published>2009-05-15T11:53:00.001-07:00</published><updated>2009-11-11T09:58:57.815-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Custom header in Cruise Control</title><content type='html'>We have multiple CruiseControl (CCNET) instances running on our build boxes and we've been wondering how to differentiate which one is which so people can know at a glance which one they are pointing at.&lt;br /&gt;This turns out to be relatively easy. In a typical CCNET installation, there's a \cruiseinstalldir\webdashboard\templates directory.  Inside it you'll find a file called TopMenu.vm.  Open the file up and after the last '#end' put some literal spaces in and type the title of your CCNET site with some plain html formatting to make it obvious (make the font bigger and bold, for example)&lt;br /&gt;&lt;br /&gt;...save it and refresh your dashboard page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5467387692643743459?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5467387692643743459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5467387692643743459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5467387692643743459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5467387692643743459'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/05/custom-header-in-cruise-control.html' title='Custom header in Cruise Control'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3317794109868230390</id><published>2009-05-15T08:39:00.000-07:00</published><updated>2009-05-15T11:51:22.259-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Windows and Automated builds</title><content type='html'>We've run into a couple of interesting situations with Windows with our automated build scripts that I wanted to document.  Both of them have to do with inconsistencies with what the Windows GUI is saying about a configuration versus what the operating system is actually using for a configuration.&lt;br /&gt;Both of these situations were discovered while we were trying to do an expansive upgrade of our code to use the new .NET framework.  In the first instance we were manually trying to install/uninstall dll's from the gac on a particular box.  We manually dragged and dropped a particular dll into the c:\windows\assembly folder and the GUI would say everything was successful with registering the dll in the gac.  However, check it from the command line, or try to run something in the application against the newly gac'ed dll and the OS didn't seem to see it.  The only way we could get the OS to successfully see the change was to gac the dll from the command line.&lt;br /&gt;In the other instance (which is sort of similar in nature), our automated deploy scripts are creating a Virtual Directory underneath an IIS web site on a remote server.  After the Vdir is created, we had a 'step' that automatically updated the ASP.NET version on the Virtual Directory fo 2.0.50727 (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -s W3SVC/%WEB_SITE_NUMBER%/Root/%WebSiteName%).  This script ran successfully, and the ASP.NET tab in the VDir on the web site displayed the change.  However, IIS didn't actually see the change and continued to run the web site on the old 1 .1.4322 version - even though the GUI in IIS said it was.  We knew this because the C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files folder didn't have the new corresponding virtual directory folder (this is where IIS keeps the compiled pages - it's like the 'working' folder in Tomcat).  It seems the IIS metabase was updated, but the registry was not.  I have a hunch that this might be because during that particular deploy, we left IIS running while we did the deploy.  Perhaps shutting it down would make the update work properly through to the registry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3317794109868230390?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3317794109868230390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3317794109868230390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3317794109868230390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3317794109868230390'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/05/windows-and-automated-builds.html' title='Windows and Automated builds'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5193623149326496981</id><published>2009-05-12T10:29:00.000-07:00</published><updated>2009-08-06T11:09:15.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>Don't assume anything</title><content type='html'>We are doing a big upgrade of our components in our upcoming release.  The security structure of our organization is fairly complex with users, roles, user groups assigned to roles, boxes in the domain, boxes outside of the domain, and a whole other layer of users and roles at the database level.   Managing security for this release has been a hassle. It seems in every environment there are differences with who is assigned to what group, which users and which groups have 'these' permissions on 'this' folder, etc. &lt;br /&gt;Thinking we had most of the issues documented, automated and swept under the rug, we deployed into our staging environment.  Surprise, surprise, there were permissions issues there.  The really interesting thing was these turned out to be new issues.  Well, we spend the good part of the day trying to see if we missed a permission on a folder somewhere.  In the end, it turned out that our architecture group (who is responsible for the shared components code and the overall enterprise architecture) had some code for applying special permissions that was hard-coded to be applied against ONLY our staging and production environments.&lt;br /&gt;Shock.&lt;br /&gt;I guess it goes to show, don't assume anything - no matter who is responsible for code or where the error seems to be, or how stable you think your configuration are....  We also discovered that that particular componenet had a different security setting for the COM+ in the Staging env compared to the Testing env.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5193623149326496981?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5193623149326496981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5193623149326496981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5193623149326496981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5193623149326496981'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/05/dont-assume-anything.html' title='Don&apos;t assume anything'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-6837796445693425948</id><published>2009-05-07T06:21:00.000-07:00</published><updated>2009-11-11T10:01:22.112-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMS&apos;s'/><title type='text'>InfoGlue installation</title><content type='html'>I've been doing a lot of work with InfoGlue lately. I downloaded the new 2.9.6.X release and went to install it and got a 49.0 version error.  It seems that the new version of InfoGlue doesn't run as good on Java 1.5 as it's documented to.  It worked when I finally upgraded to 1.6.  I also had issues getting it to work with MySql because my install of MySql was done with a production box in mind.  It seems that the MySql configuration engine clamps down on security when you specify this, and as a result, I had to allow temporary access for root to all schematas, and then have to specify permissions for each user by schemata.  While I'm very impressed and happy about this, it made for a little more grief than I was expecting in the installation process.&lt;br /&gt;Also in the InfoGlue installation process, you do want to change the first username/password it asks you for to be the specific one that InfoGlue will use to call the DB with.  Not realizing that, I had to go through all my web contexts and change the references to those properties.&lt;br /&gt;Also, deleting a repo in InfoGlue using it's 'force' feature is not a great idea.  Better to rename it instead.  Sigh.  I had to go through and insert data back into a couple of tables to get the repo working properly again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-6837796445693425948?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/6837796445693425948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=6837796445693425948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6837796445693425948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/6837796445693425948'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/05/infoglue-installation.html' title='InfoGlue installation'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4643441848256288116</id><published>2009-04-07T06:35:00.001-07:00</published><updated>2009-04-07T06:46:54.499-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>IIS debugging</title><content type='html'>Been working lately on getting a new IIS web application into production.  We've been continuing to run into some more issues with anonymous/integrated windows authentication as the build is progressing through different environments.  However, I found this cool tool yesterday that has some neat utilities for working/debugging IIS.  It's called the Internet Information Services (IIS) Resource Kit Tools and you can download it &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=56FC92EE-A71A-4C73-B628-ADE629C89499&amp;amp;displaylang=en"&gt;here&lt;/a&gt;.  Some of the cool utilities in that package are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;WFetch - allows you to fully customize an HTTP request and send it to a Web server so that you can see the raw HTTP request and response data.  Sort of like &lt;a href="http://www.ethereal.com/"&gt;Ethereal&lt;/a&gt; for IIS.&lt;/li&gt;&lt;li&gt;SelfSSL - allow you to create and sign you own ssl certificates for testing with ssl in dev environments&lt;/li&gt;&lt;li&gt;A Metabase Explorer - allows you to view all the configuration properties IIS and it's web sites, app pools, virtual directories, and more&lt;/li&gt;&lt;li&gt;And an &lt;a href="httpd.apache.org/"&gt;Apache&lt;/a&gt; to IIS migration tool which would apparently allow me to migrate an apache web server (and it's configs) to an IIS6.0 server.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4643441848256288116?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4643441848256288116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4643441848256288116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4643441848256288116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4643441848256288116'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/04/iis-debugging.html' title='IIS debugging'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2036145424040888332</id><published>2009-03-27T15:22:00.000-07:00</published><updated>2009-03-27T15:38:04.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>IIS and Nagios</title><content type='html'>Working with IIS on a particular app, we had a situation where the behavior of the web server seemed to be inconsistent with how we had configured it.  We had configured it to allow Authenticated access based on Integrated Windows authentication only, no anonymous access.  When we browsed to the page we wanted to view on the web server itself, the page came up fine.  But when we tried to browse to the page from another box, we were required to authenticate.  This was not expected since it should have been using the Integrated Windows authentication to log in transparently.&lt;br /&gt;After comparing it with another server that worked and seeing that most of the GUI configuration looked identical, I started googling and found this &lt;a href="http://support.microsoft.com/?id=871179"&gt;article&lt;/a&gt; that answered the problem for the most part.  The only difference we found was even the order of the different NTAuthentication providers matters - the working server had "NTLM,Negotiate"; the server that didn't work was set up as "Negotiate,NTLM".  Changing the broken server to look like the other server fixed our problem.&lt;br /&gt;&lt;br /&gt;Our infrastructure teams has been doing some changes and moved the configurations for the email servers a bit.  Unfortunately, this wasn't transparent to my Nagios/GroundworkOpensource installation (since I was lazy and hadn't reconfigured the email 'from' address for host).  What ended up happening was all the Nagios emails ended up getting sent outside the internal network (because the domain name was still 'localhost.localdomain') and getting caught by the public antispamm appliance we have.  I ended up switching notifications to use 'service-notify-by-sendemail' instead of 'service-notify-by-email' and then overriding the host in the command to point to our local email server.  And that worked.  Similar to &lt;a href="http://www.groundworkopensource.com/community/forums/viewtopic.php?f=23&amp;amp;t=1286&amp;amp;hilit=email+change+from+localdomain"&gt;this post&lt;/a&gt; on the groundwork forum.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2036145424040888332?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2036145424040888332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2036145424040888332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2036145424040888332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2036145424040888332'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/iis-and-nagios.html' title='IIS and Nagios'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-9011165710725567790</id><published>2009-03-18T15:24:00.000-07:00</published><updated>2009-08-06T11:09:38.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>Automatically deploying IIS web apps</title><content type='html'>We've been working on automated builds and deploys at work.  All of our web apps run on IIS and configuring 'good' automated deploys for these applications has been challenging.  But I think we're seeing the light at the end of the tunnel now.&lt;br /&gt;&lt;br /&gt;Microsoft provides a good number of support scripts (in vbs) to configure IIS, App Pools, and Virtual Directories from the command line.  Some of them come with the IIS installation,  some of them we had to download - if I remember correctly.&lt;br /&gt;&lt;br /&gt;There are two 'sets' of these CLI vbs scripts that I'm aware of that work with IIS.  One is found in the ../inetpub/adminscript folder. There's a bunch of vbs scripts in there.  The other set is found in c:/windows/system32/iis*&lt;br /&gt;&lt;br /&gt;Here's some examples of what you can do with these scripts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create a virtual directory:   cscript c:\windows\system32\iisvdir.vbs /create webSiteName virDirName virDirPath /s serverName&lt;/li&gt;&lt;li&gt;set perms on a virtual directory: c:\inetpub\adminscripts\adsutil.vbs SET w3svc/webSiteNumber/Root/virDirName/AccessFlags permNum (like 513)&lt;/li&gt;&lt;li&gt;set ASP.NET version for the virtual Directory  c:\windows\Microsoft.net\framework\v2.0.50727\aspnet_regiis -s w3svc/webSiteNumber/root/virDirName&lt;/li&gt;&lt;li&gt;and tons more...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;You can view all the website numbers in the IIS manager.  They show up in a column.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-9011165710725567790?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/9011165710725567790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=9011165710725567790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/9011165710725567790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/9011165710725567790'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/automatically-deploying-iis-web-apps.html' title='Automatically deploying IIS web apps'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-8573225748968155591</id><published>2009-03-16T20:06:00.000-07:00</published><updated>2009-08-06T11:08:43.976-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network security'/><title type='text'>IT Security</title><content type='html'>Over the past few years I've seen sensitive information exposed in some very interesting places on enterprise networks and servers.  Sometimes this leftover information can be super helpful if you're trying to debug problems or get an idea of what happened on the box in the past.  In other cases, it just plain bad.  Here's some of what I've seen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Shared drives mapped all over the enterprise.  Shared drives mapped on production boxes with access to  files that contain &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;sensitive&lt;/span&gt; info like passwords for production users.&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Kickstart&lt;/span&gt; configuration files with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;username&lt;/span&gt; and passwords for domain users in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;clear text&lt;/span&gt; forgotten on servers&lt;/li&gt;&lt;li&gt;Passwords and sensitive information exposed in .bash_history files.  Bash_History files are a treasure trove of information.  They'll show you all kinds of things - where the db server is located, what the connection string is, where http servers are installed, how to shut them down and start them up....etc.&lt;/li&gt;&lt;li&gt;*.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;udl&lt;/span&gt; files - &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;Microsoft&lt;/span&gt; specific.  They store connection information in clear text for db servers.  Don't leave them lying around and exposed.&lt;/li&gt;&lt;li&gt;Installations for UPS (Universal Power Supply) systems left with their default configured administrator &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;username&lt;/span&gt; and password.  I happened to find a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;login&lt;/span&gt; page for a UPS console one day and logged in on the first try using the first password I could think of.  The dashboard I subsequently found myself on gave me the power to shut down the entire enterprise.&lt;/li&gt;&lt;/ul&gt;Here's some simple ways to make your network/enterprise more secure:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't allow a plethora of undocumented mapped drives.&lt;/li&gt;&lt;li&gt;Do searches for text like 'password' on any boxes, drives, etc that you might be concerned about.  If you get results, take steps to either encrypt or delete those files or references.&lt;/li&gt;&lt;li&gt;Change default installation passwords&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-8573225748968155591?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/8573225748968155591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=8573225748968155591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8573225748968155591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8573225748968155591'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/it-security.html' title='IT Security'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4836277024885424101</id><published>2009-03-15T20:26:00.000-07:00</published><updated>2009-11-11T10:01:42.957-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMS&apos;s'/><title type='text'>CMS experiences</title><content type='html'>In the past year or so I have gotten a bit of experience with different CMS systems.  I was given two clients(&lt;a href="http://www.mross.com"&gt;www.mross.com&lt;/a&gt;, &lt;a href="http://www.auma.ca"&gt;www.auma.ca&lt;/a&gt;) that run on &lt;a href="http://www.infoglue.org/"&gt;InfoGlue&lt;/a&gt; - a java/velocity based cms system.  I am also messing around with &lt;a href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt;, and I have one client (&lt;a href="http://brooks.ca"&gt;www.brooks.ca&lt;/a&gt;) that runs on it.  I have yet to do anything with &lt;a href="http://drupal.org/"&gt;Droopal&lt;/a&gt;, but from what I've heard, it sounds more like InfoGlue than Joomla - that is, it's more geared towards an enterprise/portal centric CMS than what Joomla appears to be.&lt;br /&gt;&lt;br /&gt;InfoGlue is very configurable and supports internationalization.  This makes is somewhat cumbersome to configure to start out with.  I've found that the important files to know about when doing a configuration on the fly are:&lt;br /&gt;- WEB-INF/classes/cms.properties&lt;br /&gt;- WEB-INF/classes/hibernate.properties&lt;br /&gt;- conf/localhost/live.properties, etc&lt;br /&gt;&lt;br /&gt;Some issues that I've noticed with the InfoGlue instances that I work on are:&lt;br /&gt;- on logging into the CMS, I have to refresh the page 3 times before I acutally get the GUI.  Only one of my instances does this, so I think it's a configuration thing.&lt;br /&gt;- sometimes Tomcat seems to get it's knickers in a knot and needs to be rebooted in order for content changes to be saved.  This happens periodically.&lt;br /&gt;- deleting content (cleaning things up) can be a huge pain - especially if there are a lot of references to the content in other parts of the site.  You end up having to delete the references first before you can delete the content.&lt;br /&gt;&lt;br /&gt;So far I've been pretty impressed with Joomla.  I was able to figure out how things were put together fairly quickly.  I bought &lt;a href="http://www.amazon.ca/Joomla-Users-Guide-Building-Successful/dp/0136135609/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1238440032&amp;amp;sr=8-1"&gt;this book&lt;/a&gt; which helped some - it has some good chapters on SEO and working with Joomla templates.  I was able to manage a complex upgrade to the site I maintain within a week of getting bootstrapped on the Joomla CMS.  This impressed me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4836277024885424101?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4836277024885424101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4836277024885424101' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4836277024885424101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4836277024885424101'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/cms-experiences.html' title='CMS experiences'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5289240516586664578</id><published>2009-03-10T11:38:00.000-07:00</published><updated>2009-08-06T11:10:00.669-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated deploys'/><title type='text'>Visual Build</title><content type='html'>I've been working with Visual Build in a .NET environment off and on for almost the past year.  When we decided to go forward with Visual Build, I thought it would be a more painful process than it turned out to be.  Our technology stack includes ClearCase, Subversion, Ms SQL, PSExec, VMWare, VB.NET, IIS, CruiseControl, Nant, Nunit, and a bunch of 3rd party tools and servers related to document management.&lt;br /&gt;Visual Build provides a bunch of example build files that are quite helpful in getting all kinds of different functionality going.  We automatically compile, unittest, deploy (to remote boxes), and run verification tests using Visual Build.  There a numerous other interesting smaller tasks that we've got Visual Build to manage for us like setting perms on remote boxes, stopping and starting servers, services and com+ objects, performing baselines, checkins/outs, and updates of clearcase streams and views,  etc.&lt;br /&gt;Some of the gotchas we've discovered in our work with Visual Build:&lt;br /&gt;- managing windows (child build files that get spawned in a complex build process) and logs is not so trivial.  If they aren't managed correctly, your build will stop without much notification as to why.  We found that piping the output from the build to a separate file worked for us with logging.  With windows, we found that matching the build context, waiting for completion, running the GUI app in silent mode, and not closing the GUI app on failure were what made things tick.&lt;br /&gt;- psexec needs to be on the path on the box you're running Visual Build on.&lt;br /&gt;- CruiseControl integration was relatively easy - we just used the command line with options:&lt;tasks&gt;&lt;br /&gt;           &lt;exec&gt;&amp;lt;tasks&amp;gt;&lt;br /&gt;                  &lt;executable&gt;&amp;lt;executable&amp;gt;C:\PathToVisualBuildInstallation\VisBuildCmd.exe&lt;/executable&gt;&lt;/exec&gt;&lt;/tasks&gt;&amp;lt;/executable&amp;gt;&lt;tasks&gt;&lt;exec&gt;&lt;executable&gt;&lt;/executable&gt;&lt;br /&gt;   &lt;basedirectory&gt;&amp;lt;baseDirectory&amp;gt;D:\pathToBuildFile&lt;/basedirectory&gt;&lt;/exec&gt;&lt;/tasks&gt;&amp;lt;/baseDirectory&amp;gt;&lt;tasks&gt;&lt;exec&gt;&lt;basedirectory&gt;&lt;/basedirectory&gt;&lt;br /&gt;                   &lt;buildargs&gt;&amp;lt;buildArgs&amp;gt;/b "XXX.bld" -other args to pass to buildfile go here&lt;/buildargs&gt;&lt;/exec&gt;&lt;/tasks&gt;&amp;lt;/buildArgs&amp;gt;&lt;tasks&gt;&lt;exec&gt;&lt;buildargs&gt;&lt;/buildargs&gt;&lt;br /&gt;                   &lt;buildtimeoutseconds&gt;&amp;lt;buildTimeoutSeconds&amp;gt;1000&lt;/buildtimeoutseconds&gt;&lt;/exec&gt;&lt;/tasks&gt;&amp;lt;/buildTimeoutSeconds&amp;gt;&lt;tasks&gt;&lt;exec&gt;&lt;buildtimeoutseconds&gt;&lt;/buildtimeoutseconds&gt;&lt;br /&gt;           &lt;/exec&gt;&lt;/tasks&gt;&amp;lt;/tasks&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5289240516586664578?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5289240516586664578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5289240516586664578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5289240516586664578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5289240516586664578'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/visual-build.html' title='Visual Build'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1031352687035040566</id><published>2009-03-06T12:40:00.000-08:00</published><updated>2010-11-16T19:41:47.127-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='emergency software fix'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Replatforming an app in 21 hours....</title><content type='html'>I got a cold call a couple of weeks ago.  A prominent institution in Calgary had a java application that ran on a Sun OS with an iPlanet web server that was key to their business that didn't work with a key upgrade from a 3rd party vendor.  It needed to be upgraded an running in production 2 weeks. Could I help?&lt;br /&gt;I agreed to help and showed up that afternoon to see what could be done.  The current code in production ran fine.  However, there was no guarantee it would run fine with the upgrade.  Unfortunately, the code base was a mess.  Multiple versions of the same file were all over the production server with .bak, .ver2, etc extension.  Everything had been done on the fly in the past.  The logs couldn't provide us with any useful information, and they had no test environment.&lt;br /&gt;After seeing what could be done on the Sun box (which had been running this application non-stop for more than 10 years!), I decided to try and port the application to &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt; - in this container I knew what I was doing and I could debug the problems more effectively.  Within 14 hours we had the application running on Tomcat with some minor bugs.&lt;br /&gt;Over the weekend,  new production and test virtual machines were requisitioned and when I came back on my next visit, we got the last of the bugs out of the way and had everything working in the new test environment.&lt;br /&gt;Some lessons learned....&lt;br /&gt;- Don't be afraid to replatform in Java.  I would've had a much harder time trying to do this with Microsoft technology.  The clients were VERY happy to get off that old server.  No one was around to support it anymore...etc.  That was 10 year old java code that I didn't have to do a thing to when I moved it onto j2sdk1.4.2_XX.&lt;br /&gt;- It's almost scary how many different ways you can configure things in Tomcat. We had outstanding issue that was 'bugging' me after 14 hours of work.  The client required the application to be available from two separate url paths without using an apache web server to do url rewriting.  I tried various different configurations in the app's web.xml, the global web.xml, the server.xml and found that I could get the url's to work, but then I had problems with sessions getting lost/corrupted.  In the end, we wrote another servlet (sort of &lt;a href="http://http//www.java-tips.org/java-ee-tips/java-servlet/how-to-redirect-a-request-using-servlet.html"&gt;like this&lt;/a&gt;, but different) that we configured to 'catch' the url we needed it to and redirect the request to the controller servlet that was already mapped to the other url.  This worked beautifully. &lt;br /&gt;- We discovered that if your dealing with pages that have a lot of scriptlet code that does response.sendRedirect(someUrl), these method calls will sometimes throw IllegalState exceptions.  The (quick) way to get around throwing the exception is to add a return; statement right after it. Or you could put that kind of logic into a servlet if you have time.  I didn't (have time).&lt;br /&gt;- Having good logging is critical to debugging an app in an emergency.  Seeing my System.out.println() outputs in the tomcat console was like drinking hot chocolate after a day of skiing.  So RIGHT!  Of course I commented out those lines before we put the code into production.&lt;br /&gt;- Using technologies that don't required registry keys makes configuration and multiple environment installations very easy.  I found that I could write two short paragraphs of directions (documentation?) and that was enough for my client to install java and Tomcat into their new test environment by himself. (Pretty much copy - paste, and add the JAVA_HOME system variable and add the j2sdk...\bin onto the Path system variable).  They were very happy about that too.&lt;br /&gt;- Having hard coded path references to properties files in java code is &lt;span style="font-weight: bold;"&gt;so nasty&lt;/span&gt;!  Every time we changed the path, we had to recompile all our classes.  I know that's not the right way to do things, but the client just wanted to get things working and worry about refactoring later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1031352687035040566?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1031352687035040566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1031352687035040566' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1031352687035040566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1031352687035040566'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/replatforming-app-in-21-hours.html' title='Replatforming an app in 21 hours....'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3720240638134612386</id><published>2009-03-05T07:17:00.000-08:00</published><updated>2009-08-06T11:08:07.502-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Groundwork/Nagios and Rockstars</title><content type='html'>I've implemented &lt;a href="http://www.nagios.org/"&gt;Nagios&lt;/a&gt; at a few different places.  In my current position, I've implemented Nagios with &lt;a href="http://www.groundworkopensource.com/"&gt;Groundwork&lt;/a&gt;, and I'm really happy with it.  Groundwork provides a 'community' (free) version of their tool on a VM imaged instance that you can just plunk into a VM client.  We use the npre_nt agents to monitor specific services and metrics on a number of windows servers.  I reconfigured some of the vbscripts in the remote agents to call different methods in the WMI api which I've detailed in &lt;a href="http://www.groundworkopensource.com/community/forums/viewtopic.php?f=22&amp;amp;t=1969"&gt;this forum&lt;/a&gt;.  I've also customized the check_mssql to call specific tables looking for issues in production data (querying for held up business processes and corrupted documents). In order to do this, I had to download &lt;a href="http://www.freetds.org/"&gt;freetds&lt;/a&gt; and install it on the VM, overriding the default installation target with /usr/local/groundwork/.  Then the freetds.conf file gets put into /usr/local/groundwork/etc and you can configure the servers you want to call in there.  I put two configs for each server I wanted to call in that .conf file as I wanted to be able to test from the command line.  I found that groundwork ends up calling using the IP of the box  - so each server conf has a proper domain name config, and a IP name config.&lt;br /&gt;One other thing about configuring the Groundwork/Nagios installation - I had to configure the CentOS to point to our exchange server so the email notifications would work.&lt;br /&gt;&lt;br /&gt;I've read a couple of of good tech books lately (I now own them both).  &lt;a href="http://www.pragprog.com/titles/mnee/release-it"&gt;Release It!&lt;/a&gt; by Michael Nygard, and &lt;a href="http://ridingthecrest.com/"&gt;Secrets of Rockstar Programmers&lt;/a&gt; by Ed Burns.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3720240638134612386?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3720240638134612386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3720240638134612386' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3720240638134612386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3720240638134612386'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/groundworknagios-and-rockstars.html' title='Groundwork/Nagios and Rockstars'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-8131708662591939634</id><published>2009-03-04T13:03:00.000-08:00</published><updated>2009-11-11T10:00:03.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='network security'/><title type='text'>Schema Crawler</title><content type='html'>I got back to using &lt;a href="http://schemacrawler.sourceforge.net/"&gt;schema crawler&lt;/a&gt; this week, trying to make sure we can explain the inconsistencies we see in the metadata between our different environments.  I found this &lt;a href="http://it.toolbox.com/blogs/teach-it/port-scanner-in-a-bash-command-line-24604"&gt;cool little script&lt;/a&gt; to do port scanning so I could discover which ports our DB's were using.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;HOST=127.0.0.1;&lt;br /&gt;for((port=1;port&lt;=65535;++port)); do echo -en "$port \n"; if echo -en "open $HOST $port\nlogout\quit" | telnet 2&gt;/dev/null | grep 'Connected to' &gt; /dev/null;&lt;br /&gt;then echo -en "\n\nport $port/tcp is open\n\n";&lt;br /&gt;fi;&lt;br /&gt;done&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-8131708662591939634?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/8131708662591939634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=8131708662591939634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8131708662591939634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8131708662591939634'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2009/03/schema-crawler.html' title='Schema Crawler'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3111494328931656495</id><published>2007-10-17T18:50:00.000-07:00</published><updated>2009-03-11T05:21:20.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tibco'/><title type='text'>Tibco and Certificates</title><content type='html'>I've been messing around for the past two weeks with certificate chains, different certificate libraries, and keystores in Tibco with a third party provider.  Man, what a mess.  To come into a project where nothing is documented about which certs are used and have more than half a dozen of them (legacy) littered here there and everywhere around the module, along with another 7 or so new ones isn't happiness.&lt;br /&gt;   Interesting things I've learned through this experience are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It turns out that there are compatibility issues with .p12 certificates between java 1.4 and java 1.5.  I had a pkcs12 certificate that I could read and sign fine in java 1.5, and yet java 1.4 could not find the alias in the same certificate at all.  Apparently, there are a couple of ways around this issue - I only got one of them to work.  One way is to convert the .p12 certificate into a .pem cert, and then convert it back to .p12 (all of this with openssl).  The .p12 certificate is supposed to be readable after the conversion from .pem, but that didn't work for me.  I got some kind of invalid tag error.  What did work for me was to use &lt;a href="http://www.openssl.org/"&gt;openssl &lt;/a&gt;to convert the .p12 cert into a .pem cert and change my java 1.4 code to deal with the .pem file.  To do this I had to use a couple of jars in the &lt;a href="http://www.globus.org/toolkit/"&gt;globus &lt;/a&gt;library.  I remember something about a BouncyCastle class.  :-)  Also, here's a &lt;a href="http://archives.neohapsis.com/archives/postfix/2007-01/1333.html"&gt;link &lt;/a&gt;I found helpful to discover what kind of certs you are actually dealing with.&lt;/li&gt;&lt;li&gt;Getting those new external jars to work in Tibco Designer's Tester was a bit of a trick.  First I added them in tibco's jre/1.4.2/lib/ext directory.  That enabled me to compile the java code in the palette java item.  But when I went to run the tester, it said I had code I needed to compile !?!  I then I found I also had to add them into the path property in the tibco/designer/5.2/bin/designer.tra file so that Tibco's Tester would compile the code.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Trying to load the module into production, I ran into two exceptions in the Tibco adminstrator tool.  One was an OutOfMemoryError.  This was resolved by doubling the java heap property found in the tibco/administrator/5.2/bin/tibcoadmin-&lt;domain&gt;.tra file, and also doubling the values for the min/max heap size for the module, found under the module itself in the administrator GUI.  The second exception was a InputStream cut off IO error.  This was because my module was too big.  I was referencing java libraries that we already had referenced in a 'SharedResources' module we have.  Getting rid of those drastically cut down the size of my module and it loaded fine after that.&lt;br /&gt;&lt;/domain&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3111494328931656495?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3111494328931656495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3111494328931656495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3111494328931656495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3111494328931656495'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/10/tibco-and-certificates.html' title='Tibco and Certificates'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3596210615740754825</id><published>2007-10-05T21:32:00.000-07:00</published><updated>2009-03-11T05:25:21.923-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Looking for a Pragmatic Development Process</title><content type='html'>Consider for a moment, if you will, the delicate balance between robust, thoroughly quality assured code and the amount of time it takes to put that code into production.  I ran hard into the brick wall of 'development process' this week - an obstacle numerous people in our business had been complaining about, but I'm not sure how many people on the IT side of our organization understood.&lt;br /&gt;&lt;br /&gt;My story went like this.  We have some feedback from one of our applications that gets displayed in another in office application that was getting truncated.  This truncated information was deemed valuable by the SME's and so a fix was requested.  I looked into the fix, and it turned out to be a &lt;span style="font-style: italic;"&gt;one character&lt;/span&gt; change in a cold fusion file.  Getting this change implemented in production would not even require a server restart.  After getting the changed entered in our bug ticket system and socializing the change with the appropriate stakeholders, it seems that our development process requires that I wait a &lt;span style="font-style: italic;"&gt;full month&lt;/span&gt; before my change is actually implemented in production...  and we're (supposedly) an Agile shop.  What (on earth) is wrong with this picture?&lt;br /&gt;&lt;br /&gt;This isn't the first time the organization has run into this issue.  There have been other similar issues in the past - an email address needed to be changed.  Could you please wait 2 weeks?  If fact, this has turned into a major issue with upper level management (read execs), to the point that an entire system rewrite is being considered using a totally different technology with the main purpose being to cut in half (or more) the time it takes to get from requirements to production.&lt;br /&gt;&lt;br /&gt;Personally, I do not think that the business and management is going to find their silver bullet in implementing a different technology for development.   I think the problem lies in our development process being too rigid.  'We have one release a month - your changes go in that release and if you miss getting your change in by the code complete date, too bad'.  Different technology will expose other problems.  For example,  a lack of appropriate hooks (or a complete absence thereof) for proper unit testing. Or, an inability to version and automate the configuration and deployment of the new technology stack.&lt;br /&gt;&lt;br /&gt;Save a few million bucks on 'new technology' (it would really only be new to the company). Seems to me that it wouldn't be that difficult to set up a small, very part time team of a senior developer, a senior qa analyst, a senior ba, and an rm dude to assess these 'changes' that don't fit into agile's bug definition, but should be made in production quickly.  If the change is deemed relatively innocuous by the team, put on your cowboy hat's and let's have five minutes of fun.  Maybe that's going a bit too far - you want to capture the change in your build system.  Communicate the risk to your client (very likely the same person or close to them) whose asking for the change, and then make them happy.&lt;br /&gt;&lt;br /&gt;Please, don't make them wait a month for their change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3596210615740754825?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3596210615740754825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3596210615740754825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3596210615740754825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3596210615740754825'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/10/looking-for-pragmatic-development.html' title='Looking for a Pragmatic Development Process'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4301699382377344394</id><published>2007-09-24T19:35:00.000-07:00</published><updated>2009-08-06T11:07:18.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network security'/><title type='text'>Stealing the Network</title><content type='html'>Last week a friend at work handed me a book to check out.  It was called Stealing the Network.  Boy did I enjoy it.  It's basically a collection of 'fictional' hacker/security consultant stories.  The stories cover the whole gammit of hacking, from social engineering to deconstructing worms, to stealing a 0-day exploit.  I found it super interesting.&lt;br /&gt;&lt;br /&gt;In their stories, the authors go into detail with the kinds of tools they use.  &lt;a href="http://netcat.sourceforge.net/"&gt;Netcat,&lt;/a&gt; &lt;a href="http://www.snort.org/"&gt;Snort&lt;/a&gt;, John the Ripper, and &lt;a href="http://www.ethereal.com/"&gt;Ethereal&lt;/a&gt; all make an appearance, as well as many others.  It's interesting to compare the list of tools used in this book with the list at &lt;a href="http://sectools.org."&gt;sectools.org.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'd highly recommend the book if you're familiar with any of these tools or have an interest in secure networks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4301699382377344394?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4301699382377344394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4301699382377344394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4301699382377344394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4301699382377344394'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/09/stealing-network.html' title='Stealing the Network'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3709985702251955075</id><published>2007-09-13T18:38:00.000-07:00</published><updated>2007-09-13T19:32:25.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tibco'/><title type='text'>A Different Perspective...</title><content type='html'>I've been working with Tibco for the last two months.  Before that I was involved in a significant development effort building an automated build system for a large java development team.  What a difference in projects. &lt;br /&gt;&lt;br /&gt;Before this gig, I didn't have a lot of experience with big SOA (Service Oriented Architecture) solutions like Tibco.  Approaching Tibco's 'solution' from a java perspective is a bit of a shock.  Why?  Isn't Tibco coded in Java?  It certainly looks like it, however it's end users (I don't think) were supposed to be experience enterprise Java developers.  It appears to be geared more towards business analysts and 'light' coders.  ...Grab this component, drop it there, draw an arrow to it from that component.. etc.  I was somewhat aware of that going into the project.&lt;br /&gt;&lt;br /&gt;Probably the biggest surprise and 'Aha!' for me is Tibco's business model.  What I see is Tibco markets their product to the big decision makers (read: people who sign the cheques).  Generally, these people have a high level view of most things, including the development process and what actually happens behind the GUI of an application.  Tibco very successfully markets their products to these people, telling them that Tibco applications will 'take your system from greedy (as in a money sink) to speedy'.  It looks great on paper and running in a demonstration.  It looks like a Godsend to businesses that are fed up with waiting a month for the release cycle to finish so they can get their little text change posted in production.&lt;br /&gt;&lt;br /&gt;Who knows.. it might be.  It seems to come down to who really owns the business.  Who calls the shots about what the business direction is and what should be put into production?  Who's responsible if revenue doesn't meet expected targets?  Should the business be limited and reigned in by IT's processes because 'everything needs to be unit tested, smoke tested, functionally tested, regression tested, performance tested, and then tested in a staging environment'?  Sometimes it's fun to wear a cowboy hat.&lt;br /&gt;&lt;br /&gt;The Tibco tool we work with doesn't seem to have much in the way of a testing harness... at all.  Please feel free to set me straight on this - I want to know how to do some QA against a Tibco app.  Also, our Tibco application makes close to 2 dozen separate calls (between itself and over the wire with a significant amount of data) for 1 single request - it's VERY chatty.  Apparently, Tibco's solution to increase performance and make chatty applications run faster... throw more hardware at it.&lt;br /&gt;&lt;br /&gt;For me the jury is out.  I don't have enough experience yet to make an informed decision either way: Java enterprise or Tibco SOA.   You want granular control of how your application works at the lowest level and you don't need to turn production on a dime - I'd suggest Java.  If you want quick turnaround and a business oriented IT application, and you're not concerned about what's happening underneath the covers, maybe Tibco is the option for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3709985702251955075?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3709985702251955075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3709985702251955075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3709985702251955075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3709985702251955075'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/09/different-perspective.html' title='A Different Perspective...'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-76333901033019361</id><published>2007-09-12T18:47:00.000-07:00</published><updated>2010-07-12T11:53:20.912-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fusioncharts'/><category scheme='http://www.blogger.com/atom/ns#' term='random technical'/><category scheme='http://www.blogger.com/atom/ns#' term='cron'/><title type='text'>Flash boot, more cron, and caching.</title><content type='html'>I learned an interesting thing today.  Depending on the bios of your system, you can boot your box from a flash drive (memory stick).  The flash drive needs to be in the usb port when you start your box up though, otherwise the bios won't know that's it's available.&lt;br /&gt;&lt;br /&gt;I learned one more thing about cron today.  To get cron to run once daily, don't do this: '* 0 *** /opt/myscript.sh'.  What will happen is cron will wait until midnight to run, and then it'll run every minute because you've used a '*' instead of a '0' in the minutes space.  The correct format is '0 0 *** /opt/myscript.sh'.&lt;br /&gt;&lt;br /&gt;I've pretty much finished up my little project with FusionCharts.  However, I've noticed there a bit of an issue with caching.  It's actually not very consistent.  I can have 5 charts displaying 5 different data sets on one page, and 4 of them will update with new data, one of them will absolutely refuse to until I shut down the browser and open a new one.  (I'm working with Firefox, by the way). &lt;br /&gt;&lt;br /&gt;Firefox seems to really be in love with pages it's seen before.  I haven't just seen this issue with FusionCharts.  Some time ago we ran into a situation at work where clients were actually having to log in twice because the first login seemed to be ignored.  What was happening was Firefox was overwriting the cookie for the login page with the favicon cookie.  We had to examine every packet for each request to figure that one out.  We used an obscure setting in the ajp connector in tomcat's server.xml file to resolve that one. 'emptySession=true' or something like that - I can't remember it off the top of my head right now - it was a couple of months ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-76333901033019361?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/76333901033019361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=76333901033019361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/76333901033019361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/76333901033019361'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/09/flash-boot-more-cron-and-caching.html' title='Flash boot, more cron, and caching.'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4521489402604992204</id><published>2007-09-11T18:18:00.000-07:00</published><updated>2009-11-11T09:57:45.701-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Oracle &amp; perl</title><content type='html'>Continuing to work with SqlPlus and Oracle 10g.  Today I resolved two issues I had with an sql query. &lt;br /&gt;&lt;br /&gt;With the first problem, I was passing two parameters into the .sql file and when the sql was executed in the file, along with the selected information, it would output 'old ... my sql here with the params not replaced' and then 'new... my sql here with the params replaced'.  Thanks for that, but I know which params I'm replace, I don't need more notification of it.  It turns out getting rid of this notification is fairly easy.  At the top of the script, just put 'set verify off' and no more 'old...new' junk.&lt;br /&gt;&lt;br /&gt;In the second problem (same script) I was doing some division and there were instances where my divisor could be (and was) 0.  Sql doesn't like to divide by 0 at all (like pretty much every other language I've worked with).  There is a neat little fix to get around this as well.  My divisor looked like 'select count(a.blah) from ....'  and if you add 'select decode(count(a.blah),0,1,count(a.blah)) from ...' it will substitute a 1 if the selected count is a 0.  It worked super.&lt;br /&gt;&lt;br /&gt;Messing around with Perl some more, I discovered some good functions.  @myArray = split(/~/,$var); will take make an array of strings, seperating them by every '~' found in the string.  Working with arrays, push(@myArray, someValue) pushes a new value onto 'myArray'.  Pretty basic stuff, I know.  I like to celebrate small victories (and remember them for next time).&lt;br /&gt;&lt;br /&gt;Can you believe it, I hit a dog riding my bike on the way home from work today.  A big doberman.  He ran right infront of me.  I slammed on my brakes and my rear end came up.  I didn't hit him hard - but enough to put my handle bars out of alignment with my front tire a bit.  I fixed that at the first red light I stopped at.  I also just about hit a snake warming himself on the pavement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4521489402604992204?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4521489402604992204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4521489402604992204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4521489402604992204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4521489402604992204'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/09/continuing-to-work-with-sqlplus-and.html' title='Oracle &amp; perl'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-1514388509696554032</id><published>2007-09-07T22:01:00.000-07:00</published><updated>2009-11-11T09:55:11.894-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='fusioncharts'/><category scheme='http://www.blogger.com/atom/ns#' term='cron'/><title type='text'>Random assimilations and Business ideas</title><content type='html'>Today I learned that you can pass in parameters to .sql scripts that are destined to be run with sqlplus.  It looks like this: 'sqlplus -s dbuser/dbpasswd@dbname @scriptname.sql param1 param2' and then in the sql file you output the params using &amp;1 and &amp;amp;2.  I was finding though that for the replacement sqlplus was being verbose and telling me about every replacement it made.  I didn't like that so much, but couldn't figure out how to turn it off.  I've already got 'set headers off' and 'set feedback off' set at the beginning of the script.  I tried 'set logging off' but it didn't like that (because logging is set to off as a default I believe).  Anyhow, the replacements were working.&lt;br /&gt;&lt;br /&gt;With Oracle SQL, if you want to select back by a time interval, do something like this: 'select count(*) from my_log_table where logdatetime &gt; current_date - interval '15' minute;'  or you can use '- interval '6' hour' ... or '- interval '2' day' etc.  Single quotes around the number!&lt;br /&gt;&lt;br /&gt;Back to cron: to set cron to run every minute go '*/1 * * * * /scriptToBeRun.sh'  Every 3 minutes: '*/3 * * * * /script2BRun.sh'&lt;br /&gt;&lt;br /&gt;One problem I've run into with FusionCharts is the limitation of the Flash plugin to handle a big data dump.  Put more than a few graphs with, say, 50 datapoints each on a page, and the browser hangs and the plugin throws our of memory errors.&lt;br /&gt;&lt;br /&gt;Interesting IT Business Ideas:&lt;br /&gt;- Reusing software development tools for other industries/applications.  For example: other than the obvious issue with binary file types, why don't architects and lawyers use a repository like SVN,  or Monotone? ( I left out the ones you have to pay for :-)  We've tossed this idea around wondering if anybody has tried to market repositories this way....&lt;br /&gt;- Becoming a freeware software consultant for small businesses.  You can get everything from a good OS to all the 'openOffice' applications for free, not to mention what Google and others are putting on line (word processors and spreadsheets, etc), and universally accessible too!  Seems to me if you're good at training, you can really help small businesses save a buck on software by showing them how to use all the free stuff out there.  It wouldn't surprise me if people are doing this one already.&lt;br /&gt;- write a GOOD, scalable, secure, extensible front end framework for web applications.  There's a tonne of them out there now, but it seems like every one of them (Ruby, JSF, Struts, Facelets, Tapestry, SpringMVC, etc) has a downside.  I've had conversations with a number of knowledgeable architect types and they agree that there is no good front end web solution out there right now.  So, one could code a good freeware framework, consult using it, and then sell it to Red Hat (like the JBoss consultants did).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-1514388509696554032?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/1514388509696554032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=1514388509696554032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1514388509696554032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/1514388509696554032'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/09/today-i-learned-that-you-can-pass-in.html' title='Random assimilations and Business ideas'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-5410632006504152302</id><published>2007-09-05T19:05:00.000-07:00</published><updated>2007-09-05T19:27:31.208-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fusioncharts'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='cron'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Got Something done today!</title><content type='html'>...or at least, it felt like it.  After doing housekeeping with our production application yesterday at work, today was a 'sit down and code' day.  Boy did it feel good.  I had told myself that I had to get this charting solution finished today or it would turn into a waste of time.  It turns out that FusionCharts are super easy to implement, and boy, do they look sharp.&lt;br /&gt;&lt;br /&gt;In my 'solution', I'm using Nagios to provide the data, with its 'service-perfdata' process.  That file gets big quickly.  I just enabled it in the Nagios configuration on Friday last week, and I already had 12 Megs of data.  Going through the Nagios documentation and forums, there doesn't appear to be any mechanism to 'roll' this file or archive it or buffer it....  It had me stumped for a while.  Then I realized I could just do a simple 'tail -1000 service-perfdata.out &gt; service-perfdata.out' in a shell script with a cron job, and presto - a simple fix.&lt;br /&gt;&lt;br /&gt;So, mental note to self.... whenever you're coding a shell script (or any kind of script) that gets run by cron, make all the file paths in the script(s) absolute.  I keep on running into this problem.  Cron is ignorant about everybody's profile and position.&lt;br /&gt;&lt;br /&gt;I just started coding with Perl this summer on this project, and I really like it.  Working with arrays is tricky and not very intuitive.  Otherwise, though, Perl is fantastic for whipping up something quick.  Today I found out that you can use &amp;&amp;amp; and || in conditional 'if' statements.  That was good.  Also, something I've noticed in the past and ran into again today - the 'chop' and 'chomp' functions in perl don't seem to work like the documentation says they should.  I ended up having to something like this to get rid of spaces '$var =~ s| ||g'  - basically using sed (or the like) to get rid of spaces I didn't want.  Perl's localtime() function to convert unix to to something readable worked slick for me today.  Another thing I ran into not too long ago - the proper way to concatenate strings in Perl is with '.'&lt;br /&gt;&lt;br /&gt;Rode my bike into work today.  Just had the pedal axle fixed, and wow, what a difference.  The aphids are all over the place right now.  After a ride they are just plastered all over me.  It's hard to not breathe them in while one rides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-5410632006504152302?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/5410632006504152302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=5410632006504152302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5410632006504152302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/5410632006504152302'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/09/got-something-done-today.html' title='Got Something done today!'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-8403139129305350718</id><published>2007-08-31T21:46:00.000-07:00</published><updated>2009-08-06T11:06:22.516-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fusioncharts'/><category scheme='http://www.blogger.com/atom/ns#' term='cron'/><title type='text'>Assumptions and Critical Thinking</title><content type='html'>A couple of weeks ago I programmed a DB load process that ran off a cron job.  It ftp-ed data files from a public box to a local one, and then loaded the data based on .dat files that were extracted from the download, and .CTL files already on hand.  I assumed this process worked correctly because every time I ran it manually it worked, and when I started it using cron, it 'looked' like it workded.  It turned out that when it ran off the cron, it didn't do everything I wanted it to do.  I set about debugging this today, and it turned out that my problem was very similar to my PLSQL problem from earlier this week.&lt;br /&gt;&lt;br /&gt;   Part of the Load process used a java program to created create the .dat files.  The java worked fine when I ran it manually because the user I was running it with had JAVA_HOME set in it's profile.  Cron runs differently.  Even though my cron job su's to the proper user, doing the same thing manually and then checking with a 'who am i' command (which, by the way, gets different results than a 'whoami' command) returns a surprise. It's not my su'ed user.  Adding JAVA_HOME into the script that gets run solved the problem.&lt;br /&gt;&lt;br /&gt;   Been looking at graphing solutions for a little thing I'm working on.  &lt;a href="http://www.fred.net/brv/chart/"&gt;GDchart&lt;/a&gt; seems usable.  I might do some more work with it on Tuesday next week.  &lt;a href="http://www.fusioncharts.com/"&gt;FusionCharts&lt;/a&gt; seems very interesting as well.  I've worked with Cewolf and JFreeCharts in the past, but I need something quicker right now.&lt;br /&gt;&lt;br /&gt;   Picked up a book called Th!nk off the discount shelf at Cole's today.  I'm liking it so far.  It's something of a rebuttal to another book called Blink!.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-8403139129305350718?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/8403139129305350718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=8403139129305350718' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8403139129305350718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/8403139129305350718'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/08/assumptions-and-critical-thinking.html' title='Assumptions and Critical Thinking'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-3171737043400413537</id><published>2007-08-30T20:09:00.000-07:00</published><updated>2009-11-11T09:59:28.854-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Nagios and things part 2</title><content type='html'>So I got to work this morning (with a fresh mind) and after a bit of googling figured out my problem in 30 minutes.  Basically it boiled down to adding a reference to ORACLE_HOME in the bash script itself, and the full path of SQLPlus.  After that, things ran fine even with changing the permissions of the scripts and related files back to normal and running Nagios with the Nagios user.&lt;br /&gt;&lt;br /&gt;One of the 'nice to haves' for this little monitoring things I'm working on in Nagios is graphing capability - so we can see trends of the performance data at a glance.  Just before I left today, I discovered that Nagios might install with this capability commented out.  I let you know for sure in my next post.&lt;br /&gt;&lt;br /&gt;While I was working on solving the graphing problem a different way, I got focused on some graphing addins for Nagios that required perl modules I didn't have.  I learned that cspan is basically like 'yum' for perl.  Didn't know what it was before today.  In fact, I haven't had any exposure to perl before this project.  It's all good - learning new stuff every day.&lt;br /&gt;&lt;br /&gt;I also learned a big way to correct my golf swing today.  I need to grip hard with my left hand and the right hand is just for support.  I was driving much better and more consistently after I made that adjustment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-3171737043400413537?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/3171737043400413537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=3171737043400413537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3171737043400413537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/3171737043400413537'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/08/oracle-and-things-part-2.html' title='Nagios and things part 2'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-2165712226856155150</id><published>2007-08-29T22:07:00.000-07:00</published><updated>2009-03-11T05:20:50.490-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Nagios and things</title><content type='html'>I've done a couple of installations of &lt;a href="http://www.nagios.org/"&gt;Nagios&lt;/a&gt; now, and I quite like as a monitoring tool.  Today I was working on coding a custom plug-in so we could keep an eye on a particular KPI.  This involved running something of a complex query in Oracle and then sending the results to Nagios.&lt;br /&gt; Writing the shell script wasn't difficult.  The Nagios plug-in developer documentation was clear enough for me to follow.  It took me a few minutes to figure out how to return the codes that Nagios is looking for - 'exit 1, or exit 2, etc'.  However, to try and get Nagios to automatically run SQLPlus is a totally bear.  I'm going to sleep on it tonite.  I've tried changing perms on all the files, even tried changing the ownership to oracle and setting the SUID - no dice.  Tried running Nagios as root (not recommended, but I had to try), and set all the Oracle environment variables in the .bash_profile for all the users I could think of that might possibly be running that code.  I tried doing a su -c 'call my script here' oracle, and that didn't work either.&lt;br /&gt;&lt;br /&gt; Oracle posts online regarding SQL*Plus 43 initiation errors etc. are pretty sparse.  In my opinion, it's just more fodder for people who advocate using 3rd party free ware.  At least if it's broken, somebody has likely run into the same issue and posted it online.  With Oracle and Tibco, it seems like they guard their support forums with their life (maybe Oracle not so much so).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-2165712226856155150?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/2165712226856155150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=2165712226856155150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2165712226856155150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/2165712226856155150'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/08/nagios-and-things.html' title='Nagios and things'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3710704267775157311.post-4700508635449965696</id><published>2007-08-27T22:11:00.000-07:00</published><updated>2009-11-11T09:58:36.580-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='tibco'/><title type='text'>Oracle, Tibco, and tcpdump</title><content type='html'>I've started a new project recently that uses Tibco with an Oracle backend.  It still amazes me the little nuances of domain knowledge that are so key to being a productive developer on some of these 'platforms'.&lt;br /&gt;My issue today was a query I was trying to run using the jdbc 'component' in Tibco.  It's pretty finicky about SQL syntax.  I needed aliases for column names and it turned out the only way to get those to work is to use double quotes.  Single quotes work if you want to hardcode what you're returning in your select statement.  Double quotes (I was told) are effectively ignored by Oracle unless you're trying to alias a column.  I'm starting this blog mainly so I can keep these little nuances documented somewhere - I hope it'll help me remember in the future.&lt;br /&gt;&lt;br /&gt;I ran into a different configuration problem with Tibco last week which I had to use tcpdump to help me solve.  I used the command something like this: tcpdump -nnXi eth0 -port 8080.  This helped me realized that Tibco was responding to http GET and not http POST requests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3710704267775157311-4700508635449965696?l=continuouslylearning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://continuouslylearning.blogspot.com/feeds/4700508635449965696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3710704267775157311&amp;postID=4700508635449965696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4700508635449965696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3710704267775157311/posts/default/4700508635449965696'/><link rel='alternate' type='text/html' href='http://continuouslylearning.blogspot.com/2007/08/oracle-tibco-and-tcpdump.html' title='Oracle, Tibco, and tcpdump'/><author><name>Perry McKenzie</name><uri>http://www.blogger.com/profile/15549600970437851514</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_QysY4o3RaGI/SzpNVgW78TI/AAAAAAAAAAM/k_Unfc4tRig/S220/me.jpg'/></author><thr:total>0</thr:total></entry></feed>
