<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkIMQH86fip7ImA9WxJUE0Q.&quot;"><id>tag:blogger.com,1999:blog-11593374</id><updated>2009-07-12T10:23:01.116+01:00</updated><title>Andrew Beacock's Blog</title><subtitle type="html">&lt;a href="/search/label/Agile"&gt;agile&lt;/a&gt; / &lt;a href="/search/label/Apache"&gt;apache&lt;/a&gt; / &lt;a href="/search/label/Java"&gt;java&lt;/a&gt; / &lt;a href="/search/label/Leadership"&gt;leadership&lt;/a&gt; / &lt;a href="/search/label/Linux"&gt;linux&lt;/a&gt; / &lt;a href="/search/label/Mobile"&gt;mobile&lt;/a&gt; / &lt;a href="/search/label/Ruby"&gt;ruby&lt;/a&gt; / &lt;a href="/search/label/Subversion"&gt;subversion&lt;/a&gt; / &lt;a href="/search/label/Web"&gt;web&lt;/a&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.andrewbeacock.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>195</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><logo>http://bp0.blogger.com/_Vu_eUOpUOMk/RgWamJV19TI/AAAAAAAAAGw/Lu_6ZKf-Glw/s400/buddy_icon.png</logo><link rel="self" href="http://feeds.feedburner.com/andrewbeacock" type="application/atom+xml" /><feedburner:emailServiceId>andrewbeacock</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CU4CQH46cCp7ImA9WxJUEkg.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-1341072306693951823</id><published>2009-07-10T20:26:00.000+01:00</published><updated>2009-07-10T20:26:01.018+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-10T20:26:01.018+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Supporting the Oracle XMLTYPE datatype via JPA (Spring, Hibernate &amp; JDBC)</title><content type="html">On a recent project I was tasked with developing two domain objects which mapped via JPA to a couple of tables.  This would have been easy apart from one table used the the &lt;a href="http://www.oracle-base.com/articles/9i/XMLTypeDatatype.php"&gt;Oracle-specific XMLTYPE data type&lt;/a&gt;:&lt;pre class="brush:sql"&gt;create table PERSON&lt;br /&gt;(&lt;br /&gt; P_ID number not null,&lt;br /&gt; P_NAME varchar2(50),&lt;br /&gt; P_UPDATED date,&lt;br /&gt; P_XML xmltype&lt;br /&gt;);&lt;/pre&gt;The XMLTYPE datatype is not supported by JPA (or any Hibernate-specific annotations) and so I had to use a different approach.  I created the JPA-based &lt;code&gt;Person&lt;/code&gt; class as normal, adding &lt;code&gt;@Column&lt;/code&gt; annotations to the class, ignoring the P_XML column.  I then added the following bit of code to be a placeholder for the XML:&lt;pre class="brush:java"&gt;@Transient&lt;br /&gt;// required so that JPA doesn't try to persist it, we need JDBC for that&lt;br /&gt;private String xml;&lt;/pre&gt;I then developed the JpaPersonDao as normal, using the &lt;code&gt;getJpaTemplate()&lt;/code&gt; methods to select, insert and update the database. This handles all the columns except the XMLTYPE one - you need to use JDBC for that one due to the way in which Oracle expects the column to be filled and read.&lt;br /&gt;&lt;br /&gt;My approach was to use the JPA-based DAO to perform most of the work loading and saving the rows, but hook in a JDBC-based DAO behind the scenes to handle the XMLTYPE column.  By hiding it in the DAO, the users of the PersonDao will not have to worry about the special nature of the XMLTYPE column.&lt;br /&gt;&lt;br /&gt;This is the JdbcPersonDao performing access to the XMLTYPE-based column only:&lt;pre class="brush:java"&gt;public class JdbcPersonDao extends JdbcDaoSupport {&lt;br /&gt;&lt;br /&gt;   private static final String SELECT_XML_SQL = "select p.P_XML.getClobVal() from PERSON p where P_ID = ?";&lt;br /&gt;   private static final String UPDATE_XML_SQL = "update PERSON set P_XML = xmltype(?) where P_ID = ?";&lt;br /&gt;&lt;br /&gt;   public String getXml(Integer id) {&lt;br /&gt;       Object[] args = { new Integer(id) };&lt;br /&gt;       int[] argTypes = new int[] { Types.INTEGER };&lt;br /&gt;       return (String) getJdbcTemplate().queryForObject(SELECT_XML_SQL, args, argTypes, String.class);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setXml(Integer id, String xml) {&lt;br /&gt;       OracleLobHandler lobHandler = new OracleLobHandler();&lt;br /&gt;       lobHandler.setNativeJdbcExtractor(new CommonsDbcpNativeJdbcExtractor());&lt;br /&gt;&lt;br /&gt;       Object[] args = { new SqlLobValue(xml, lobHandler), new Integer(id) };&lt;br /&gt;       int[] argTypes = new int[] { Types.CLOB, Types.INTEGER };&lt;br /&gt;       getJdbcTemplate().update(UPDATE_XML_SQL, args, argTypes);&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;And here are the important bits of the JpaPersonDao hooking into the JDBC-based one to ensure that the data stays consistent, both accesses to the database are within the same transaction and so are atomic:&lt;pre class="brush:java"&gt;public class JpaPersonDao extends JpaDaoSupport implements PersonDao {&lt;br /&gt;&lt;br /&gt;   @Autowired&lt;br /&gt;   private JdbcPersonDao jdbcPersonDao; // deals with the xmltype clob&lt;br /&gt;&lt;br /&gt;   public Person getPersonById(Integer id) {&lt;br /&gt;       Person person = getJpaTemplate().find(Person.class, id);&lt;br /&gt;&lt;br /&gt;       if (person != null) {&lt;br /&gt;           person.setXml(jdbcPersonDao.getXml(id));&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return person;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void savePerson(Person person) {&lt;br /&gt;       getJpaTemplate().persist(person);&lt;br /&gt;       getJpaTemplate().flush(); // forces the generation of an ID, required in the saveXml call&lt;br /&gt;       saveXml(person);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public Person updatePerson(Person person) {&lt;br /&gt;       // put the xml to one side as the merge clears out the transient field&lt;br /&gt;       String xml = person.getXml();&lt;br /&gt;       Person updatedPerson = getJpaTemplate().merge(person);&lt;br /&gt;       updatedPerson.setXml(xml);&lt;br /&gt;       saveXml(updatedPerson);&lt;br /&gt;&lt;br /&gt;       return updatedPerson;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void saveXml(Person person) {&lt;br /&gt;       if (person.getXml() != null) {&lt;br /&gt;           jdbcPersonDao.setXml(person.getId(), person.getXml());&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;Not the most elegant solution, but at least with the use of the &lt;code&gt;@Autowired&lt;/code&gt; JDBC-based DAO the mess is hidden from the caller...&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Spring" rel="tag"&gt;Spring&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JPA" rel="tag"&gt;JPA&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JDBC" rel="tag"&gt;JDBC&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Hibernate" rel="tag"&gt;Hibernate&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Oracle" rel="tag"&gt;Oracle&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/XMLTYPE" rel="tag"&gt;XMLTYPE&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-1341072306693951823?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mwndkp6PI6exeMLKnSJiAE9d6UA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mwndkp6PI6exeMLKnSJiAE9d6UA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mwndkp6PI6exeMLKnSJiAE9d6UA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mwndkp6PI6exeMLKnSJiAE9d6UA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=sZUiQakD-RU:SaGPblmaL2c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=sZUiQakD-RU:SaGPblmaL2c:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=sZUiQakD-RU:SaGPblmaL2c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=sZUiQakD-RU:SaGPblmaL2c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=sZUiQakD-RU:SaGPblmaL2c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=sZUiQakD-RU:SaGPblmaL2c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=sZUiQakD-RU:SaGPblmaL2c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/1341072306693951823/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=1341072306693951823" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/1341072306693951823?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/1341072306693951823?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/sZUiQakD-RU/supporting-oracle-xmltype-datatype-via.html" title="Supporting the Oracle XMLTYPE datatype via JPA (Spring, Hibernate &amp; JDBC)" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/07/supporting-oracle-xmltype-datatype-via.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4MSXw_fip7ImA9WxJVGEQ.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-7115862377819437616</id><published>2009-07-04T11:36:00.001+01:00</published><updated>2009-07-06T16:09:48.246+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-06T16:09:48.246+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Shopping" /><title>MP3 purchase comparison between Amazon.co.uk &amp; Play.com</title><content type="html">My first foray into purchasing MP3 was from &lt;a href="http://www.amazon.co.uk/?&amp;tag=andrewbeacock-21&amp;camp=1698&amp;creative=11426&amp;linkCode=ez&amp;adid=1NB7J8ZETJKXNQRCE4PH&amp;"&gt;Amazon.co.uk&lt;/a&gt; some months back. It was a smooth experience much like buying anything else from Amazon and it's quirky MP3 downloader popped the nicely named MP3 files into my music folder in the normal directory structure of &lt;code&gt;Artist name/Album name/track number &amp; name&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;This week I purchased an album from &lt;a href="http://www.play.com/"&gt;Play.com&lt;/a&gt;'s MP3 catalogue due to it being a little cheap than Amazon.  It's download format was a large zip file that had to be saved to the desktop, it's content was just the tracks - no artist/album directory structure, no track numbers.  Because I don't have an iPod I had to look up the track listing on the net and rename the files just to put them in the right album order!&lt;br /&gt;&lt;br /&gt;Next time I want to buy some music online I think I will be skipping &lt;a href="http://www.play.com/"&gt;Play.com&lt;/a&gt;'s offering completely and paying the little more that &lt;a href="http://www.amazon.co.uk/?&amp;tag=andrewbeacock-21&amp;camp=1698&amp;creative=11426&amp;linkCode=ez&amp;adid=1NB7J8ZETJKXNQRCE4PH&amp;"&gt;Amazon.co.uk&lt;/a&gt; was charging - it will be worth it to just have my music just download straight into the right place rather than messing around with zip file and renames...&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/MP3" rel="tag"&gt;MP3&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Amazon.co.uk" rel="tag"&gt;Amazon.co.uk&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Play.com" rel="tag"&gt;Play.com&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-7115862377819437616?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qi5RPey-lLLcyYn7xEqv9OHDp-M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qi5RPey-lLLcyYn7xEqv9OHDp-M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qi5RPey-lLLcyYn7xEqv9OHDp-M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qi5RPey-lLLcyYn7xEqv9OHDp-M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=mKK8huI_US0:tZvXFcljINI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=mKK8huI_US0:tZvXFcljINI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=mKK8huI_US0:tZvXFcljINI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=mKK8huI_US0:tZvXFcljINI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=mKK8huI_US0:tZvXFcljINI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=mKK8huI_US0:tZvXFcljINI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=mKK8huI_US0:tZvXFcljINI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/7115862377819437616/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=7115862377819437616" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7115862377819437616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7115862377819437616?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/mKK8huI_US0/mp3-purchase-comparison-between.html" title="MP3 purchase comparison between Amazon.co.uk &amp; Play.com" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/07/mp3-purchase-comparison-between.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcNRHk6eCp7ImA9WxJVFEo.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-7534879925760191504</id><published>2009-07-01T19:16:00.002+01:00</published><updated>2009-07-01T19:31:35.710+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-01T19:31:35.710+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><title>A new way to label in GMail (and the end of Right-Sided Labels)</title><content type="html">Back in March I blogged about &lt;a href="http://blog.andrewbeacock.com/2009/03/customising-gmail-with-google-mail-labs.html"&gt;my favourite GMail labs&lt;/a&gt;.  One of them has died today - &lt;a href="http://gmailblog.blogspot.com/2008/09/new-in-labs-right-side-labels-and-chat.html"&gt;Right-side Labels&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Google are &lt;a href="http://gmailblog.blogspot.com/2009/07/labels-drag-and-drop-hiding-and-more.html"&gt;grouping labels&lt;/a&gt; together with Inbox, Drafts, Chats and other system labels, and so putting the labels over on the right-hand side doesn't make sense anymore.&lt;br /&gt;&lt;br /&gt;The problem is, &lt;a href="http://gmailblog.blogspot.com/2009/07/labels-drag-and-drop-hiding-and-more.html"&gt;my GMail's not been updated yet&lt;/a&gt; so I can't play with the new features! :)&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Google" rel="tag"&gt;Google&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/GMail" rel="tag"&gt;GMail&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Google Labs" rel="tag"&gt;Google Labs&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-7534879925760191504?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aQR5fJo-7ihYbJLA8adBjTBjopQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aQR5fJo-7ihYbJLA8adBjTBjopQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aQR5fJo-7ihYbJLA8adBjTBjopQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aQR5fJo-7ihYbJLA8adBjTBjopQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=vYVZoePsE_0:B10PQ_Aneho:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=vYVZoePsE_0:B10PQ_Aneho:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=vYVZoePsE_0:B10PQ_Aneho:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=vYVZoePsE_0:B10PQ_Aneho:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=vYVZoePsE_0:B10PQ_Aneho:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=vYVZoePsE_0:B10PQ_Aneho:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=vYVZoePsE_0:B10PQ_Aneho:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/7534879925760191504/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=7534879925760191504" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7534879925760191504?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7534879925760191504?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/vYVZoePsE_0/new-way-to-label-in-gmail-and-end-of.html" title="A new way to label in GMail (and the end of Right-Sided Labels)" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/07/new-way-to-label-in-gmail-and-end-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8NQ34yeCp7ImA9WxJVEk8.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-5569800077542329204</id><published>2009-06-27T22:38:00.001+01:00</published><updated>2009-06-28T22:18:12.090+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-28T22:18:12.090+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Be careful writing hashCode() methods when using HashCodeBuilder</title><content type="html">I've blogged in the past about &lt;a href="http://blog.andrewbeacock.com/2008/08/write-simpler-equals-hashcode-java.html"&gt;using the Apache Commons EqualsBuilder and HashCodeBuilder to write simpler equals() &amp; hashCode() methods&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://slackaliss.blogspot.com/"&gt;My colleague&lt;/a&gt; recently blogged about a &lt;a href="http://slackaliss.blogspot.com/2009/06/hashcodebuilder-is-great-but.html"&gt;potential pitfall when using this approach&lt;/a&gt;, I'll summarise his findings here:&lt;br /&gt;&lt;br /&gt;Be VERY careful when you ask the &lt;a href="http://commons.apache.org/lang/api/index.html?org/apache/commons/lang/builder/HashCodeBuilder.html"&gt;HashCodeBuilder &lt;/a&gt;to generate the resulting hashcode value:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Make sure you call &lt;code&gt;builder.toHashCode()&lt;/code&gt; rather than &lt;code&gt;builder.hashCode()&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first correctly generates a hashcode value based on the objects that you have added to the builder, the second gives you the hashcode of the builder object itself - definitely not the value you would be expecting (and would be a sure fire way to &lt;a href="http://blog.andrewbeacock.com/2008/11/how-to-lose-java-object-in-collection.html"&gt;lose your objects in a Collection&lt;/a&gt;)...&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Apache Commons" rel="tag"&gt;Apache Commons&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/HashCodeBuilder" rel="tag"&gt;HashCodeBuilder&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/hashCode" rel="tag"&gt;hashCode&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-5569800077542329204?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ssF1Gi4NYq_3_X6A_b7PG3GWwlY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ssF1Gi4NYq_3_X6A_b7PG3GWwlY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ssF1Gi4NYq_3_X6A_b7PG3GWwlY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ssF1Gi4NYq_3_X6A_b7PG3GWwlY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=BaOypSfVxxY:nBb1sq0gsI4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=BaOypSfVxxY:nBb1sq0gsI4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=BaOypSfVxxY:nBb1sq0gsI4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=BaOypSfVxxY:nBb1sq0gsI4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=BaOypSfVxxY:nBb1sq0gsI4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=BaOypSfVxxY:nBb1sq0gsI4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=BaOypSfVxxY:nBb1sq0gsI4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/5569800077542329204/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=5569800077542329204" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/5569800077542329204?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/5569800077542329204?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/BaOypSfVxxY/be-careful-writing-hashcode-methods.html" title="Be careful writing hashCode() methods when using HashCodeBuilder" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/06/be-careful-writing-hashcode-methods.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMCSHc8fSp7ImA9WxJVGUQ.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-2127676990634920624</id><published>2009-06-23T20:49:00.004+01:00</published><updated>2009-07-07T20:04:29.975+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T20:04:29.975+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>How to escape text when pasting into Eclipse (including XML)</title><content type="html">When you paste text into &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; it does just that - places where the cursor is in it's full un-altered original form.  This is fine most of the time apart from when you might want to copy a chunk of XML (or a similar large body of text).  What you end up with in this case is the text pasted in with red lines everywhere because the text hasn't been properly escaped for Java code.&lt;br /&gt;&lt;br /&gt;To enable escaping of pasted text open the Preferences panel ('Window' menu -&gt; 'Preferences...' option), then choose: 'Java' -&gt; 'Editor' -&gt; 'Typing' and tick the box which says "Escape text when pasting in a string literal":&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Vu_eUOpUOMk/Sj6O7PxpGdI/AAAAAAAAAhc/K6ZLW9E3KHc/s1600-h/pasting_xml_into_eclipse.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 297px; height: 400px;" src="http://2.bp.blogspot.com/_Vu_eUOpUOMk/Sj6O7PxpGdI/AAAAAAAAAhc/K6ZLW9E3KHc/s400/pasting_xml_into_eclipse.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5349870555860900306" /&gt;&lt;/a&gt;&lt;br /&gt;Now whenever you post in text which is broken over multiple lines, Eclipse will insert the relevant quotes of Java to make Eclipse happy.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Eclipse" rel="tag"&gt;Eclipse&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Editor" rel="tag"&gt;Editor&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Escaping Text" rel="tag"&gt;Escaping Text&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/XML" rel="tag"&gt;XML&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-2127676990634920624?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uZele-ieb6VM9FYF-tmS6ChoZrg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZele-ieb6VM9FYF-tmS6ChoZrg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uZele-ieb6VM9FYF-tmS6ChoZrg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZele-ieb6VM9FYF-tmS6ChoZrg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DdaZpCkqrus:QfqXSAmEXUI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DdaZpCkqrus:QfqXSAmEXUI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DdaZpCkqrus:QfqXSAmEXUI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=DdaZpCkqrus:QfqXSAmEXUI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DdaZpCkqrus:QfqXSAmEXUI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DdaZpCkqrus:QfqXSAmEXUI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=DdaZpCkqrus:QfqXSAmEXUI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/2127676990634920624/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=2127676990634920624" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/2127676990634920624?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/2127676990634920624?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/DdaZpCkqrus/how-to-escape-text-when-pasting-into.html" title="How to escape text when pasting into Eclipse (including XML)" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Vu_eUOpUOMk/Sj6O7PxpGdI/AAAAAAAAAhc/K6ZLW9E3KHc/s72-c/pasting_xml_into_eclipse.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/06/how-to-escape-text-when-pasting-into.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUDQnczeSp7ImA9WxJVEks.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-3433340710083434434</id><published>2009-06-17T16:24:00.001+01:00</published><updated>2009-06-29T10:04:33.981+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-29T10:04:33.981+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile" /><title>Summary of June's Manchester Spring User Group Meeting</title><content type="html">I missed the first &lt;a href="http://www.springusergroup.org.uk/"&gt;Manchester Spring User Group&lt;/a&gt; meeting back in April which I &lt;a href="http://billcomer.blogspot.com/2009/04/spring-user-group-in-north-west.html"&gt;heard&lt;/a&gt; was excellent so I made sure I didn't miss &lt;a href="http://blog.andrewbeacock.com/2009/06/spring-user-group-comes-back-to.html"&gt;June's meeting&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The sessions (based at the &lt;a href="http://skillsmatter.com/location-details/java-jee/382/55"&gt;University of Manchester Core Technology Facility&lt;/a&gt; - &lt;a href="http://maps.google.co.uk/maps?cbp=12,21.53,,0,5&amp;cbll=53.463788,-2.227503&amp;ll=53.463788,-2.227503&amp;layer=c"&gt;cool building&lt;/a&gt; BTW) were organised by &lt;a href="http://www.cakesolutions.net/"&gt;Cake Solutions&lt;/a&gt; (in particular their MD Guy Remond) and it was Guy that introduced the evening and laid out the agenda.  Just a quick note about the venue, it's a very new tidy building, the room was an excellent size (seating for 50+ people) and coffee (and cake!) were provided.  Parking was free and immediately outside the building, just press the buzzer and mention the Spring User Group...&lt;br /&gt;&lt;br /&gt;The first talk was by Paul Sweby (of &lt;a href="http://www.uk.capgemini.com/"&gt;CapGemini&lt;/a&gt;) entitled:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Spring in Government - Improving System &amp; Personal Performance&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Paul works on the &lt;a href="http://www.hmrc.gov.uk/index.htm"&gt;HM Revenue &amp; Customs website&lt;/a&gt; and started his talk by providing some pretty impressive statistics: around 40 million tax payers use the HMRC web site for various purposes.  The software is developed by CapGemini, the systems integration provided by Fujitsu, with BT providing the network connectivity.&lt;br /&gt;&lt;br /&gt;Previous versions were composed of a mixture of COBOL, Java and .Net, and since 2000 it was predominately Java with &lt;a href="http://en.wikipedia.org/wiki/Session_Beans"&gt;stateless sessions beans&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Facade_pattern"&gt;facade pattern&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Since then this has been ripped out and replaced with &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;.  It's now made up of the following software technologies: &lt;a href="http://www.springsource.org/"&gt;Spring 2.0&lt;/a&gt;, &lt;a href="https://www.hibernate.org/"&gt;Hibernate 3.2&lt;/a&gt;, &lt;a href="http://commons.apache.org/"&gt;Apache Commons&lt;/a&gt;, &lt;a href="http://www.jboss.org/drools/"&gt;Drools 4&lt;/a&gt;, and the following supporting components: &lt;a href="http://www.f5.com/products/big-ip/"&gt;F5 BigIP&lt;/a&gt;, &lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt;, &lt;a href="http://www.oracle.com/appserver/index.html"&gt;WebLogic&lt;/a&gt;, &lt;a href="http://www.oracle.com/database/index.html"&gt;Oracle 10g (with RAC)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are the notes that I was able to capture as Paul described some of the key points to being able to build such a large scale application:&lt;ul&gt;&lt;li&gt;Minimal use of JavaScript to ensure widest reach and browser compatibility&lt;br /&gt;&lt;li&gt;Uses &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; extensively - will be migrating to &lt;a href="http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/"&gt;Spring 3.0's REST support&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Strictly one business call per request&lt;br /&gt;&lt;li&gt;The HTTP session is bad, difficult &amp; expensive to replicate, compromises the compliance of the browsers navigation features (back button)&lt;br /&gt;&lt;li&gt;Minimal shared user data is maintained (around 2k) this is passed around between servers either via the database or sometimes as hidden fields on the page&lt;br /&gt;&lt;li&gt;Because of the above the pages are all bookmarkable&lt;br /&gt;&lt;li&gt;Careful planning of the URLs is important due to the use of REST and the exposure of data and services as 'resources'&lt;br /&gt;&lt;li&gt;Using &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt; (and possibly &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt;) for &lt;a href="http://www.martinfowler.com/articles/continuousIntegration.html"&gt;continuous integration&lt;/a&gt;&lt;br /&gt;&lt;li&gt;The used agile 'by stealth', &lt;a href="http://astore.amazon.co.uk/andrewbeacock-21/detail/0321146530"&gt;test first development&lt;/a&gt; and &lt;a href="http://www.agilemodeling.com/essays/barelyGoodEnough.html"&gt;'barely enough' modelling&lt;/a&gt;&lt;/ul&gt;Future plans include:&lt;ul&gt;&lt;li&gt;Increased use of &lt;a href="http://static.springframework.org/spring-batch/"&gt;Spring Batch&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Migration from Spring 2 to Spring 3 (remove the concrete inheritance of the controllers)&lt;br /&gt;&lt;li&gt;Add support for &lt;a href="http://en.wikipedia.org/wiki/Web_2.0"&gt;'Web 2.0'&lt;/a&gt; components&lt;/ul&gt;The Spring-based system described above was able to deal with 400,000 filings on the last allowed day (Jan 30th) with 40,000 submissions filed in the last hour alone!  For the tax year of 2008/2009 over 5.8 million tax returns were filed, with a saving to the government of £20 million.  Pretty impressive stuff!&lt;br /&gt;&lt;br /&gt;There was a little break which contained a mention of the Manchester Spring User Group sponsors: &lt;a href="http://www.umic.co.uk/"&gt;UMIC&lt;/a&gt;, &lt;a href="http://www.hays.com/it/"&gt;Hays IT&lt;/a&gt;, &lt;a href="http://skillsmatter.com/"&gt;Skills Matter&lt;/a&gt;, &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt; &amp; &lt;a href="http://www.cakesolutions.net/"&gt;Cake Solutions&lt;/a&gt; and a mention about a new open source portal/forum/community site called &lt;a href="http://opensource-central.com/"&gt;OpenSource-Central&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The next talk was by &lt;a href="http://www.russmiles.com/"&gt;Russ Miles&lt;/a&gt; (author and MD of &lt;a href="http://www.opencredo.com/"&gt;OpenCredo&lt;/a&gt; amongst other things) and his talk was:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Grails Eye for the Spring Guy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; is an "open-source web application framework that leverages the &lt;a href="http://groovy.codehaus.org/"&gt;Groovy language&lt;/a&gt; and complements Java Web development".  It aims to make you more productive by providing a natural process from idea to concrete solution.  It follows the &lt;a href="http://en.wikipedia.org/wiki/Convention_over_Configuration"&gt;'convention over configuration'&lt;/a&gt; approach giving you an opinionated 'right way' of doing things - this is helpful in that fact that if you follow it's way of doing things you end up doing your work in less time, it's taken care of a lot of the mundane and background tasks for you.&lt;br /&gt;&lt;br /&gt;After Russ explained some of the core ideas behind Grails, he then proceeded for the rest of the presentation to build a simple web application from scratch using Grails.  He started by asking Grails to create the basic project structure: &lt;code&gt;grails create-app&lt;/code&gt; and then followed by explaining some of the directory structure.&lt;br /&gt;&lt;br /&gt;Without writing any code he then started his web application: &lt;code&gt;grails run-app&lt;/code&gt; and navigated to a simple start page in his browser - the basic guts of getting a running application was done for you.  He then created a domain class using the built-in Groovy scripts to create various types of artefacts, this auto-created an appropriate controller and a number of views suitable for simple &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt; operations.  The controller doesn't have normal methods for the CRUD operations, it has &lt;a href="http://en.wikipedia.org/wiki/Closure_(computer_science)"&gt;'closures'&lt;/a&gt; - methods which are assigned to properties and so can be passed around like variables.&lt;br /&gt;Without writing any database code he re-ran the web app and added a new domain object which was then displayed in a resulting list - Grails had created a development database using &lt;a href="http://hsqldb.org/"&gt;HSQLDB&lt;/a&gt; and mapped the domain object to a backing table created when the web-application started up.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/plugin/home"&gt;Grails plugins&lt;/a&gt; were mentioned next, it appears that most non-core functionality will be released as plugins which can cover the full technology stack from raw Spring access all the way up through controllers and domain objects up to the views.  It's with the use of plugins that new 'conventions' can be introduced enriching the Grails world - one example of this was the &lt;a href="http://grails.org/plugin/quartz"&gt;quartz&lt;/a&gt; plugin - this provided some new commands including &lt;code&gt;grails create-job&lt;/code&gt;.  Other useful plugins included &lt;a href="http://grails.org/plugin/jsecurity"&gt;jsecurity&lt;/a&gt;, &lt;a href="http://grails.org/plugin/springws"&gt;springws&lt;/a&gt; and &lt;a href="http://grails.org/plugin/yui"&gt;yui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;He also dived a little into the world of Groovy showing that it's a smooth learning curve from Java to Groovy - you can write normal Java in a &lt;code&gt;.groovy&lt;/code&gt; file and the Groovy interpreter/compiler understands it.  Groovy also follows the same path as some of the other dynamic languages in that it has a &lt;a href="http://en.wikipedia.org/wiki/Metaobject"&gt;'metaobject protocol' (MOP)&lt;/a&gt; allowing the application to add functionality to objects and classes at runtime.&lt;br /&gt;&lt;br /&gt;From my point of view, having done some &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt; development &lt;a href="http://blog.andrewbeacock.com/2005/09/ruby-to-replace-java-or-compliment-it.html"&gt;in the past&lt;/a&gt;, was that Grails appears to be a port of Rails to the Groovy language, taking the same ethos that 'convention of configuration' and simplicity are best.  That's not to say that I don't see vast benefit in Grails just that I didn't see any new 'magic' being presented.  One great advantage of Grails is the fact that it's underlying language (Groovy) is Java-based and runs (and compiles down to) standard Java which runs in the JVM.  This allows a much smoother transition for Java developers to migration to something like Grails rather than learn Ruby and then figure out how to deploy Rails - quite different than dropping WAR files into Tomcat...&lt;br /&gt;&lt;br /&gt;Guy concluded the evening with a little prize draw and then it was off to the local pub for some beers provided by Arie Chapman of &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt;, cheers Arie!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE: Russ Miles has kindly &lt;a href="http://www.russmiles.com/home/2009/6/26/grails-eye-slides-from-manchester-sug-now-available.html"&gt;uploaded his slides to his blog&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Spring" rel="tag"&gt;Spring&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/User Group" rel="tag"&gt;User Group&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/MSUG" rel="tag"&gt;MSUG&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Guy Remond" rel="tag"&gt;Guy Remond&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Cake Solutions" rel="tag"&gt;Cake Solutions&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Paul Sweby" rel="tag"&gt;Paul Sweby&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/CapGemini" rel="tag"&gt;CapGemini&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Russ Miles" rel="tag"&gt;Russ Miles&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/OpenCredo" rel="tag"&gt;OpenCredo&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Arie Chapman" rel="tag"&gt;Arie Chapman&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/SpringSource" rel="tag"&gt;SpringSource&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-3433340710083434434?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pgovnGDvjPM1BgPCkYJ6jJI6XT8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pgovnGDvjPM1BgPCkYJ6jJI6XT8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pgovnGDvjPM1BgPCkYJ6jJI6XT8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pgovnGDvjPM1BgPCkYJ6jJI6XT8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=cO3EXUj2Ick:wyVzG6HO9bM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=cO3EXUj2Ick:wyVzG6HO9bM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=cO3EXUj2Ick:wyVzG6HO9bM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=cO3EXUj2Ick:wyVzG6HO9bM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=cO3EXUj2Ick:wyVzG6HO9bM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=cO3EXUj2Ick:wyVzG6HO9bM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=cO3EXUj2Ick:wyVzG6HO9bM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/3433340710083434434/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=3433340710083434434" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3433340710083434434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3433340710083434434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/cO3EXUj2Ick/summary-of-junes-manchester-spring-user.html" title="Summary of June's Manchester Spring User Group Meeting" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/06/summary-of-junes-manchester-spring-user.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MCQXYyeip7ImA9WxJWEU0.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-5005565615939559818</id><published>2009-06-15T22:31:00.000+01:00</published><updated>2009-06-15T22:31:00.892+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-15T22:31:00.892+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>Improving slow wifi bandwidth performance on an Acer Aspire One</title><content type="html">We've noticed over the past few days that it was taking a long time to download stuff on &lt;a href="http://blog.andrewbeacock.com/2009/05/acer-aspire-one-backing-up-hidden.html"&gt;our Acer Aspire One&lt;/a&gt;.  Tonight I found out that it was only slow when it was unplugged from the mains - so it's a power-saving 'feature'.  I couldn't find any options within the power saving section of Windows control panel, so it was off to google for some help.&lt;br /&gt;&lt;br /&gt;Within seconds I found &lt;a href="http://apevere.blogspot.com/2009/01/acer-aspire-one-slow-wifi.html"&gt;the perfect solution&lt;/a&gt; explained very clearly over on &lt;a href="http://apevere.blogspot.com/"&gt;Peve's Blog&lt;/a&gt;.  I'm not going to repeat his instructions as he explains it great already so head over there to read his post entitled &lt;a href="http://apevere.blogspot.com/2009/01/acer-aspire-one-slow-wifi.html"&gt;Acer Aspire One Slow Wifi&lt;/a&gt; - Thanks Peve!&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Acer" rel="tag"&gt;Acer&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Aspire One" rel="tag"&gt;Aspire One&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Wifi" rel="tag"&gt;Wifi&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Apevere" rel="tag"&gt;Apevere&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-5005565615939559818?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OzIg1e4FzRMP8AE7l2ZH1jqe7s0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OzIg1e4FzRMP8AE7l2ZH1jqe7s0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OzIg1e4FzRMP8AE7l2ZH1jqe7s0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OzIg1e4FzRMP8AE7l2ZH1jqe7s0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=lTJPQeWSPQM:AAtVStGeFBs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=lTJPQeWSPQM:AAtVStGeFBs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=lTJPQeWSPQM:AAtVStGeFBs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=lTJPQeWSPQM:AAtVStGeFBs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=lTJPQeWSPQM:AAtVStGeFBs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=lTJPQeWSPQM:AAtVStGeFBs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=lTJPQeWSPQM:AAtVStGeFBs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/5005565615939559818/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=5005565615939559818" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/5005565615939559818?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/5005565615939559818?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/lTJPQeWSPQM/improving-slow-wifi-bandwidth.html" title="Improving slow wifi bandwidth performance on an Acer Aspire One" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/06/improving-slow-wifi-bandwidth.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8CQHs9eip7ImA9WxJXFks.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-7195146289959291004</id><published>2009-06-10T21:56:00.004+01:00</published><updated>2009-06-10T22:04:21.562+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T22:04:21.562+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>How to copy recorded TV programmes off your PVR (Humax 9200T)</title><content type="html">We have had a &lt;a href="http://www.trustedreviews.com/home-cinema/review/2008/03/27/Humax-PVR-9200T-Personal-Video-Recorder/p1"&gt;Humax 9200T PVR&lt;/a&gt; for quite some time now and occasionally we have wanted a more portable copy (think DVD) of a particular programme that we have recorded.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Vu_eUOpUOMk/SjAeCNDDYyI/AAAAAAAAAgs/OCO7ShVXKNg/s1600-h/humax1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 98px;" src="http://2.bp.blogspot.com/_Vu_eUOpUOMk/SjAeCNDDYyI/AAAAAAAAAgs/OCO7ShVXKNg/s400/humax1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5345805780899816226" /&gt;&lt;/a&gt;&lt;br /&gt;If you flip down the right-hand panel you will notice an unlabelled &lt;a href="http://en.wikipedia.org/wiki/USB#Types_of_USB_connector"&gt;standard USB B socket&lt;/a&gt;.  It's by the use of this socket that you can stream recorded programmes off the Humax and onto a PC ready for converting to a DVD (or just watching on the PC).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Vu_eUOpUOMk/SjAeCflzUSI/AAAAAAAAAg0/unJ98o23aM8/s1600-h/humax2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 125px;" src="http://3.bp.blogspot.com/_Vu_eUOpUOMk/SjAeCflzUSI/AAAAAAAAAg0/unJ98o23aM8/s400/humax2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5345805785877401890" /&gt;&lt;/a&gt;&lt;br /&gt;Here's how you do it:&lt;br /&gt;&lt;br /&gt;Visit Humax's support site and download &amp; install their rather old and flaky &lt;a href="http://www.humaxdigital.com/uk/support/downloadcenter_model.aspx?category_seq=56"&gt;Media E-Linker software&lt;/a&gt; (Click the "Media E-Linker software (Version 2.5) download link).&lt;br /&gt;&lt;br /&gt;Get a regular USB lead with an 'A' type plug on one end, and a 'B' type plug on the other.  Plug the 'B' end into the Humax, and the 'A' into any USB socket on your PC.  Your PC should now 'find' the Humax and request to install the drivers, I let mine 'auto-search' and it found and installed the drivers just fine (I think they also might be packaged in the Humax E-Linker software installation).&lt;br /&gt;&lt;br /&gt;Once the Humax is correctly attached, run the E-Linker software and choose to 'connect'.  If everything is successful you be given a file listing on the righthand side - probably giving you options of Pictures &amp; MP3.  Change the drive letter in the drop-down box on the top-right and you should now see a listing of all your recorded programs.&lt;br /&gt;&lt;br /&gt;Select the one that you want to transfer and click the button in the middle with an arrow pointing from right to left.  Now the tricky part: wait, and wait, and wait, etc.  On my rather old laptop (with USB1.1 I might add) it took over 24 hours to transfer a two hour program.  It may be quicker with a USB2.0 PC but I had problems getting &lt;a href="http://blog.andrewbeacock.com/2009/05/acer-aspire-one-backing-up-hidden.html"&gt;our Acer Aspire One&lt;/a&gt; to connect to the Humax correctly.&lt;br /&gt;&lt;br /&gt;Once the transfer has completed you will be left with the program as a ".ts" file - this is an MPEG2 file but with "&lt;a href="http://en.wikipedia.org/wiki/MPEG_transport_stream"&gt;transport stream&lt;/a&gt;" encoding, exactly the same format as the file came over the air to your Humax in the first place.  Many players and DVD burning software know how to deal with this format, but if not you can simply convert it to a regular MPEG2 video file with something like &lt;a href="http://www.midwinter.com/~bcooley/"&gt;HDTVtoMPEG2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Vu_eUOpUOMk/SjAeCvcL0-I/AAAAAAAAAg8/xFGxe5qXauE/s1600-h/hdtv_to_mpeg2.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 337px;" src="http://4.bp.blogspot.com/_Vu_eUOpUOMk/SjAeCvcL0-I/AAAAAAAAAg8/xFGxe5qXauE/s400/hdtv_to_mpeg2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345805790132032482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Humax" rel="tag"&gt;Humax&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/PVR" rel="tag"&gt;PVR&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-7195146289959291004?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3uDmOBUed3f_fI97aCGKUnRcmsA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3uDmOBUed3f_fI97aCGKUnRcmsA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3uDmOBUed3f_fI97aCGKUnRcmsA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3uDmOBUed3f_fI97aCGKUnRcmsA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kWmYFq5dNCI:FGN0OqtdIl4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kWmYFq5dNCI:FGN0OqtdIl4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kWmYFq5dNCI:FGN0OqtdIl4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=kWmYFq5dNCI:FGN0OqtdIl4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kWmYFq5dNCI:FGN0OqtdIl4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kWmYFq5dNCI:FGN0OqtdIl4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=kWmYFq5dNCI:FGN0OqtdIl4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/7195146289959291004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=7195146289959291004" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7195146289959291004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7195146289959291004?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/kWmYFq5dNCI/how-to-copy-recorded-tv-programmes-off.html" title="How to copy recorded TV programmes off your PVR (Humax 9200T)" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Vu_eUOpUOMk/SjAeCNDDYyI/AAAAAAAAAgs/OCO7ShVXKNg/s72-c/humax1.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/06/how-to-copy-recorded-tv-programmes-off.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEEQXs4fSp7ImA9WxJQGEQ.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-5247848265310046943</id><published>2009-06-01T22:10:00.001+01:00</published><updated>2009-06-01T22:10:00.535+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-01T22:10:00.535+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>The Spring User Group comes back to Manchester on June 15th</title><content type="html">Back in March I blogged about the &lt;a href="http://blog.andrewbeacock.com/2009/03/spring-user-group-comes-to-north-west.html"&gt;first North West Spring User Group meeting&lt;/a&gt;.  Well on the &lt;a href="http://skillsmatter.com/event/java-jee/msug"&gt;15th June&lt;/a&gt; they are coming back to Manchester.  I wasn't able to attend the last one but an old colleague &lt;a href="http://billcomer.blogspot.com/"&gt;Bill Comer&lt;/a&gt; &lt;a href="http://billcomer.blogspot.com/2009/04/spring-user-group-in-north-west.html"&gt;attended the session&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;June's session is on "Grails eye for the Spring guy" by &lt;a href="http://skillsmatter.com/expert-profile/java-jee/russell-miles"&gt;Russ Miles&lt;/a&gt; (MD of &lt;a href="http://www.opencredo.com/index.html"&gt;OpenCredo&lt;/a&gt;). Russ has also &lt;a href="http://www.russmiles.com/home/2009/5/12/speaking-the-manchester-spring-user-group-monday-15th-june.html"&gt;blogged about the future talk over on his blog&lt;/a&gt;.  It sounds good and I'm planning on attending this time so if you see me there come over and say hi!&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Spring" rel="tag"&gt;Spring&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Hibernate" rel="tag"&gt;Hibernate&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Manchester" rel="tag"&gt;Manchester&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/North West" rel="tag"&gt;North West&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Russ Miles" rel="tag"&gt;Russ Miles&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-5247848265310046943?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CaDrIUwtJ_STPAT3wotL1D2g8hc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CaDrIUwtJ_STPAT3wotL1D2g8hc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CaDrIUwtJ_STPAT3wotL1D2g8hc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CaDrIUwtJ_STPAT3wotL1D2g8hc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=0U5zNUq-NTE:ozQztqyMvK0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=0U5zNUq-NTE:ozQztqyMvK0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=0U5zNUq-NTE:ozQztqyMvK0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=0U5zNUq-NTE:ozQztqyMvK0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=0U5zNUq-NTE:ozQztqyMvK0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=0U5zNUq-NTE:ozQztqyMvK0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=0U5zNUq-NTE:ozQztqyMvK0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/5247848265310046943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=5247848265310046943" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/5247848265310046943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/5247848265310046943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/0U5zNUq-NTE/spring-user-group-comes-back-to.html" title="The Spring User Group comes back to Manchester on June 15th" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/06/spring-user-group-comes-back-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMEQXY6fip7ImA9WxJQE04.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-786466028663579779</id><published>2009-05-26T12:30:00.000+01:00</published><updated>2009-05-26T12:30:00.816+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-26T12:30:00.816+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>Replace your broadband provider's DNS servers with OpenDNS ones for more reliable service</title><content type="html">I had an 'internet issue' last week when around 10am my connection to the internet was lost.  Well not completely lost - my work PC (a remote box accessed via &lt;a href="http://en.wikipedia.org/wiki/Vpn"&gt;VPN&lt;/a&gt;) was still working fine so I still had a connection (at an IP level), but I couldn't visit any websites.  The problem was that Pipex's &lt;a href="http://en.wikipedia.org/wiki/Domain_name_system"&gt;DNS&lt;/a&gt; servers were offline (I couldn't ping them) and it wasn't planned maintenance.&lt;br /&gt;&lt;br /&gt;So I replace them with settings for the &lt;a href="http://www.opendns.com/"&gt;free OpenDNS servers&lt;/a&gt;.  These DNS servers are used by millions of people around the world, I suppose I've not migrated to them before because I've not had an issue until now.  The migration couldn't have been easier - I logged into &lt;a href="http://blog.andrewbeacock.com/2006/07/dead-broadband-routers-fantastic.html"&gt;my router&lt;/a&gt;, accessed the 'internet settings' menu option, and selected 'DNS'.  Then I unticked the "Automatic from ISP" box and entered the OpenDNS server details in the IP address boxes:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Vu_eUOpUOMk/ShKBJq6CGEI/AAAAAAAAAgg/0SdZR7EeXeo/s1600-h/opendns_settings.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 218px;" src="http://1.bp.blogspot.com/_Vu_eUOpUOMk/ShKBJq6CGEI/AAAAAAAAAgg/0SdZR7EeXeo/s400/opendns_settings.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5337470511523960898" /&gt;&lt;/a&gt;&lt;br /&gt;The OpenDNS DNS server IP addresses are:&lt;pre&gt;Primary   DNS Server: 208.67.222.222&lt;br /&gt;Secondary DNS Server: 208.67.220.220&lt;/pre&gt;Once my router had restarted itself with these DNS settings I was back online again...&lt;br /&gt;&lt;br /&gt;More &lt;a href="https://www.opendns.com/start/"&gt;detailed setup instructions&lt;/a&gt; can be found on the OpenDNS site.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/DNS" rel="tag"&gt;DNS&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Broadband" rel="tag"&gt;Broadband&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Pipex" rel="tag"&gt;Pipex&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/OpenDNS" rel="tag"&gt;OpenDNS&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-786466028663579779?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cUsgPH2a39z9LbFNrGBEgB6_50M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cUsgPH2a39z9LbFNrGBEgB6_50M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cUsgPH2a39z9LbFNrGBEgB6_50M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cUsgPH2a39z9LbFNrGBEgB6_50M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=O0A-zKKhwz8:JN7hfZwcaUs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=O0A-zKKhwz8:JN7hfZwcaUs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=O0A-zKKhwz8:JN7hfZwcaUs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=O0A-zKKhwz8:JN7hfZwcaUs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=O0A-zKKhwz8:JN7hfZwcaUs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=O0A-zKKhwz8:JN7hfZwcaUs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=O0A-zKKhwz8:JN7hfZwcaUs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/786466028663579779/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=786466028663579779" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/786466028663579779?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/786466028663579779?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/O0A-zKKhwz8/replace-your-broadband-providers-dns.html" title="Replace your broadband provider's DNS servers with OpenDNS ones for more reliable service" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_Vu_eUOpUOMk/ShKBJq6CGEI/AAAAAAAAAgg/0SdZR7EeXeo/s72-c/opendns_settings.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/05/replace-your-broadband-providers-dns.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4NRn44eip7ImA9WxJRFkU.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-3979855691056421849</id><published>2009-05-18T22:40:00.001+01:00</published><updated>2009-05-18T22:43:17.032+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-18T22:43:17.032+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>JSTL date comparisons with the current time (now) in JSPs</title><content type="html">When you are coding JSPs and using the &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html"&gt;JSTL tags&lt;/a&gt; you will often be presenting information captured in a domain object, using the JavaBean-style getters to pull out the values within the JSP page.&lt;br /&gt;&lt;br /&gt;What do you do if you need to show some text if the date stored within the domain object is before (or after) the current time?&lt;br /&gt;&lt;br /&gt;There are many wrong or messy solutions - polluting the domain object by adding a method to 'get' the text to display, do the comparison in the controller and add the text to display to the request, etc.&lt;br /&gt;&lt;br /&gt;One clean way is to use the &lt;a href="http://java.sun.com/products/jsp/tags/11/syntaxref11.fm14.html"&gt;&lt;code&gt;jsp:useBean&lt;/code&gt; tag&lt;/a&gt; to create a page-scoped variable containing the current date/time and then use normal JSTL to compare the objects.&lt;br /&gt;&lt;br /&gt;First create the page-scoped &lt;code&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Date.html"&gt;java.util.Date&lt;/a&gt;&lt;/code&gt; object (using &lt;code&gt;jsp:useBean&lt;/code&gt;), then use &lt;code&gt;${now}&lt;/code&gt; to reference the current date/time. This is a regular JSP object now and so the normal JSTL operators work with this variable:&lt;br /&gt;&lt;pre&gt;&amp;lt;jsp:useBean id=&amp;quot;now&amp;quot; class=&amp;quot;java.util.Date&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:if test=&amp;quot;${someEvent.startDate lt now}&amp;quot;&amp;gt;&lt;br /&gt;   It's history!&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;/pre&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Java" rel="tag"&gt;Java&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JSP" rel="tag"&gt;JSP&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JSTL" rel="tag"&gt;JSTL&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Date" rel="tag"&gt;Date&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Comparison" rel="tag"&gt;Comparison&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-3979855691056421849?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nJbM2hXgTlI75bDmiIHMqh5jUqE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nJbM2hXgTlI75bDmiIHMqh5jUqE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nJbM2hXgTlI75bDmiIHMqh5jUqE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nJbM2hXgTlI75bDmiIHMqh5jUqE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=M3mlvzik8eM:f5tN5BxqVDk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=M3mlvzik8eM:f5tN5BxqVDk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=M3mlvzik8eM:f5tN5BxqVDk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=M3mlvzik8eM:f5tN5BxqVDk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=M3mlvzik8eM:f5tN5BxqVDk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=M3mlvzik8eM:f5tN5BxqVDk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=M3mlvzik8eM:f5tN5BxqVDk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/3979855691056421849/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=3979855691056421849" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3979855691056421849?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3979855691056421849?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/M3mlvzik8eM/jstl-date-comparisons-with-current-time.html" title="JSTL date comparisons with the current time (now) in JSPs" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/05/jstl-date-comparisons-with-current-time.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04GQHs_eSp7ImA9WxJWEEw.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-7714441961061734322</id><published>2009-05-12T23:09:00.006+01:00</published><updated>2009-06-14T21:38:41.541+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-14T21:38:41.541+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>Acer Aspire One: Backing up the hidden Windows XP factory image partition</title><content type="html">My wife recently got the Windows XP 160GB version of the amazing popular &lt;a href="http://astore.amazon.co.uk/andrewbeacock-21/detail/B001MIYOME"&gt;Acer Aspire One&lt;/a&gt; (this seems to be the only netbook people ever have!).&lt;br /&gt;&lt;br /&gt;I'd heard from a friend that we should save off the backup image which is preloaded onto a hidden partition (called PQSERVICE).  But how do you gain access to the partition in order to save it off?&lt;br /&gt;&lt;br /&gt;After much research I came up with the following options:&lt;ul&gt;&lt;li&gt;Install Linux on a USB pendrive, boot from that, then save the partition using Linux tools&lt;br /&gt;&lt;li&gt;Hack the master boot record to remove the 'hidden' attribute of the partition, then save it somehow&lt;br /&gt;&lt;li&gt;Numerous other tough/dangerous/involved methods&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Follow my method below which is easy, safe and free!&lt;/span&gt;&lt;/ul&gt;Here are the steps you need to follow to be able to save off a backup image of the factory install of your Acer Aspire One as well as save a copy of your &lt;a href="http://en.wikipedia.org/wiki/Master_boot_record"&gt;Master Boot Record (MBR)&lt;/a&gt;  incase your hard drive dies...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Saving your hidden PQSERVICE partition&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Download the &lt;a href="http://www.macrium.com/reflectfree.asp"&gt;free version of Macrium Reflect&lt;/a&gt; and install it&lt;br /&gt;&lt;br /&gt;Run Macrium Reflect, let it analyse your drive and then right-click on the listed PQSERVICE partition (it's not hidden to this tool!):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Vu_eUOpUOMk/Sgnzs3ZpX5I/AAAAAAAAAgQ/s91a7rtTIJk/s1600-h/create_image.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 273px;" src="http://4.bp.blogspot.com/_Vu_eUOpUOMk/Sgnzs3ZpX5I/AAAAAAAAAgQ/s91a7rtTIJk/s400/create_image.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5335063185708375954" /&gt;&lt;/a&gt;&lt;br /&gt;Choose the "Create Image of '1 - PQSERVICE'" option&lt;br /&gt;&lt;br /&gt;Save the partition to wherever is suitable, I place mine directly on my &lt;a href="http://en.wikipedia.org/wiki/Network-attached_storage"&gt;NAS storage box&lt;/a&gt; (I selected the "Intelligent Copy" option rather than the sector by sector copy, but I've not restored the image so please don't rely on that advice for a safe copy...).&lt;br /&gt;&lt;br /&gt;An image of your hidden WinXP partition will now be saved:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Vu_eUOpUOMk/SgnztHnyahI/AAAAAAAAAgY/DUcr-XykOmw/s1600-h/saving_image.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 319px;" src="http://2.bp.blogspot.com/_Vu_eUOpUOMk/SgnztHnyahI/AAAAAAAAAgY/DUcr-XykOmw/s400/saving_image.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5335063190062656018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Saving your Master Boot Record (MBR)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You will also probably want to save off the master boot record of the Acer's drive so that in the case of a complete drive failure you can set it up in a similar manner to the factory settings to be able to restore it correctly.&lt;br /&gt;&lt;br /&gt;Download the free &lt;a href="http://mbrwizard.com/"&gt;MBRWizard&lt;/a&gt; and extract the archive&lt;br /&gt;&lt;br /&gt;Open a DOS box, navigate to where you extracted MBRWiz.exe and run the following command:&lt;br /&gt;&lt;pre&gt;MBRWiz /Save=C:\acer_aspire_one.mbr&lt;/pre&gt;Copy the &lt;code&gt;acer_aspire_one.mbr&lt;/code&gt; file in your C drive to somewhere safe (I put mine in the same place on the NAS box as the above PQSERVICE partition image file.&lt;br /&gt;&lt;br /&gt;That's it!&lt;br /&gt;&lt;br /&gt;Note: I've not restored this partition or master boot record, and I don't expect to, but at least you have a copy without messing about with your new netbook too much!&lt;br /&gt;&lt;br /&gt;All this information was gleamed from &lt;a href="http://www.raymond.cc/blog/archives/2008/11/11/the-importance-of-backing-up-eisa-hidden-pqservice-partition-and-mbr-on-a-new-laptop/"&gt;The Importance of Backing Up EISA Hidden PQSERVICE Partition and MBR on a New Laptop&lt;/a&gt; (includes details on how to view the contents of the backed up image) and &lt;a href="http://www.raymond.cc/blog/archives/2008/11/10/5-free-tools-to-backup-and-restore-master-boot-record-mbr/"&gt;5 Free Tools to Backup and Restore Master Boot Record (MBR)&lt;/a&gt; from &lt;a href="http://www.raymond.cc/blog/"&gt;the fantastic Raymond.cc blog&lt;/a&gt;.  They go into much more detail and I would recommend that you give them both a good read.&lt;br /&gt;&lt;br /&gt;UPDATE: This blog post looks like a good source of information if you want to &lt;a href="http://nerdfortress.com/2009/04/14/restore-xp-on-the-acer-aspire-one-how-to-restore-xp-from-the-acer-aspire-one-hidden-partition/"&gt;Restore XP from the Acer Aspire One Hidden Partition&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Acer" rel="tag"&gt;Acer&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Aspire" rel="tag"&gt;Aspire&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Backup" rel="tag"&gt;Backup&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Partition" rel="tag"&gt;Partition&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Image" rel="tag"&gt;Image&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/WindowsXP" rel="tag"&gt;WindowsXP&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Macrium" rel="tag"&gt;Macrium&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/MBRWizard" rel="tag"&gt;MBRWizard&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Raymond.cc" rel="tag"&gt;Raymond.cc&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-7714441961061734322?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FDTCeSiUdJ2ZjiVzTN76NHemD48/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FDTCeSiUdJ2ZjiVzTN76NHemD48/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FDTCeSiUdJ2ZjiVzTN76NHemD48/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FDTCeSiUdJ2ZjiVzTN76NHemD48/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=JOWsXNORgfc:vpziNh0Y0-Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=JOWsXNORgfc:vpziNh0Y0-Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=JOWsXNORgfc:vpziNh0Y0-Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=JOWsXNORgfc:vpziNh0Y0-Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=JOWsXNORgfc:vpziNh0Y0-Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=JOWsXNORgfc:vpziNh0Y0-Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=JOWsXNORgfc:vpziNh0Y0-Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/7714441961061734322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=7714441961061734322" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7714441961061734322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7714441961061734322?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/JOWsXNORgfc/acer-aspire-one-backing-up-hidden.html" title="Acer Aspire One: Backing up the hidden Windows XP factory image partition" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_Vu_eUOpUOMk/Sgnzs3ZpX5I/AAAAAAAAAgQ/s91a7rtTIJk/s72-c/create_image.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/05/acer-aspire-one-backing-up-hidden.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMBQX87eSp7ImA9WxJSEk0.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-4498912333895192849</id><published>2009-05-01T20:50:00.004+01:00</published><updated>2009-05-01T21:07:30.101+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T21:07:30.101+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile" /><title>Easy, collaborative web UI mockups with Balsamiq</title><content type="html">Every now and again you come across a tool that is so easy to understand, so fast to use and so effective at conveying it's ideas that you just have to tell people about it.  One such tool is &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Mockups by Balsamic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.balsamiq.com/products/mockups"&gt;&lt;img style="width: 200px; height: 65px;" align="right" src="http://2.bp.blogspot.com/_Vu_eUOpUOMk/SftS8b5XeyI/AAAAAAAAAfo/vmIygJxw700/s400/balsamiq_logo1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5330945782157114146" /&gt;&lt;/a&gt;It's a &lt;a href="http://www.balsamiq.com/products/mockups"&gt;web page mockup drawing tool&lt;/a&gt; written using Adobe Air which provides a palette of HTML widgets with which to 'draw' your screens.  It has a querky 'freehand' style which lends itself to conveying the components and ideas that a web page should have without forcing the designer to code it up in HTML (or for the customer to think that because the HTML is done, the app must nearly be ready...).&lt;br /&gt;&lt;br /&gt;Here is a very simple web page for search and listing users which I '&lt;a href="http://www.balsamiq.com/products/mockups"&gt;mocked up&lt;/a&gt;' in less than 10 minutes:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Vu_eUOpUOMk/SftS8fD90XI/AAAAAAAAAfg/ZVwHsUch6co/s1600-h/mockup.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 341px;" src="http://4.bp.blogspot.com/_Vu_eUOpUOMk/SftS8fD90XI/AAAAAAAAAfg/ZVwHsUch6co/s400/mockup.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330945783006876018" /&gt;&lt;/a&gt;As you can see it's got a number of standard HTML widgets on it as well as a very useful 'post it' note allowing you to add distinctive notes and comments to the mockups themselves.  So this in itself is enough to warrant using it to create all the screenshots that you might need which trying to show a customer what their site might look like, but...&lt;br /&gt;&lt;br /&gt;The best feature about this tool is that it's so easy to understand and control that people are happy to start adding and editing stuff within five minutes of seeing the tool:&lt;br /&gt;&lt;blockquote&gt;I used it recently during a teleconference to try and show a couple of remote attendees what my ideas were about our new project.  We were each sat at our desks (in different offices) with headsets on (talking to each other) and other two people 'remote desktop'ed (via VNC) to my machine.  I was then able to show them my ideas and also start to perform live edits to the mockups as the meeting progressed.&lt;br /&gt;&lt;br /&gt;After about five minutes one attendee said "here, let me try..." and that was it, for the rest of the hour-long meeting all three of us were taking it in turns to control the mouse and keyboard and refine the mockups.&lt;/blockquote&gt;It was one of the most collaborative remote sessions I have ever done - because &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsamiq Mockups&lt;/a&gt; is so intuitive to use it was a doddle to get people to start to use it.  Also because you can directly export the mockups to images it's easy to include them in just about any type of document or system that you have.&lt;br /&gt;&lt;br /&gt;This is an excellent tool, and cheap as well!&lt;br /&gt;&lt;br /&gt;Oh, and if the standard widgets contained in &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsamiq Mockups&lt;/a&gt; aren't enough, there is an ever-growing collection of user-contributed widgets over on the &lt;a href="http://mockupstogo.net/"&gt;Mockups To Go&lt;/a&gt; site, a great example packed with widgets is &lt;a href="http://mockupstogo.net/various-web-page-widgets"&gt;Various Web Page Widgets&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Collaboration" rel="tag"&gt;Collaboration&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Web" rel="tag"&gt;Web&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/HTML" rel="tag"&gt;HTML&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Mockups" rel="tag"&gt;Mockups&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Balsamiq" rel="tag"&gt;Balsamiq&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-4498912333895192849?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ps5OytFU1T0VWyGHeoqI2hs5WsU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ps5OytFU1T0VWyGHeoqI2hs5WsU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ps5OytFU1T0VWyGHeoqI2hs5WsU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ps5OytFU1T0VWyGHeoqI2hs5WsU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=1jsGmrpb0LA:RA31bUMrnS4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=1jsGmrpb0LA:RA31bUMrnS4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=1jsGmrpb0LA:RA31bUMrnS4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=1jsGmrpb0LA:RA31bUMrnS4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=1jsGmrpb0LA:RA31bUMrnS4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=1jsGmrpb0LA:RA31bUMrnS4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=1jsGmrpb0LA:RA31bUMrnS4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/4498912333895192849/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=4498912333895192849" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/4498912333895192849?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/4498912333895192849?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/1jsGmrpb0LA/easy-collaborative-web-ui-mockups-with.html" title="Easy, collaborative web UI mockups with Balsamiq" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Vu_eUOpUOMk/SftS8b5XeyI/AAAAAAAAAfo/vmIygJxw700/s72-c/balsamiq_logo1.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/05/easy-collaborative-web-ui-mockups-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYEQXc4fyp7ImA9WxVaEEk.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-6195483308813795665</id><published>2009-04-06T19:55:00.000+01:00</published><updated>2009-04-06T19:55:00.937+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-06T19:55:00.937+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>JSTL 'forEach' looping tricks using varStatus</title><content type="html">Do you have a &lt;a href="http://java.sun.com/products/jsp/jstl/"&gt;JSTL&lt;/a&gt; &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/c/forEach.html"&gt;forEach loop&lt;/a&gt; in your &lt;a href="http://java.sun.com/products/jsp/"&gt;JSP&lt;/a&gt; page displaying a list of results?  Have you ever wanted to do something different for each row, or maybe do something for all but the last row?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;varStatus&lt;/b&gt; is what you want!&lt;br /&gt;&lt;br /&gt;You declare a new variable within the main forEach JSP block which will allow you to access the internal loop counter of the for-each loop.  Then you can call a number of methods on that object to be able to do conditional processing.&lt;br /&gt;&lt;br /&gt;The code example below will display a horizontal rule under each item apart from the very last one:&lt;pre&gt;&amp;lt;c:forEach var=&amp;quot;thing&amp;quot; items=&amp;quot;${things}&amp;quot; varStatus=&amp;quot;status&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;a href=&amp;quot;${thing.link}&amp;quot;&amp;gt;${thing.description}&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;    ${not status.last ? '&amp;lt;hr/&amp;gt;' : ''}&lt;br /&gt;&lt;br /&gt;&amp;lt;/c:forEach&amp;gt;&lt;/pre&gt;The important bits of the above snippet are the &lt;code&gt;varStatus="status"&lt;/code&gt; and &lt;code&gt;status.last&lt;/code&gt;.  The first one defines a 'status' variable, and the second one accesses it to ask if this row is the 'last'.&lt;br /&gt;&lt;br /&gt;The status object has a number of useful methods:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#getCurrent()"&gt;current&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#getIndex()"&gt;index&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#getCount()"&gt;count&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#isFirst()"&gt;first&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#isLast()"&gt;last&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#getBegin()"&gt;begin&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#getStep()"&gt;step&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#getEnd()"&gt;end&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/forEach" rel="tag"&gt;forEach&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JSTL" rel="tag"&gt;JSTL&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JSP" rel="tag"&gt;JSP&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-6195483308813795665?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YYskLPe-8HxiBq90Y_FVbROQCGg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YYskLPe-8HxiBq90Y_FVbROQCGg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YYskLPe-8HxiBq90Y_FVbROQCGg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YYskLPe-8HxiBq90Y_FVbROQCGg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=RsUAsbM0TiI:HPV-v0SPbSc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=RsUAsbM0TiI:HPV-v0SPbSc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=RsUAsbM0TiI:HPV-v0SPbSc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=RsUAsbM0TiI:HPV-v0SPbSc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=RsUAsbM0TiI:HPV-v0SPbSc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=RsUAsbM0TiI:HPV-v0SPbSc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=RsUAsbM0TiI:HPV-v0SPbSc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/6195483308813795665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=6195483308813795665" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/6195483308813795665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/6195483308813795665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/RsUAsbM0TiI/jstl-foreach-looping-tricks-using.html" title="JSTL 'forEach' looping tricks using varStatus" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/04/jstl-foreach-looping-tricks-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8ER3Y-eyp7ImA9WxVUFEQ.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-6811075783870643600</id><published>2009-03-19T21:20:00.003Z</published><updated>2009-03-19T21:40:06.853Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-19T21:40:06.853Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><title>Customising GMail with Google Mail Labs</title><content type="html">I've been playing with a few of the &lt;a href="http://gmailblog.blogspot.com/2008/06/introducing-gmail-labs.html"&gt;Google Mail Labs&lt;/a&gt; plugins over the past couple of months and this post is about my 'must haves'.  There are three that I am very pleased with, which have changed how I use GMail to the point that it is now the only tab within &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt; that I MUST have open.&lt;br /&gt;&lt;br /&gt;Here is a screenshot of my &lt;a href="http://gmail.google.com/"&gt;GMail&lt;/a&gt; page with the relevant labs highlighted, details follow below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Vu_eUOpUOMk/ScK7T0J2pHI/AAAAAAAAAe4/E5bgXYct3fY/s1600-h/gmail.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 392px;" src="http://2.bp.blogspot.com/_Vu_eUOpUOMk/ScK7T0J2pHI/AAAAAAAAAe4/E5bgXYct3fY/s400/gmail.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315016459342488690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://gmailblog.blogspot.com/2008/09/new-in-labs-right-side-labels-and-chat.html"&gt;Right-side labels&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This plugin shoves the labels section of the GMail page over to the right-hand side, meaning that you are not scrolling the page up and down to see your Inbox and your labels.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;a href="http://gmailblog.blogspot.com/2008/10/new-in-labs-calendar-and-docs-gadgets.html"&gt;Google Calendar gadget&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This tightly integrates Google Calendar into the left-hand side of GMail meaning that you can keep an eye on what is coming up without either having a seperate application running (which is sync'ed with Google Calendar) or another tab open.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://gmailblog.blogspot.com/2009/02/new-in-labs-browser-title-bar-tweaks.html"&gt;&lt;br /&gt;Title Tweaks&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a recent addition (yesterday in fact) but looks quite useful - it simply rearranges the page title so that the selected folder (inbox, chats, labels, etc.) is first and so shows up on the tab.&lt;br /&gt;&lt;br /&gt;They are all such 'simple' changes which just make GMail all the more useful.  I've also started playing with the 'Offline' lab but I'm not got much to report on that yet...&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Google" rel="tag"&gt;Google&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Mail" rel="tag"&gt;Mail&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/GMail" rel="tag"&gt;GMail&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Calendar" rel="tag"&gt;Calendar&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Labs" rel="tag"&gt;Labs&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-6811075783870643600?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/N6UxFVEDgMtgWuhr9PrC3kFXMbc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N6UxFVEDgMtgWuhr9PrC3kFXMbc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/N6UxFVEDgMtgWuhr9PrC3kFXMbc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/N6UxFVEDgMtgWuhr9PrC3kFXMbc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=f4Uvw5jXV2A:4hnf6qrRQOI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=f4Uvw5jXV2A:4hnf6qrRQOI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=f4Uvw5jXV2A:4hnf6qrRQOI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=f4Uvw5jXV2A:4hnf6qrRQOI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=f4Uvw5jXV2A:4hnf6qrRQOI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=f4Uvw5jXV2A:4hnf6qrRQOI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=f4Uvw5jXV2A:4hnf6qrRQOI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/6811075783870643600/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=6811075783870643600" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/6811075783870643600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/6811075783870643600?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/f4Uvw5jXV2A/customising-gmail-with-google-mail-labs.html" title="Customising GMail with Google Mail Labs" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Vu_eUOpUOMk/ScK7T0J2pHI/AAAAAAAAAe4/E5bgXYct3fY/s72-c/gmail.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/03/customising-gmail-with-google-mail-labs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8ARn4ycSp7ImA9WxVVGEs.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-3457919964718205637</id><published>2009-03-12T14:33:00.004Z</published><updated>2009-03-12T14:40:47.099Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T14:40:47.099Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>The Spring User Group comes to the North West!</title><content type="html">My friend &lt;a href="http://billcomer.blogspot.com/"&gt;Bill Comer&lt;/a&gt; forwarded on an email today about the the &lt;a href="http://www.springusergroup.org.uk/"&gt;UK Spring User Group&lt;/a&gt; coming to &lt;a href="http://skillsmatter.com/event/java-jee/spring-ug-meeting-208"&gt;Manchester on the 8th April&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;It's a free event starting at 6pm at Manchester University, and they have a number of speakers lined up including &lt;a href="http://europe.springone.com/europe-2009/speaker/Rob+Harrop"&gt;Rob Harrop&lt;/a&gt; (architect and lead developer at SpringSource).&lt;br /&gt;&lt;br /&gt;This sounds like a great event for any Northern Spring developers and it's nice that they have left London for a change! :)&lt;br /&gt;&lt;br /&gt;More details can be found at the &lt;a href="http://skillsmatter.com/event/java-jee/spring-ug-meeting-208"&gt;Skills Matter&lt;/a&gt; site.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Spring" rel="tag"&gt;Spring&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/North West" rel="tag"&gt;North West&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-3457919964718205637?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2mp52HWvEn_ygyeyHamkdRXobfs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2mp52HWvEn_ygyeyHamkdRXobfs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2mp52HWvEn_ygyeyHamkdRXobfs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2mp52HWvEn_ygyeyHamkdRXobfs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kc4RLm-afMg:JVrr_c68oic:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kc4RLm-afMg:JVrr_c68oic:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kc4RLm-afMg:JVrr_c68oic:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=kc4RLm-afMg:JVrr_c68oic:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kc4RLm-afMg:JVrr_c68oic:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=kc4RLm-afMg:JVrr_c68oic:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=kc4RLm-afMg:JVrr_c68oic:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/3457919964718205637/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=3457919964718205637" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3457919964718205637?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3457919964718205637?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/kc4RLm-afMg/spring-user-group-comes-to-north-west.html" title="The Spring User Group comes to the North West!" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/03/spring-user-group-comes-to-north-west.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcCQnkyeCp7ImA9WxVVE04.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-4500215439877990385</id><published>2009-03-06T08:50:00.002Z</published><updated>2009-03-06T09:01:03.790Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-06T09:01:03.790Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>How to move an existing Cygwin installation</title><content type="html">Although &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; is a self-contained installation with little in the way of the normal tendrils hooked into the dark shady corners of Windows there are a few hidden catches to moving an existing installation.&lt;br /&gt;&lt;br /&gt;Cygwin creates a number of mount points for your drives, and it's these that cause the problems when you move your installation directory around.&lt;br /&gt;&lt;br /&gt;Here are the steps to move your Cygwin installation:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Save off existing mount points&lt;br /&gt;&lt;code&gt;mount -m &gt; /usr/bin/mountCommands.bat&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unmount existing mount points&lt;br /&gt;&lt;code&gt;umount -A&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy Cygwin directory to new home&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Update any Windows shortcuts &amp; Start Menu items&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Update the Cgywin path within &lt;code&gt;$CYGWIN_HOME/cygwin.bat&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Update mount points within &lt;code&gt;$CYGWIN_HOME/bin/mountCommands.bat&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Re-mount to new location&lt;ul&gt;&lt;li&gt;Start Cygwin&lt;br /&gt;    &lt;li&gt;&lt;code&gt;./mountCommands.bat&lt;/code&gt;&lt;br /&gt;    &lt;li&gt;Close Cygwin&lt;br /&gt;  &lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Restart Cygwin, and carry on with life&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;This tip was compiled from information about &lt;a href="http://www-cdf.fnal.gov/~cplager/cygwin.html#backup"&gt;Backup Your Cygwin installation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Windows" rel="tag"&gt;Windows&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Unix" rel="tag"&gt;Unix&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Linux" rel="tag"&gt;Linux&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Terminal" rel="tag"&gt;Terminal&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Cygwin" rel="tag"&gt;Cygwin&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Installation" rel="tag"&gt;Installation&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Relocation" rel="tag"&gt;Relocation&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-4500215439877990385?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3iS3lkHeXZfG6OvINTVg92W8m_s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3iS3lkHeXZfG6OvINTVg92W8m_s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3iS3lkHeXZfG6OvINTVg92W8m_s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3iS3lkHeXZfG6OvINTVg92W8m_s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=qSAOGnjB6dE:gMOq3LokLj8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=qSAOGnjB6dE:gMOq3LokLj8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=qSAOGnjB6dE:gMOq3LokLj8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=qSAOGnjB6dE:gMOq3LokLj8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=qSAOGnjB6dE:gMOq3LokLj8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=qSAOGnjB6dE:gMOq3LokLj8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=qSAOGnjB6dE:gMOq3LokLj8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/4500215439877990385/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=4500215439877990385" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/4500215439877990385?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/4500215439877990385?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/qSAOGnjB6dE/how-to-move-existing-cygwin.html" title="How to move an existing Cygwin installation" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/03/how-to-move-existing-cygwin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMMQHw_fCp7ImA9WxVXE0U.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-4891750650717945586</id><published>2009-02-11T21:08:00.000Z</published><updated>2009-02-11T21:08:01.244Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-11T21:08:01.244Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Spring's form tags: make sure you set the action</title><content type="html">A &lt;a href="http://profile.ak.facebook.com/v227/740/20/n586348066_7895.jpg"&gt;colleague&lt;/a&gt; and I found a problem recently where if you specify a parameter on the URL which takes you to a &lt;a href="http://www.springsource.org/"&gt;Spring-powered&lt;/a&gt; &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/view.html#view-jsp-formtaglib"&gt;form&lt;/a&gt;, and then submit that form you end up with multiple values for the same field item in the controller.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Example&lt;/span&gt;&lt;ul&gt;&lt;li&gt;http://localhost/productDetails?serialNumber=12345A&lt;br /&gt;Loads the product details form with serial number 12345A and displays the product details&lt;br /&gt;&lt;li&gt;User enters a different serial number 98765Z in the serialNumber input box and clicks "Get product details"&lt;br /&gt;&lt;li&gt;Application received a serialNumber parameter contain an array of Strings: \["12345A", "98765Z"\]&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Reason&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you use &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/view.html#view-jsp-formtaglib"&gt;Spring's "&lt;form:form...&gt;&lt;/form:form&gt; tags&lt;/a&gt; but don't specify an action the taglib will create one for you in the resulting HTML. This will be the URL that you used to access your form, so if you pass a  serialNumber in a GET request, the serialNumber will be part of the action URL as well as a field within your form - hence an array of serial numbers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another colleague (&lt;a href="http://profile.ak.facebook.com/profile6/312/101/s739006087_3328.jpg"&gt;Richard&lt;/a&gt;) cleverly suggested that it could be to do with the form's action attribute and he was correct: to stop this behaviour you have to specify an action.  You should be able to just use the mapping URL that you have bound into the controller (without the slash), so in my case my Controller looks like:&lt;pre&gt;@Controller&lt;br /&gt;@RequestMapping("/productDetails")&lt;br /&gt;public class ProductDetailsFormController {&lt;br /&gt;   ...&lt;br /&gt;}&lt;/pre&gt;And so my form tag looks like:&lt;pre&gt;&amp;lt;form:form modelAttribute=&amp;quot;product&amp;quot; action=&amp;quot;productDetails&amp;quot;&amp;gt;&lt;br /&gt;   ...&lt;br /&gt;&amp;lt;/form:form&amp;gt;&lt;/pre&gt;This appears to work correctly for me, please let me know if you have any issues with this approach.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Spring" rel="tag"&gt;Spring&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Form Tags" rel="tag"&gt;Form Tags&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-4891750650717945586?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EdsQLOn_nRzvHpmaWA7CtnvXZVU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EdsQLOn_nRzvHpmaWA7CtnvXZVU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EdsQLOn_nRzvHpmaWA7CtnvXZVU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EdsQLOn_nRzvHpmaWA7CtnvXZVU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=v-tl7u7Vz3E:AdWnlFB6TgU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=v-tl7u7Vz3E:AdWnlFB6TgU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=v-tl7u7Vz3E:AdWnlFB6TgU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=v-tl7u7Vz3E:AdWnlFB6TgU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=v-tl7u7Vz3E:AdWnlFB6TgU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=v-tl7u7Vz3E:AdWnlFB6TgU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=v-tl7u7Vz3E:AdWnlFB6TgU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/4891750650717945586/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=4891750650717945586" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/4891750650717945586?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/4891750650717945586?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/v-tl7u7Vz3E/springs-form-tags-make-sure-you-set.html" title="Spring's form tags: make sure you set the action" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/02/springs-form-tags-make-sure-you-set.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYMQXY4fip7ImA9WxVQGUg.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-9024871894104695946</id><published>2009-02-06T21:53:00.000Z</published><updated>2009-02-06T21:53:00.836Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-06T21:53:00.836Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Blog" /><title>Pasting code snippets to your blog easily with FormatMySourceCode</title><content type="html">When I was preparing my last blog post on &lt;a href="http://blog.andrewbeacock.com/2009/01/disabling-html-elements-in-jsps-with.html"&gt;disabling HTML elements (in JSPs) with JSTL's "c:if"&lt;/a&gt; I needed to change a lot of the JSP markup to prepare it for adding to my posting - the angled opening and closing tags were causing quite a problem.&lt;br /&gt;&lt;br /&gt;I was about to painstakingly go through changing them all to their 'lt' and 'gt' &lt;a href="http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references"&gt;XML entity equivalents&lt;/a&gt; and then remembered a site I bookmarked sometime ago:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://formatmysourcecode.blogspot.com/"&gt;FormatMySourceCode.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a very handy webpage with a box to paste your code into, select a few options such as tab width and whether you want an embedded stylesheet and then click "Format Text".  It promptly returns with your code (of any kind) converted into a web-friendly version which is perfect for pasting straight into your blog post.&lt;br /&gt;&lt;br /&gt;It a great yet simple idea by &lt;a href="http://ghouston.blogspot.com/"&gt;Greg Houston&lt;/a&gt; and oh so very useful!&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Greg Houston" rel="tag"&gt;Greg Houston&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Code Formatting" rel="tag"&gt;Code Formatting&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Blogging" rel="tag"&gt;Blogging&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-9024871894104695946?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o4fNYxVU_DukN5dtQtM87sQZgSI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o4fNYxVU_DukN5dtQtM87sQZgSI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o4fNYxVU_DukN5dtQtM87sQZgSI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o4fNYxVU_DukN5dtQtM87sQZgSI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=eiOFeVn3GEA:EjPqqxOhPDY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=eiOFeVn3GEA:EjPqqxOhPDY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=eiOFeVn3GEA:EjPqqxOhPDY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=eiOFeVn3GEA:EjPqqxOhPDY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=eiOFeVn3GEA:EjPqqxOhPDY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=eiOFeVn3GEA:EjPqqxOhPDY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=eiOFeVn3GEA:EjPqqxOhPDY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/9024871894104695946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=9024871894104695946" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/9024871894104695946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/9024871894104695946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/eiOFeVn3GEA/pasting-code-snippets-to-your-blog.html" title="Pasting code snippets to your blog easily with FormatMySourceCode" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/02/pasting-code-snippets-to-your-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4BSXc5eyp7ImA9WxVQE0g.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-7894372415726056493</id><published>2009-01-30T21:58:00.004Z</published><updated>2009-01-30T22:19:18.923Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-30T22:19:18.923Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Disabling HTML elements (in JSPs) with JSTL's "c:if"</title><content type="html">I've been doing some &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;-based &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/view.html#view-jsp-formtaglib"&gt;web forms&lt;/a&gt; work recently and one area of interest was around disabling certain input fields until particular values were set in the form-backing object.  I wanted to ensure that particular radio buttons were disabled if the value was not what I expected.&lt;br /&gt;&lt;br /&gt;Below is a statically disabled Spring radiobutton:&lt;br /&gt;&lt;pre&gt;&amp;lt;form:radiobutton path=&amp;quot;name&amp;quot; disabled=&amp;quot;true&amp;quot;/&amp;gt;&lt;/pre&gt;For example's sake, I wanted to disabled the button if the name field of the form-backing object was "beacock", so what I needed was a boolean variable which captured the output of my particular test:&lt;pre&gt;&amp;lt;c:if test=&amp;quot;details.name eq 'beacock'&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;c:set var=&amp;quot;isMe&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;/pre&gt;I could then use the above &lt;code&gt;isMe&lt;/code&gt; variable in the following:&lt;pre&gt;&amp;lt;form:radiobutton path=&amp;quot;name&amp;quot; disabled=&amp;quot;${isMe}&amp;quot;/&amp;gt;&lt;/pre&gt;Simple huh? But you can go a step further in the strive for clean code, the &lt;code&gt;&lt;c:if&gt;&lt;/code&gt; tag can take an optional &lt;code&gt;var&lt;/code&gt; parameter which is a holder for the outcome of the boolean expression:&lt;pre&gt;&amp;lt;c:if test=&amp;quot;${details.name eq 'beacock'}&amp;quot; var=&amp;quot;isMe&amp;quot;/&amp;gt;&lt;/pre&gt;So now the whole thing becomes:&lt;pre&gt;&amp;lt;c:if test=&amp;quot;${details.name eq 'beacock'}&amp;quot; var=&amp;quot;isMe&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;form:radiobutton path=&amp;quot;name&amp;quot; disabled=&amp;quot;${isMe}&amp;quot;/&amp;gt;&lt;/pre&gt;Although you can perform complex expressions in the &lt;code&gt;${}&lt;/code&gt; tags, you can use the &lt;a href="http://mindprod.com/jgloss/ternaryoperator.html"&gt;ternary operator&lt;/a&gt;:&lt;pre&gt;value="${isMe ? 'Andrew Beacock' : 'Someone Else'}"&lt;/pre&gt;Here are a few more things I've found you can use as well:&lt;br /&gt;&lt;pre&gt;${!isMe}&lt;br /&gt;${not isMe}&lt;br /&gt;${not isMe or someOtherVariable}&lt;/pre&gt;A very good reference for all things JSTL is the &lt;a href="http://www.manning-source.com/books/bayern/bayern_apxA.pdf"&gt;JSTL quick reference&lt;/a&gt; - an appendix of one of the Manning books.  Also the &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring-form.tld.html"&gt;TLD documentation of the Spring Form Tag library&lt;/a&gt; is full of all the optional stuff.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/JSTL" rel="tag"&gt;JSTL&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JSP" rel="tag"&gt;JSP&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Spring" rel="tag"&gt;Spring&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/HTML" rel="tag"&gt;HTML&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-7894372415726056493?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sVyi8GY_n1mvxAAFYuecoQ2oPC8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sVyi8GY_n1mvxAAFYuecoQ2oPC8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sVyi8GY_n1mvxAAFYuecoQ2oPC8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sVyi8GY_n1mvxAAFYuecoQ2oPC8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DehkI4ir5zE:igSLhHsm7y0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DehkI4ir5zE:igSLhHsm7y0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DehkI4ir5zE:igSLhHsm7y0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=DehkI4ir5zE:igSLhHsm7y0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DehkI4ir5zE:igSLhHsm7y0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=DehkI4ir5zE:igSLhHsm7y0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=DehkI4ir5zE:igSLhHsm7y0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/7894372415726056493/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=7894372415726056493" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7894372415726056493?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7894372415726056493?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/DehkI4ir5zE/disabling-html-elements-in-jsps-with.html" title="Disabling HTML elements (in JSPs) with JSTL's &quot;c:if&quot;" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/01/disabling-html-elements-in-jsps-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QBSX4zfCp7ImA9WxVREE4.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-6123974419407828702</id><published>2009-01-15T14:54:00.000Z</published><updated>2009-01-15T14:55:58.084Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-15T14:55:58.084Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><title>jQuery has a new funky API browser</title><content type="html">Head over to &lt;a href="http://api.jquery.com/"&gt;api.jquery.com&lt;/a&gt; and check out the rather swish new way to browse it's API reference documentation.&lt;br /&gt;&lt;br /&gt;Oh and of course it's powered by &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; - what a wonderful way to show what you can do with the jQuery JavaScript Library!&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/jQuery" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-6123974419407828702?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KrumwKfmMNDrBe9rGg9wyMehHzg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KrumwKfmMNDrBe9rGg9wyMehHzg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KrumwKfmMNDrBe9rGg9wyMehHzg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KrumwKfmMNDrBe9rGg9wyMehHzg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=K6BsIIo_Nh4:3j689xmwOO4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=K6BsIIo_Nh4:3j689xmwOO4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=K6BsIIo_Nh4:3j689xmwOO4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=K6BsIIo_Nh4:3j689xmwOO4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=K6BsIIo_Nh4:3j689xmwOO4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=K6BsIIo_Nh4:3j689xmwOO4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=K6BsIIo_Nh4:3j689xmwOO4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/6123974419407828702/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=6123974419407828702" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/6123974419407828702?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/6123974419407828702?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/K6BsIIo_Nh4/jquery-has-new-funky-api-browser.html" title="jQuery has a new funky API browser" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/01/jquery-has-new-funky-api-browser.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MCSXYzeyp7ImA9WxVREE4.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-1262640557907201741</id><published>2009-01-08T21:28:00.003Z</published><updated>2009-01-15T14:57:48.883Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-15T14:57:48.883Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Guitar" /><title>JustinGuitar.com - a fantastic resource for learning the guitar - and it's free!</title><content type="html">Back in August I decided that I wanted to learn the guitar.  It's been an instrument that I've always wanted to play and so I thought "why not just try to learn it?".  I spoke to a friend who lent me his electric so now I just needed some lessons...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.justinguitar.com/index.php"&gt;&lt;img src="http://www.justinguitar.com/images/main/logo.gif" align="right"/&gt;&lt;/a&gt;After a search on YouTube I found a few half-decent videos and then I discovered &lt;a href="http://www.justinguitar.com/en/AA-001-JustinSandercoe.php"&gt;Justin Sandercoe&lt;/a&gt;'s excellent &lt;a href="http://www.justinguitar.com/index.php"&gt;JustinGuitar.com&lt;/a&gt; tuition site.&lt;br /&gt;&lt;br /&gt;It's packed &lt;a href="http://www.justinguitar.com/en/AA-000-LessonIndex.php"&gt;full of lessons&lt;/a&gt; on almost everything and Justin has an excellent teaching manner - makes watching his videos entertaining and informative.  I've learnt so much from watching them that it's pretty much the only place on the net that I go for guitar advice - &lt;a href="http://www.justinguitar.com/forum_frame/"&gt;his forums&lt;/a&gt; are also an excellent place to get more advice from other guitarists. &lt;br /&gt;&lt;br /&gt;Although Justin's content is free you can &lt;a href="http://www.justinguitar.com/en/AA-004-PleaseDonate.php"&gt;donate cash&lt;/a&gt; if you wish to help support him as he films these wonderful instructional videos.  &lt;br /&gt;&lt;br /&gt;When people ask me if I'm having lessons I say "yes, from &lt;a href="http://www.justinguitar.com/index.php"&gt;JustinGuitar.com&lt;/a&gt;"!&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/JustinGuitar.com" rel="tag"&gt;JustinGuitar.com&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Justin Sandercoe" rel="tag"&gt;Justin Sandercoe&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Guitar" rel="tag"&gt;Guitar&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-1262640557907201741?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lVuzjsTgXBLWBPbpqaMZYNxVYTI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lVuzjsTgXBLWBPbpqaMZYNxVYTI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lVuzjsTgXBLWBPbpqaMZYNxVYTI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lVuzjsTgXBLWBPbpqaMZYNxVYTI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=Y2Zuk7KjQko:tH5CSkWqC6M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=Y2Zuk7KjQko:tH5CSkWqC6M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=Y2Zuk7KjQko:tH5CSkWqC6M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=Y2Zuk7KjQko:tH5CSkWqC6M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=Y2Zuk7KjQko:tH5CSkWqC6M:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=Y2Zuk7KjQko:tH5CSkWqC6M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=Y2Zuk7KjQko:tH5CSkWqC6M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/1262640557907201741/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=1262640557907201741" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/1262640557907201741?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/1262640557907201741?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/Y2Zuk7KjQko/justinguitarcom-fantastic-resource-for.html" title="JustinGuitar.com - a fantastic resource for learning the guitar - and it's free!" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2009/01/justinguitarcom-fantastic-resource-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUNRn04cSp7ImA9WxVRFEg.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-3723007461481760324</id><published>2008-12-24T15:01:00.005Z</published><updated>2009-01-20T11:51:37.339Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-20T11:51:37.339Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>How to increase the colour depth of Windows Remote Desktop (RDP) up to 24-bit</title><content type="html">I use &lt;a href="http://en.wikipedia.org/wiki/Remote_Desktop_Protocol"&gt;RDP&lt;/a&gt; to access my work PC on a daily basis and one of the limiting factors when doing web design has been the lack of colour depth - rather than the standard 24-bit (or higher) you get 15-bit due to using &lt;a href="http://www.microsoft.com/windowsxp/using/mobility/getstarted/starteremote.mspx"&gt;Remote Desktop&lt;/a&gt; (RDP).  Although this is the default RDP server setting, you can increase it to 24-bit with a little Windows Registry hack.&lt;br /&gt;&lt;br /&gt;NOTE:  If you mess up your machine from hack your registry - please don't blame me, I'm only giving you the tool to do that damage...&lt;br /&gt;&lt;br /&gt;Open &lt;code&gt;regedit&lt;/code&gt; and browse to:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Over on the right-hand side you will see an attribute called "ColorDepth" which by default is set to 3 (or rather 0x00000003, it's a DWORD).  Double-click that attribute and change the &lt;code&gt;Value data&lt;/code&gt; field from 3 to 4, then click "OK", close regedit and reboot your PC.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Vu_eUOpUOMk/SVJO6wPzSWI/AAAAAAAAAcA/cjeG6lRxjHo/s1600-h/rdp.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 187px;" src="http://3.bp.blogspot.com/_Vu_eUOpUOMk/SVJO6wPzSWI/AAAAAAAAAcA/cjeG6lRxjHo/s400/rdp.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5283372084149569890" /&gt;&lt;/a&gt;&lt;br /&gt;Now if you increase the requested colour depth when connecting to this machine you should get a few more colours to play with!&lt;br /&gt;&lt;br /&gt;Oh BTW Merry Christmas and a Happy New Year!&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Windows" rel="tag"&gt;Windows&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/RemoteDesktop" rel="tag"&gt;RemoteDesktop&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/RDP" rel="tag"&gt;RDP&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/ColorDepth" rel="tag"&gt;ColorDepth&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-3723007461481760324?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uRWMkxEBoaKBHhkMKBFFTgnxLzg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uRWMkxEBoaKBHhkMKBFFTgnxLzg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uRWMkxEBoaKBHhkMKBFFTgnxLzg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uRWMkxEBoaKBHhkMKBFFTgnxLzg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=7qq1tVx_-EQ:C8v_361D7mY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=7qq1tVx_-EQ:C8v_361D7mY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=7qq1tVx_-EQ:C8v_361D7mY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=7qq1tVx_-EQ:C8v_361D7mY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=7qq1tVx_-EQ:C8v_361D7mY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=7qq1tVx_-EQ:C8v_361D7mY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=7qq1tVx_-EQ:C8v_361D7mY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/3723007461481760324/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=3723007461481760324" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3723007461481760324?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3723007461481760324?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/7qq1tVx_-EQ/how-to-increase-colour-depth-of-windows.html" title="How to increase the colour depth of Windows Remote Desktop (RDP) up to 24-bit" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_Vu_eUOpUOMk/SVJO6wPzSWI/AAAAAAAAAcA/cjeG6lRxjHo/s72-c/rdp.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2008/12/how-to-increase-colour-depth-of-windows.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMAQXgyfip7ImA9WxRaGUg.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-7232433646320836063</id><published>2008-12-22T12:53:00.004Z</published><updated>2008-12-22T13:44:00.696Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-22T13:44:00.696Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Shopping" /><category scheme="http://www.blogger.com/atom/ns#" term="Guitar" /><title>Fantastic service from StringsDirect guitar shop!</title><content type="html">Late on Thursday night I broke one of my electric guitar strings and being a beginner I didn't have a pile of replacements to drop in straight away.  I'd placed a couple of small orders with &lt;a href="http://www.stringsdirect.co.uk/"&gt;StringsDirect&lt;/a&gt; over the past few months and had such fast delivery that they were my first port of call.  I placed an order for a couple of packs of &lt;a href="http://www.drstrings.com/"&gt;handmade DR Strings&lt;/a&gt; (one &lt;a href="http://www.stringsdirect.co.uk/products/668-dr_tite_fit_nickel_plated_"&gt;Tite Fit&lt;/a&gt; and the other &lt;a href="http://www.stringsdirect.co.uk/products/1853-dr_hi_beam_nickel_electric_guitar_strings"&gt;Hi-Beam&lt;/a&gt;) around midnight on Thursday night and what with the Christmas post service issues (along with various PO strikes) I had little hope that they would be with me before Christmas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.stringsdirect.co.uk/strings/electric_guitar/dr_handmade"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://3.bp.blogspot.com/_Vu_eUOpUOMk/SU-ZPYC8fvI/AAAAAAAAAbg/wKHVkDNCW7s/s400/dr.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5282609377360772850" /&gt;&lt;/a&gt;They arrived on Saturday morning, nicely packaged, all the correct bits I ordered - absolutely perfect!  So if you need any guitar accessories, take an online trip to &lt;a href="http://www.stringsdirect.co.uk/"&gt;StringsDirect&lt;/a&gt;, they have loads of items and the delivery service is second to none!&lt;br /&gt;&lt;br /&gt;As an aside, I picked &lt;a href="http://www.drstrings.com/"&gt;DR Strings&lt;/a&gt; after &lt;a href=" http://www.justinguitar.com/en/AA-001-JustinSandercoe.php"&gt;Justin Sandercoe&lt;/a&gt; of &lt;a href="http://www.justinguitar.com/"&gt;www.justinguitar.com&lt;/a&gt; recommended them - his &lt;a href="http://www.justinguitar.com/"&gt;online guitar tuition site&lt;/a&gt; is second to none and I trust his judgement on products and accessories.&lt;br /&gt;&lt;br /&gt;Now all StringsDirect need is an affiliate link programme... ;)&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Guitar" rel="tag"&gt;Guitar&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/StringDirect" rel="tag"&gt;StringDirect&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/DRStrings" rel="tag"&gt;DRStrings&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Justin Sandercoe" rel="tag"&gt;Justin Sandercoe&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/JustinGuitar" rel="tag"&gt;JustinGuitar&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-7232433646320836063?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P2dumzUdyqmCyrw4OLFKaq5ktnI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P2dumzUdyqmCyrw4OLFKaq5ktnI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P2dumzUdyqmCyrw4OLFKaq5ktnI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P2dumzUdyqmCyrw4OLFKaq5ktnI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=3uXqckFXPQI:lXC7ksvV2hw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=3uXqckFXPQI:lXC7ksvV2hw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=3uXqckFXPQI:lXC7ksvV2hw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=3uXqckFXPQI:lXC7ksvV2hw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=3uXqckFXPQI:lXC7ksvV2hw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=3uXqckFXPQI:lXC7ksvV2hw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=3uXqckFXPQI:lXC7ksvV2hw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/7232433646320836063/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=7232433646320836063" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7232433646320836063?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/7232433646320836063?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/3uXqckFXPQI/fantastic-service-from-stringsdirect.html" title="Fantastic service from StringsDirect guitar shop!" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_Vu_eUOpUOMk/SU-ZPYC8fvI/AAAAAAAAAbg/wKHVkDNCW7s/s72-c/dr.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2008/12/fantastic-service-from-stringsdirect.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYAQXc6cSp7ImA9WxRaFEs.&quot;"><id>tag:blogger.com,1999:blog-11593374.post-3831772696845874119</id><published>2008-12-16T22:39:00.000Z</published><updated>2008-12-16T22:39:00.919Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-16T22:39:00.919Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><title>How to get the Home &amp; End keys working in Cygwin (RXVT)</title><content type="html">Last year I blogged about &lt;a href="http://blog.andrewbeacock.com/2007/08/how-to-get-home-end-keys-working-in.html"&gt;how to get the Home &amp; End keys working in remote Linux shells &amp; terminals&lt;/a&gt;.  Well now it's time to sort the Windows shell Cygwin out.&lt;br /&gt;&lt;br /&gt;If your Home and End keys are producing funny characters on the command line rather than moving the cursor then the input codes of the keyboard need to be remapped.&lt;br /&gt;&lt;br /&gt;Open your Cygwin terminal and create a file called &lt;code&gt;.inputrc&lt;/code&gt; in your home directory, and add the following:&lt;pre&gt;# Home Key&lt;br /&gt;"\e[7~":beginning-of-line&lt;br /&gt;&lt;br /&gt;# End Key&lt;br /&gt;"\e[8~":end-of-line&lt;br /&gt;&lt;br /&gt;# Delete Key&lt;br /&gt;"\e[3~":delete-char&lt;br /&gt;&lt;br /&gt;# Insert Key&lt;br /&gt;"\e[2~":paste-from-clipboard&lt;/pre&gt;Now edit or create &lt;code&gt;.bashrc&lt;/code&gt; in your home directory and add the following line to ensure the above .inputrc file is picked up:&lt;pre&gt;export INPUTRC=$HOME/.inputrc&lt;/pre&gt;To see if all the above has worked, reopen your cygwin terminal and try it out!  If it doesn't work then just delete the .inputrc file and remove the line from .bashrc.&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/Keyboard" rel="tag"&gt;Keyboard&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Mapping" rel="tag"&gt;Mapping&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Windows" rel="tag"&gt;Windows&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Linux" rel="tag"&gt;Linux&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Terminal" rel="tag"&gt;Terminal&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Shelle" rel="tag"&gt;Shelle&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Cygwin" rel="tag"&gt;Cygwin&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Andrew Beacock" rel="tag"&gt;Andrew Beacock&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11593374-3831772696845874119?l=blog.andrewbeacock.com'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dlvA0uPTxKQaihTEsqHjkqxfFpQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dlvA0uPTxKQaihTEsqHjkqxfFpQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dlvA0uPTxKQaihTEsqHjkqxfFpQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dlvA0uPTxKQaihTEsqHjkqxfFpQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=yxJNeUpQTA8:cf1FfNrYyfU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=yxJNeUpQTA8:cf1FfNrYyfU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=yxJNeUpQTA8:cf1FfNrYyfU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=yxJNeUpQTA8:cf1FfNrYyfU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=yxJNeUpQTA8:cf1FfNrYyfU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/andrewbeacock?a=yxJNeUpQTA8:cf1FfNrYyfU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/andrewbeacock?i=yxJNeUpQTA8:cf1FfNrYyfU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.andrewbeacock.com/feeds/3831772696845874119/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=11593374&amp;postID=3831772696845874119" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3831772696845874119?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11593374/posts/default/3831772696845874119?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/andrewbeacock/~3/yxJNeUpQTA8/how-to-get-home-end-keys-working-in.html" title="How to get the Home &amp; End keys working in Cygwin (RXVT)" /><author><name>abeacock</name><uri>http://www.blogger.com/profile/01039992884679308726</uri><email>blog@andrewbeacock.com</email><gd:extendedProperty name="OpenSocialUserId" value="16044632545316934027" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.andrewbeacock.com/2008/12/how-to-get-home-end-keys-working-in.html</feedburner:origLink></entry></feed>
