tag:blogger.com,1999:blog-297042972024-03-21T09:14:39.542-04:00Jeremy Gerrits' WeblogMusings on all things Java(Script) - and maybe some other crap too...Unknownnoreply@blogger.comBlogger54125tag:blogger.com,1999:blog-29704297.post-89240375307404401562014-05-28T09:30:00.004-04:002014-05-28T09:30:52.617-04:00JavaScript Pro-tipWhen using <code>setInterval</code>, never ever forget the second argument.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-72302703334219371972012-12-21T13:12:00.000-05:002012-12-21T13:12:06.931-05:00Getting the connection (with some AOP too!)<h3>
Abstract</h3>
If you need the raw OracleConnection so you can use End-to-End Metrics and you're using a JNDI data source from WebSphere, you need to jump through a few hoops.<br />
<br />
<h3>
The Details</h3>
Some up-front info: the project I'm on is running some old software so I'm not sure how relevant any of this is to anyone but me. We are using Spring 2.0.6, Hibernate 3.2.5, WebSphere 6.x and Oracle 10g...<br />
<br />
Anyways, we wanted to implement Oracle's End-to-End metrics so that we could have a better way to see what each user is doing on the system and where potential problems might lie in relation to the database. We also wanted the code to be as non-intrusive as possible - adding new code everywhere would be a total pain.<br />
<br />
I decided to use AOP which allow us the ability to attach code anytime a method on a DAO is called. It works quite well, even with Spring 2.0.<br />
<br />
Back to the original idea, here's the code to get the <span style="font-family: Courier New, Courier, monospace;">OracleConnection</span>:<br />
<br />
<code>import org.hibernate.jdbc.ConnectionWrapper;<br />
import com.ibm.ws.rsadapter.jdbc.WSJdbcConnection;<br />
import com.ibm.ws.rsadapter.jdbc.WSJdbcUtil;<br />
import oracle.jdbc.OracleConnection;<br />
<br />
Connection conn = session.connection();<br />
org.hibernate.jdbc.ConnectionWrapper cw = (ConnectionWrapper) conn;<br />
WSJdbcConnection connws = (WSJdbcConnection) cw.getWrappedConnection();<br />
OracleConnection oc = (OracleConnection) WSJdbcUtil.getNativeConnection(connws);<br />
</code><br />
<br />
With <span style="font-family: Courier New, Courier, monospace;">session</span> being the Hibernate session (I added the imports so you wouldn't have to look for them later).<br />
<br />
Now that you have the <span style="font-family: Courier New, Courier, monospace;">OracleConnection</span>, you can easily add the code for the metrics:<br />
<code><br />
String[] metrics = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];<br />
metrics[OracleConnection.END_TO_END_MODULE_INDEX] = module;<br />
metrics[OracleConnection.END_TO_END_ACTION_INDEX] = action;<br />
metrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = userName;<br />
oc.setEndToEndMetrics(metrics, (short) 0);<br />
</code><br />
<br />
Now that the hard stuff is out of the way, let's throw in some AOP. Using Spring's AOP XMLNS makes this quite easy. Basically we will define our Aspect bean and then configure it as a before-type aspect.<br />
<code><br />
<bean class="com.djs.OracleMetricsAspect" id="metricsAdvice" /><br />
<aop:config><br />
<aop:aspect ref="metricsAdvice"><br />
<aop:before method="addMetrics" pointcut="execution(* com.djs..*DAOImpl*.*(..))" /><br />
</aop:aspect><br />
</aop:config><br />
</code><br />
<br />
This will run the <span style="font-family: Courier New, Courier, monospace;">metricsAdvice</span> before any method that's executed in any class that's contains DAOImpl in it's name.<br />
<br />
So now that we have that finished, here's the <span style="font-family: Courier New, Courier, monospace;">addMetrics</span> method that's run in the <span style="font-family: Courier New, Courier, monospace;">OracleMetricsAspect</span> class:<br />
<br />
<code>public void addMetrics(final JoinPoint joinPoint) {<br />
try {<br />
if (joinPoint.getTarget() instanceof HibernateDaoSupport) {<br />
HibernateTemplate ht = ((HibernateDaoSupport) joinPoint.getTarget()).getHibernateTemplate();<br />
ht.execute(new HibernateCallback() {<br />
public Object doInHibernate(Session session) throws HibernateException, SQLException {<br />
String[] metrics = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];<br />
String className = joinPoint.getTarget().getClass().getName();<br />
String module = className.substring(className.lastIndexOf(".") + 1);<br />
if (module.length() > 48) {<br />
metrics[OracleConnection.END_TO_END_MODULE_INDEX] = module.substring(0, 48);<br />
} else {<br />
metrics[OracleConnection.END_TO_END_MODULE_INDEX] = module;<br />
}<br />
String action = joinPoint.getSignature().toShortString();<br />
if (action.length() > 29) {<br />
metrics[OracleConnection.END_TO_END_ACTION_INDEX] = action.substring(0, 29) + "(" + joinPoint.getArgs().length + ")";<br />
} else {<br />
metrics[OracleConnection.END_TO_END_ACTION_INDEX] = action + "(" + joinPoint.getArgs().length + ")";<br />
}<br />
metrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = SecurityUtils.getUserName(); // this is implementation specific<br />
try {<br />
Connection conn = session.connection();<br />
ConnectionWrapper cw = (ConnectionWrapper) conn;<br />
WSJdbcConnection connws = (WSJdbcConnection) cw.getWrappedConnection();<br />
OracleConnection oc = (OracleConnection) WSJdbcUtil.getNativeConnection(connws);<br />
oc.setEndToEndMetrics(metrics, (short) 0);<br />
} catch (Exception e) {<br />
logger.error(e.getMessage(), e);<br />
}<br />
return null;<br />
}<br />
});<br />
}<br />
} catch (Exception e) {<br />
logger.error(e.getMessage(), e);<br />
}<br />
}</code><br />
<br />
Since all of our DAOs extend Spring's <span style="font-family: Courier New, Courier, monospace;">HibernateDaoSupport</span>, we have access to the <span style="font-family: Courier New, Courier, monospace;">HibernateTemplate</span>. And from there we can get the Hibernate session. And from the <span style="font-family: Courier New, Courier, monospace;">JoinPoint</span>, we have access to the class name and method that's being called so we can use that for the module and action for the Oracle metrics. Below is a screenshot of what the DBAs see in OIM:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH1BctoxHhvKkGXf93Zkvo2AUPW0EijGmEJkBFFKaSr1WjznQbDADWXB54STVYAFbhCmHNsWXNRB4LckCy7G1XWznzAnFCaBi7BuPvIvRQzoSDCGGCmQ8DPIPTv4hrVQxJl-Ed3Q/s1600/OIM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH1BctoxHhvKkGXf93Zkvo2AUPW0EijGmEJkBFFKaSr1WjznQbDADWXB54STVYAFbhCmHNsWXNRB4LckCy7G1XWznzAnFCaBi7BuPvIvRQzoSDCGGCmQ8DPIPTv4hrVQxJl-Ed3Q/s1600/OIM.png" height="345" width="400" /></a></div>
<br />
Hope I didn't miss anything.<br />
<br />
Have fun coding!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-85434637339423040952012-03-27T10:09:00.002-04:002012-03-27T10:09:24.863-04:00JSP EL reserved wordTip for the day.<br />
<br />
You probably shouldn't use <span style="font-family: 'Courier New', Courier, monospace;">class</span> as a variable name in JSP EL. WebSphere 8 doesn't seem to like it.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-42004662523091331492012-03-02T10:05:00.001-05:002012-03-02T13:39:36.397-05:00Sitemesh ExcludesThis is more for me than for any of you :)<br />
<br />
If you don't want Sitemesh to decorate a page, use the <code>excludes</code> tag in your <code>decorators.xml</code> file. It will save you a lot of headaches.<br />
<br />
I was using this with version 2.4.2.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-42833000631512742252011-12-07T10:24:00.001-05:002011-12-07T11:49:04.019-05:00Double-tap on Mobile SafariI've been working on a client-side map (think Google Maps) that has to work in IE7 and other browsers. It also has to work on mobile Safari, specifically the iPad.<br />
<br />
This map is zoom-able to 4 levels deep and contains pins for specific locations. Tapping/clicking on these pins will either bring up a list of options (if pins overlap) or go directly to another page. As you can tell, I'm also using jQuery.<br />
<br />
Here's what I came up with:<br />
<br />
<code><br />
$('#map').bind('touchstart', function(e) {<br />
if ($(e.target).hasClass('disclosure') || $(e.target).parent().hasClass('disclosure') || (e.target.src && e.target.src.toLowerCase().indexOf('disclosure') > 0)) {<br />
map.jumpToPage(e);<br />
return false;<br />
}<br />
$('#flyover').hide();<br />
var oe = e.originalEvent;<br />
if (oe.touches.length == 1) {<br />
var tap = { at: new Date().getTime(), x: oe.touches[0].pageX, y: oe.touches[0].pageY, shortDelay: $(e.target).hasClass('pin') };<br />
if (!$('#map').data('firstTap') || ((tap.at - $('#map').data('firstTap').at) > 500)) {<br />
$('#map').data('firstTap', tap);<br />
} else {<br />
var firstTap = $('#map').data('firstTap');<br />
if ((tap.at - firstTap.at) <= (tap.shortDelay ? 300 : 500)) {<br />
$('#map').data('lastTap', tap); <br />
}<br />
}<br />
}<br />
e.preventDefault();<br />
}).bind('touchend', function(e) {<br />
var f = $('#map').data('firstTap');<br />
var l = $('#map').data('lastTap');<br />
setTimeout(function() {<br />
var f1 = $('#map').data('firstTap');<br />
var l1 = $('#map').data('lastTap');<br />
if (f1 && !l1 || f1 && l1 && (f1.at > l1.at)) {<br />
map.showPopUp({ pageX: f1.x, pageY: f1.y, target: e.target, stopPropagation: function() {} });<br />
}<br />
}, 301);<br />
if ((f && l && (l.at > f.at)) && map.getZoom() < 4 && !map.isZooming()) {<br />
map.zoomIn((l.x - $('#map').offset().left), (l.y - $('#map').offset().top));<br />
}<br />
});<br />
</code><br />
<br />
<code>#map</code> is the main map element, <code>#flyover</code> is the list of items to display if necessary.<br />
<br />
Here's how the code works:<br />
<br />
For "touchstart":<br />
<ul><li>When the map is first tapped, the first thing we check for is if it was a list item (has a class of <code>disclosure</code>). If it is, go to that page.<br />
<li>Make sure the <code>#flyover</code> is hidden. This is the root element for the pop-up.<br />
<li>Get <code>originalEvent</code> from jQuery since <code>e</code> doesn't contain the actual touch events.<br />
<li>Only continue if it was a single-touch event.<br />
<li>Create <code>tap</code> object that contains all the pertinent data we want to keep.<br />
<li>If this was the first time we've tapped on the map or it's been more than a half a second, save <code>firstTap</code>.<br />
<li>Otherwise, we compare <code>firstTap</code> to the current <code>tap</code> and if it's been less than 300ms for a pin or 500ms for the map, we save <code>tap</code> as <code>lastTap</code>.<br />
</ul>For "touchend":
<ul><li>Retrieve <code>firstTap</code> and <code>lastTap</code>.<br />
<li>In <code>setTimeout</code>, if <code>l1</code> doesn't exist or is older than <code>f1</code>, we run the <code>showPopUp</code> after 301ms. This is a specific scenario for when a user taps on a pin. A single-tap should show a pop up, but a double-tap will zoom in.<br />
<li>Finally, we zoom in on the map if <code>firstTap</code> is before <code>lastTap</code> and the map isn't zoomed all the way in or in the midst of zooming-in.<br />
</ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-35420894933216561132009-09-08T15:58:00.001-04:002009-09-08T15:58:32.803-04:00A couple of pics from Sundays race<p class="mobile-photo"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX36Hs9POlVzTX4EdGeFLrg6QBa-qO-_nRtEDNaVoxTVyvwqtfhRw-0YTmG8LQTQ_Tu8dlP5daEyFZ3WtmAfFBoVOan5qrfeaZjcrwa5MtzcBW-UiMryHbSGdHOV4B6-5Rai803w/s1600-h/1-712804.jpeg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX36Hs9POlVzTX4EdGeFLrg6QBa-qO-_nRtEDNaVoxTVyvwqtfhRw-0YTmG8LQTQ_Tu8dlP5daEyFZ3WtmAfFBoVOan5qrfeaZjcrwa5MtzcBW-UiMryHbSGdHOV4B6-5Rai803w/s320/1-712804.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5379188462963376386" /></a></p><p class="mobile-photo"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfqmR3g7tB__y4juufoyiOEaBmQMa-_BazmioGHGYCQ2e67Xn-0VdPxjXrWnnlEVI_GX4nTH3hE8XitQCxySxRuqGbZNB99uxQu40wmxd7_b8GCfh0EUVD_5HOjjAFxPqfh2EC1g/s1600-h/2-714093.jpeg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfqmR3g7tB__y4juufoyiOEaBmQMa-_BazmioGHGYCQ2e67Xn-0VdPxjXrWnnlEVI_GX4nTH3hE8XitQCxySxRuqGbZNB99uxQu40wmxd7_b8GCfh0EUVD_5HOjjAFxPqfh2EC1g/s320/2-714093.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5379188474866353762" /></a></p>A couple of pics from the last DINO race of the season. Rather slick because of the light rain but not nearly as muddy as last year.<br /><br />Middle of the pack as usual: 12 out of 20 for my age group, 36 out of 62 Cat3 overall.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-25573902216544911692009-08-13T11:25:00.001-04:002009-08-13T11:25:44.558-04:00DINO 2009 Race #3 - Versailles State Park<p>Wow. Where to start? So, the race was finally able to go on after being postponed for two weeks due to excessive amounts of rain. It probably wouldn't have been a huge problem since the sun came out each weekend but since one of the trails was only built a couple of weeks prior, the rain turned it into a soupy, slippery, dangerous mess. Suffice it to say that it was a good idea to postpone the event.</p> <p>An interesting day for us as well. After what was a good morning we ended up leaving quite a bit later than I wanted. This resulted in my starting with the 40+ group which was 2 minutes back from my class. Not really a problem since I'm not yet ready to stand on the podium.</p> <p>The trails at the park are pretty amazing. <a href="http://www.hmba.org/">HMBA</a> is, again, to be commended on their trail building, especially when you consider that all or most of it is volunteer work. The trails also integrate some of the unique features of the park, including what's called the Waterfall:</p> <p><img alt="" src="http://indytrekracer.smugmug.com/photos/595660735_3bK7M-M.jpg" /></p> <p>As you can see, this is just exposed rock and the trail follows along a natural ledge. Pretty amazing but can be quite slippery.</p> <p>Since I'm not much for planning, I didn't give much thought to making sure I was fueled up for the race. This was evident about halfway through when I felt like I was going to bonk. Luckily, I seem to have a good size reserve since I made it through to the end. I even passed somebody right before the finish line! I finished 10th out of 12 in my age group (wow, top ten!) and 21st out of 31 for Cat3 (<a href="http://www.dinoseries.com/results/mtb/2009/race5/Cat3Men.htm">results</a>). Even with my 2-minute deficit, it doesn't change my results at all.</p> <p>Overall, I thought it was a good race that could have been better had I done a better job of planning and preparing. This weekend is race #6 at France Park. I have to redeem myself since I DNFd last year. And I'll have a bigger cheering section, my mom and sister will be there!</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-40465330691798065982009-06-20T11:57:00.001-04:002009-06-20T11:57:21.433-04:00DINO 2009 Race #3 - Frank Park, Fort Wayne<p>Although I don't show up on the <a href="http://www.dinoseries.com/results/mtb/2009/race3/Cat3Men.htm">results</a> (the person running the computer missed me as I was riding by but the backup didn't), I did end up 25th overall for Cat3 men, 12th out of 14 for my age group.</p> <p>As usual, the second half of the race is always my better half. There are several short but somewhat steep climbs on the trail that, if you're not ready, will require you to get out of the saddle and hike it. Basically, the first lap I had to hike it, the second I was able to stay in the saddle.</p> <p>Overall, I thought the course was really nice. It's been a very wet Spring in Indiana but the trail, except for a few soft spots, was very nice.</p> <p>Since the family and I will be on vacation, we won't be attending race #4 at Muscatatuk Park. But we will be at Versailles State Park for #5. </p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-9058500862323639752009-06-11T15:52:00.001-04:002009-06-11T15:52:14.239-04:00Grrrrrr...... DBAs...<p><rant><br />This is a work related post so be prepared. Why is it that DBAs still don't know the layout of the schema even though they've been working on it for 2 years? I find that I'm constantly reminding them how the damn thing works.<br /></rant></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-44661060078297672552009-06-01T12:50:00.001-04:002009-06-01T12:50:57.695-04:00DINO 2009 Race #2 - Brown County State Park<p>Yesterday was DINO Race #2 and what a day it was. Temps in the mid to low 70s and low humidity. And excellent day to race.</p> <p>And a pretty good weekend to go camping. Yes, Dana and I took the kids camping at the State Park. It was at times a bit hectic but overall a lot of fun and the kids seemed to enjoy it, especially the s'mores.</p> <p>Anyways, here's the race results:</p> <p>Overall<br />Last year: 68/80<br />This year: 55/70</p> <p>Age group<br />Last year: 30/32<br />This year: 22/25</p> <p>Time<br />Last year: 1:10:17<br />This year: 1:01:52</p> <p>Doesn't seem like much of an improvement until you consider that I shaved off over 8 minutes on my time. I would attribute this to the condition of my bike more than any improvement in fitness. The differences on my bike from last year to this year are significant. A working suspension fork, new bar and stem, new brakes, wheels, tires and crankset. The bike is much easier to control and smoother on the trail.</p> <p>Also, there's something to say about pre-riding the course. I remembered that there was a steep climb early on and was able to stay in the front pack, but I forgot that there's a second one right before you enter the woods. I ended up walking up the last 100 feet or so and lost any advantage I had from the first climb. Also, on the Aynes Loop, there's a sustained climb for what seems like a mile or more and I had to do some walking for that as well.</p> <p>Because my suspension fork worked this year, it was a more enjoyable race on the downhills. And if my fitness was a little better I might have enjoyed the uphills. Eh, maybe not...</p> <p>Up next is Franke Park in the Fort Wayne. The course looks to be very fast with some short, steep uphills. I can't wait!</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-67237034048905574212009-04-14T20:23:00.004-04:002009-04-14T20:36:28.827-04:00Pics from SaturdayThe start<br>
<a href="http://s112.photobucket.com/albums/n169/Danjer02/?action=view¤t=dino12.jpg" target="_blank"><img src="http://i112.photobucket.com/albums/n169/Danjer02/dino12.jpg" border="0" alt="jeremy"></a>
<br><br>
Finding my place in the pack<br>
<a href="http://s112.photobucket.com/albums/n169/Danjer02/?action=view¤t=dino114.jpg" target="_blank"><img src="http://i112.photobucket.com/albums/n169/Danjer02/dino114.jpg" border="0" alt="jeremy"></a>
<br><br>
Almost finished<br>
<a href="http://s112.photobucket.com/albums/n169/Danjer02/?action=view¤t=dino19.jpg" target="_blank"><img src="http://i112.photobucket.com/albums/n169/Danjer02/dino19.jpg" border="0" alt="Photobucket"></a>
<br><br>
<p><a href"http://www.dinoseries.com/2009-bike-tuneup-Cat3Men.htm">The results</a>.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-67952348256395142052009-04-10T12:57:00.001-04:002009-04-10T16:26:27.027-04:00I hate the rain<p>So, what was to be the <a href="http://www.dinoseries.com/tuneup.html">highlight of my week</a> has been canceled due to the weather. Our wetter than normal (so far) April has turned the bike trails into soup. Funny thing was, I was on the trail yesterday and it was 95% dry. </p> <p>I guess I shouldn't be too surprised. Prior to this week, I had been commuting by bike 4 out of 5 days a week. But this week started out with a chance for snow, then rain, a nice day yesterday (60 and sunny) and now rain again. Other than riding the trails yesterday, I hadn't been on the bike all week. Still sucks though.</p> <p>Also, I was going to be debuting my new duds. The extremely thoughtful wife picked up some new riding gear. I have now have a long-sleeve Oakley jersey, a Zoic short-sleeve jersey and Zoic mountain bike shorts. Ok, so I wore the Oakley jersey and shorts yesterday - couldn't go out looking like a total doofus. Oh, and they were very nice - puts all of my old stuff to shame. Thank you honey!</p> <p>All of this means I have to wait another 3 weeks for the next race. Hopefully this year it'll be a little warmer and a lot less windy at Winona Lake.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-43193506205527618922009-02-27T10:50:00.000-05:002009-02-27T10:44:39.679-05:00For a little color...<p>I can't recommend this site highly enough for the monthly collections of desktop backgrounds. They usually post these on one of the last days of the month and the collection for March 2009 is outstanding as far as I'm concerned.</p> <p><a href="http://www.smashingmagazine.com/2009/02/27/desktop-wallpaper-calendar-march-2009/">March backgrounds from Smashing Magazine</a></p> <p>The site also has excellent articles on web design as well.<br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-61609054029376300802009-02-14T10:05:00.000-05:002009-02-14T09:58:58.804-05:00Musings...<p>I'm not sure how I like the winter season here in Indiana. When I lived in Michigan, especially in the UP, there was a definite start and stop to winter. Once winter started, you knew it was there to stay. Here in Indiana, the average daily temperature for January is 34 degrees. That means it can be winter during the week and spring on the weekend. I don't mind the part where I don't have to shovel the driveway much, but it can screw with your brain if you're not used to it.</p> <p>But spring is on the way and that means bike riding. The <a href="http://www.dinoseries.com/">DINO Series</a> gets started earlier this year with the Tuneup on the second weekend of April instead of the last. And I can't wait.</p> <p>Have you seen the cover of the March 2009 Bicycling magazine? I think I may have found my new road bike. I haven't really thought about much about getting a Giant but this one looks quite nice. I haven't ridden one since I had my brothers old steel Rincon. I rode that around Marquette quite a bit along Lakeshore Blvd.</p> <p>Other things I've been thinking about are getting some new bike shorts and possibly a new jersey. All my stuff is as old as my bike is and it sure would be nice to get something more in fashion. I really like the Mountain Tee (<a href="http://www.performancebike.com/shop/profile.cfm?SKU=25945&subcategory_ID=1111">long</a> or <a href="http://www.performancebike.com/shop/profile.cfm?SKU=25946&subcategory_ID=1110">short</a> sleeve) from Performance. What I'm trying to figure out though is, would that jersey still go with <a href="http://www.performancebike.com/shop/profile.cfm?SKU=25241">regular bike shorts</a>? Or would I need to get something like their <a href="http://www.performancebike.com/shop/profile.cfm?SKU=22781&subcategory_ID=1122">Mesa</a> short. I'll have to think about that.<br /></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-29704297.post-68337195069815708432009-02-14T09:36:00.000-05:002009-02-14T09:29:51.196-05:00Tomcat Tip: Tabs in TLD files<p>When you're writing your own JSP EL functions and putting the function signature in the TLD file, make sure it does not include tabs. Tomcat doesn't like it.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-2350782104461062162008-11-25T15:12:00.000-05:002008-11-25T15:09:36.338-05:00Have a little respect...<img src="http://i36.tinypic.com/bzpyx.jpg" alt="" />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-39523956234892521282008-11-25T15:11:00.003-05:002008-12-03T15:55:02.956-05:00Cloth Bags<a href="http://s112.photobucket.com/albums/n169/Danjer02/?action=view¤t=grocerybags09-18-09b_hummel.jpg" target="_blank"><img src="http://i112.photobucket.com/albums/n169/Danjer02/grocerybags09-18-09b_hummel.jpg" border="0" alt="Photobucket"></a>
<p>Dana and I have been using cloth bags for awhile now. Our biggest problem is remembering to use them. I will say it feels good to use them and since they can haul more, there's less trips from the garage to the kitchen.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-32865599864075306772008-11-06T12:56:00.001-05:002008-11-06T20:57:39.469-05:00Obama's first day on the job...<p><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1e7lzioOeSObpsIoIMoxZqOX-QyHn61KOEVrGY8CofBbBvbPiBRQwHXx7Mo9CS-Lub1w8zpdqwEBfVfZTfgh4afqFLiZJp1ZBAtwqIaf9JG8ry1X5L_I9-V_yinhmyJ0eJjpjLw/s1600/5684_image-716700.gif" alt="" id="BLOGGER_PHOTO_ID_5265604633594232274" border="0" /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-71812202880663812272008-10-16T11:42:00.001-04:002008-10-16T11:42:22.338-04:00Interesting articles...<p>So apparently somebody DID want to do something about the '70s energy crisis.<br /></p> <blockquote> <p><a href="http://www.commondreams.org/views05/0503-22.htm">Carter Tried To Stop Bush's Energy Disasters - 28 Years Ago</a></p> </blockquote> <p>Dr Shlomo argues that the idea of a Jewish nation is a myth invented little more than a century ago.</p> <blockquote> <p><a href="http://www.informationclearinghouse.info/article21020.htm">Israeli Bestseller Breaks National Taboo</a></p> </blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-77208725016461870662008-10-03T15:02:00.001-04:002008-10-03T15:02:38.963-04:00Happy Halloween?<p class="mobile-photo"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfHAhH8Y65YT6lULQdZIGTUAYJMhvEvDYDqwKQ7qnAU3dpPWfdi5ZFDwyglsWGJ6IKQTGhvHiPMYkMgci1Y93jS0OnzfZLwknHuWNoxE5-70NZU_815MY2xOWzLe_yPuexAJ-iUA/s1600-h/halloween-758966.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfHAhH8Y65YT6lULQdZIGTUAYJMhvEvDYDqwKQ7qnAU3dpPWfdi5ZFDwyglsWGJ6IKQTGhvHiPMYkMgci1Y93jS0OnzfZLwknHuWNoxE5-70NZU_815MY2xOWzLe_yPuexAJ-iUA/s320/halloween-758966.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5253005103409099506" /></a></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-86460063375395375072008-10-03T15:00:00.001-04:002008-10-03T15:00:27.777-04:00Typical McCain Supporters?<a href="http://www.photobasement.com/these-seem-like-typical-mccain-supporters/">These Seem Like Typical McCain Supporters</a>. Too funny!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-75276412493293711012008-09-26T13:41:00.001-04:002008-09-26T13:41:50.167-04:00A bit presumptious, don't you think?<p>Apparently McCain has won tonights debate, even though it hasn't happened yet!</p> <p><a href="http://voices.washingtonpost.com/thefix/2008/09/mccain_wins_debate.html">McCain Wins Debate</a></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-74227043405518710682008-09-26T09:54:00.001-04:002008-09-26T09:54:25.280-04:00Called It! WaMu is no more<p>I mentioned to some family that this could happen several weeks ago.</p> <p><a href="http://www.startribune.com/business/29776529.html?elr=KArks:DCiU1OiP:DiiUiacyKUnciaec8O7EyU">WaMu is seized in largest bank failure in U.S. history</a></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-46005327308814757072008-09-24T08:37:00.000-04:002008-09-24T08:36:59.646-04:00Tell Paulson where to stick it!Please sign Senator Bernie Sanders petition and let Secretary Paulson know what should really happen.<br /><br /><a href="http://sanders.senate.gov/petitions/?petition=financial_crisis_1">Sign the petition</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-29704297.post-27021645569238980072008-09-18T15:52:00.001-04:002008-09-18T15:52:14.901-04:00Women Against Sarah PalinThe most powerful site I've seen yet. The quantity and quality of the comments is staggering.<br /><br /><a href="http://womenagainstsarahpalin.blogspot.com/">Women Against Sarah Palin</a>Unknownnoreply@blogger.com0