<?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:blogger='http://schemas.google.com/blogger/2008' 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-20282472</id><updated>2025-04-04T18:13:01.849-07:00</updated><category term="baseball"/><category term="java"/><category term="basketball"/><category term="greasemonkey"/><category term="css"/><category term="fantasy"/><category term="ucla"/><category term="football"/><category term="outdoors"/><category term="perl"/><category term="shopping"/><category term="snowboarding"/><category term="spring"/><category term="vegas"/><category term="2008"/><category term="camping"/><category term="comedy"/><category term="comparator"/><category term="design"/><category term="dvorak"/><category term="generics"/><category term="giants"/><category term="hardware"/><category term="javascript"/><category term="javascript ppr"/><category term="jsp"/><category term="nephew"/><category term="netflix"/><category term="personal"/><category term="poker"/><category term="politics"/><category term="python"/><category term="safe passwords"/><category term="subversion"/><category term="tomcat"/><category term="tv"/><category term="varargs"/><category term="video conversion"/><category term="wisdom teeth"/><category term="xml"/><category term="xp"/><category term="xslt"/><title type='text'>David Lee&#39;s Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default?start-index=26&amp;max-results=25'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20282472.post-6606154316983871317</id><published>2009-10-27T22:27:00.000-07:00</published><updated>2009-10-27T23:01:41.635-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="greasemonkey"/><title type='text'>Retiring yahoo fantasy greasemonkey scripts</title><content type='html'>Two years ago, I wrote &lt;a href=&quot;http://robobruin.blogspot.com/2007/11/2007-fantasy-basketball-script-released.html&quot;&gt;a couple&lt;/a&gt; of popular greasemonkey scripts that allowed yahoo fantasy users to easily see live stats for their fantasy team.  At the time, users who didn&#39;t shell out the 10 bucks to buy stattracker had to wait until the following day to see how their players performed.  I didn&#39;t think that was fair so I automated the process of clicking through the boxscore link, parsing out the stat for a player, and summarizing it in a nice modal window.

Starting this football season and continuing with basketball today, yahoo has decided to offer stattracker for free!  This means that the scripts I released are no longer needed.  Competition from other fantasy sites most likely compelled yahoo to offer it for free, but I&#39;d like that all of you who used it, told your friends about it, and sent me bug and suggestions also forced their hand :)</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/6606154316983871317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/6606154316983871317' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6606154316983871317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6606154316983871317'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2009/10/retiring-yahoo-fantasy-greasemonkey.html' title='Retiring yahoo fantasy greasemonkey scripts'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-1039080038219600237</id><published>2008-09-04T23:40:00.000-07:00</published><updated>2008-09-20T00:09:46.900-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript ppr"/><title type='text'>initializing js objects with many parameter</title><content type='html'>&lt;p&gt;For the past couple of months I&#39;ve been working on a &lt;a href=&quot;http://apps.new.facebook.com/fbfantasy/landing&quot;&gt;fantasy football&lt;/a&gt; application on facebook.  I worked primarily on the &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1mAKr-oyGWsZgQO35EfbF7VMKoMEEo4jtHC1lF7avsOqbRnxPlK24zmUpKaxr8KpubjUjvuyjQoWREWH0dVyzpT3ki_WKKKTCJx14H3f5riVCSVtjvJf6B_sNTFJFhi3EKlzUyA/s1600-h/liveDraft.png&quot;&gt;live online draft&lt;/a&gt; and &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe5bCQ8SDp11yAuw-YUOcY3eseYIIbl0uBZOclhOllYPqNJOLt7XIfvdrXxDHtzCXMjgAZDgYmSqCe-nvBrcdb-ih_zUqRUC4BsniwFrIHAbuI4lo7TRbUXoW4zwAI_s7F7Z6MhA/s1600-h/liveScoring.png&quot;&gt;real time fantasy scoring&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It was a lot of work and also a lot of fun.  My coworkers and I spent many a night and weekend getting the site looking and working correctly.  I was worried that I would get sick of thinking about football but luckily that never happened. I want to share what I learned on this project so I thought I&#39;d start with an easy one that is now part of my personal pattern repository (ppr).&lt;/p&gt;

&lt;p&gt;What&#39;s the best way to initialize a js object with lots of initial state?  Originally, I passed in function parameters:  function init(param1, param2, param3).  As the complexity increased, I found myself passing in more and more parameters.&lt;/p&gt;

&lt;p&gt;the init string was generated on the server side so my code looked like&lt;br/&gt; 
String.format(&quot;init(%s,%s,%s,%s);&quot;, param1, param2, param3, param4). &lt;/p&gt; 

&lt;p&gt;Whenever I added a new parameter I had to change the server side code and also the js file.&lt;/p&gt;

&lt;p&gt;After a couple of changes I wizened up and found a much better way to do things.  on the server side, I created a JSONObject and set up my parameters like so:&lt;/p&gt;

JSONObject json = new JSONObject().put(&quot;param1&quot;, param1).put(&quot;param2&quot;, param2)....&lt;br/&gt;
String.format(&quot;init(%s)&quot;, json.toString())&lt;br/&gt;

&lt;p&gt;And on the js file:&lt;/p&gt;
&lt;pre&gt;
function init(params) {
var param1 = params.param1;
var param2 = params.param2;
...
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/1039080038219600237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/1039080038219600237' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/1039080038219600237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/1039080038219600237'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2008/09/initializing-js-objects-with-many.html' title='initializing js objects with many parameter'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-8902571529605618879</id><published>2008-03-31T21:29:00.000-07:00</published><updated>2008-03-31T22:26:41.400-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2008"/><category scheme="http://www.blogger.com/atom/ns#" term="baseball"/><category scheme="http://www.blogger.com/atom/ns#" term="giants"/><title type='text'>Your 2008 San Francisco Giants</title><content type='html'>&lt;p&gt;Goodbye Barry Bonds, hello Brian Bocock.  This year&#39;s team is going to be tough to watch.  The heart of our lineup is Randy Winn, Bengie Molina, and Ray Durham.  I expect Aaron Rowand to move up from his sixth spot in the lineup within a few games but as of opening day, the 3-4-5 hitters are embarrassing.  Thankfully, baseball is not all about offense and the strength of this team is the starting pitching.   Pundits predict that we&#39;ll win around 60 games this year but I really think we have a good shot at .500 if the pitching performs as expected and if our hitters exceed expectations.  Without further adieu, here are my optimistic predictions for the 2008 season.&lt;/p&gt;

&lt;p&gt;Pitching&lt;/p&gt;
&lt;p&gt;The trio of Matt Cain, Tim Lincecum, and Barry Zito will win 45 games.&lt;/p&gt;

&lt;p&gt;The Giants bullpen will be the strength of the team and will be ranked top 5 in the NL in holds, ERA, and WHIP.&lt;/p&gt;

&lt;p&gt;Hitting&lt;/p&gt;
&lt;p&gt;Aaron Rowand will hit above .300, steal 15 bases, and drive in 100 runs.&lt;/p&gt;

&lt;p&gt;Rajai Davis and Eugenio Velez will steal a combined 60 bases.&lt;/p&gt;

&lt;p&gt;Benjie Molina will hit .290 with 30 homers.&lt;/p&gt;

&lt;p&gt;sorry...I can&#39;t do this anymore.  Here&#39;s my tip for all Giants fans this season:  Don&#39;t miss Cain and Lincecum pitch and check out the &lt;a href=&quot;http://sanfrancisco.giants.mlb.com/schedule/promotions.jsp?c_id=sf&quot;&gt;2008 promotional schedule&lt;/a&gt; for some bobbleheads.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/8902571529605618879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/8902571529605618879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/8902571529605618879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/8902571529605618879'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2008/03/your-2008-san-francisco-giants.html' title='Your 2008 San Francisco Giants'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-6122634488576610429</id><published>2007-11-04T00:06:00.000-07:00</published><updated>2008-02-22T22:41:28.149-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="basketball"/><category scheme="http://www.blogger.com/atom/ns#" term="fantasy"/><category scheme="http://www.blogger.com/atom/ns#" term="greasemonkey"/><title type='text'>2007 Fantasy basketball script  released</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCffJ-j1E59SB9DA4nYDZIQjY-JPFEdove59aw5yb5ePsV0f1JspyD8YrjItT4zuifuHik98YZptwF8IQHG_mbMKp0D-cPhNTs3SvW8yTSF2C33byMEicKqqoBEINilTqD-CIpsg/s1600-h/basketball.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCffJ-j1E59SB9DA4nYDZIQjY-JPFEdove59aw5yb5ePsV0f1JspyD8YrjItT4zuifuHik98YZptwF8IQHG_mbMKp0D-cPhNTs3SvW8yTSF2C33byMEicKqqoBEINilTqD-CIpsg/s200/basketball.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5128881012147281058&quot; /&gt;&lt;/a&gt;
&lt;p&gt;*update - 2/22/2008 - updated the script to handle new yahoo boxscores for in progress games&lt;/p&gt;
&lt;p&gt;I couldn&#39;t sleep last night (Friday night...actually Sat at 2am to be exact) so I stayed up and implemented the two missing features for the &lt;a href=&quot;http://userscripts.org/scripts/show/6177&quot;&gt;live stats basketball script&lt;/a&gt;: maintaining the order of players in the modal window and displaying a summary of all active players&#39; stats.&lt;/p&gt;

&lt;p&gt;The first feature was easy to implement since I had already solved that problem for &lt;a href=&quot;http://userscripts.org/scripts/show/5143&quot;&gt;baseball&lt;/a&gt;.  The old technique of adding a row after retrieving a player&#39;s stats leads to indeterminate ordering because we do not wait for a boxscore request to finish before moving on to the next.  Therefore, it was possible that a UTIL player who is towards the bottom of the management page would actually be processed faster than a PG depending on how snappy the server handled the request.  The solution is to create placeholder rows that have the correct order and then update those rows later.&lt;/p&gt;

&lt;p&gt;The second feature is summarizing all your players&#39; stats for the night.  Unlike a baseball boxscore where a player&#39;s stats appear on multiple parts of the page and some stats need to be derived, all basketball stats appear on one row.  That&#39;s why I didn&#39;t create full blown function objects that had getter/setters for stats like assists, turnovers, pts, boards, etc.  Instead, I went the lightweight route and defined two rules that are used to summarize stats.  If the stat has a dash, like 7-11, then we keep track of total made and total attempts, else we just sum up the current stat with the running total.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/6122634488576610429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/6122634488576610429' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6122634488576610429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6122634488576610429'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/11/2007-fantasy-basketball-script-released.html' title='2007 Fantasy basketball script  released'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCffJ-j1E59SB9DA4nYDZIQjY-JPFEdove59aw5yb5ePsV0f1JspyD8YrjItT4zuifuHik98YZptwF8IQHG_mbMKp0D-cPhNTs3SvW8yTSF2C33byMEicKqqoBEINilTqD-CIpsg/s72-c/basketball.png" height="72" width="72"/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-503413527203514140</id><published>2007-10-31T23:00:00.000-07:00</published><updated>2007-10-31T23:16:31.124-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="basketball"/><category scheme="http://www.blogger.com/atom/ns#" term="fantasy"/><title type='text'>halloween treat</title><content type='html'>&lt;p&gt;No candy to pass out but I did make a few tweaks to my &lt;a href=&quot;http://userscripts.org/scripts/show/6177&quot;&gt;fantasy basketball live scoring script&lt;/a&gt;. Like the modified &lt;a href=&quot;http://userscripts.org/scripts/show/5143&quot;&gt;baseball version&lt;/a&gt;, the script no longer automatically loads.  The user has to trigger it by clicking on the &#39;show freebie stats&#39; link.  I also ripped out the autocenter on scroll code since that was causing display issues for users on low resolution monitors.&lt;/p&gt;

&lt;p&gt;The two biggest missing features that I will tackle next are maintaining the order on the display and totaling all your active players&#39; stats.  But I probably won&#39;t get to that until the weekend.  don&#39;t fret, yahoo provides free stats for the first couple of weeks of the season so you&#39;re covered.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/503413527203514140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/503413527203514140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/503413527203514140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/503413527203514140'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/10/halloween-treat.html' title='halloween treat'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-6878828621618130717</id><published>2007-10-14T17:31:00.000-07:00</published><updated>2007-10-14T17:44:13.853-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="comedy"/><title type='text'>annoying commercial parody</title><content type='html'>SNL lampooned one of the most annoying commercials that has been playing during the LCS.

&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/fdE5UbCC1qQ&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/fdE5UbCC1qQ&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/uu04-fY_pzc&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/uu04-fY_pzc&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/6878828621618130717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/6878828621618130717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6878828621618130717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6878828621618130717'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/10/annoying-commercial-parody.html' title='annoying commercial parody'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-1379880389715006164</id><published>2007-10-02T21:37:00.000-07:00</published><updated>2007-10-02T22:32:45.056-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="baseball"/><title type='text'>Fantasy baseball recap</title><content type='html'>&lt;p&gt;Back in March, Yahoo Sports invited average Joes to go head-to-head against their fantasy experts in baseball.  I answered the call and was pitted in a 16 team, head-to-head league with Big Noise himself, Brad Evans.  My key draft picks were Chipper, Magglio, Markakis, and Jose Reyes.  My waiver wire gems were Ryan Braun and Carlos Pena, who I swapped for Derek Lee just before the trading deadline.  My offense carried me the entire season because my only good pitcher was Josh Beckett.  Since it was a head-to-head league, I knew that if my offense held up, I could stream pitchers if I reached the playoffs.&lt;/p&gt;

&lt;p&gt;Only 6 out of 16 teams qualified for the playoffs and I made it as a 3rd place qualifier.  This meant that I didn&#39;t have a first round bye which is always a bit dangerous.  Luckily, my team held up and I moved on to the semifinals against the 2nd place team.  We both had off weeks but my team went on to win.  Waiting for me in the championship showdown was Brad Evans&#39; team.  He was on a roll and I had to go through him to win the championship.  I was up to the challenge and pulled out all the stops like streaming pitchers to win the W and K categories and picking hot September additions such as Jacoby Ellsbury and Norris Hopper.&lt;/p&gt;

&lt;p&gt;Just like the regular season, my offense carried me and streaming pitchers yielded wins in the W and K categories.  In the end, it was a fun season and I&#39;m thankful that Yahoo opened the league up and that Brad Evans took some time to go up against some of his readers.&lt;/p&gt;

&lt;p&gt;Pics or it didn&#39;t happen:&lt;/p&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifM9RPL27-g2jKM8IbCI3V0B4vnSLZ82Hq1VW7qt0RZnftpOjMHrWs9oEEFagesII3JhQULXyUoUGo4f7qcE3ZRjWCNkBEMjP2ePhUQikUD5QPy31AduCy5-lQZd752SdQFWCdHQ/s1600-h/giants.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifM9RPL27-g2jKM8IbCI3V0B4vnSLZ82Hq1VW7qt0RZnftpOjMHrWs9oEEFagesII3JhQULXyUoUGo4f7qcE3ZRjWCNkBEMjP2ePhUQikUD5QPy31AduCy5-lQZd752SdQFWCdHQ/s320/giants.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5116977872691508274&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/1379880389715006164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/1379880389715006164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/1379880389715006164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/1379880389715006164'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/10/fantasy-baseball-recap.html' title='Fantasy baseball recap'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifM9RPL27-g2jKM8IbCI3V0B4vnSLZ82Hq1VW7qt0RZnftpOjMHrWs9oEEFagesII3JhQULXyUoUGo4f7qcE3ZRjWCNkBEMjP2ePhUQikUD5QPy31AduCy5-lQZd752SdQFWCdHQ/s72-c/giants.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-6258438828573260099</id><published>2007-10-01T22:16:00.001-07:00</published><updated>2007-10-01T22:42:27.663-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="baseball"/><title type='text'>Padres out, Rockies in</title><content type='html'>Thank goodness for TBS.  Too bad &lt;a href=&quot;http://sports.yahoo.com/mlb/recap?gid=271001127&quot;&gt;this game&lt;/a&gt; was not televised on the networks because it was an instant classic that saw the Rockies come back against the man with the most saves in the history of baseball.  I actually didn&#39;t see the comeback because I was peeved that Scott Hairston hit another clutch homer for the Padres and went to do the dishes.  This guy has been killing the Giants all year and during the last week of the regular season he tossed the bat about 20 feet after blasting a homer off Matt Cain.  Cain let him have it and it&#39;ll be interesting to see these guys matched up next year.

When I came back from doing the dishes, I saw that the Rockies had won and that Holliday scored the winning run.  What a relief that must have been since he was the one that misplayed the Brian Giles flyball that led to the Padres tying the game.  If this game was any indication how the playoffs will be played, then we&#39;re all in for a treat.  My sleeper pick is the Cubs but I think either Boston or Cleveland will win it all.</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/6258438828573260099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/6258438828573260099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6258438828573260099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6258438828573260099'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/10/padres-out-rockies-in.html' title='Padres out, Rockies in'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-3785770335556653016</id><published>2007-10-01T22:02:00.000-07:00</published><updated>2007-10-01T22:13:59.724-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="video conversion"/><title type='text'>Converting a large AVI file to a smaller WMV file for picasa or youtube</title><content type='html'>&lt;p&gt;I was uploading pictures and videos from a company outing and soon discovered that the max file size for uploads to PicasaWeb is 100MB.  So I decided to give YouTube a try but the max upload size on YouTube was also 100MB.&lt;/p&gt;

&lt;p&gt;I took the video on my digital camera and it was in AVI format.  I needed something that would convert this file to a smaller size.  A couple of google searches later I discovered that Microsoft has a free WMV converter.  The program provides different output quality settings and soon I was able to get my 162MB avi file to a 11MB wmv.  Here&#39;s the download link:  &lt;a href=&quot;http://www.microsoft.com/windows/windowsmedia/forpros/encoder/default.mspx&quot;&gt;http://www.microsoft.com/windows/windowsmedia/forpros/encoder/default.mspx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you aren&#39;t running Windows, &lt;a href=&quot;http://www.mplayerhq.hu/design7/dload.html&quot;&gt;mplayer&lt;/a&gt; might be sufficient for your video conversion needs.  But the Linux version of Picasa doesn&#39;t allow uploading to web albums so you will have to do it through the web interface.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/3785770335556653016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/3785770335556653016' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3785770335556653016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3785770335556653016'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/10/converting-large-avi-file-to-smaller.html' title='Converting a large AVI file to a smaller WMV file for picasa or youtube'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-7700246799817388143</id><published>2007-09-28T00:01:00.000-07:00</published><updated>2007-09-28T21:40:49.339-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="baseball"/><title type='text'>Giants 2007 Recap</title><content type='html'>&lt;p&gt;Now that the season is winding down, it&amp;#39;s time to revisit &lt;a href=&quot;http://robobruin.blogspot.com/2007/02/fresh-start.html&quot;&gt;my extremely optimistic outlook&lt;/a&gt; for the Giants 2007 baseball season. Granted, some of these predictions (see Benitez) were best case, Brady Anderson ala 1996 scenarios, but as the 2005 White Sox proved, it can happen.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Pitching&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Prediction:  Zito will assume ace responsibilities and that new windup may give him that extra zip and movement.&lt;/p&gt;

&lt;p&gt;Reality: The new windup was abandoned in the first week of spring training because the Giants didn&amp;#39;t pay for new windup Barry.  Barry had one of his worst seasons as a professional.  &lt;/p&gt;

&lt;p&gt;Running tally: 0-1&lt;/p&gt;

&lt;p&gt;Prediction:  A seasoned Matt Cain, aka Bobby Hill, will have learned how to pitch&lt;/p&gt;

&lt;p&gt;Reality: Cain&amp;#39;s W-L record belies how he well he pitched because the record could have been reversed if the Giants gave him more run support or if the relief pitchers didn&amp;#39;t blow his leads.   He definitely matured from his rookie year and mixed sliders and change ups to go with that nasty fastball.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Running tally: 1-1&lt;/p&gt;

&lt;p&gt;Prediction:  Noah Lowry might be able to fool hitters once more&lt;/p&gt;

&lt;p&gt;Reality: Before Noah got injured he was among the league leaders in wins.  He doesn&amp;#39;t have overpowering stuff and runs a lot of counts to 3-2 but he still keeps the games close and finds ways to get guys to miss on fastballs never topping 90.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Running tally: 2-1&lt;/p&gt;

&lt;p&gt;Prediction:  Matt Morris will be able to avoid that one big inning blowup he always has&lt;/p&gt;

&lt;p&gt;Reality:  nope.  same old Morris after a promising start and eventually traded to the Pirates for Rajai Davis.&lt;/p&gt;

&lt;p&gt;Running tally: 2-2&lt;/p&gt;

&lt;p&gt;Prediction:  The fifth starter, whether it is a renewed Russ Ortiz or rookie sensations Linceum or Sanchez will surprise the league by storm.&lt;/p&gt;

&lt;p&gt;Reality: I sure gave myself some leeway here by counting on at least 1 of 3 players to have a good year.  Lincecum really did show the league that he&amp;#39;s a special player.  Whenever he pitches the opposing team is always at the railing checking him out. &lt;/p&gt;

&lt;p&gt;Running tally: 3-2&lt;/p&gt;

&lt;p&gt;Prediction:  Benitez will be in shape and less of a headcase.&lt;/p&gt;

&lt;p&gt;Reality: Nope.  same old Benitez.  Traded before the break to the Marlins for Randy Messenger.&lt;/p&gt;

&lt;p&gt;Running tally: 3-3&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Hitting&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Prediction:  old guys will be injury free&lt;/p&gt;

&lt;p&gt;Reality:  wishful thinking.  Durham, Roberts, Bonds spent significant time on the DL.&lt;/p&gt;

&lt;p&gt;Running tally: 3-4&lt;/p&gt;

&lt;p&gt;Prediction:  Barry Bonds will break Hank&amp;#39;s record by early August so the team can concentrate on the playoff push&lt;/p&gt;

&lt;p&gt;Reality: Barry broke the record in early August but playoff hopes were pretty much gone at that point.  half right = half wrong = a push&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Running tally: still 3-4&lt;/p&gt;

&lt;p&gt;Prediction:  Dave Roberts will be that leadoff hitter we haven&amp;#39;t had since Brett Butler&lt;/p&gt;

&lt;p&gt;Reality: injured for most of the first half, came on strong for awhile and then leveled off.  Splitting time with Rajai Davis so can&amp;#39;t say he&amp;#39;s that good.&lt;/p&gt;

&lt;p&gt;Running tally: 3-5&lt;/p&gt;

&lt;p&gt;Prediction: Rich Aurilia pounds 40 homers and shows Seattle fans why they once signed him to big bucks&lt;/p&gt;

&lt;p&gt;Reality: yeah right.  that was the last prediction so I went for the juggernaut.  Rich Aurilia couldn&#39;t beat out Ryan Klesko for the starting first base job.&lt;/p&gt;

&lt;p&gt;Final tally: 3-6 which pretty much sums up the Giants season.  But next year, we&amp;#39;ll be back.&lt;br&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/7700246799817388143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/7700246799817388143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/7700246799817388143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/7700246799817388143'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/giants-2007-recap.html' title='Giants 2007 Recap'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-3426574987305836002</id><published>2007-09-26T22:10:00.000-07:00</published><updated>2007-09-26T22:14:17.562-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="tomcat"/><title type='text'>Logging request and response headers in Tomcat</title><content type='html'>&lt;p&gt;What&amp;#39;s the best way to dump out request or response headers in Tomcat?&lt;/p&gt;

&lt;p&gt;Before rolling up your own solution, take a look at the &lt;a href=&quot;http://tomcat.apache.org/tomcat-5.0-doc/config/valve.html&quot;&gt;valve&lt;/a&gt; component that Tomcat supports.  In particular, the aptly named &lt;a href=&quot;http://tomcat.apache.org/tomcat-5.0-doc/config/valve.html#Request Dumper Valve&quot;&gt;RequestDumperValve&lt;/a&gt; will log all the request and response headers in Tomcat.  To enable the valve,  just go to your server.xml file in the /conf directory and uncomment this line:  &lt;/p&gt;

&lt;p&gt;&amp;lt;Valve className=&amp;quot;org.apache.catalina.valves.RequestDumperValve&amp;quot;/&amp;gt;&lt;/p&gt;

&lt;p&gt;Then restart your server and the headers will appear in your log file.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/3426574987305836002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/3426574987305836002' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3426574987305836002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3426574987305836002'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/logging-request-and-response-headers-in.html' title='Logging request and response headers in Tomcat'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-8605522356859646334</id><published>2007-09-25T23:12:00.000-07:00</published><updated>2007-09-26T22:13:07.869-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><title type='text'>Javascript composite comparator</title><content type='html'>&lt;p&gt;Since it&#39;s available on every modern web browser, Javascript captures the title as the world&#39;s most deployed programming language.  But while its availability is almost universal, its reputation is less than stellar.  Douglas Crockford wrote a great piece on Javascript being the &lt;a href=&quot;http://www.crockford.com/javascript/javascript.html&quot;&gt;world&#39;s most misunderstood programming language&lt;/a&gt;.  He lists several reasons such as design errors, bad early implementations, and even naming the language Javascript which implied it being like Java and it being no more than a simple scripting language.&lt;/p&gt;

&lt;p&gt;I&#39;ll admit that my initial opinion was quite down as well.  I used it strictly as a C clone and cringed anytime I had to debug a script.  But now that I have had more exposure to and experience with the language features such as closures and first class functions, I&#39;ve definitely reversed my opinion.  It&#39;s so useful to perform client side processing with such a full fledged language at my disposal.&lt;/p&gt;

&lt;p&gt;This post wouldn&#39;t do Javascript justice if it didn&#39;t have some accompanying code, so I&#39;ll revisit my &lt;a href=&quot;http://robobruin.blogspot.com/2007/09/composite-comparator-fun-with-generics.html&quot;&gt;Java generics and varargs post&lt;/a&gt; and reimplement the composite comparator using Javascript.&lt;/p&gt;

&lt;p&gt;To recap, the composite comparator (aka cascading comparator or chained comparator) is a comparator made up of several other comparators.  My Java 1.5 implementation uses the varargs language feature to yield a simple to use api that accepts a variable amount of comparators.&lt;/p&gt;

&lt;p&gt;Since javascript is dynamically typed and supports variable length arguments, the implementation looks pretty similar.&lt;/p&gt;

&lt;code&gt;
This is our player object:&lt;br /&gt;
&lt;br /&gt;
function player(name, hr, rbi, sb) {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.name=name;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.hr=parseInt(hr);&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.rbi=parseInt(rbi);&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;this.sb=parseInt(sb);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Let&#39;s create some players and populate a players array:&lt;br /&gt;
var a = new player(&#39;Arod&#39;,50,150,1);&lt;br /&gt;
var b = new player(&#39;Reyes&#39;,50,150,2);&lt;br /&gt;
var c = new player(&#39;Bonds&#39;,50,150,3);&lt;br /&gt;
&lt;br /&gt;
var players = new Array(a,b,c);&lt;br /&gt;
&lt;br /&gt;
Next, we need to create some comparators:&lt;br /&gt;
function sortRbi(a, b) {&lt;br /&gt;
&amp;#160;&amp;#160; return a.rbi - b.rbi;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function sortHr(a,b) {&lt;br /&gt;
&amp;#160;&amp;#160; return a.hr-b.hr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function sortSb(a,b) {&lt;br /&gt;
&amp;#160;&amp;#160; return a.sb-b.sb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Here&#39;s the composite comparator:&lt;br /&gt;
function compositeSort() {&lt;br /&gt;
&amp;#160;&amp;#160;var args = Array.prototype.slice.call(arguments);&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; return function(a,b) {&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var i=0;i&amp;lt;args.length;i++) {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;var result = args[i](a,b);&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (result!=0) { &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return result;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 0;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Here&#39;s a negate comparator:&lt;br /&gt;
function negate(func) {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;return function(a,b) {&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;var i=func(a,b);&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (i==0)&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return i;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;else&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return -i;&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This comparator will sort by hr ascending, rbi ascending, and sb descending.&lt;br /&gt;
var comp = compositeSort(sortHr,sortRbi,negate(sortSb));&lt;br /&gt;
&lt;br /&gt;
And now we pass the newly created comparator to the built in sort method in arrays.&lt;br /&gt;
players.sort(comp)
&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/8605522356859646334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/8605522356859646334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/8605522356859646334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/8605522356859646334'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/javascript-composite-comparator.html' title='Javascript composite comparator'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-3194370182406712517</id><published>2007-09-24T23:20:00.000-07:00</published><updated>2007-09-25T00:01:14.677-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><category scheme="http://www.blogger.com/atom/ns#" term="xslt"/><title type='text'>xslt stylesheet to convert xml to tab delimited file</title><content type='html'>Sometimes, you just want a tab delimited text file.  For those occasions, here&#39;s the xslt to convert an xml file to a tab delimited file.   the tab and newline characters might get converted when displayed on the screen so do a view source if the select=&quot; &quot; shows whitespace

&lt;textarea class=&quot;code&quot;&gt;
&lt;xsl:stylesheet version=&#39;1.0&#39;
    xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
    &lt;xsl:output omit-xml-declaration=&quot;yes&quot;/&gt;
    &lt;xsl:variable name=&quot;tab&quot; select=&quot;&#39;&amp;#09;&#39;&quot; /&gt;
    &lt;xsl:variable name=&quot;newline&quot; select=&quot;&#39;&amp;#10;&#39;&quot; /&gt;

    &lt;xsl:template match=&quot;/&quot;&gt;
        &lt;xsl:apply-templates select=&quot;//player&quot;/&gt;
    &lt;/xsl:template&gt;

    &lt;xsl:template match=&quot;player&quot;&gt;
        &lt;xsl:value-of select=&quot;first_name&quot;/&gt;
        &lt;xsl:value-of select=&quot;$tab&quot; /&gt;
        &lt;xsl:value-of select=&quot;last_name&quot;/&gt;
        &lt;xsl:value-of select=&quot;$newline&quot; /&gt;
    &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;
&lt;/textarea&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/3194370182406712517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/3194370182406712517' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3194370182406712517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3194370182406712517'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/xslt-stylesheet-to-convert-xml-to-tab.html' title='xslt stylesheet to convert xml to tab delimited file'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-4488797279467462896</id><published>2007-09-21T17:21:00.001-07:00</published><updated>2007-09-26T22:15:01.500-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="baseball"/><title type='text'>It&#39;s official.  The Barry Bonds era has come to an end</title><content type='html'>&lt;p&gt;&lt;a href=&quot;http://sanfrancisco.giants.mlb.com/news/article.jsp?ymd=20070921&amp;content_id=2222175&amp;vkey=news_sf&amp;fext=.jsp&amp;c_id=sf&quot;&gt;It&#39;s official&lt;/a&gt;.  Barry Bonds will not be a San Francisco Giant next year.&lt;/p&gt;

&lt;p&gt;Many people outside of the Bay Area don&#39;t understand the relationship Giants fans have with Barry.  We know he took steroids.  We know he&#39;s arrogant.  We know he&#39;s mean to reporters.  So why is it that we don&#39;t hate him like the rest of America?  Because he&#39;s a Giant.  Because he grew up in the Bay Area. Because his dad played for the Giants and because his godfather is Willie Mays.  Because he&#39;s not the only guy that ever took steroids and because he was a hall of famer caliber player before he juiced up.  Because 1993 was a magical season.&lt;/p&gt;

&lt;p&gt;To be competing for a division title a year removed from a woeful season and rumors of a move to St. Petersbug was invigorating.  Suddenly it was fun to be a Giants fan again.  Barry put the franchise on his back and carried the organization through the opening of Pac Bell Park, into the World Series in 2002, and even up to when he broke the home run record.  That&#39;s a lot of great memories.   He&#39;s been the face of the Giants for 15 years and when you&#39;re loyal to your team,  you&#39;re going to be loyal to the face of the franchise too.  Go Giants!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/4488797279467462896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/4488797279467462896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/4488797279467462896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/4488797279467462896'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/its-official-barry-bonds-era-has-come.html' title='It&#39;s official.  The Barry Bonds era has come to an end'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-4045747844893259256</id><published>2007-09-20T22:47:00.001-07:00</published><updated>2007-09-26T00:30:56.495-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="basketball"/><title type='text'>Would you leave 63 million on the table?</title><content type='html'>&lt;p&gt;&lt;a href=&quot;http://sports.espn.go.com/nba/news/story?id=3029816&quot;&gt;Andrei Kirilenko would.&lt;/a&gt;   He&#39;s so unhappy playing for Jerry Sloan that he&#39;s willing to forego the rest of his max contract which equates to 63 million dollars.  Is this guy for real?  Most guys want to void or renegotiate their contract to make &lt;span style=&quot;font-style:italic;&quot;&gt;more&lt;/span&gt; money.  Kirilenko&#39;s already got a max deal and the way he&#39;s played the last two years he&#39;s never going to get that sweet a deal again. &lt;/p&gt;

&lt;p&gt;He played for the Russian team this summer and was the main man so maybe he missed being the go to guy.  Maybe he just really misses home.  Maybe he was misquoted and the interview was taken out of context.  Maybe a Russian oil tycoon has promised him even more cash to play in Russia. &lt;/p&gt;

&lt;p&gt;Whatever the reason I&#39;m sure more of the story will come out in the coming weeks.  I&#39;ve always been a big Kirilenko fan.  He won me over many years ago when he went ballistic in a Rookie vs Sophomore game during All star weekend.  The other players were playing lackadaisically and AK was subbed in and was a beast of defense.  He guarded guys tight, swatted shots, and went to the basket hard.  It was refreshing to see since those games are more and1 than nba.  He&#39;s also been a favorite because he resembled Ivan Drago from Rocky IV so my old roommates and I would shout out the &quot;I must break you&quot; voice every time he blocked a shot.&lt;/p&gt;

&lt;p&gt;Good luck Kirilenko!  I hope you get whatever makes you happy.  I&#39;d definitely like to see you in a Warriors uniform.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/4045747844893259256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/4045747844893259256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/4045747844893259256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/4045747844893259256'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/would-you-leave-63-million-on-table.html' title='Would you leave 63 million on the table?'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-7344370388415776075</id><published>2007-09-19T21:49:00.000-07:00</published><updated>2007-09-26T00:33:49.277-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="perl"/><title type='text'>Schwarzian Transform</title><content type='html'>&lt;p&gt;I like to remind myself of this Perl gem every so often.  I always call it Schwarzian transform but it&#39;s actually &lt;a href=&quot;http://en.wikipedia.org/wiki/Schwartzian_transform&quot;&gt;Schwartzian transform&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;
#using schwarzian transform
#@sorted contains objects sorted by their distance
my @sorted=
map {$_-&gt;[1]}
sort { $a-&gt;[0] &lt;=&gt; $b-&gt;[0] }
map { [$_-&gt;distance(), $_ ] } @{$paObject};

map EXPRESSION, list returns a new list whose elements are the outcome of the expression
Example: @newArray = map {uc $_}, @array
is just
@array = qw(a b c d);
@newArray = ();
foreach my $temp (@array) {
   push @newArray, uc $temp;
} 

back to the example...
$paObject is a pointer to an array of objects.   The object has a method name distance() that returns an int
@{$paObject} dereferences the array.
working backwards,

map { [$_-&gt;distance(), $_ ] } @{$paObject}, creates an array like [[10,object reference 1],[2,object reference 2]]

and then feeds that into sort { $a-&gt;[0] &lt;=&gt; $b-&gt;[0] } which sorts according to the element at index 0

keeping with this example it yields [[2,object reference 2],[10, object reference 1]] 
which is fed into map {$_-&gt;[1]} which selects element at index 1

so now @sorted contains [object reference 2, object ref]

The benefit of the algorithm is that you only call the distance() method for each object once.  
If this method is computationally intensive and the list is large, the savings can be quite large.  
If your list is small, it&#39;s probably better to something like: @sorted =  {$a &lt;=&gt; $b} @unsorted
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/7344370388415776075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/7344370388415776075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/7344370388415776075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/7344370388415776075'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/schwarzian-transform.html' title='Schwarzian Transform'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-749997898023470771</id><published>2007-09-18T20:02:00.000-07:00</published><updated>2007-09-18T20:10:28.810-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="css"/><title type='text'>fixing IE checkbox padding/margin</title><content type='html'>Support for CSS is built in to every modern browser so theoretically we shouldn&#39;t have to deal with too many layout issues. Unfortunately, a lot of browser specific quirks still exist.

One I&#39;ve dealt with recently is getting a checkbox to line up exactly to the left of a div.  Setting the left margin and padding did not work in IE and I was going to try really drastic measures like setting float or absolute positioning until I found a really easy solution.  To fix the extra padding for checkboxes in IE, we just need to give the checkbox a fixed width.

I&#39;ve summarized the results in the table with some screenshots.  The markup I want to style is:
&lt;pre&gt;
&lt;code&gt;
&amp;lt;div&amp;gt;
&amp;lt;p&amp;gt;some text before&amp;lt;/p&amp;gt;
&amp;lt;input type=&quot;checkbox&quot;/&amp;gt; checkbox 1&amp;lt;br/&amp;gt;
&amp;lt;input type=&quot;checkbox&quot;/&amp;gt; checkbox 2&amp;lt;br/&amp;gt;
&amp;lt;p&amp;gt;some text after&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;
&lt;/pre&gt;
&lt;br/&gt;
&lt;table valign=&quot;top&quot; border=&quot;1&quot; cellspacing=&quot;10&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th width=&quot;10%&quot;&gt;FireFox&lt;/th&gt;
&lt;th width=&quot;10%&quot;&gt;IE&lt;/th&gt;
&lt;th width=&quot;40%&quot;&gt;CSS&lt;/th&gt;
&lt;th width=&quot;40%&quot;&gt;notes&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_iarx1TowtiQL1L204C4mTgKf3HXuDD4wtN6lcNdBxvimxO1yObKj430teOkh-5smyizWpUIs5oLGXPq4nzh0JT9ylqb-D_CyeTPnALBImSIxGiglgu0M9YNgkdXHlg5G-97huQ/s1600-h/ff_no_cb_style.png&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_iarx1TowtiQL1L204C4mTgKf3HXuDD4wtN6lcNdBxvimxO1yObKj430teOkh-5smyizWpUIs5oLGXPq4nzh0JT9ylqb-D_CyeTPnALBImSIxGiglgu0M9YNgkdXHlg5G-97huQ/s200/ff_no_cb_style.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5111628339741175122&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1gkGGSo9nZjmeeGa_ANCT5jvDQzUTnUQ40qFGNcfbqs1wzx_9jq0P38IcxNllvHtKooiexw5k1lC41bYZd_5N19FM3hvNWyreCz5EGJEM2eIMnWkxGG5sUReVeJ82dw5tTPhJnA/s1600-h/ie7_no_cb_style.png&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1gkGGSo9nZjmeeGa_ANCT5jvDQzUTnUQ40qFGNcfbqs1wzx_9jq0P38IcxNllvHtKooiexw5k1lC41bYZd_5N19FM3hvNWyreCz5EGJEM2eIMnWkxGG5sUReVeJ82dw5tTPhJnA/s200/ie7_no_cb_style.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5111628537309670754&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
div {border: solid 1px #000;width:150px;}

p {padding:0;margin:0;}

&lt;/td&gt;
&lt;td&gt;no styling on checkbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_Lu6JjBR-Wsel3xwDqIuINH1mq3yIbhIFoh1Rj8M4CTYLdQCd0Lo77B1Fb8pUpWZxHJq0DkwF09IZ85dH3gnIwHINC8eq_9FbdevwO9QRXmWgr482Hk9hkx3uboZdIqY5tDwISg/s1600-h/ff_no_margin.png&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_Lu6JjBR-Wsel3xwDqIuINH1mq3yIbhIFoh1Rj8M4CTYLdQCd0Lo77B1Fb8pUpWZxHJq0DkwF09IZ85dH3gnIwHINC8eq_9FbdevwO9QRXmWgr482Hk9hkx3uboZdIqY5tDwISg/s200/ff_no_margin.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5111628726288231794&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTnsPzPsaQtCqarAZnGAXdxkljQcpPcnvre9vKhqJEKETR9_9GvCPdrZkRJFX8H7uJDeT1U8RFK3GPoFXBqtlZyrWdV5BXDHyDiWpE-HAoC92sUw4nsCdNXWGXUq0LF2DI1itnNQ/s1600-h/ie7_no_margin.png&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTnsPzPsaQtCqarAZnGAXdxkljQcpPcnvre9vKhqJEKETR9_9GvCPdrZkRJFX8H7uJDeT1U8RFK3GPoFXBqtlZyrWdV5BXDHyDiWpE-HAoC92sUw4nsCdNXWGXUq0LF2DI1itnNQ/s200/ie7_no_margin.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5111628919561760130&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
div {border: solid 1px #000;width:150px;}

p {padding:0;margin:0;}

input {padding-left:0;margin-left:0;}

&lt;/td&gt;
&lt;td&gt;style checkbox to have no left padding or margin.  only Firefox behaves as expected&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxYDDjEsZwzSjycXUx0dMoz-8U7v93oUZXTHGZQ-7ee56t73yfmZ42mLzAqR6Uw4xroJegz-qi7LlXNgdDww5fWIvQ60Z1ZqGGdtbquUpyRHjVElLvYAO2xMi6w68JZd5Q5KOgag/s1600-h/ff_fixed_width.png&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxYDDjEsZwzSjycXUx0dMoz-8U7v93oUZXTHGZQ-7ee56t73yfmZ42mLzAqR6Uw4xroJegz-qi7LlXNgdDww5fWIvQ60Z1ZqGGdtbquUpyRHjVElLvYAO2xMi6w68JZd5Q5KOgag/s200/ff_fixed_width.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5111629091360451986&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAFeZ8KwvWSwZuWcT5bOBh4gETPmJghuAr6stTrDwSwjue4Nr4RVjvmQ8E2rrEBA1N5CfJpA0uDyu_bnEbj_9NhlBotsFkJeU3uUyVWJdtOKa_gdz5XDxX1jnngZZNFbCCQ-mDlw/s1600-h/ie7_fixed_width.png&quot;&gt;&lt;img style=&quot;cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAFeZ8KwvWSwZuWcT5bOBh4gETPmJghuAr6stTrDwSwjue4Nr4RVjvmQ8E2rrEBA1N5CfJpA0uDyu_bnEbj_9NhlBotsFkJeU3uUyVWJdtOKa_gdz5XDxX1jnngZZNFbCCQ-mDlw/s200/ie7_fixed_width.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5111629237389340066&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
div {border: solid 1px #000;width:150px;}

p {padding:0;margin:0;}

input {padding-left:0;margin-left:0;width:15px;}

&lt;/td&gt;
&lt;td&gt;
added a fixed width and now IE7 looks fine too!
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/749997898023470771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/749997898023470771' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/749997898023470771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/749997898023470771'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/fixing-ie-checkbox-paddingmargin.html' title='fixing IE checkbox padding/margin'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_iarx1TowtiQL1L204C4mTgKf3HXuDD4wtN6lcNdBxvimxO1yObKj430teOkh-5smyizWpUIs5oLGXPq4nzh0JT9ylqb-D_CyeTPnALBImSIxGiglgu0M9YNgkdXHlg5G-97huQ/s72-c/ff_no_cb_style.png" height="72" width="72"/><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-5913918346258695267</id><published>2007-09-17T21:32:00.000-07:00</published><updated>2007-09-26T00:35:37.417-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>spring initbinder example that registers custom editor</title><content type='html'>&lt;p&gt;One of the nice features in Spring is the automatic databinding that occurs if you use one of the subclasses of BaseCommandController such as AbstractCommandController or SimpleFormController. By automatic databinding, I mean Spring initializing your command object based on the request parameters.
The magic behind this feature is Spring&#39;s builtin property editors which do things like convert strings to integers. Sooner or later, however, you&#39;ll run into a situation where you need to do some custom databinding by registering your own PropertyEditor through the initBinder() method.&lt;/p&gt;
&lt;pre&gt;
Suppose this is my command class:

&lt;code&gt;
class FootballPlayer {

static enum POSITION {RB, WR, QB, DB, LB}



POSITION _position;



public POSITION getPosition() {

return _position;

}



public void setPosition(POSITION position) {

_position = position;

}

}

&lt;/code&gt;


So if my request parameter is ?positon=rb and I want my command class to have the correct enum set, do the following:
First, create a custom property editor.
&lt;code&gt;
class FootBallPlayerEditor extends PropertyEditorSupport {

public String getAsText() {

FootballPlayer editor = (FootballPlayer) getValue();

return editor.getPosition().name();

}



public void setAsText(final String text) {

setValue(FootballPlayer.POSITION.valueOf(text));

}

}

&lt;/code&gt;

then override initBinder
&lt;code&gt;
protected void initBinder(HttpServletRequest request,

ServletRequestDataBinder binder) {

binder.registerCustomEditor(FootballPlayer.POSITION.class, new FootBallPlayerEditor());

}

&lt;/code&gt;

And you&#39;re all set.
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/5913918346258695267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/5913918346258695267' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/5913918346258695267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/5913918346258695267'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/spring-initbinder-example-that.html' title='spring initbinder example that registers custom editor'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-3889909777596435828</id><published>2007-09-16T23:06:00.000-07:00</published><updated>2007-09-26T00:34:44.615-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="shopping"/><title type='text'>&#39;Best Buy&#39;er Beware</title><content type='html'>&lt;p&gt;I picked up an item at my local Best Buy and it rang up at 3 times the listed price.  I politely mentioned to the cashier that this must be a price mistake so she led me to the aisle where she knew the item was being sold.  The problem was that this wasn&#39;t the aisle where I picked up my product so I brought her to where &lt;span style=&quot;font-style: italic;&quot;&gt;I&lt;/span&gt; found the item.  Sure enough, the price was the lower and so she sold me the item at the price I originally saw. &lt;/p&gt;

&lt;p&gt;Seems odd that the same item was listed at different prices in two parts of the store.  I found mine near the back and the other one was near the cashier.  Either I got lucky or this is a Best Buy ploy to overcharge their customers.  Moral of the story is twofold.  One, do a walk through to see if your item is priced differently at a different spot in the store. Two, make sure you&#39;re watching when they ring up your order.  Buyer beware.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/3889909777596435828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/3889909777596435828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3889909777596435828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3889909777596435828'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/best-buyer-beware.html' title='&#39;Best Buy&#39;er Beware'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-6703032291914064578</id><published>2007-09-15T12:12:00.000-07:00</published><updated>2007-09-26T00:36:35.930-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="football"/><title type='text'>And you thought Roger Goddell was a disciplanarian</title><content type='html'>&lt;p&gt;Roger Goddell is the commissioner of the NFL.  Since he&#39;s taken over the top role about a year ago, he&#39;s suspended numerous players for &#39;conduct detrimental to the league&#39; and now he&#39;s laid the law down among the coaches too.&lt;/p&gt;

&lt;p&gt;The Patriots were caught taping the Jets as they were relaying defensive signals down to the field.  The penalty for this action?  A $500,000 fine for Belichick, head coach of the Patriots, a $250,000 fine for Bill Kraft, the owner of the Patriots, and the loss of a first round draft pick.   The penalty wasn&#39;t too severe since Belichick wasn&#39;t suspended but it definitely wasn&#39;t a slap on the wrist either.  I thought it was actually pretty fair since the lost of a first rounder could come back to bite them down the line and Belichick now has less cash to buy hooded sweatshirts and warmup pants.&lt;/p&gt;

&lt;p&gt;Contrast this penalty with the &lt;a href=&quot;http://canadianpress.google.com/article/ALeqM5gqtOoiYBSBPPYMCHRmZ-20tvUJYw&quot;&gt;hammer that was dropped&lt;/a&gt; when Mclaren was found in possession with Ferrari&#39;s playbook.  A 100 million dollar fine and suspension from the team championships.  That&#39;s right...100 miiiiiilliooooooon dollars!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/6703032291914064578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/6703032291914064578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6703032291914064578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/6703032291914064578'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/and-you-thought-roger-goddell-was.html' title='And you thought Roger Goddell was a disciplanarian'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-2432305796314956645</id><published>2007-09-14T19:10:00.000-07:00</published><updated>2007-09-26T00:28:51.284-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="comparator"/><category scheme="http://www.blogger.com/atom/ns#" term="generics"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="varargs"/><title type='text'>Composite Comparator - Fun with generics and varargs</title><content type='html'>&lt;p&gt;A couple of new features in Java 5 are the additions of &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html&quot;&gt;generics&lt;/a&gt; and &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html&quot;&gt;varargs&lt;/a&gt;. We use generics a lot when returning a list from our &lt;a href=&quot;http://java.sun.com/blueprints/patterns/DAO.html&quot;&gt;DAOs &lt;/a&gt;but I&#39;ve never had to implement a method that accepted varargs until I implemented this &lt;a href=&quot;http://www.greatschools.net/school/parentReviews.page?id=6397&amp;amp;state=CA&quot;&gt;parent reviews page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a typical page where a user may sort by date or by rating. Another feature is that a principal&#39;s review for a school always comes first. So the sorting is like so:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;By Principal, then date descending&lt;/li&gt;
&lt;li&gt;By Principal, then date ascending&lt;/li&gt;
&lt;li&gt;By Principal, then rating, then descending&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First thing I needed to do was create a couple of comparators. I used the static final comparator approach that that Josh Block talks about in Effective Java. I&#39;ll demonstrate with a baseball class.  The nice thing about the composite comparator is that now I can create a comparator based on hr,rbi, and anything else I wanted to add later like sb, runs, etc.&lt;/p&gt;
Example:&lt;br/&gt;
&lt;code&gt;
&lt;pre&gt;
public class BaseBallPlayer {

   private int _rbi;

   private int _hr;



   public BaseBallPlayer(int rbi, int hr) {

       _rbi = rbi;

       _hr = hr;

   }



   public static final Comparator HR_COMPARATOR = new Comparator&amp;lt;BaseBallPlayer&amp;gt;() {

       public int compare(BaseBallPlayer o1, BaseBallPlayer o2) {

           return o1.getRbi() - o2.getRbi();

       }

   };



   public static final Comparator RBI_COMPARATOR = new Comparator&amp;lt;BaseBallPlayer&amp;gt;() {

       public int compare(BaseBallPlayer o1, BaseBallPlayer o2) {

           return o1.getHr() - o2.getHr();

       }

   };



   public int getHr() {

       return _hr;

   }



   public int getRbi() {

       return _rbi;

   }

}

public class GenericComparator {

   public static &amp;lt;T&amp;gt;Comparator&amp;lt;T&amp;gt; createComparator(final Comparator&amp;lt;T&amp;gt;... c) {

       return new Comparator&amp;lt;T&amp;gt;() {

           public int compare(T r1, T r2) {

               int result = 0;

               for (Comparator&amp;lt;T&amp;gt; comp : c) {

                   result = comp.compare(r1, r2);

                   if (result != 0) {

                       break;

                   }

               }

               return result;

           }

       };

   }

}

   Comparator&amp;lt;BaseBallPlayer&amp;gt; HR_RBI_COMPARATOR = GenericComparator.&amp;lt;BaseBallPlayer&amp;gt;createComparator(

                   BaseBallPlayer.HR_COMPARATOR, BaseBallPlayer.RBI_COMPARATOR);

&lt;/pre&gt;
&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/2432305796314956645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/2432305796314956645' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/2432305796314956645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/2432305796314956645'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/composite-comparator-fun-with-generics.html' title='Composite Comparator - Fun with generics and varargs'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-1475322737541652156</id><published>2007-09-13T16:13:00.000-07:00</published><updated>2007-09-26T00:37:02.844-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="personal"/><title type='text'>Gauntlet thrown</title><content type='html'>&lt;p&gt;I&#39;m challenging myself to do a posting at least once a day for the next 30 days.  This might not sound like a big deal to you super posters out there but have you seen my last posting date?  It&#39;s been months and the updates have been sorely lacking.&lt;/p&gt;

&lt;p&gt;I know what some of you may be thinking...&quot;But Dave, I come here only for the thoroughly researched content and the essay like blog postings!&quot;&lt;/p&gt;

&lt;p&gt;Fear not loyal readers, quantity &lt;span style=&quot;font-style: italic;&quot;&gt;can equal&lt;/span&gt; quality.  Plus, have you mistaken this blog for &lt;a href=&quot;http://www.paulgraham.com&quot;&gt;Paul Graham&#39;s&lt;/a&gt;?  I&#39;ll continue to write is my stream of consciousness manner, but this time it will be a lot more often so expect a new blog entry for the next 30 days.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/1475322737541652156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/1475322737541652156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/1475322737541652156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/1475322737541652156'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/09/gauntlet-thrown.html' title='Gauntlet thrown'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-3846548336679563790</id><published>2007-04-12T19:37:00.000-07:00</published><updated>2007-09-26T22:51:35.330-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="baseball"/><category scheme="http://www.blogger.com/atom/ns#" term="fantasy"/><category scheme="http://www.blogger.com/atom/ns#" term="greasemonkey"/><title type='text'>2007 yahoo fantasy baseball script</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuQgRfy-vOgFVjctl9wxMCZ8ty0K6ybcoOVD4k53YCOloRFMsBCs-Y8HP1R9MB6wPLW5Tvrk_VFZzkCZXF3F_kKDOai3p6sW7w2Yxy9mu0aGAjTUHZ68ffXr_Ijnljmwv27Z1ubQ/s1600-h/freebieStatsBaseball.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuQgRfy-vOgFVjctl9wxMCZ8ty0K6ybcoOVD4k53YCOloRFMsBCs-Y8HP1R9MB6wPLW5Tvrk_VFZzkCZXF3F_kKDOai3p6sW7w2Yxy9mu0aGAjTUHZ68ffXr_Ijnljmwv27Z1ubQ/s200/freebieStatsBaseball.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5057220360939965298&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;p&gt;update 4/24/2007&lt;br/&gt;
&lt;a href=&quot;http://userscripts.org/scripts/show/5143&quot;&gt;Script updated&lt;/a&gt;.  Fixed issues &lt;a href=&quot;http://code.google.com/p/freebiestats/issues/detail?id=3&quot;&gt;3&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/freebiestats/issues/detail?id=6&quot;&gt;6&lt;/a&gt; reported by Rodric Rabbah and lots of code refactoring.
The script no longer automatically loads the window.  You have to activate it by pressing on the
blue &quot;Show Freebie Stats&quot; button on the top right.&lt;/p&gt;

&lt;p&gt;update 4/18/2007&lt;br/&gt;
&lt;a href=&quot;http://userscripts.org/scripts/show/5143&quot;&gt;Script updated&lt;/a&gt;.  Fixed issues &lt;a href=&quot;http://code.google.com/p/freebiestats/issues/detail?id=4&quot;&gt;4&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/freebiestats/issues/detail?id=5&quot;&gt;5&lt;/a&gt; reported by Ethan Herbertson.&lt;/p&gt;

&lt;p&gt;update 4/16/2007
To use the script, follow these 3 steps
&lt;ol&gt;&lt;li&gt;download &lt;a href=&quot;http://www.getfirefox.com/&quot;&gt;firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;install &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/748&quot;&gt;greasemonkey&lt;/a&gt; extension&lt;/li&gt;&lt;li&gt;after installing greasemonkey, &lt;a href=&quot;http://userscripts.org/scripts/show/5143&quot;&gt;install the script&lt;/a&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;I just updated my &lt;a href=&quot;http://robobruin.blogspot.com/2006/08/greasemonkey-fantasy-baseball-script.html&quot;&gt;fantasy baseball script&lt;/a&gt; for 2007.   The most obvious change is that I incorporated the UI from my &lt;a href=&quot;http://robobruin.blogspot.com/2006/10/yahoo-fantasy-basketball-live-scoring.html&quot;&gt;fantasy basketball script&lt;/a&gt; but there are also a bunch of under-the-hood fixes too.  I go into some detail in those two blog postings on how the scripts are implemented so I won&#39;t recap any of that here but I will describe one bug fix.  Stolen bases and homers are not part of the boxscore and they require extra parsing.&lt;/p&gt;

&lt;p&gt;The stolen base string is of the form: D. Roberts 2 (2nd Inning off J. Bard), B. Bonds (3rd inning off J. Bard)&lt;/p&gt;

&lt;p&gt;My old regular expression was a simple check to see if a players name was part of the string.  The problem was that if  I had J. Bard on my team, then he got a stolen base even though he was the one that allowed the steal.  To fix the problem, I deleted everything in parentheses first.&lt;/p&gt;

&lt;p&gt;That regular expression looks like:  statLine = statLine.replace(/\([^\)].+?\)/gi,&#39;&#39;);  The key is &#39;?&#39; which makes it a non greedy match and [^\)] which tells the engine when to stop.&lt;/p&gt;

&lt;p&gt;Another thing that bothered me was calling mozilla&#39;s childNodes method on a table row returned some unexpected results.  Instead of returning a list of td elements, it would also return some additional children.  To remedy this annoyance, I call row.getElementsByTagName(&quot;TD&quot;) and then I get a list of td elements that I expect.  That said, I&#39;m much happier with Mozilla&#39;s handling of the dom api and the development plugins available in FireFox.  My day job is as web developer for a high traffic site where we strive for pixel, perfect perfection between IE 6,7 and firefox so developing for just one browser was a nice break.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://userscripts.org/scripts/show/5143&quot;&gt;Install the script&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/3846548336679563790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/3846548336679563790' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3846548336679563790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/3846548336679563790'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/04/2007-yahoo-fantasy-baseball-script.html' title='2007 yahoo fantasy baseball script'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuQgRfy-vOgFVjctl9wxMCZ8ty0K6ybcoOVD4k53YCOloRFMsBCs-Y8HP1R9MB6wPLW5Tvrk_VFZzkCZXF3F_kKDOai3p6sW7w2Yxy9mu0aGAjTUHZ68ffXr_Ijnljmwv27Z1ubQ/s72-c/freebieStatsBaseball.jpg" height="72" width="72"/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-8753844463683513251</id><published>2007-04-08T22:30:00.000-07:00</published><updated>2007-04-08T22:37:01.042-07:00</updated><title type='text'>Best DNP description ever</title><content type='html'>My good friend Johnny sent me a link to the &lt;a href=&quot;http://sports.yahoo.com/nba/boxscore?gid=2007040524&quot;&gt;best boxscore DNP description&lt;/a&gt; ever.  We know Robert Horry is not the same player he used to be, but come on San Antonio, the man with six rings deserves a bit more respect.
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyorBYUINS-ycdsbrRtnpEDnhwlHAVKXOav99a2IvJASSGcYjLu6GhGb_3PbIKguFccAItQieDrgT_Wld9lY0qpPA9AJFtBeaDmg8R_fqARq-iXIPbyq3D39QiiDaA0pZ1bXUppA/s1600-h/dnp.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyorBYUINS-ycdsbrRtnpEDnhwlHAVKXOav99a2IvJASSGcYjLu6GhGb_3PbIKguFccAItQieDrgT_Wld9lY0qpPA9AJFtBeaDmg8R_fqARq-iXIPbyq3D39QiiDaA0pZ1bXUppA/s320/dnp.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5051297907228496130&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/8753844463683513251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/8753844463683513251' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/8753844463683513251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/8753844463683513251'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/04/best-dnp-description-ever.html' title='Best DNP description ever'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyorBYUINS-ycdsbrRtnpEDnhwlHAVKXOav99a2IvJASSGcYjLu6GhGb_3PbIKguFccAItQieDrgT_Wld9lY0qpPA9AJFtBeaDmg8R_fqARq-iXIPbyq3D39QiiDaA0pZ1bXUppA/s72-c/dnp.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20282472.post-4271317414957368022</id><published>2007-03-25T18:24:00.000-07:00</published><updated>2007-09-26T22:52:39.947-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hardware"/><title type='text'>inspiron 700m broken cd rom drive</title><content type='html'>&lt;p&gt;the cd rom drive on my laptop broke a couple of months ago and I never bothered to get it replaced since it never got any use.  then yesterday I wanted to install turbotax.  To workaround the missing drive, I mounted my desktop&#39;s cd rom drive and then accessed it through the network.  problem solved!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://robobruin.blogspot.com/feeds/4271317414957368022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20282472/4271317414957368022' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/4271317414957368022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20282472/posts/default/4271317414957368022'/><link rel='alternate' type='text/html' href='http://robobruin.blogspot.com/2007/03/inspiron-700m-broken-cd-rom-drive.html' title='inspiron 700m broken cd rom drive'/><author><name>Dave</name><uri>http://www.blogger.com/profile/12599422987118317308</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>