I spent a good three weeks troubleshooting this issue and finally found the solution.  It started when I decided to do several updates at once.  CF 8.0.0. to 8.0.1, apply the CFIMAGE hotfix, install a plethora of Windows updates (90+), and switch to the latest version of Java 6.

After several reboots, Coldfusion Application Server became unstable.  If I was lucky, it would take 3-4 service start attempts before it would run successfully.  And on occasion it wouldn’t last long.

  1. Event Viewer had no detail.
  2. Coldfusion Logs were similar ({cfapplication}\logs).  More useful if the application server is actually running.
  3. The runtime logs is where it’s at ({cfapplication}\runtime\logs\coldfusion-out.log).
  4. As well as runtime bin logs ({cfapplication}\runtime\bin\hs_err_pidxxxx.log).

“EXCEPTION_ACCESS_VIOLATION Java HotSpot(TM) Server VM problematic frame in ntdll.dll”

But what does this mean?!  I exhausted just about every effort.  Google searching kept returning people receiving unrelated memory errors.  I tried 5 different JVMs including the one that came with CF8.  Different JVM startup arguments.  Uninstalled Fusion Reactor.  Reinstalled CF8.  Rebuilt the VM from scratch.

Reinstalling CF8 actually worked, but as soon as I changed the Maximum JVM Heap Size to anything other than the default 512m, I was back to receiving the same error.  Unfortunately I didn’t realize changing the memory was the problem because CF started just fine as it sometimes it would.

On another server, I didn’t want to mess with Coldfusion at all and decided to only install Windows Updates.  That server became unstable.  Awesome.  I wonder which of the 90 Windows Updates caused this?

I’m usually pretty good at finding answers to my problems, but this one really took me down a notch and made me feel less of a person.  Weeks had gone by and I kept ending up back at the beginning.  I tried everything. Everything except for the one simple thing that would fix it.  Maybe I wasn’t good enough at my job, the one where I’m solving problems every day.

A few days later I knocked the JVM max memory back down to 512m.  CF started.  I restarted 20 times, even rebooted the machine, and it stayed up.  Nice!  Even though 512m isn’t enough, at least I know it’s memory related.  I tried 640m and 768m.  They would work more often than 1024m, but not good enough for production.  I assume it’s not a physical memory issue because I’m getting the same error from a VM on a different server.

Late in the evening, before I would call it quits by hitting the bottle, I did one last Google search.  Which lead me to this Server Fault link which mentions a specific Windows Update and that update having a subsequent hotfix for it.  The Knowledge Base article mentions an issue with the Microsoft ISA Server Control service failing to start on servers where multiple cores were registering as multiple CPUs.  My VM is a dual core running on an 8-core host.  After installing the hotfix and rebooting, all my problems went away.

The good thing about this whole mess is while I felt dumber the longer it went on I learned a good amount while reading up on JVMs, error logging on the CF and Java side, various JVM arguments and what they can do for the server, Citrix XenServer tidbits, and installing and configuring our web servers from scratch.

 

There have been a few occasions where I have need to print a large scale image across multiple pages.  Maybe I wanted to print a long list of tables+columns in a database schema or a snapshot of a web page.  Most commonly, the apps I use would only shrink or crop a large image to one page.  If I absolutely had to break it apart I would cut the image up and print each one individually.  Very time consuming.

I came across an Ask MetaFilter post of someone asking for the same thing and one of the responses mentions MS Paint.  Could it be true MS Paint actually has a use?  I don’t know how long it has supported this feature, but it does indeed allow you to print large scale images across multiple pages.

Start by pasting an image in MS Paint.  Then go to document menu -> Print Preview -> Page Setup:

The Fit to: option in page setup is something I’m most familiar with when printing Excel documents.  Simply select the number of pages wide by number of pages tall, click OK, verify the preview, print, and you’re all set.

Technology is amazing.

 

You have just installed the Tomato firmware on your LinkSys or Buffalo router and your ISP was kind enough to give you more than one public static IP. What you’d like to do is point each IP to a different machine on your network.

1. Configure static local IPs for each machine on your network

You can set this on the router side as opposed to having to configure each computer individually. With each machine connected to the router (wired or wireless), log into the Tomato administration interface and go to Status -> Device List. Click on the current IP of each machine and set the IP Address to something that’s easy to remember. For example, if your network is on 10.10.0.1 and you have three computers, set each machine like this:

computer_one 10.10.0.50
computer_two 10.10.0.100
computer_three 10.10.0.150


Be sure that those IPs are outside of the DHCP range. For my home network I like to set DHCP to be in the 200-220 range. After setting the new local static IP click Save at the bottom. Click the Reboot link on the router and release/renew the connection on each computer to make sure they’re now pulling the new IP.

2. Configure the public static IPs on the router

From the Tomato administration interface go to Administration -> Scripts -> Firewall.

Example public static IPs from your ISP:

64.100.100.50
64.100.100.51
64.100.100.52


Update the 64.100.100.* and 10.10.0.* values below to match your actuals:

/usr/sbin/ip addr add 64.100.100.50/29 dev vlan1   
/usr/sbin/ip addr add 64.100.100.51/29 dev vlan1  
/usr/sbin/ip addr add 64.100.100.52/29 dev vlan1

/usr/sbin/iptables -t nat -I POSTROUTING 1 -p all -s 10.10.0.50 -j SNAT --to 64.100.100.50
/usr/sbin/iptables -t nat -I POSTROUTING 1 -p all -s 10.10.0.100 -j SNAT --to 64.100.100.51
/usr/sbin/iptables -t nat -I POSTROUTING 1 -p all -s 10.10.0.150 -j SNAT --to 64.100.100.52

/usr/sbin/iptables -t nat -I PREROUTING -d 64.100.100.50 -j DNAT --to-destination 10.10.0.50
/usr/sbin/iptables -t nat -I PREROUTING -d 64.100.100.51 -j DNAT --to-destination 10.10.0.100
/usr/sbin/iptables -t nat -I PREROUTING -d 64.100.100.52 -j DNAT --to-destination 10.10.0.150


Paste the following in the Firewall tab, click Save, wait for it to process, then Reboot the router again.

3. Allowing people from the outside to reach your server

Now let’s say you have a web server on 10.10.0.50 and you already have the server configured, you simply need a way for public traffic to reach it. From the Tomato administration interface, go to Port Forwarding -> Basic. Under “Src Address” put the public static IP (64.100.100.52). “Ext Ports” should be 80 (assuming that’s the port your web server is running under). “Int Address” set to 10.10.0.50. Add a description like “Web server”. Save.

If all is well, you should now be able to hit the public and reach your local web server. You’ll want to setup host headers and DNS records to make it more user friendly, but that’s outside the scope of these post.

Note: Be sure to only expose the ports necessary for the services you want available and patch your server OS and web server to the latest version.

 

Right around the time the Apple iPad came out I decided to upgrade my Dell Latitude X1 (Samsung Q30) ultraportable notebook.  I wanted something I could used to comfortably browse the Internet while sitting on the couch.  I bought the X1 in 2005 as my primary notebook at work.  It lasted for a good two years and is still the best notebook I’ve owned to date.  Sadly, when I upgraded to another notebook my X1 essentially sat around and collected dust.

Late last year I jumped on the Solid State Disk bandwagon and got one for my work notebook.  Like many others have already said, it’s the best upgrade you can make to a notebook and for any power user is worth every penny.

Now, one of the greatest aspects of the X1 is it being fanless.  The only noise you’ll hear is the HDD access coming from the 1.8” drive inside.  I wondered if there were 1.8” SSD drives that would work in the X1 to make it completely silent.  Google quickly pointed me in the right direction.

The highlights:

  • The notebook comes with 1 GB memory + 256 MB on-board.  At the time there weren’t single 2 GB memory sticks for this notebook, but now they are available and work just fine (even ones marked for higher speeds).
  • Rather than going with an SSD, you can install a larger, faster than the stock drive 1.8” HDD for much less.  You’ll just need to buy an adapter for the HDD which fits really tight in the notebook.
  • Most people have been chasing the 32 GB MTron SSD drive, but I haven’t had much luck finding it at a low price (discontinued?).  KingSpec makes 8 GB through 128 GB compact flash 1.8” SSD drives.
  • You can put 16 GB, even 32 GB SDHC Flash memory into the SD card on the front and instantly have even more storage space.

What I purchased:

Each item I ordered can be considered an individual upgrade and I can confirm that each one works.  No part is dependent upon another which makes it easy to tailor your upgrade to what you’re in need of.  You might even be able to upgrade the display, but I’m not interested in that.

SSD Drive Performance Results

Unfortunately I don’t have results from before the upgrade, but if you have an X1 with a stock HDD I’d love to see your results.  The results aren’t as impressive as I was expecting on the writes side, but the read speed is not bad at all.\

Additional Resources:

 

Over the past two days I redesigned my site and officially moved it to Tumblr from Mango Blog (and previously from BlogCFC).  The two main reasons for the move was to find a hosted solution and something that’s quicker to post to in hopes that I’ll post more often.

Tumblr supports RSS feeds which I planned to use for photos and recent posts lists, but you’re limited to the latest item and new items going forward.  Not so good when you have historical data you want to backfill.  Instead, I setup a scheduled task to pull down a list of feeds, format each feed to a specific layout, and copy up to Amazon S3.  Then I just needed to include the iframe as part of the theme.

I’ll post the Coldfusion/CFML code I have for this along with the what I wrote to import my old posts.

I’m going to attempt to set a schedule for blogging regularly primarily for my own reference.  Either development projects I’m personally working on or work-related problems I’ve come across and resolved.  Not to mention some of the other topics you’ll find links for in the header/footer.

 
I want to build my own MOO to hide in.

I want to build my own MOO to hide in.

 

I’ve run into this a few different times at work.  You have a web page script that calls a SQL Stored Procedure and all of a sudden it takes 10-20x longer than it normally does to finish.  If it’s a hefty query it could timeout.  When you execute the proc or take the code within and manually run it in a query window it runs as it should.

The solution is a quick Google search away (assuming you know what to search for).

“Parameter sniffing” refers to a process whereby SQL Server’s execution environment “sniffs” the current parameter values during compilation or recompilation, and passes it along to the query optimizer so that they can be used to generate potentially faster query execution plans. The word “current” refers to the parameter values present in the statement call that caused a compilation or a recompilation.

Quick solution, change:

CREATE PROCEDURE books_by_subject_lis @foo nvarchar(50)
AS BEGIN
    SELECT title, description
    FROM book
    WHERE subject = @foo
END

To:

CREATE PROCEDURE books_by_subject_lis @foo nvarchar(50)
AS BEGIN

    DECLARE @localFoo INT -- Declare local var
    SET @localFoo = @foo -- Set local var
    
    SELECT title, description
    FROM book
    WHERE subject = @localFoo -- Use local var
    
END

Resources:

http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/
http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html

 

A problem I’ve been having with the Daily Puppy widget I have on Petnibs.com is it doesn’t display the same size image each day.  Aside from the laziness on their part, it meant the iframe I was using would never be the perfect size.  Either there would be extra space below it or it’d cut off part of the featured image.

It’s easy to resize/manipulate a local domain iFrame based on the content, but Petnibs is on a hosted platform and the Daily Puppy widget lives on another server.  It takes a little bit more effort, but the solution I found on Adam on Life explains it well and is pretty cool.

Pages Need:

  1. Parent - loads the iFrame widget, included global iFrame resizing javascript.
  2. iFrame 1 - the content of the widget, on another domain, includes iFrame 2, and tells iFrame 2 what size iFrame 1 is.
  3. iFrame 2 - is on the parent domain, checks to see if a height value exists in the URL string, passes value to iFrame resize script on parent.

Basically since Parent and iFrame 2 are on the same domain and linked together by iFrame 1, iFrame 2 is able to call functions on Parent and pass in values.

 

How to add a “What is your question?” field at the top of all your pages so users can start asking a question from anywhere. I posted screenshots on the Meta Stack Exchange site, but wanted to post more detail here for others to get at.

Submitting the form takes you to the normal Ask Question page, pre-populates the form with your question, and displays any related questions above the form field.

Below is the code to implement a generic version of this form. I removed any style attributes that were specific to Petnibs.

CSS
Add to the theme custom CSS field

/* ========================= */
/* Ask Question */
/* ========================= */

#content { margin-top: 64px; }

#ask-question-form {
padding: 0px;
position: relative;
top: 88px;
width: 470px;
}

#ask-question-form form {
margin: 0px;
padding: 0px;
}

#ask-question-form input {
font-size: 17px;
float: left;
width: 348px;
}

#ask-question-form button {
cursor: pointer;
float: left;
font-size: 130%;
font-weight: bold;
height: 31px;
line-height: 31px;
margin: 5px;
padding: 0px 8px;
}

/* ========================= */
/* Search results */
/* ========================= */

#search-title {
margin-top: 18px;
}

#search-message {
color: #F00;
line-height: 18px;
margin-top: 18px;
}

#search-results {
max-height: 165px;
overflow: auto;
width: 665px;
}

#search-results .question-summary {
padding-bottom: 2px;
padding-top: 2px;
width: 640px;
}

#search-results .summary {
width: 450px;
}

#search-results h3 {
font-size: 14px;
margin-bottom: 2px;
margin-top: 2px;
}

#search-results .search-text {
font-size: 11px;
line-height: 13px;
}

#search-suggest {
color: #888;
padding-left: 8px;
}

Ask Question Quick Form Code
Add to the end of the Linkbar content field

Ask

<div id="ask-question-form">
	<form action="/questions/ask" method="get">
<input id="question" name="question" type="text" value="What is your question?" />
<button>Ask</button>
</form>
</div>


Ask Question Form Code
Add both sets of code to the end of the Question Help content field. For the second block, wrap it with <script type=”text/javascript>…</script>.

<style type="text/css">
#ask-question-form { display: none; }
#content { margin-top: 45px; }
#question-suggestions { display: none; }
</style>

Look for //modify and tweak those lines to your preference.

// Insert new elements
$("#post-form").before('<div id="search-message" style="display: none;"></div>');
$("#post-form").before('<h3 id="search-title" style="display: none;"></h3>');
$("#post-form").before('<div id="search-results" style="display: none;"></div>');
// Set question title field from url.question if blank
$().ready(function() {
if ($("#ask-error-container").length == 0) {
if ($("#title").val().length == 0) {
if ($.getUrlVar('question').length > 2) {
$("#title").val($.getUrlVar('question'));
QuestionSuggestions();
}
}
}
});
// Override QuestionSuggestions()
QuestionSuggestions = function() {
var s = $("#title").val();
if (s.length > 2) {
document.title = s + " - [site_name.com]"; // Modify
$.ajax({
url: "/search/titles?like=" + escape(s),
cache: false,
success: function(data){
$("#question-suggestions").html(data);
process_results();
}
});
}
}
// Plugin to retrieve URL variables
$.extend({
getUrlVars: function(){
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for(var i = 0; i < hashes.length; i++)
{
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
},
getUrlVar: function(name){
var return_string = $.getUrlVars()[name];
return_string = jQuery.trim(return_string).replace(/\+/g,' ');
return unescape(return_string);
}
});
// Display related results
function process_results() {
var results = $("#question-suggestions").html();
var htmlString = "";

results = jQuery.trim(results);

if (results != "That's not a very good title. Can you add some more unique words to it?") {

// Change results to related questions list, clear out any previous results, show count
results = $(".answer-summary");
$('#search-results').html('');
$('#search-title').html('Related Questions (' + results.length + ')');

// Loop over related questions and create new HTML string to display results
$.each(results, function(i, n) {

var htmlString = "<div class='question-summary narrow id-"+i+"'>";
var textString = "";

// Add question votes
htmlString += "<div class='search-link'>" + $(this).find(".answer-link").html() + "</div>";

// Add answer votes
votesCount = $(this).find(".answer-votes").text();
if ( votesCount == 1) { votesString = "<div>vote</div>"; } else { votesString = "<div>votes</div>"; }
htmlString += "<div class='votes'><div class='mini-counts'>" + $(this).find(".answer-votes").text() + "</div>" + votesString + "</div>";

// Add title
htmlString += "<div class='summary'><h3>";
htmlString += "<a href=" + $(this).find("a.question-hyperlink").attr("href") + ">";
htmlString += $(this).find(".question-hyperlink").text();
htmlString += "</a></h3>";

// Add summary
htmlString += "<div class='search-text'>" + $(this).find("a.question-hyperlink").attr("title") + "</div>";
htmlString += "</div></div>";

// Insert into DOM
$('#search-results').append(htmlString);

// hacky : Remove href from answer-link, string spaces and parentheses, replace content
$('#search-results .id-'+i+' a.question-hyperlink').remove();
textString = $('#search-results .id-'+i+' .search-link').text();
textString = textString.replace(/[\(\)\.\-\s,]/g,'');
if (textString == '') { textString = "<div class='status'><div class='mini-counts'>0" } else { textString = "<div class='status answered'><div class='mini-counts'>" + textString };
if ( textString == 1) { answersString = "<div>answer</div>"; } else { answersString = "<div>answers</div>"; }
textString = textString + "</div>" + answersString + "</div>";
$('#search-results .id-'+i+' .search-link').replaceWith(textString);

});

$("#search-message").html("Your question may have already been asked.<br />Please review the following related questions before submitting a new one."); // Modify
// Show related search results
$("#search-message").show("fast");
$("#search-title").show("fast");
$('#search-results').show("slow");

}
else {

$("#search-message").html("Your question seems too short. Are there additional unique words you can add to it?"); // Modify
// Show results - message only
$("#search-message").show("fast");
$("#search-title").hide();
$('#search-results').hide();
}
}
 

Just got back from the Stack Overflow DevDays conference in LA.  Overall it was worth the price of $99 a ticket and is unheard of.  I enjoyed the speakers, many of which are making me itch to learn a new language (Python in particular).

Available Swag


The Crowd

The crowd seemed a bit light.  My guess would be 150 people.  A few members of my team weren’t able to make it at the last minute either.  And as expected, most software developers are shy and had trouble mingling with strangers.  I know I personally, really wanted to say high to Joel & Jeff and shake hands.  Everyone was respectable, though.

Favorite Presentations


The Not-So-Favorites

  • Wi-fi was horrible and caused slowdowns / problems for some presenters not being able to pull up something in their browser.  Aside from the Google App Engine everything else should have been local or cached.
  • Some presentations dragged on and were uninteresting.  Or would have been more interesting had it not been slowed down by coding bugs or build executions of which I can’t imagine an actual developer having to sit through 100 times a day.
  • Wished Jeff Atwood would have had more to present.  I liked listening to his short talk.
  • Was a bit hard to find the room, but maybe I should have read the directions before heading out rather than looking them up on my phone while wandering around.
  • Not enough networking with other developers, but as I said, probably the fault of scared developers released out into the real world.

Other Goods

  • The coffee was good, though at times not hot.
  • Cookies were amazing!
  • During the lunch break there were tables set out each with a specific topic to break off and discuss with others.  I missed listening in to any because we headed off to Chipotle for food.  The conference was serving salads, cookies, chips, muffins, and beverages.
  • Kiln for FogBugz was announced.  Looks pretty great, but not an option for people who host FogBugz internally.
  • Audience members had a chance to announce they were hiring and able to meet developers.  Also a time for anyone to mention local user groups in the area.  Sadly, very few were mentioned.

In the end, would I go next year?  Yes! The price alone makes it a no-brainer.  However, if it’s the same talks it will get boring fast.  The presentations were all introductory and pretty easy to grasp.  More intermediate talks would be cool.  Technology is always advancing so I imagine it won’t be hard to find new topics.  Couch DB or principle talks of software development / project management would be great. I hope some people post pics. I wanted to do a Qik video stream, but wasn’t sure if it would be allowed.