<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9952047</id><updated>2011-04-21T15:38:16.256-05:00</updated><category term='xml'/><category term='java'/><category term='presentation'/><category term='example'/><title type='text'>Troy Landers' Blog</title><subtitle type='html'>Java, C#/.NET, Software, etc... &lt;br/&gt;&lt;br/&gt;
Essentially my views on software and the software industry. Articles about technologies that I work with or am investigating.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9952047.post-3484726492358868649</id><published>2008-06-23T16:02:00.007-05:00</published><updated>2008-06-23T23:57:24.975-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><title type='text'>Basic JavaMail Code</title><content type='html'>Every time I have to use the JavaMail API I am reminded how much I don't like it. Could it be any harder to figure out how to send a simple email?&lt;br /&gt;&lt;br /&gt;Here is an example of how to send an HTML email (minus the exception handling)...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Properties props = new Properties();&lt;br /&gt;props.put("mail.smtp.host", "YOUR_HOST_NAME");&lt;br /&gt;&lt;br /&gt;Session session = Session.getInstance(props, null);&lt;br /&gt;session.setDebug(true);&lt;br /&gt;&lt;br /&gt;MimeMessage message = new MimeMessage(session);&lt;br /&gt;message.setFrom(new InternetAddress("YOU@YOURHOST.COM"));&lt;br /&gt;&lt;br /&gt;InternetAddress [] address = {new InternetAddress("PERSON@THEIRHOST.COM")};&lt;br /&gt;&lt;br /&gt;message.setRecipients(Message.RecipientType.TO, address);&lt;br /&gt;message.setSubject("A Subject");&lt;br /&gt;message.setSentDate(Calendar.getInstance().getTime());&lt;br /&gt;message.setContent("&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;This is an HTML email.&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;", "text/html");&lt;br /&gt;&lt;br /&gt;Transport.send(message);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the end it looks fairly simple, but it took far too much time searching through the JavaMail docs to piece them together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-3484726492358868649?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/3484726492358868649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=3484726492358868649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/3484726492358868649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/3484726492358868649'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2008/06/basic-javamail-code.html' title='Basic JavaMail Code'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-116996768814616279</id><published>2007-01-28T01:01:00.002-06:00</published><updated>2008-06-23T16:30:05.660-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Java SE 6 Presentation</title><content type='html'>In January 2007, I gave a &lt;a href="http://www.landersconsulting.biz/present.jsp" target="lci"&gt;presentation&lt;/a&gt; to the Kansas City Java User Group (KCJava) about the recently released &lt;a href="http://java.sun.com/javase/6/" target="jse6"&gt;Java SE 6&lt;/a&gt;. The presentation gives an overview of the major features that are included in this release of the Java SDK and some links where one can learn more about each of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-116996768814616279?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/116996768814616279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=116996768814616279' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/116996768814616279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/116996768814616279'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2007/01/java-se-6-presentation.html' title='Java SE 6 Presentation'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-115471750046953274</id><published>2006-08-04T13:49:00.002-05:00</published><updated>2008-06-23T16:29:37.057-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Basic Castor XML Example</title><content type='html'>&lt;a href="http://www.castor.org/xml-framework.html"&gt;Castor XML&lt;/a&gt; is an open-source  framework that simplifies the task of marshalling Java objects to and from XML documents. I chose Castor over &lt;a href="http://java.sun.com/webservices/jaxb/"&gt;JAXB&lt;/a&gt; because after a little research it sounded like Castor was easier to configure and that it would be better at handling XML documents for which I do not have an XML Schema.&lt;br /&gt;&lt;br /&gt;In this article I will show how to use Castor to create an XML document from some Java objects. Then I'll demonstrate going in the other direction - reading an XML document and populating some Java objects.&lt;br /&gt;&lt;br /&gt;First, create the Java classes. For this example I'll create a simple User class with an Address class. Note that each of the classes implements Serializable and has a default constructor. Each of them also adheres to the JavaBeans naming conventions. This isn't a requirement but if you don't then you must provide a mapping file.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// from User.java&lt;br /&gt;public class User implements java.io.Serializable {&lt;br /&gt;  private String         firstName;&lt;br /&gt;  private String         lastName;&lt;br /&gt;  private java.util.Date birthDate;&lt;br /&gt;  private int            numAnnoyingHabits;&lt;br /&gt;  private Address        address;&lt;br /&gt;  &lt;br /&gt;  public User() {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Address getAddress() {&lt;br /&gt;    return address;&lt;br /&gt;  }&lt;br /&gt;  public void setAddress(Address a) {&lt;br /&gt;    address = a;&lt;br /&gt;  }&lt;br /&gt;  public java.util.Date getBirthDate() {&lt;br /&gt;    return birthDate;&lt;br /&gt;  }&lt;br /&gt;  public void setBirthDate(java.util.Date d) {&lt;br /&gt;    birthDate = d;&lt;br /&gt;  }&lt;br /&gt;  public String getFirstName() {&lt;br /&gt;    return firstName;&lt;br /&gt;  }&lt;br /&gt;  public void setFirstName(String name) {&lt;br /&gt;    firstName = name;&lt;br /&gt;  }&lt;br /&gt;  public String getLastName() {&lt;br /&gt;    return lastName;&lt;br /&gt;  }&lt;br /&gt;  public void setLastName(String name) {&lt;br /&gt;    lastName = name;&lt;br /&gt;  }&lt;br /&gt;  public int getNumAnnoyingHabits() {&lt;br /&gt;    return numAnnoyingHabits;&lt;br /&gt;  }&lt;br /&gt;  public void setNumAnnoyingHabits(int i) {&lt;br /&gt;    numAnnoyingHabits = i;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// from Address.java&lt;br /&gt;public class Address implements java.io.Serializable {&lt;br /&gt;  private String  address;&lt;br /&gt;  private String  city;&lt;br /&gt;  private String  state;&lt;br /&gt;  private boolean isPrimary;&lt;br /&gt;  private int     numberOfYearsActive;&lt;br /&gt;&lt;br /&gt;  public Address() { }&lt;br /&gt;&lt;br /&gt;  public String getAddress() {&lt;br /&gt;    return address;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setAddress(String address) {&lt;br /&gt;    this.address = address;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getCity() {&lt;br /&gt;    return city;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setCity(String city) {&lt;br /&gt;    this.city = city;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public boolean isPrimary() {&lt;br /&gt;    return isPrimary;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setPrimary(boolean isPrimary) {&lt;br /&gt;    this.isPrimary = isPrimary;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public int getNumberOfYearsActive() {&lt;br /&gt;    return numberOfYearsActive;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setNumberOfYearsActive(int numberOfYearsActive) {&lt;br /&gt;    this.numberOfYearsActive = numberOfYearsActive;&lt;br /&gt;  }&lt;br /&gt;  public String getState() {&lt;br /&gt;    return state;&lt;br /&gt;  }&lt;br /&gt;  public void setState(String state) {&lt;br /&gt;    this.state = state;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then create a class that populates the objects and calls Castor to dump them to XML.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// from Main.java&lt;br /&gt;import java.io.*;&lt;br /&gt;import org.exolab.castor.xml.*;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;  public static void main(String [] args) {&lt;br /&gt;&lt;br /&gt;    // first populate objects&lt;br /&gt;    User user = new User();&lt;br /&gt;    user.setFirstName("Afirst");&lt;br /&gt;    user.setLastName("Alast");&lt;br /&gt;    user.setBirthDate(new java.util.Date());&lt;br /&gt;    user.setNumAnnoyingHabits(2);&lt;br /&gt;&lt;br /&gt;    Address addr = new Address();&lt;br /&gt;    addr.setAddress("100 A Blvd");&lt;br /&gt;    addr.setCity("Peculiar");&lt;br /&gt;    addr.setState("MO");&lt;br /&gt;    addr.setPrimary(true);&lt;br /&gt;    addr.setNumberOfYearsActive(4);&lt;br /&gt;&lt;br /&gt;    user.setAddress(addr);&lt;br /&gt;&lt;br /&gt;    // now call Castor to write them to XML&lt;br /&gt;    try {&lt;br /&gt;      Writer writer = new FileWriter("user.xml");&lt;br /&gt;&lt;br /&gt;      Marshaller.marshal(user, writer);&lt;br /&gt;&lt;br /&gt;      writer.close();      &lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next, find all of the required libraries below, place them in the CLASSPATH, and compile the classes. The exact versions that I used are not required.&lt;br /&gt;&lt;br /&gt;castor-1.0.1.jar&lt;br /&gt;log4j-1.2.13.jar&lt;br /&gt;commons-logging-1.1.jar&lt;br /&gt;xercesImpl.jar (Xerces 2.8)&lt;br /&gt;&lt;br /&gt;Finally, create a castor.properties file containing the following line and place it in the CLASSPATH. This setting causes Castor to indent the XML file so it is easier to read. In a production environment you probably want to turn indentation off so you're not moving around unnecessary whitespace.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;org.exolab.castor.indent=true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When you run the example you should get a document that looks like the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;user num-annoying-habits="2"&amp;gt;&lt;br /&gt;    &amp;lt;birth-date&amp;gt;2006-08-05T21:42:46.355-05:00&amp;lt;/birth-date&amp;gt;&lt;br /&gt;    &amp;lt;address number-of-years-active="4" primary="true"&amp;gt;&lt;br /&gt;        &amp;lt;address&amp;gt;100 A Blvd&amp;lt;/address&amp;gt;&lt;br /&gt;        &amp;lt;state&amp;gt;MO&amp;lt;/state&amp;gt;&lt;br /&gt;        &amp;lt;city&amp;gt;Peculiar&amp;lt;/city&amp;gt;&lt;br /&gt;    &amp;lt;/address&amp;gt;&lt;br /&gt;    &amp;lt;last-name&amp;gt;Alast&amp;lt;/last-name&amp;gt;&lt;br /&gt;    &amp;lt;first-name&amp;gt;Afirst&amp;lt;/first-name&amp;gt;&lt;br /&gt;&amp;lt;/user&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There are some interesting things to note about the XML:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;First off, it worked! I just serialized some Java objects to XML with almost no effort!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;By default, primitive types are written as attributes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The default Date format is less than friendly. Unfortunately you must create a custom field handler to use another format. Hopefully I'll find time to demonstrate that in the future.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Now with just a few more lines of code I can read the document back into Java&lt;br /&gt;objects.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// add to Main.java after marshalling code&lt;br /&gt;&lt;br /&gt;// unmarshall file to a new object&lt;br /&gt;Reader reader = new FileReader("user.xml");&lt;br /&gt;&lt;br /&gt;User user2 = (User) Unmarshaller.unmarshal(User.class, reader);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That's all there is to it! In future blogs I'll show how Castor handles collections and then how its mapping file can be used to configure Castor to read and write XML documents that are not in its default format.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-115471750046953274?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/115471750046953274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=115471750046953274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/115471750046953274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/115471750046953274'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/08/basic-castor-xml-example.html' title='Basic Castor XML Example'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-115368724458694915</id><published>2006-07-23T15:22:00.000-05:00</published><updated>2006-07-23T15:40:44.596-05:00</updated><title type='text'>Object to XML Binding</title><content type='html'>Recently I've gotten to work on some projects that require object to XML binding. The best part is that one is in .NET while the other is in Java. This has given me the opportunity to compare and contrast how each platform accomplishes this task. In the next few weeks I'll try to post my findings and some examples of each of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-115368724458694915?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/115368724458694915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=115368724458694915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/115368724458694915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/115368724458694915'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/07/object-to-xml-binding.html' title='Object to XML Binding'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-114818635570979544</id><published>2006-05-20T23:27:00.001-05:00</published><updated>2008-06-23T16:29:09.787-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Intro to Web Services Presentation</title><content type='html'>In May 2006, I gave another presentation to the Kansas City Java User Group (KCJava). The topic of this presentation was an &lt;a href="http://www.landersconsulting.biz/present.jsp" target="lci"&gt;introduction to Web Services&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The presentation gives a  high-level picture of what Web Services are and what are its key standards and technologies. It also shows the Java API's that support Web Services. Finally there is an example service and client built using &lt;a href="http://ws.apache.org/axis" target="axis"&gt;Apache Axis&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This was my first in-depth look at Web Services and I was surprised at the complexity of the subject. In contrast, I was surprised at how easy Apache Axis made it to implement a Web Service. I also found that the &lt;a href="http://java.sun.com/webservices/jwsdp/index.jsp" target="jwsdp"&gt;Java Web Services Developer Pack (JWSDP) 2.0&lt;/a&gt; has some similar features that I plan to learn more about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-114818635570979544?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.landersconsulting.biz/present.jsp' title='Intro to Web Services Presentation'/><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/114818635570979544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=114818635570979544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114818635570979544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114818635570979544'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/05/intro-to-web-services-presentation.html' title='Intro to Web Services Presentation'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-114784581291928627</id><published>2006-05-17T01:03:00.000-05:00</published><updated>2006-05-17T01:10:06.193-05:00</updated><title type='text'>Ajax Presentation</title><content type='html'>About a month ago with the help of Shashank Date I gave an introductory presentation on Ajax to the &lt;a href="http://www.kcjava.org/" target="_kcjava"&gt;Kansas City Java User Group&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;During my research I found Ajax to be much more fascinating than I had expected. My expectations were that it was just a technology for "spicing up" web interfaces with simple features like auto-completion text fields.&lt;br /&gt;&lt;br /&gt;However, articles like &lt;a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"&gt;Jesse James Garrett's&lt;/a&gt; made me realize that Ajax has a much grander vision. The vision is what is represented by his "Ajax engine". When done correctly, this layer will decouple the web user interface from the web itself. Instead of being constrained by the request-response model of the web, the web interface will interact with the services provided by the Ajax engine. In doing so the web interface can be much more responsive and feature-rich.&lt;br /&gt;&lt;br /&gt;All of this is a pretty tall task given that Ajax relies on the major browsers to uniformly implement Javascript. However, it would be nice to be able to use web applications that are as interactive as today's desktop apps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-114784581291928627?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.landersconsulting.biz/present.jsp' title='Ajax Presentation'/><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/114784581291928627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=114784581291928627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114784581291928627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114784581291928627'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/05/ajax-presentation.html' title='Ajax Presentation'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-114623945676952955</id><published>2006-04-28T10:04:00.000-05:00</published><updated>2006-04-28T10:50:56.806-05:00</updated><title type='text'>Laptop Crashes are Bad for Blogging</title><content type='html'>The title pretty much says it all. Actually it leaves out a lot of other things that come to a grinding halt when one's laptop dies.&lt;br /&gt;&lt;br /&gt;Roughly 6 weeks ago, the LCD on my work laptop decided to flake out. Fortunately the hard drive was fine, but the experience reminded me how disruptive it is to switch machines (yes, I bought a new one) and to setup the environment.&lt;br /&gt;&lt;br /&gt;I thought that the environment setup was going to be easy since I used it nearly every day. However, I had forgotten many of the tweaks and gotchas that pop up along the way. And of course, much of the setup process was not written down.&lt;br /&gt;&lt;br /&gt;So here is my list of lessons learned so this will be less painful next time...&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Keep key software together in a well-known place. I eventually found everything but digging through boxes and piles of stuff isn't very efficient.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Keep license keys to key software together in a well-known place. I use a wallet program, eWallet, for storing a lot of this information. Unfortunately I wasn't always good about putting everything in there. Also, install your wallet program on another machine and keep that wallet reasonably up to date.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Write down clear instructions for non-trivial setup steps. No, I didn't do a good job of that this time either, but I sure wish that I had. Remember, do as I say, not as I do.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you can afford it, have a backup machine that is as current as possible. I got the old laptop repaired so I have one now. This laptop will probably become another home computer, but I'm yanking the work hard drive and saving it for the next time this happens.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Backup everything that is critical and then test your backups. I backup fairly often so this wasn't an issue. This fact gave me a small amount of comfort when I first realized that my laptop was crashing. If the hard drive had crashed then these backups would have been the only thing that saved me.&lt;br /&gt;&lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-114623945676952955?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/114623945676952955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=114623945676952955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114623945676952955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114623945676952955'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/04/laptop-crashes-are-bad-for-blogging.html' title='Laptop Crashes are Bad for Blogging'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-114006231584536314</id><published>2006-02-15T21:55:00.000-06:00</published><updated>2006-02-15T21:58:35.856-06:00</updated><title type='text'>Web Usability for Older Users</title><content type='html'>&lt;a href="http://www.codeproject.com/useritems/older-users.asp"&gt;Here&lt;/a&gt; is a good, short article about designing web sites that are usable for older users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-114006231584536314?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.codeproject.com/useritems/older-users.asp' title='Web Usability for Older Users'/><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/114006231584536314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=114006231584536314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114006231584536314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/114006231584536314'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/02/web-usability-for-older-users.html' title='Web Usability for Older Users'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-113942017778676084</id><published>2006-02-08T10:52:00.000-06:00</published><updated>2006-02-08T11:36:17.813-06:00</updated><title type='text'>Copernic Desktop Search</title><content type='html'>&lt;a href="http://www.copernic.com/" target="_new"&gt;Copernic Desktop Search&lt;/a&gt; has become one of my desktop's killer apps. It saves me an incredible amount of time searching for files, emails, etc... - and it is free! Free desktop search tools are nothing new, but this is the best one that I've found.&lt;br /&gt;&lt;br /&gt;Originally I used the default file searching in Windows. For a while this kept me happy, but beginning with Windows XP (maybe sooner) the interface got prettier and its usefulness disappeared. I remember several times when I couldn't configure it to locate files that I knew existed. It also has several other shortcomings...&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;It does not use an index. Instead each search does a full scan of the sub-directory each time you search for something. This is time consuming and inefficient.&lt;/li&gt;   &lt;li&gt;It does not search emails. I have lots of emails with important information that I often need to find. As a side note, Outlook's "Advanced Find" feature stinks too.&lt;/li&gt; &lt;/ul&gt; &lt;a href="http://desktop.google.com" target="_new"&gt;Google Desktop Search&lt;/a&gt; is another well-known desktop search tool. I experimented with it briefly in 2005 but I was disappointed that it only indexed and searched a limited number of email and document types. The supported types include Outlook emails and most Microsoft documents, all of which are good. Unfortunately I'm a developer (for searching anyway) and I need to search many other file types that are not supported and that are obviously low on Google's list.&lt;br /&gt;&lt;br /&gt;These disappointments eventually led me to Copernic. Copernic indexes all of the files that I want and it does it when my computer is idle. It also does NOT index files that I don't want it to search (e.g. backups and temp directories). When I search for something in Copernic I am almost always amazed at how quickly it helps me find what I'm looking for.&lt;br /&gt;&lt;br /&gt;The only feature that I wish Copernic had was regular expression searches. Admittedly this is probably hard to do, but man would it be cool and powerful!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-113942017778676084?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.copernic.com/' title='Copernic Desktop Search'/><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/113942017778676084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=113942017778676084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113942017778676084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113942017778676084'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/02/copernic-desktop-search.html' title='Copernic Desktop Search'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-113833922340092225</id><published>2006-01-26T23:18:00.000-06:00</published><updated>2006-01-26T23:33:06.363-06:00</updated><title type='text'>CMS Directory and Matrix</title><content type='html'>I found a &lt;a href="http://www.pcmag.com/article2/0,1895,480782,00.asp"&gt;CMS directory&lt;/a&gt; online. It is missing many CMS's but it still has lots of good information.&lt;br /&gt;&lt;br /&gt;This &lt;a href="http://www.oscom.org/matrix/index.html"&gt;CMS matrix&lt;/a&gt; lists many of the open source CMS's that are out there today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-113833922340092225?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/113833922340092225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=113833922340092225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113833922340092225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113833922340092225'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/01/cms-directory-and-matrix.html' title='CMS Directory and Matrix'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-113820009260826419</id><published>2006-01-25T08:38:00.000-06:00</published><updated>2006-01-25T08:50:36.830-06:00</updated><title type='text'>Java Content Manager - Initial List</title><content type='html'>After doing a little research I found a list of CMS's that might meet my requirements. Over time I plan to give each of them a try and will do my best to document my findings.&lt;br /&gt;&lt;br /&gt;I plan to take a look at the following CMS's:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;OpenCMS&lt;/li&gt;   &lt;li&gt;Magnolia&lt;/li&gt;   &lt;li&gt;Slide&lt;/li&gt;   &lt;li&gt;Jackrabbit&lt;/li&gt;&lt;li&gt;eXo&lt;/li&gt;   &lt;li&gt;Rhythmyx 5&lt;/li&gt;   &lt;li&gt;Liferay&lt;br /&gt; &lt;/li&gt;  &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-113820009260826419?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/113820009260826419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=113820009260826419' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113820009260826419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113820009260826419'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/01/java-content-manager-initial-list.html' title='Java Content Manager - Initial List'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-113814197194362866</id><published>2006-01-24T16:14:00.000-06:00</published><updated>2006-01-24T23:17:30.683-06:00</updated><title type='text'>Searching for a Java Content Manager</title><content type='html'>Through my consulting and full-time work, I learned the value of a Content Management System (CMS). The big benefit is that the chore of maintaining a web site's content can be taken out of a developer's hands and given to someone who is less technical. In an ideal world this person would be the business user who best knows the content.&lt;br /&gt;&lt;br /&gt;Unfortunately, the only good Java CMS that I have worked with has been part of a framework called &lt;a href="http://www.bluemartini.com/"&gt;Blue Martini&lt;/a&gt;. While the Blue Martini web framework itself is far from perfect, its CMS, Enterprise Desktop, makes it worth the trouble. The problem is that the framework is far too expensive for myself and for many of my clients. I need a CMS with similar capabilities, but with a much smaller price tag.&lt;br /&gt;&lt;br /&gt;The optimist in me says that good, reasonably priced CMS' exist for other languages (e.g. PHP), so one has to exist for Java, right?&lt;br /&gt;&lt;br /&gt;Hoping that the open source community will once again come to my rescue I have begun a search for a replacement CMS that costs nothing to very little and that meets my other requirements (see below).&lt;br /&gt;&lt;br /&gt;Before I get started, what content do I want to manage?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Images&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy (i.e. the text on the page)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Downloadable files (e.g. PDF's)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Some layout attributes - not really content but&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;My requirements for a CMS...&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Must be accessible from Java code. At one time I wanted the CMS to be written in Java too since it just seemed "right", but I now realize that this is a "nice to have" and not a hard requirement. Another nice to have is support for &lt;a href="http://www.jcp.org/aboutJava/communityprocess/review/jsr170/"&gt;JSR-170&lt;/a&gt;.&lt;/li&gt;   &lt;li&gt;Is just a CMS or can be used just as a CMS. Many of the CMS's out there are tied to a web or portal framework. I don't need the framework. I want a CMS that can be used with any framework or with any Java application&lt;/li&gt;&lt;li&gt;Allows a snapshot of the most current content to be taken and moved to other environments. For example, I want to be able to add content that is under development, take a snapshot of this content, and then move it to a test environment where it can be reviewed as a complete site. Once the review is complete then the content snapshot would be moved to a production environment. Many CMS' allow individual pieces of content to be modified and tested before being published to production, but they do not allow the entire site to be tested and published at one time.&lt;/li&gt;   &lt;li&gt;Supports internationalization of content. I need to be able to insert multiple translated versions of a piece of content and to have the CMS return the correct version based on the user's locale.&lt;/li&gt;   &lt;li&gt;Must have a rich user interface. The UI can be a thin web client or a thick client. What is important is that it must be easy enough for non-technical people to work with.&lt;br /&gt;  &lt;/li&gt;  &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-113814197194362866?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/113814197194362866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=113814197194362866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113814197194362866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113814197194362866'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/01/searching-for-java-content-manager.html' title='Searching for a Java Content Manager'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9952047.post-113814068957472703</id><published>2006-01-24T15:48:00.000-06:00</published><updated>2006-01-24T16:13:03.916-06:00</updated><title type='text'>Why Am I Doing This?</title><content type='html'>This is my first serious venture into blogging. Prior to now I hadn't taken the plunge into blogging because I didn't think that I had the time to do it well. Further I didn't think that there was an audience out there who would be interested in reading what I had to say. Essentially, why should I take the time to blog when I might be my only reader?&lt;br /&gt;&lt;br /&gt;Well, I've decided to make time to blog and I have decided that at the very least writing will help me better organize my thoughts and better understand the topics that I write about. And if I'm lucky a few people might stumble upon my writing and find it helpful.&lt;br /&gt;&lt;br /&gt;In this blog, I plan to write about my experiences with the tools and technologies that I use every day. In particular, through my software consulting work with &lt;a href="http://www.landersconsulting.biz"&gt;Landers Consulting, Inc.&lt;/a&gt; I utilize a lot of open source technologies. As most software folks know, one of the frustrations of using open source software is the lack of quality documentation and real world examples. Hopefully my posts will help fix this problem.&lt;br /&gt;&lt;br /&gt;In addition to open source,  I plan to write about the following topics:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Software architecture and development - nothing specific, just my musings on the industry&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;Java - any Java technology or tool that catches my fancy&lt;/li&gt;   &lt;li&gt;C# / .NET - same as above&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9952047-113814068957472703?l=tlanders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tlanders.blogspot.com/feeds/113814068957472703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9952047&amp;postID=113814068957472703' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113814068957472703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9952047/posts/default/113814068957472703'/><link rel='alternate' type='text/html' href='http://tlanders.blogspot.com/2006/01/why-am-i-doing-this.html' title='Why Am I Doing This?'/><author><name>Troy Landers</name><uri>http://www.blogger.com/profile/14978372965203815408</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
