<?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:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUMMQ3k-fCp7ImA9WhRaE0U.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065</id><updated>2012-02-16T01:11:22.754-08:00</updated><category term="node.js" /><category term="Lions-Tigers-Bears" /><category term="Tools" /><category term="DITA" /><category term="XDI" /><category term="Git" /><category term="Java" /><category term="OpenXDI" /><category term="Maven" /><category term="Locker" /><title>Nodal.info</title><subtitle type="html">Blogging about Node.js, Communitivity, and sometimes other development topics</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.nodal.info/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.nodal.info/" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Nodalinfo" /><feedburner:info uri="nodalinfo" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A08ESHc6eyp7ImA9WhRUGE0.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-6752323024917273844</id><published>2012-01-28T12:42:00.000-08:00</published><updated>2012-01-28T20:03:29.913-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T20:03:29.913-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>How to start over in a Github repo</title><content type="html">&lt;div&gt;&lt;img style="clear:left; float:left;margin-right:1em; margin-bottom:1em;" border="0"  src="https://github.com/BillBarnhill/nodal.info/raw/master/images/git-logo.png" /&gt;

&lt;p&gt;So I am cleaning up some source code and putting it onto Github.  I made some mistakes when I made my first commit, so I needed to back that out.  The rest of this short post describes how I did it.&lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-DeWEhAgebYg/TyRW86Tv8AI/AAAAAAAAAB4/aa0ecEqgkTc/s1600/warning_icon_small.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="100" width="100" src="http://1.bp.blogspot.com/-DeWEhAgebYg/TyRW86Tv8AI/AAAAAAAAAB4/aa0ecEqgkTc/s320/warning_icon_small.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;But first, a warning: If other people are using the code in your repo already do not do this. It will completely mess them up and should only be done when you are first committing a project, or at least only when no one has forked the project.
&lt;/p&gt;&lt;/div&gt;

&lt;p style="clear: both;"&gt;First you scrap your commits in your local repo...&lt;/p&gt;
&lt;div style="margin-left: 20px;"&gt;
&lt;code style="font-style: italic;white-space:pre;"&gt;
git init
git add .
&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt;Next make sure there are no extraneous files...&lt;/p&gt;
&lt;div style="margin-left: 20px;"&gt;
&lt;code style="font-style: italic;white-space:pre;"&gt;
git status
&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt;If there are files you don't mean to add the remove them...&lt;/p&gt;
&lt;div style="margin-left: 20px;"&gt;
&lt;code style="font-style: italic;white-space:pre;"&gt;
git rm --cached FileToRemove
&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt;Next do the commit and force it onto the master...&lt;/p&gt;
&lt;div style="margin-left: 20px;"&gt;
&lt;code style="font-style: italic;white-space:pre;"&gt;
git commit -a -m 'first commit'
git remote add origin git@github.com:Owner/Repo.git
git push origin +master
&lt;/code&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-6752323024917273844?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fV9-qZddD7sFGRH1TofAWYHAFA0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fV9-qZddD7sFGRH1TofAWYHAFA0/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/fV9-qZddD7sFGRH1TofAWYHAFA0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fV9-qZddD7sFGRH1TofAWYHAFA0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/rICBosjccTI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/6752323024917273844/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=6752323024917273844" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/6752323024917273844?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/6752323024917273844?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/rICBosjccTI/how-to-start-over-in-github-repo.html" title="How to start over in a Github repo" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-DeWEhAgebYg/TyRW86Tv8AI/AAAAAAAAAB4/aa0ecEqgkTc/s72-c/warning_icon_small.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.nodal.info/2012/01/how-to-start-over-in-github-repo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkADRHY-eCp7ImA9WhRRFEw.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-7388351133719267985</id><published>2011-11-27T08:44:00.001-08:00</published><updated>2011-11-27T10:32:55.850-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-27T10:32:55.850-08:00</app:edited><title>Being More Productive</title><content type="html">&lt;article&gt;
&lt;header&gt;
&lt;h3&gt;&lt;i&gt;The start of a personal productivity plan&lt;/i&gt;&lt;/h3&gt;
&lt;/header&gt;
&lt;section&gt;
&lt;h2&gt;Some background&lt;/h2&gt;
&lt;p&gt;I'm already very productive at work in my day job but my side work has not been as productive as I'd like. So I've decided to adapt the techniques I use during the regular work day to my side business and personal life.&lt;/p&gt;
&lt;p&gt;As an incentive I decided to be open about it and publish as much as I can about my path to better personal productivity.  This post is the first in that series, all of which will be tagged #ProductivityMeasures&lt;/p&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h2&gt;First Steps&lt;/h2&gt;
&lt;p&gt;So the first thing is to establish the measures.  In the System Engineering world there are two main types of measures. There are Measures of Effectiveness (MoEs) and Measures of Performance (MoPs). To paraphrase the &lt;a href="https://dap.dau.mil/glossary/pages/2236.aspx"&gt;DAU Dictionary&lt;/a&gt; definition a Measure of Effectiveness (MoE) is a measure of how a system changes its environment, i.e. the effect it has. A Measure of Performance is more granular measure than a Measure of Effectiveness and is also more quantitative. Right now I am going to focus on MoEs, later I may decompose them into MoPs&lt;/p&gt;
&lt;p&gt;To provide a context for my effort I need to specify the environment affected, which I'm defining as an combination of available Open Source software, my own closed source software, my social network, the body of knowledge around the technologies I am interested in (mobile apps, Node.js, social software, semantic technologies, and more), humanity, and family. That is just the initial definition of the environment, I expect to revise it as I go forward. Humanity is included because while a positive effect on humanity is not going to make me more productive immediately it will likely make me a better person and a more connected person.  Family is included because my family keeps me grounded, balanced, and sane - and having a positive effect on my family maks me a better person. Of course I am the system under measurement.&lt;/p&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h2&gt;So how can I affect this environment?&lt;/h2&gt;
&lt;p&gt;Here are some ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write a blog post that increases the technical body of knowledge (at least I'd like to think so)&lt;/li&gt;
&lt;li&gt;Make a piece of Open Source Software&lt;/li&gt;
&lt;li&gt;Create a document describing an idea for a piece of Open Source software to create&lt;/li&gt;
&lt;li&gt;Create a document describing an idea for a new blog post to publish&lt;/li&gt;
&lt;li&gt;Improve a blog post draft&lt;/li&gt;
&lt;li&gt;Publish a blog post&lt;/li&gt;
&lt;li&gt;Make a piece of closed source software&lt;/li&gt;
&lt;li&gt;Join a new social network&lt;/li&gt;
&lt;li&gt;Add info that will enhance my discoverability to my profile on a social network&lt;/li&gt;
&lt;li&gt;Add a contact to one of my social networks&lt;/li&gt;
&lt;li&gt;Help someone in my social network&lt;/li&gt;
&lt;li&gt;Strengthen my ties by having an authentic conversation with someone in my social network. What do I mean by an authentic conversation? For that see &lt;a href="http://www.linkedin.com/in/eekim"&gt;E.E. Kim&lt;/a&gt;'s great post on &lt;a href="http://eekim.com/blog/2007/11/authentic-relationships-and-networking/"&gt;"Authentic Relationships and Networking"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Do one of the things that don't directly make me more productive, but that make me a better person
and &lt;a href="#" onClick="(alert('This is a future blog post.'))"&gt;better people are more productive&lt;/a&gt;.  These things are:
&lt;ul&gt;
  &lt;li&gt;Watch something with my wife or daughter and have an authentic conversation about it.&lt;/li&gt;
  &lt;li&gt;Make something with my daughter&lt;/li&gt;
  &lt;li&gt;Have an authentic conversation with my wife or daughter&lt;/li&gt;
  &lt;li&gt;A family trip&lt;/li&gt;
  &lt;li&gt;Teach my daughter something in depth&lt;/li&gt;
  &lt;li&gt;Volunteer service&lt;/li&gt;
  &lt;li&gt;Give a gift (and I don't mean Farmville)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h2&gt;We've described possible effects, still need measures and goals&lt;/h2&gt;
&lt;p&gt;The previous section describes the how I can affect my environment in ways that will make me more productive. Describing these in itself won't help me be more productive. To do that I need to take the descriptions of effects and determine how to measure them, then decide on my goals, then measure my effects against these goals and alter my behavior accordingly. &lt;/p&gt;
&lt;p&gt;So the next step is to determine how to measure these effects.  That's actually easy - since I organized the list into discrete activities the unit of measure is one activity. That's not saying writing a complete web-app is the same as a single Java class, but it's a place to start.&lt;/p&gt;

&lt;dl&gt;
&lt;lh&gt;So onto my goals. I tend to define goals using three levels that progressively represent more accomplished:&lt;/lh&gt;
&lt;dt&gt;threshold&lt;/dt&gt;&lt;dd&gt;The lowest level, this is the bare minimum that's considered to meet the goal&lt;/dd&gt;
&lt;dt&gt;objective&lt;/dt&gt;&lt;dd&gt;This is the level of effect that is expected and planned&lt;/dd&gt;
&lt;dt&gt;ideal&lt;/dt&gt;&lt;dd&gt;The stars align, everything works for the first time, and this level of effect is achieved.  This is what I strive for.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;So thinking about the above list I came up with the following areas of effect: family, blog, standards work, software, social network.&lt;/p&gt;
&lt;p&gt;I need to have a positive effect on each at least once a day, so there is my threshold&lt;/p&gt;
&lt;p&gt;For my blogging objectives I'd like to write 3 good blog posts a week, with an ideal of one a day&lt;/p&gt;
&lt;p&gt;For my social networking objectives I'd like to add three new contacts a week, ideally one a day.  These a meaningful contacts mind you, not the 'I like your smile' kind (see &lt;a href="http://eekim.com/blog/2007/11/authentic-relationships-and-networking/"&gt;E.E. Kim's article&lt;/a&gt;).  I'd also like to add one new social network a quarter, ideally one a month. I'd also like to post 3 useful links/comments each week to LinkedIn, Facebook, and StackOverflow, ideally one per day.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;To be finished later today...&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Add goals for family here&lt;/p&gt;
&lt;p&gt;Add goals for standards work here&lt;/p&gt;
&lt;/section&gt;
&lt;section&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;Next I need to figure out a schedule to keep in order to meet my objective goals and the tools I'll use to track my efforts, but that will be a different blog post.&lt;/p&gt;
&lt;/article&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-7388351133719267985?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9i7o7sEiQ22w11zchLwZF9Xhhn0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9i7o7sEiQ22w11zchLwZF9Xhhn0/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/9i7o7sEiQ22w11zchLwZF9Xhhn0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9i7o7sEiQ22w11zchLwZF9Xhhn0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/HmDb4DwNFQA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/7388351133719267985/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=7388351133719267985" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/7388351133719267985?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/7388351133719267985?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/HmDb4DwNFQA/being-more-productive.html" title="Being More Productive" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2011/11/being-more-productive.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4BSHo-fCp7ImA9WhRUGE0.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-8735169469753643521</id><published>2011-06-27T15:06:00.000-07:00</published><updated>2012-01-28T19:15:59.454-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T19:15:59.454-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DITA" /><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Installing and testing the DITA Open Toolkit</title><content type="html">&lt;div&gt;&lt;p&gt;Installed the DIT Open Toolkit with...&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ cd /code&lt;br /&gt;
$ wget http://sourceforge.net/projects/dita-ot/files/DITA-OT%20Stable%20Release/DITA%20Open%20Toolkit%201.5.3/DITA-OT1.5.3_full_easy_install_bin.tar.gz/download&lt;br /&gt;
$ tar zxvf DITA-OT1.5.3_full_easy_install_bin.tar.gz&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Next we need to test it by trying to build just the web version of the sample files...&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ cd DITA-OT1.5.3&lt;br /&gt;
$ export DITA_HOME=/code/DITA-OT1.5.3&lt;br /&gt;
$ ./startcmd.sh &lt;br /&gt;
$ ant samples.web -f build_demo.xml&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Seems to have worked, let's see what it produced...&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ find out/samples/web&lt;br /&gt;
out/samples/web&lt;br /&gt;
out/samples/web/commonltr.css&lt;br /&gt;
out/samples/web/commonrtl.css&lt;br /&gt;
out/samples/web/concepts&lt;br /&gt;
out/samples/web/concepts/garageconceptsoverview.html&lt;br /&gt;
out/samples/web/concepts/lawnmower.html&lt;br /&gt;
out/samples/web/concepts/oil.html&lt;br /&gt;
out/samples/web/concepts/paint.html&lt;br /&gt;
out/samples/web/concepts/shelving.html&lt;br /&gt;
out/samples/web/concepts/snowshovel.html&lt;br /&gt;
out/samples/web/concepts/toolbox.html&lt;br /&gt;
out/samples/web/concepts/tools.html&lt;br /&gt;
out/samples/web/concepts/waterhose.html&lt;br /&gt;
out/samples/web/concepts/wheelbarrow.html&lt;br /&gt;
out/samples/web/concepts/workbench.html&lt;br /&gt;
out/samples/web/concepts/wwfluid.html&lt;br /&gt;
out/samples/web/dita.list&lt;br /&gt;
out/samples/web/dita.xml.properties&lt;br /&gt;
out/samples/web/image&lt;br /&gt;
out/samples/web/image/carwash.jpg&lt;br /&gt;
out/samples/web/index.html&lt;br /&gt;
out/samples/web/tasks&lt;br /&gt;
out/samples/web/tasks/changingtheoil.html&lt;br /&gt;
out/samples/web/tasks/garagetaskoverview.html&lt;br /&gt;
out/samples/web/tasks/organizing.html&lt;br /&gt;
out/samples/web/tasks/shovellingsnow.html&lt;br /&gt;
out/samples/web/tasks/spraypainting.html&lt;br /&gt;
out/samples/web/tasks/takinggarbage.html&lt;br /&gt;
out/samples/web/tasks/washingthecar.html&lt;br /&gt;
out/samples/web/toc.html&lt;br /&gt;
$ open out/samples/web/index.html&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;Next lets build the PDF version...&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ ant samples.pdf -f build_demo.xml&lt;br /&gt;
out/samples/pdf&lt;br /&gt;
out/samples/pdf/Configuration&lt;br /&gt;
out/samples/pdf/Configuration/OpenTopic&lt;br /&gt;
out/samples/pdf/Configuration/OpenTopic/cfg&lt;br /&gt;
out/samples/pdf/Configuration/OpenTopic/cfg/common&lt;br /&gt;
out/samples/pdf/Configuration/OpenTopic/cfg/common/artwork&lt;br /&gt;
out/samples/pdf/Configuration/OpenTopic/cfg/common/artwork/hand.gif&lt;br /&gt;
out/samples/pdf/Configuration/OpenTopic/cfg/common/artwork/warning.gif&lt;br /&gt;
out/samples/pdf/Customization&lt;br /&gt;
out/samples/pdf/Customization/OpenTopic&lt;br /&gt;
out/samples/pdf/Customization/OpenTopic/common&lt;br /&gt;
out/samples/pdf/Customization/OpenTopic/common/artwork&lt;br /&gt;
out/samples/pdf/Customization/OpenTopic/common/artwork/README.txt&lt;br /&gt;
out/samples/pdf/dita.list&lt;br /&gt;
out/samples/pdf/dita.xml.properties&lt;br /&gt;
out/samples/pdf/image&lt;br /&gt;
out/samples/pdf/image/carwash.jpg&lt;br /&gt;
out/samples/pdf/sequence.pdf&lt;br /&gt;
$ open out/samples/pdf/sequence.pdf&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-8735169469753643521?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jp5laVHawe9QJ0CoxZfKM1LEqik/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jp5laVHawe9QJ0CoxZfKM1LEqik/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/jp5laVHawe9QJ0CoxZfKM1LEqik/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jp5laVHawe9QJ0CoxZfKM1LEqik/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/T4Sl4-yjWps" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/8735169469753643521/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=8735169469753643521" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/8735169469753643521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/8735169469753643521?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/T4Sl4-yjWps/installing-and-testing-dita-open.html" title="Installing and testing the DITA Open Toolkit" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2011/06/installing-and-testing-dita-open.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUHR3o-eCp7ImA9WhZaEkw.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-4647713348118352981</id><published>2011-06-27T14:30:00.000-07:00</published><updated>2011-06-27T14:30:36.450-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-27T14:30:36.450-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XDI" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenXDI" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Maven" /><title>How to build the OpenXDI server</title><content type="html">&lt;div&gt;&lt;p&gt;So first we have to get the code...&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ cd /code/&lt;br /&gt;
$ svn checkout https://svn.gluu.info/repository/openxdi/code/ oxserver&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Next we try to build (I am using Maven 2.1):&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ cd oxserver&lt;br /&gt;
$ mvn install&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;The result? I got a bunch of errors on incompatibility with -source 1.3. Probably because they build using their own settings file on the U: drive, according to mvn_ox.bat.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So I added the following in the pom.xml:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
&amp;nbsp;16 &amp;nbsp;&amp;lt;build&amp;gt;&lt;br /&gt;
&amp;nbsp;17 &amp;nbsp; &amp;nbsp; &amp;lt;plugins&amp;gt;&lt;br /&gt;
&amp;nbsp;18 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;plugin&amp;gt;&lt;br /&gt;
&amp;nbsp;19 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
&amp;nbsp;20 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
&amp;nbsp;21 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;nbsp;22 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;nbsp;23 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;source&amp;gt;6&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;nbsp;24 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;target&amp;gt;6&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;nbsp;25 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;br /&gt;
&amp;nbsp;26 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&amp;nbsp;27 &amp;nbsp; &amp;nbsp; &amp;lt;/plugins&amp;gt;&lt;br /&gt;
&amp;nbsp;28 &amp;nbsp; &amp;lt;/build&amp;gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
This got me past the Java syntax errors, but the following two tests fail:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;initializationError(org.xdi.graphmodel.TestGraphBuilder)&lt;br /&gt;
&amp;nbsp; initializationError(org.xdi.graphmodel.TestGraphBuilder)&lt;br /&gt;
&lt;br /&gt;
So I check the error log...&lt;br /&gt;
$cat /code/oxserver/GraphModel/target/surefire-reports/org.xdi.graphmodel.TestGraphBuilder.txt | pbcopy&lt;br /&gt;
&lt;br /&gt;
and I see...&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
Test set: org.xdi.graphmodel.TestGraphBuilder&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.008 sec &amp;lt;&amp;lt;&amp;lt; FAILURE!&lt;br /&gt;
initializationError(org.xdi.graphmodel.TestGraphBuilder) &amp;nbsp;Time elapsed: 0.003 sec &amp;nbsp;&amp;lt;&amp;lt;&amp;lt; ERROR!&lt;br /&gt;
java.lang.Exception: Test class should have exactly one public constructor&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.BlockJUnit4ClassRunner.validateOnlyOneConstructor(BlockJUnit4ClassRunner.java:143)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.BlockJUnit4ClassRunner.validateConstructor(BlockJUnit4ClassRunner.java:132)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:121)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.ParentRunner.validate(ParentRunner.java:269)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.ParentRunner.&amp;lt;init&amp;gt;(ParentRunner.java:66)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.BlockJUnit4ClassRunner.&amp;lt;init&amp;gt;(BlockJUnit4ClassRunner.java:58)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.junit4.JUnit4TestSet.&amp;lt;init&amp;gt;(JUnit4TestSet.java:45)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:209)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.Surefire.run(Surefire.java:156)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)&lt;br /&gt;
&lt;br /&gt;
initializationError(org.xdi.graphmodel.TestGraphBuilder) &amp;nbsp;Time elapsed: 0.001 sec &amp;nbsp;&amp;lt;&amp;lt;&amp;lt; ERROR!&lt;br /&gt;
java.lang.Exception: No runnable methods&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:177)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:122)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.ParentRunner.validate(ParentRunner.java:269)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.ParentRunner.&amp;lt;init&amp;gt;(ParentRunner.java:66)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.BlockJUnit4ClassRunner.&amp;lt;init&amp;gt;(BlockJUnit4ClassRunner.java:58)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.junit4.JUnit4TestSet.&amp;lt;init&amp;gt;(JUnit4TestSet.java:45)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:209)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.Surefire.run(Surefire.java:156)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)&lt;br /&gt;
&lt;br /&gt;
Oh well, Open Source is not called bleeding edge for nothing. By all accounts Yuri does good work so hopefully it is just a minor fix. Time to breakout the workhorse program:&lt;br /&gt;
&lt;br /&gt;
$ emacs GraphModel/test-src/org/xdi/graphmodel/TestGraphBuilder.java&lt;br /&gt;
&lt;br /&gt;
Looks like everything is static and this is a singleton helper for the tests. Problem is that it is named TestGraphBuilder so Junit thinks it's a test since it starts with Test, which is reasonable.&lt;br /&gt;
&lt;br /&gt;
So I renamed it to SampleGraphBuilder.java and reflect that name through the test code (include that file itself), then see what happens...&lt;br /&gt;
&lt;br /&gt;
Sidebar: If you are trying to use sed on a Mac you need to know you are using BSD sed. Why? because using a command like:&lt;br /&gt;
sed -i "s/TestGraphBuilder/SampleGraphBuilder/g" GraphModel/test-&lt;br /&gt;
src/org/xdi/graphmodel/xri/SynonymsPatternXri20110317.java&lt;br /&gt;
&lt;br /&gt;
Will give you a cryptic error about missing characters. BSD sed requires a backup extension after the -i option, like so:&lt;br /&gt;
&lt;br /&gt;
sed -i.bak "s/TestGraphBuilder/SampleGraphBuilder/g" GraphModel/test-&lt;br /&gt;
src/org/xdi/graphmodel/xri/SynonymsPatternXri20110317.java&lt;br /&gt;
&lt;br /&gt;
So that said, how do we do all the replacing with one command line...&lt;br /&gt;
grep -R TestGraphBuilder GraphModel/test-src | grep .java\: | awk -F':' '{ print $1 }' | xargs -I {} sed -i.bak 's/TestGraphBuilder/SampleGraphBuilder/g' {}&lt;br /&gt;
&lt;br /&gt;
That gets us passing tests, but the jars do not get produced. Instead we get...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[INFO] [jar:jar]&lt;br /&gt;
[INFO] ------------------------------------------------------------------------&lt;br /&gt;
[ERROR] BUILD ERROR&lt;br /&gt;
[INFO] ------------------------------------------------------------------------&lt;br /&gt;
[INFO] Error assembling JAR&lt;br /&gt;
&lt;br /&gt;
Embedded error: basedir /code/oxserver/GraphModel/bin/production does not exist&lt;br /&gt;
&lt;br /&gt;
That's a problem, since as far as I can tell there is no assembly file anywhere, named production or otherwise.&lt;br /&gt;
&lt;br /&gt;
I see a separate build.xml so maybe we can switch to ant to produce the jar file:&lt;br /&gt;
ant archive&lt;br /&gt;
&lt;br /&gt;
Unfortunately this produces the following error output:&lt;br /&gt;
&lt;br /&gt;
BUILD FAILED&lt;br /&gt;
/code/oxserver/build.xml:67: /code/oxserver/libs not found.&lt;br /&gt;
&lt;br /&gt;
Looking at the directory more I see a weird directory: GraphModel/bin\\production&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Looks like Windows specific artifact issue, so let's fix the directory paths with:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ mkdir GraphModel/bin&lt;br /&gt;
$ mv GraphModel/bin\\production GraphModel/bin/production&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;I also see a GraphModel/bin\\test\\GraphModel so fix that in the same way:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ mkdir GraphModel/bin/test&lt;br /&gt;
$ mv GraphModel/bin\\test\\GraphModel GraphModel/bin/test/GraphModel&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;And a...&lt;/p&gt;&lt;code&gt;$ mvn clean install&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Only to get another error, this time Mac related:&lt;/p&gt;&lt;br /&gt;
&lt;pre&gt;[INFO] [jar:jar]
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error assembling JAR
Embedded error: /code/oxserver/GraphModel/bin\production/.DS_Store isn't a file.
&lt;/pre&gt;&lt;p&gt;Fixed this with:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ find . -name \.DS_Store | xargs rm -rf&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;This gets us close, but still gives an error:&lt;/p&gt;&lt;pre&gt;[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] Compiling 51 source files to /code/oxserver/WebClient/bin\production
&lt;/pre&gt;&lt;p&gt;Looks like another Windows artifact, so fixed the same way:&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ mkdir WebClient/bin&lt;br /&gt;
$ mv WebClient/bin\\production WebClient/bin/production&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Still getting errors...&lt;/p&gt;&lt;pre&gt;WARNING] POM for 'com.ibm.icu:icu4j:pom:3.4.4:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'org.slf4j:slf4j-jcl:pom:1.0.1:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'jug:jug:pom:1.1.2:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'xml-security:xmlsec:pom:1.3.0:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'xalan:xalan:pom:2.7.0:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'net.sf.ehcache:ehcache:pom:1.2.3:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'org.apache.httpcomponents:httpclient:pom:4.0.1:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'org.apache.httpcomponents:httpcore:pom:4.1:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[WARNING] POM for 'commons-codec:commons-codec:pom:1.4:compile' is invalid.

Its dependencies (if any) will NOT be available to the current build.
[INFO] [compiler:compile]
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] Compiling 51 source files to /code/oxserver/WebClient/bin\production
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] error: error reading /Users/wolf/.m2/repository/com/ibm/icu/icu4j/3.4.4/icu4j-3.4.4.jar; cannot read zip file
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[4,22] package org.apache.http does not exist
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[5,22] package org.apache.http does not exist
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[10,30] package org.apache.http.message does not exist
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[68,19] cannot find symbol
symbol  : class HttpResponse
location: class org.xdi.webclient.server.impl.MessageRequestor
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[51,14] cannot find symbol
symbol  : class HttpResponse
location: class org.xdi.webclient.server.impl.MessageRequestor
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[71,38] cannot access org.apache.http.message.AbstractHttpMessage
class file for org.apache.http.message.AbstractHttpMessage not found
            final HttpPost httppost = new HttpPost(p_url);
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[74,23] cannot find symbol
symbol  : class NameValuePair
location: class org.xdi.webclient.server.impl.MessageRequestor
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[74,69] cannot find symbol
symbol  : class NameValuePair
location: class org.xdi.webclient.server.impl.MessageRequestor
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[75,35] cannot find symbol
symbol  : class BasicNameValuePair
location: class org.xdi.webclient.server.impl.MessageRequestor
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[78,31] cannot access org.apache.http.entity.StringEntity
class file for org.apache.http.entity.StringEntity not found
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
[ERROR] /code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[80,29] cannot access org.apache.http.HttpHost
class file for org.apache.http.HttpHost not found
            return httpclient.execute(httppost);
[INFO] 12 errors 
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure

error: error reading /Users/wolf/.m2/repository/com/ibm/icu/icu4j/3.4.4/icu4j-3.4.4.jar; cannot read zip file
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[4,22] package org.apache.http does not exist
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[5,22] package org.apache.http does not exist
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[10,30] package org.apache.http.message does not exist
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[68,19] cannot find symbol
symbol  : class HttpResponse
location: class org.xdi.webclient.server.impl.MessageRequestor
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[51,14] cannot find symbol
symbol  : class HttpResponse
location: class org.xdi.webclient.server.impl.MessageRequestor
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[71,38] cannot access org.apache.http.message.AbstractHttpMessage
class file for org.apache.http.message.AbstractHttpMessage not found
            final HttpPost httppost = new HttpPost(p_url);
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[74,23] cannot find symbol
symbol  : class NameValuePair
location: class org.xdi.webclient.server.impl.MessageRequestor
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[74,69] cannot find symbol
symbol  : class NameValuePair
location: class org.xdi.webclient.server.impl.MessageRequestor
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[75,35] cannot find symbol
symbol  : class BasicNameValuePair
location: class org.xdi.webclient.server.impl.MessageRequestor
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[78,31] cannot access org.apache.http.entity.StringEntity
class file for org.apache.http.entity.StringEntity not found
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
/code/oxserver/WebClient/src/org/xdi/webclient/server/impl/MessageRequestor.java:[80,29] cannot access org.apache.http.HttpHost
class file for org.apache.http.HttpHost not found
            return httpclient.execute(httppost);
&lt;/pre&gt;&lt;p&gt;It looks like two things.&lt;/p&gt;&lt;p&gt;First, the dependency with group com.ibm.icu, artifact icu4j ,and version 3.4.4 appear missing. I've run into this before because icu is not in the central repository.&lt;/p&gt;&lt;p&gt;Second, the build seems to be creating the weird Windows specific directories. Looking into the pom.xml files in the modules GraphModel and WebClient that seems to be the case. Using \ characters in path works perfectly fine on Windows, but if you go to a flavor of Unix then it gets treated as a special character. On the other hand the / character is handled properly by Maven on both platforms.&lt;/p&gt;&lt;p&gt;So I fired up emacs and changed the offending '\' characters to '/' characters, and then rebuilt.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Still getting the missing icu jar, which was expected&lt;/p&gt;&lt;p&gt;Spending more time on this than expected, and icu4j is not a direct dependency which means fixing it could be a pain, so taking easy way...&lt;/p&gt;&lt;code&gt;&lt;br /&gt;
$ wget http://dev.mapfish.org/maven/repository/com/ibm/icu/icu4j/3.4.4/icu4j-3.4.4.jar&lt;br /&gt;
$ mvn install:install-file -DgroupId=wrap:mvn:com.ibm.icu -DartifactId=icu4j -Dversion=3.4.4 -Dpackaging=jar -Dfile=icu4j-3.4.4.jar&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;p&gt;This got me past the icu4j issue, but still going to have same issue for several jars so this is where I am calling it, since I am most interested in the server (i.e. GraphModel) portion anyways and I don't have the time to debug the rest of the Maven issues. I may revisit this later.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-4647713348118352981?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OkeZKk8leam9nPhuQhmqo8MKNrc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OkeZKk8leam9nPhuQhmqo8MKNrc/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/OkeZKk8leam9nPhuQhmqo8MKNrc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OkeZKk8leam9nPhuQhmqo8MKNrc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/MONmVolDOfI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/4647713348118352981/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=4647713348118352981" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/4647713348118352981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/4647713348118352981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/MONmVolDOfI/how-to-build-openxdi-server.html" title="How to build the OpenXDI server" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2011/06/how-to-build-openxdi-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQERXs_eCp7ImA9WhZSEU0.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-3162368251367344287</id><published>2011-03-25T19:41:00.001-07:00</published><updated>2011-03-25T19:41:44.540-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-25T19:41:44.540-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Locker" /><category scheme="http://www.blogger.com/atom/ns#" term="node.js" /><category scheme="http://www.blogger.com/atom/ns#" term="Lions-Tigers-Bears" /><title>Node, sqlite, and Locker - oh my!</title><content type="html">&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This article is the first in the Lions, Tigers, and Bears - Oh My series, how-to articles involving getting several pieces of software (usually with node.js in the mix) to work together.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This week the software is:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;node.js : the fast server side javascript platform built on the Google V8 engine&lt;/li&gt;
&lt;li&gt;node-sqlite : the node.js bindings to the sqlite library&lt;/li&gt;
&lt;li&gt;Locker : The Personal Data Store (PDS) project from Jeremie Miller&lt;/li&gt;
&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;npm, the node package manager, was installed as well in the course of installing the above software.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The operating system this was installed on was Ubuntu&amp;nbsp;and running inside VirtualBox.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The Ubuntu iso used was&amp;nbsp;ubuntu-10.10-server-i386.iso.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Script started on Fri 25 Mar 2011 05:37:14 PM EDT&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ uname -a&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Linux whitestar 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ apt-get update&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ sudo apt-get install git&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ sudo apt-get install build-essential&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ git clone git://github.com/joyent/node.git&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ cd node&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;You can go with the distribution standard packages for OpenSSL:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/node$ sudo apt-get install openssl&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/node$ sudo apt-get install libssl-dev&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Or alternatively, if you want openssl-1.0.0d...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/node$ mkdir ../downloads &amp;amp;&amp;amp; pushd ../downloads&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/downloads$ wget http://www.openssl.org/source/openssl-1.0.0d.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tar.gz&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/downloads$ tar xzf openssl-1.0.0d.tar.gz&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/downloads$ cd openssl-1.0.0d&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/downloads/openssl-1.0.0d$ ./config&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/downloads/openssl-1.0.0d$ make&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/downloads/openssl-1.0.0d$ sudo make install&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/node$ ./configure&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for program g++ or c++ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:/usr/bin/g++&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for program cpp &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :/usr/bin/cpp&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for program ar &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:/usr/bin/ar&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for program ranlib &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:/usr/bin/ranlib&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for g++ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :ok&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for program gcc or cc &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :/usr/bin/gcc&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for program ar &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:/usr/bin/ar&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for program ranlib &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:/usr/bin/ranlib&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for gcc &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :ok&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for library dl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for openssl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :not found&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function SSL_library_init &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header openssl/crypto.h &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for library util &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for library rt &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for CLOCK_MONOTONIC &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;--- libeio ---&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for library pthread &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function pthread_create &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function pthread_atfork &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for futimes(2) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for readahead(2) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for fdatasync(2) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for pread(2) and pwrite(2) &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for sendfile(2) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for sync_file_range(2) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;--- libev ---&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header sys/inotify.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function inotify_init &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header sys/epoll.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function epoll_ctl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header port.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :not found&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header poll.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function poll &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header sys/event.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:not found&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header sys/queue.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function kqueue &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :not found&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header sys/select.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function select &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for header sys/eventfd.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function eventfd &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for SYS_clock_gettime &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for library rt &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function clock_gettime &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function nanosleep &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for function ceil &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Checking for fdatasync(2) with c++ &amp;nbsp; &amp;nbsp; &amp;nbsp; :yes&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;'configure' finished successfully (6.158s)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;But it says OpenSSL not found. Actually it was because configure test for openssel libs&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;in two ways. The first is to see if the OpenSSL package is detected as installed, and in&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;this case it is installed but it's not detected so that test fails. The second way is to see&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;if it can find the openssl dev library and if that library has a certain function SSL_Library_init.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This test passes, so we are ok to proceed.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;So standard steps now to make and install node...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/node$ make&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/node$ sudo make install&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/node$ cd ..&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Now we clone, make and install npm, the node package manager. Think of npm&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;as apt-get for node.js and you wouldn't be that far off.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ git clone http://github.com/isaacs/npm.git&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ cd npm&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/npm$ sudo make install&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/npm$ cd ..&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Now to build Locker, Jeremie Miller's interesting Personal Data Ecosystem&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;project.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;First we clone the repo.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ git clone https://github.com/quartzjer/Locker.git&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Now here's where things get a little funky. If you built Locker now then&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;it would use the publihs 1.0.3 version of the node-sqlite package. That&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;would be ok as long as you didn't have a different version of sqlite installed&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;anywhere on your system include path. &amp;nbsp;If you do, like all Mac OS X users,&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;then the node-sqlite dependency build will break preventing Locker from&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;being built.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I went through this and created a modified version of node-sqlite that has&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;updated sqlite dependencies (to 3.7.5) and fixes the include problem.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;So lets get that version downloaded from my repository:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ git clone https://github.com/billbarnhill/node-sqlite.git&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Now we have to go into Locker and tell it to use the local version of node-sqlite:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~$ cd Locker&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/Locker$ sudo npm install ../node-sqlite&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;We're at the point now where we can build Locker...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/Locker$ sudo npm install&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;tester@whitestar:~/Locker$ node locker.js&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[18:53:07][Locker] Spawned dashboard pid: 20329&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[18:53:07][Locker] locker running at http://localhost:8042/&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[18:53:07][Locker] generating id private key&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[18:53:07][Locker] generating id public key&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[18:53:07][Locker] id keys loaded&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;[18:53:07][Locker] dashboard stdout: http://localhost:18042/&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Now you're ready to open up the dashboard by pasting the following&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;url into your browser's address bar and going to that location:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;http://localhost:8042/&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-3162368251367344287?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eAjOLmJlQy5IDYR4JhFJzfAe2ik/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eAjOLmJlQy5IDYR4JhFJzfAe2ik/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/eAjOLmJlQy5IDYR4JhFJzfAe2ik/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eAjOLmJlQy5IDYR4JhFJzfAe2ik/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/Nf8mMWh9ns4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/3162368251367344287/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=3162368251367344287" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/3162368251367344287?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/3162368251367344287?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/Nf8mMWh9ns4/node-sqlite-and-locker-oh-my.html" title="Node, sqlite, and Locker - oh my!" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2011/03/node-sqlite-and-locker-oh-my.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IHRng-fCp7ImA9WxZVFEU.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-7923399611732639835</id><published>2008-03-25T14:40:00.000-07:00</published><updated>2008-03-25T14:45:37.654-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-25T14:45:37.654-07:00</app:edited><title>Useful Erlang snippet to find calling function</title><content type="html">The following snippet is the erlang equivalent of generating an exception and getting the backtrace info.  Still need to parse out the function name. Working on integrating this into a debugging module.&lt;br /&gt;&lt;br /&gt;1&gt; B = fun () -&gt; erlang:process_info(erlang:self(), [backtrace]) end. &lt;br /&gt;&lt;br /&gt;2&gt; A = fun () -&gt; B() end. &lt;br /&gt;&lt;br /&gt;3&gt; [{backtrace, Bin}] = A().&lt;br /&gt;&lt;br /&gt;4&gt; io:format("~s",[binary_to_list(Bin)]).&lt;br /&gt;&lt;br /&gt;Program counter: 0x00000001005d6de0 (unknown function)&lt;br /&gt;CP: 0x0000000101a975f8 (erl_eval:do_apply/5 + 2608)&lt;br /&gt;&lt;br /&gt;0x00000001010142a0 Return addr 0x0000000101a944e0 (erl_eval:expr/5 + 15888)&lt;br /&gt;y(0)     []&lt;br /&gt;y(1)     []&lt;br /&gt;y(2)     [{'A',#Fun&lt;erl_eval.20.67289768&gt;},{'B',#Fun&lt;erl_eval.20.67289768&gt;}]&lt;br /&gt;&lt;br /&gt;0x00000001010142c0 Return addr 0x0000000101acf9b8 (shell:exprs/6 + 736)&lt;br /&gt;y(0)     none&lt;br /&gt;y(1)     {cons,1,{tuple,1,[{atom,1,backtrace},{var,1,'Bin'}]},{nil,1}}&lt;br /&gt;&lt;br /&gt;0x00000001010142d8 Return addr 0x0000000101acf138 (shell:eval_exprs/6 + 160)&lt;br /&gt;y(0)     []&lt;br /&gt;y(1)     []&lt;br /&gt;y(2)     [{'A',#Fun&lt;erl_eval.20.67289768&gt;},{'B',#Fun&lt;erl_eval.20.67289768&gt;}]&lt;br /&gt;y(3)     {value,#Fun&lt;shell.7.49304034&gt;}&lt;br /&gt;y(4)     {eval,#Fun&lt;shell.23.77821557&gt;}&lt;br /&gt;y(5)     15&lt;br /&gt;y(6)     []&lt;br /&gt;y(7)     []&lt;br /&gt;y(8)     []&lt;br /&gt;&lt;br /&gt;0x0000000101014328 Return addr 0x0000000101acecc0 (shell:eval_loop/3 + 600)&lt;br /&gt;y(0)     []&lt;br /&gt;y(1)     []&lt;br /&gt;y(2)     [{'A',#Fun&lt;erl_eval.20.67289768&gt;},{'B',#Fun&lt;erl_eval.20.67289768&gt;}]&lt;br /&gt;y(3)     &lt;0.30.0&gt;&lt;br /&gt;y(4)     Catch 0x0000000101acf228 (shell:eval_exprs/6 + 400)&lt;br /&gt;&lt;br /&gt;0x0000000101014358 Return addr 0x000000010017b7a8 (&lt;terminate process normally&gt;)&lt;br /&gt;y(0)     15&lt;br /&gt;y(1)     &lt;0.30.0&gt;&lt;br /&gt;ok&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-7923399611732639835?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VciBHyMawnzGvcJBA0NuDvkqJo4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VciBHyMawnzGvcJBA0NuDvkqJo4/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/VciBHyMawnzGvcJBA0NuDvkqJo4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VciBHyMawnzGvcJBA0NuDvkqJo4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/f5r5HLteQ2Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/7923399611732639835/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=7923399611732639835" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/7923399611732639835?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/7923399611732639835?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/f5r5HLteQ2Q/useful-erlang-snippet-to-find-calling.html" title="Useful Erlang snippet to find calling function" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2008/03/useful-erlang-snippet-to-find-calling.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIMQns8eSp7ImA9WxZVE00.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-680465056519437997</id><published>2008-03-23T14:10:00.000-07:00</published><updated>2008-03-23T14:26:23.571-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-23T14:26:23.571-07:00</app:edited><title>A method for visualizing progress against requirements</title><content type="html">This post describes a novel way I've come up with to visualize a development team's progress against a set of requirements. It should work equally well on an agile-style backlog. For the method to work the requirements must be categorized and each requirement either marked as satisfied or not satisfied.  A paper is in the works to publish this and I'll update this post with a link to that when it's published.&lt;br /&gt;&lt;br /&gt;So the steps:&lt;br /&gt;1. Create a radial graph&lt;br /&gt;2. Divide it equally into sections matching the categories, with boundaries being lines radiating out from center&lt;br /&gt;3. Mark these axis with their category names&lt;br /&gt;4. Figure out max displayable radius of the graph&lt;br /&gt;5. Divide that by the # of requirements in the largest category to get tick gap&lt;br /&gt;6. Give ticks on each axis spaced tick gap apart&lt;br /&gt;7. Draw lines from total requirements ticks to each other, making an irregular polygon, and shade a light color&lt;br /&gt;8. Do same for completed # of requirements ticks, and shade a dark color.&lt;br /&gt;&lt;br /&gt;Some alternate approaches:&lt;br /&gt;1. Assume each category is equal despite # of requirements, so normalize. E.g. if you have 3 categories A,B,C with completed/total ratios of 3/8,2/4,3/4 then the tick gap in B and C would be twice the tick gap of A&lt;br /&gt;2. Adjust tick gaps based on importance of requirement&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I still need to do some research to make sure this is not re-inventing the wheel, but I haven't seen this approach yet, so am hopeful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-680465056519437997?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D9sAmmX-38djYyNZJtRe9WTuDVM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D9sAmmX-38djYyNZJtRe9WTuDVM/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/D9sAmmX-38djYyNZJtRe9WTuDVM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D9sAmmX-38djYyNZJtRe9WTuDVM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/786F2Bpe17A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/680465056519437997/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=680465056519437997" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/680465056519437997?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/680465056519437997?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/786F2Bpe17A/method-for-visualizing-progress-against.html" title="A method for visualizing progress against requirements" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2008/03/method-for-visualizing-progress-against.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4DQno_fyp7ImA9WxZQGEU.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-5528881742208483543</id><published>2008-02-24T12:32:00.000-08:00</published><updated>2008-02-24T13:19:33.447-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-24T13:19:33.447-08:00</app:edited><title>How to...run Yaws embedded, Pt. 2</title><content type="html">&lt;p&gt;Ok, so now we are able to run Yaws from a script. Next up on my todo is running yaws from within a gen_server application.&lt;/p&gt;&lt;p&gt;It gets a little different and during the process I unrolled of the yaws functions to streamline things. The code below works for both starting and stopping. Make sure you follow the previous post's steps on building yaws.&lt;/p&gt;&lt;p&gt;In addition you need a project dir layout like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Project root &lt;li&gt;3rdparty&lt;ul&gt;&lt;li&gt;yaws&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;ebin&lt;/li&gt; &lt;li&gt;src&lt;/li&gt;&lt;li&gt;include&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; You'll need an Emakefile in your &lt;code&gt;src&lt;/code&gt; directory. Something like this:&lt;br /&gt;&lt;code&gt;{'*', [{outdir,"../ebin"},{pa,".."},{i, "../include"},{i, "../3rdparty/yaws/include"}, {warn_format,0}]}.&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Then put all your .hrl files in &lt;code&gt;./include&lt;/code&gt;, your .erl in &lt;code&gt;src&lt;/code&gt;, and build with&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    rm ebin/*.beam&lt;br /&gt;    pushd src&lt;br /&gt;    erl -noshell -s make all -s init stop&lt;br /&gt;    popd&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt; The source for the gen_server code is:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;-module(atom_app).&lt;br /&gt;-behavior(application).&lt;br /&gt;&lt;br /&gt;-include("yaws.hrl").&lt;br /&gt;&lt;br /&gt;%% application callbacks&lt;br /&gt;-export([start/2, &lt;br /&gt;         stop/1]).&lt;br /&gt;&lt;br /&gt;start(_Type, Args) -&gt;&lt;br /&gt; start_atom_yaws(Args),&lt;br /&gt; error_logger:info_msg("Starting atom_app~n",[]),&lt;br /&gt;    atom_sup:start_link([]).&lt;br /&gt;&lt;br /&gt;stop(_State) -&gt;&lt;br /&gt; stop_yaws(),&lt;br /&gt;    ok.&lt;br /&gt;&lt;br /&gt;start_atom_yaws(Args) -&gt;&lt;br /&gt; error_logger:info_msg("Starting embedded yaws~n",[]),&lt;br /&gt; Id = "yawstest",&lt;br /&gt; Debug = true,&lt;br /&gt; ok = application:load(yaws),&lt;br /&gt; ok = application:set_env(yaws, embedded, true),&lt;br /&gt; ok = application:set_env(yaws, id, Id),&lt;br /&gt; application:start(yaws),&lt;br /&gt;        DefaultGC = yaws_config:make_default_gconf(Debug, Id),&lt;br /&gt;        GC = DefaultGC#gconf{tmpdir="./temp/yaws",logdir="./temp/logs"},&lt;br /&gt;        yaws:mkdir(GC#gconf.tmpdir),&lt;br /&gt;        yaws:mkdir(GC#gconf.logdir),&lt;br /&gt;        SC = #sconf{port = 8080,&lt;br /&gt;  servername = "ubuntu01",&lt;br /&gt;  listen = {0,0,0,0},&lt;br /&gt;  docroot = "www"&lt;br /&gt; },&lt;br /&gt; Result = yaws_api:setconf(GC, [[SC]]),&lt;br /&gt; error_logger:info_msg("Finished starting embedded yaws~n",[]),&lt;br /&gt; Result.&lt;br /&gt;&lt;br /&gt;stop_yaws() -&gt;&lt;br /&gt; application:stop(yaws).&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-5528881742208483543?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nz2P-Ch4L0GTEG32w3hsR0KpR3I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nz2P-Ch4L0GTEG32w3hsR0KpR3I/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/nz2P-Ch4L0GTEG32w3hsR0KpR3I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nz2P-Ch4L0GTEG32w3hsR0KpR3I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/_gGP3K9P3OA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/5528881742208483543/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=5528881742208483543" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/5528881742208483543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/5528881742208483543?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/_gGP3K9P3OA/how-torun-yaws-embedded-pt-2.html" title="How to...run Yaws embedded, Pt. 2" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2008/02/how-torun-yaws-embedded-pt-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YAR3s6fSp7ImA9WxZQGEU.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-3562515988997113363</id><published>2008-02-24T10:33:00.000-08:00</published><updated>2008-02-24T12:32:26.515-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-24T12:32:26.515-08:00</app:edited><title>How to...run Yaws embedded</title><content type="html">Yaws is the primary Erlang web server and can be run as part of an application or script, not just standalone.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've found some good tutorials out there but they didn't quite get me what I wanted:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a  href="http://yaws.hyber.org/embed.yaws"&gt;http://yaws.hyber.org/embed.yaws&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.ciarang.com/posts/compiling-yaws-on-ubuntu"&gt;http://blog.ciarang.com/posts/compiling-yaws-on-ubuntu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.socklabs.com/2008/02/embedded_applications_with_yaw/"&gt;http://blog.socklabs.com/2008/02/embedded_applications_with_yaw/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;What I wanted that was missing was:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;No yaws command line args&lt;/li&gt;&lt;li&gt;Debugging in Yaws on&lt;/li&gt;&lt;li&gt;I didn't want to create a full app to embed yaws&lt;/li&gt;&lt;li&gt;Temp dirs are made by script if needed&lt;/li&gt;&lt;li&gt;Set temp dir for where logs go, and for the yaws working dir&lt;/li&gt;&lt;li&gt;Run yaws from a subdir rather than globally installed&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Steps:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;In you project directory make a new '3rdparty' subdir &lt;/li&gt;&lt;li&gt;Checkout and build yaws with &lt;br /&gt;&lt;code&gt;&lt;br /&gt;pushd 3rdparty&lt;br /&gt;svn co https://erlyaws.svn.sourceforge.net/svnroot/erlyaws/trunk/yaws&lt;br /&gt;cd yaws&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;popd&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;You don't need to do install as we're using it from local dir&lt;/li&gt;&lt;li&gt;Enter the source at the bottom of the post as an example. I've put this in the project root for simplicity, but you can modify to be in src by modifying the include directive in the source&lt;/li&gt;&lt;li&gt;Compile with &lt;code&gt;erlc -pa 3rdparty/yaws/ebin test.erl&lt;/code&gt;&lt;/li&gt;&lt;li&gt;or..use an Emakefile (another topic for a future post)&lt;/li&gt;&lt;li&gt;Start Erlang shell with &lt;code&gt;erl -pa 3rdparty/yaws/ebin&lt;/code&gt;&lt;/li&gt;&lt;li&gt;In shell enter &lt;code&gt;test:main()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;You should see &lt;code&gt;&lt;br /&gt;=INFO REPORT...&lt;br /&gt;Yaws: Listening to nnn.nnn.nnn:nnnn under ./www&lt;br /&gt;&lt;/code&gt;&lt;/ol&gt;&lt;div&gt;The source:&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;-include("3rdparty/yaws/include/yaws.hrl").&lt;br /&gt;&lt;br /&gt;main() -&gt;&lt;br /&gt;  Args = [],&lt;br /&gt;  yaws:start_embedded("./www", sconf_list(Args), [gconf(Args)]).&lt;br /&gt;&lt;br /&gt;gconf(Args) -&gt;&lt;br /&gt;  Id = "yawstest",&lt;br /&gt;  Debug = true,&lt;br /&gt;  GC = yaws_config:make_default_gconf(Debug, Id),&lt;br /&gt;  yaws:mkdir(GC#gconf.tmpdir),&lt;br /&gt;  yaws:mkdir(GC#gconf.logdir),&lt;br /&gt;  GC#gconf{tmpdir="./temp/yaws",logdir="./temp/logs"}.&lt;br /&gt;&lt;br /&gt;sconf_list(Args) -&gt;&lt;br /&gt;  SC = #sconf{port = 8080,&lt;br /&gt;              servername = "ubuntu01",&lt;br /&gt;              listen = {0,0,0,0},&lt;br /&gt;              docroot = "www"&lt;br /&gt;      },&lt;br /&gt;  [SC].&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-3562515988997113363?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5vpHENpso0t9NBpCJzodWwggGOg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5vpHENpso0t9NBpCJzodWwggGOg/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/5vpHENpso0t9NBpCJzodWwggGOg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5vpHENpso0t9NBpCJzodWwggGOg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/bfp5xJSrJRc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/3562515988997113363/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=3562515988997113363" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/3562515988997113363?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/3562515988997113363?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/bfp5xJSrJRc/how-torun-yaws-embedded.html" title="How to...run Yaws embedded" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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>4</thr:total><feedburner:origLink>http://www.nodal.info/2008/02/how-torun-yaws-embedded.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8NRn09fip7ImA9WxZVEko.&quot;"><id>tag:blogger.com,1999:blog-8142590004316123065.post-7667569963294125491</id><published>2008-02-24T09:55:00.000-08:00</published><updated>2008-03-23T06:28:17.366-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-23T06:28:17.366-07:00</app:edited><title>First Post</title><content type="html">&lt;p style="padding-top:2px;margin-top:2px;"&gt;I've been absent from the world of blogging for a while now.  Seems a good time to start again given my recent efforts in promoting Communitivity, XRI, and XDI.  More on those efforts in future posts, but for now I'll just explain the concept of communitivity.&lt;/p&gt;&lt;p style="padding-top:2px;margin-top:2px;"&gt;No not the math term. I am using communitivity is a social networking context based on some word-play.&lt;/p&gt;&lt;p&gt;First think of the word 'community'. That is central to social networks, and in many ways central to us as human beings.  Look it up in a dictionary..'community' is a noun.  &lt;/p&gt;&lt;p&gt;Nope, don't think so. Have you ever read Spider Robinson's Stardance? If not I highly recommend it.  The main characters in Stardance treat the word 'gravity' as a verb, not a noun, because for them it is a choice and a choice that transforms their lives.&lt;/p&gt;&lt;p&gt;What would it mean if we as human beings start treating 'Community' as a verb? For one we'd be more aware that our actions impact our connections with others, and that improving or degrading those connections is a conscious choice.  I like to think the world would be a better place. &lt;/p&gt;&lt;p&gt;The English language allows adding -ive to the end of a verb to describe tending to or performing the action that verb describes. Applying this we get 'communitive' to describe doing community.&lt;/p&gt;&lt;p&gt;We get then use the rules for the -ity suffix to get communitivity, which we're using to describe how much you're doing community.&lt;/p&gt;&lt;p&gt;The goal of Communitivity.com will be to enable non-profits, socially-conscious businesses, and government organizations to increase and monitor their communitivity.  We'll do this through teaching how that has a significant ROI, teaching communitivity best practices, communitivity consulting, and Open Source software written primarily in Erlang.&lt;/p&gt;&lt;p&gt;Stay tuned for more...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8142590004316123065-7667569963294125491?l=www.nodal.info' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hfUzdLyO1pZjvkerEQWTvemESxg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hfUzdLyO1pZjvkerEQWTvemESxg/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/hfUzdLyO1pZjvkerEQWTvemESxg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hfUzdLyO1pZjvkerEQWTvemESxg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Nodalinfo/~4/BdRzCo6s5f8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.nodal.info/feeds/7667569963294125491/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8142590004316123065&amp;postID=7667569963294125491" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/7667569963294125491?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8142590004316123065/posts/default/7667569963294125491?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Nodalinfo/~3/BdRzCo6s5f8/first-post.html" title="First Post" /><author><name>=Bill.Barnhill</name><uri>http://www.blogger.com/profile/07040370218132367602</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><feedburner:origLink>http://www.nodal.info/2008/02/first-post.html</feedburner:origLink></entry></feed>

