<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>never let be - Home</title>
  <id>tag:neverlet.be,2010:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  <link href="http://neverlet.be/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://neverlet.be/" rel="alternate" type="text/html"/>
  <updated>2010-02-26T20:55:41Z</updated>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2010-02-26:323</id>
    <published>2010-02-26T20:55:00Z</published>
    <updated>2010-02-26T20:55:41Z</updated>
    <category term="Technology"/>
    <category term="fo"/>
    <category term="markdown"/>
    <category term="propaganda"/>
    <category term="textile"/>
    <category term="xhtml2fo"/>
    <category term="xsl"/>
    <link href="http://neverlet.be/2010/2/26/propaganda" rel="alternate" type="text/html"/>
    <title>propaganda</title>
<content type="html">
            &lt;p&gt;So I have this formatting engine. Engine is maybe a strong word. I had a set of stylesheets and a nice ruby script I had hacked together that could convert HTML to XSL::FO, or XML Style Language, Formatting Objects. FO is one of those technologies that, given CSS seems a bit overkill, but from a layout perspective is probably vital. The really nice thing is, some smart guys started the &lt;a href=&quot;http://xmlgraphics.apache.org/fop/&quot;&gt;Apache FOP&lt;/a&gt; project which allows you to render a set of formatting objects to various outputs, for example PDF.&lt;/p&gt;

&lt;p&gt;So how do you get an FO document? Well, you could write on by hand but that is what the crazy people do. I didn't want to be crazy so I looked around for an XSLT stylesheet that would transform HTML to FO. There are a couple in the wild that do this. Notably there are a set of document from &lt;a href=&quot;http://www.antennahouse.com/XSLsample/XSLsample.htm&quot;&gt;Antenna House&lt;/a&gt; that covered almost everything. The problem was that they worked with their formatting engine, and not Apache FOP. So I spent some time a year ago reworking them so that they played well together.&lt;/p&gt;

&lt;p&gt;I had all of these pieces sitting around and wanted to cobble them together, but I rarely use HTML anymore. I use markdown or textile. So I decided I needed to hack together something that was easy to install to convert those to HTML and then generate a PDF for emailing to people. A couple of hours hacking gave me &lt;a href=&quot;http://github.com/jeffrafter/propaganda&quot;&gt;Propaganda&lt;/a&gt;. There is support for shelling out to the Java command for the Jar and support for loading the JVM directly with the Ruby Java Bridge. It can detect what you have and go for it.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2010-01-19:321</id>
    <published>2010-01-19T18:27:00Z</published>
    <updated>2010-01-19T18:28:54Z</updated>
    <category term="Family"/>
    <category term="Robot"/>
    <category term="at-st"/>
    <category term="lego"/>
    <category term="star wars"/>
    <link href="http://neverlet.be/2010/1/19/lego-star-wars-at-st-walker" rel="alternate" type="text/html"/>
    <title>lego star wars at-st walker</title>
<content type="html">
            &lt;p&gt;So Jude and I play with Lego blocks a lot. He loves it. That's why I do it. Not because I am a giant kid, or geek, or nerd. Or maybe I am. In any event, he has been asking for &lt;a href=&quot;http://shop.lego.com/product/?p=8038&amp;amp;LangId=2057&amp;amp;ShipTo=US&quot;&gt;Lego 'The Battle of Endor&lt;/a&gt; for a while now, and we have been resisting. Today he decided he wanted to build it with what he had. So we thought about it a little bit and started in and I think we will be able to do most of it. We worked on it for about an hour this morning. Herein are a couple of shots of our first draft at the AT-ST walker:&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.flickr.com/photos/12679541@N04/4288622778/&quot; title=&quot;Lego AT-ST Head.jpg by jeffrafter, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2780/4288622778_84c00a3ab3.jpg&quot; height=&quot;375&quot; alt=&quot;Lego AT-ST Head.jpg&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.flickr.com/photos/12679541@N04/4288622336/&quot; title=&quot;Lego AT-ST.JPG by jeffrafter, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4009/4288622336_ea6a6245a1.jpg&quot; height=&quot;500&quot; alt=&quot;Lego AT-ST.JPG&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The middle guns need some work still, and we need to add the hatch for Chewbacca (and reconstruct the inside a bit to firm it up), but the legs seem to work great and he is already happy.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2010-01-15:317</id>
    <published>2010-01-15T05:01:00Z</published>
    <updated>2010-01-15T05:01:50Z</updated>
    <category term="Health"/>
    <category term="Technology"/>
    <category term="health"/>
    <category term="mateme"/>
    <category term="touchscreen"/>
    <category term="x-forwarding"/>
    <link href="http://neverlet.be/2010/1/15/pih-baobab-openmrs-x-forwarding-mateme-and-you" rel="alternate" type="text/html"/>
    <title>pih, baobab, openmrs, x-forwarding, mateme and you</title>
<content type="html">
            &lt;p&gt;So I needed to test some stuff locally on a physical touchscreen (the kind that we use in Malawi). This required some setup that I haven&#8217;t needed to do in a while and may not have to do ever again. So I am capturing it here for posterity I guess.&lt;/p&gt;


	&lt;h2&gt;The goal&lt;/h2&gt;


	&lt;p&gt;Baobab style installations have multiple touchscreens (iOpeners running Baobab Linux) that are powered over ethernet (POE)`. The power is injected at a 48V &lt;span class=&quot;caps&quot;&gt;POE&lt;/span&gt; switch, meaning the Ethernet cable carries both power and data. A safe port on the switch allows you to plug in a server.&lt;/p&gt;


	&lt;p&gt;The iOpeners are very lower power and very low capability. Because of this we opted for one of the great all-time hacks (suggested by &lt;span class=&quot;caps&quot;&gt;MERL&lt;/span&gt; and implemented by toggles_w) of running all of the firefox instances on the server and x-forwarding them to the touchscreens. This brought about much more crazy hacks (the reverse netcat label printing hack comes to mind); but sadly those are out of the scope of this article.&lt;/p&gt;


	&lt;p&gt;Now, the switch is kind of unimportant except for injecting the power. In my case I haven&#8217;t got anything that fancy, but when you know Gerry you end up with cool things and I just so happen to have a &lt;span class=&quot;caps&quot;&gt;POE&lt;/span&gt; injector that just handles adding power to a line that carries data. So I have plugged that into a run-of-the-mill wireless router.&lt;/p&gt;


	&lt;p&gt;Plugged into the router I have an Ubuntu machine that will act like my server. This is just a Toshiba laptop running Ubuntu 9.04.&lt;/p&gt;


	&lt;h2&gt;The wires&lt;/h2&gt;


	&lt;p&gt;&lt;em&gt;Do not fry your router by plugging things in backward.&lt;/em&gt; We are dealing with power that kills things (mainly computers) here. If you aren&#8217;t sure what you are doing then just stop. If you are kinda sure, you can usually just look at the heads of the connectors, the side with more wires in the RJ-45 has power. Plug the hot end into the touchscreen (which I know you all have modified by adding a daughter board which takes power and does other cool stuff). Plug the non-hot end into a &lt;span class=&quot;caps&quot;&gt;LAN&lt;/span&gt; port on the router. Plug in the injector. At this point you should be able to power on the touchscreen and it should get an IP address on your router&#8217;s network.&lt;/p&gt;


	&lt;h2&gt;Setting up the router&lt;/h2&gt;


	&lt;p&gt;I don&#8217;t remember why, but the server needs to be in charge of handing out addresses. By default the router handles &lt;span class=&quot;caps&quot;&gt;DHCP&lt;/span&gt; and we need to turn that off. In Ubuntu, go to the Network Manager and make sure everything is set to the default (DHCP/automatic) for the &lt;span class=&quot;caps&quot;&gt;LAN&lt;/span&gt; connection and plug in. Then you can just manage your router through its web interface (mine is at 192.168.0.1, which I changed to 192.168.1.1). Find and turn off &lt;span class=&quot;caps&quot;&gt;DHCP&lt;/span&gt; on the router, and reboot it.&lt;/p&gt;


	&lt;h2&gt;Now you got nothing&lt;/h2&gt;


	&lt;p&gt;At this point you have no server, no addresses. You have a lot of wires that won&#8217;t do anything. So lets make them do something. You will need to install lots of stuff on your Ubuntu computer. Maybe Mike will make a nice live boot &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; stick that does all of this someday. That would be cool.&lt;/p&gt;


	&lt;h2&gt;Install, install, install&lt;/h2&gt;


	&lt;p&gt;First you need to add some packages. You may already have some of these, but just in case:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo apt-get install build-essential dnsmasq xinit xauth&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Next, create a user for the daemons (you can use whatever password you want):&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo adduser firefox
sudo su firefox
cd ~&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;You&#8217;ll need to check out the daemon code and compile it:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;git init
git remote add origin git://github.com/baobab/firefox-daemon.git
git pull origin master
cd src
make
cp apps/baobab.firefox/baobab.firefox* ..
exit&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Now lets make it so that the daemon has a controller and runs at startup:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo cp /home/firefox/firefox-daemon /etc/init.d/
sudo /usr/sbin/update-rc.d -f firefox-daemon defaults&lt;/code&gt;&lt;/pre&gt;


	&lt;h2&gt;Setup your server to be more networky&lt;/h2&gt;


	&lt;p&gt;So one of the things you need is to handle &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; using dnsmasq which governs the range of numbers &lt;span class=&quot;caps&quot;&gt;DHCP&lt;/span&gt; will hand out. Delete everything from your /etc/dnsmasq.conf file, and make it look like this (replace x with your subnet, 1 in my case):&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;dhcp-range=192.168.x.100,192.168.x.150,12h&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Then you want to remove everything from your /etc/resolv.conf. Now this might have other side-effects, I am not sure. Regardless it will make the touchscreen boot very very slowly if you skip it. Everyone will complain.&lt;/p&gt;


	&lt;p&gt;Make your /etc/network/interfaces look like this (again replace x with your subnet):&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;auto lo
iface lo inet loopback&lt;/code&gt;&lt;/pre&gt;


	&lt;pre&gt;&lt;code&gt;auto eth0
iface eth0 inet static
address 192.168.x.200
netmask 255.255.255.0
gateway 192.168.x.1&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Now, in Baobab Linux there is one requirement, it needs to telnet to &#8220;bart&#8221;. We didn&#8217;t want to have a server address in there because every network is going to be different, so we needed to let the server resolve some name. &#8220;bart&#8221; or &#8220;Baobab Anti-retroviral Treatment&#8221; software is what we made this whole thing for, so the touchscreen tries to connect to a &#8220;bart&#8221; server. It doesn&#8217;t actually need to have the software installed, it just needs the name.&lt;/p&gt;


	&lt;p&gt;Dnsmasq has a nice trick of resolving names based on the server&#8217;s /etc/hosts file. So edit that and add the following:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;192.168.1.200 bart&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Where &#8221;.1&#8221; is your subnet. Once you have all this you can reboot your network with &lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/networking restart&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Then restart dnsmasq:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/dnsmasq restart&lt;/code&gt;&lt;/pre&gt;


	&lt;h2&gt;Installing the firefox-2 binary&lt;/h2&gt;


	&lt;p&gt;X-forwarding does not work very well with Firefox 3. There are some options you can tweak in your &lt;span class=&quot;caps&quot;&gt;X11&lt;/span&gt; config to make it better but I haven&#8217;t explored it fully. It does, however,  work very well with Firefox 2. So you need to install that. But it isn&#8217;t supported anymore. Like at all. In fact finding it and installing it on Ubuntu 9.04 was a challenge, initially. You can just follow these instructions:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo apt-get install libstdc++5 libmozjs0d
mv ~/.profile ~/.profile_bak
wget ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.20/linux-i686/en-US/firefox-  2.0.0.20.tar.gz
tar xvzf firefox-2.0.0.20.tar.gz
sudo mv firefox /usr/bin/firefox-2.0
sudo rm /usr/bin/firefox
sudo ln -s /usr/bin/firefox-2.0/firefox /usr/bin/firefox&lt;/code&gt;&lt;/pre&gt;


	&lt;h2&gt;Connecting the touchscreen to do something&lt;/h2&gt;


	&lt;p&gt;At this point you should be fully setup. Go ahead and run the daemon so you can see any connections and any output:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/firefox-daemon&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;You should see:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;Connected to port 5840&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Plug in the touchscreen and turn it on. It should boot, give you a couple of messages in X and then startup a Firefox session.&lt;/p&gt;


	&lt;p&gt;h3 Bonus points&lt;/p&gt;


	&lt;p&gt;Now the point of this is to point it at Mateme, the new touchscreen based &lt;span class=&quot;caps&quot;&gt;EHR&lt;/span&gt; we are using in Malawi. But you might want to do something else. Simply modify the /home/firefox/default.profile/prefs.js file and change the following:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;user_pref(&quot;browser.startup.homepage&quot;, &quot;http://localhost&quot;);&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;To point at whatever you want. Keep in mind, that to get out of the network you are on you will probably need a dual network card (i.e., &lt;span class=&quot;caps&quot;&gt;LAN&lt;/span&gt;/wifi).&lt;/p&gt;


	&lt;p&gt;Here is a shot of everything working:&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/12679541@N04/4274581717/&quot; title=&quot;My 'office' by jeffrafter, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2690/4274581717_f189f9810a.jpg&quot; height=&quot;375&quot; alt=&quot;My 'office'&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2010-01-11:315</id>
    <published>2010-01-11T17:01:00Z</published>
    <updated>2010-01-11T17:01:42Z</updated>
    <category term="Technology"/>
    <category term="background"/>
    <category term="change"/>
    <category term="desktop"/>
    <category term="windows"/>
    <link href="http://neverlet.be/2010/1/11/some-background-on-windows-7-starter" rel="alternate" type="text/html"/>
    <title>some background on windows 7 starter</title>
<content type="html">
            &lt;p&gt;So you can't change the desktop background on Windows 7 Starter edition. Really. Well, you &quot;can't&quot; is more accurate. Thanks to some nice comments from Gabe and srg84 &lt;a href=&quot;http://www.withinwindows.com/2009/03/31/correction-starter-wallpaper-more-secure-than-i-thought/&quot;&gt;here&lt;/a&gt; I now can.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quoting directly:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Step by Step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open regedit (aka registry editor; you can access it from the star menu by typing “regedit” in the search box…)&lt;/li&gt;
&lt;li&gt;Go to “HKEY&lt;em&gt;CURRENT&lt;/em&gt;USER\Control Panel\Desktop\” folder and click on it&lt;/li&gt;
&lt;li&gt;On the right hand side find there are a bunch of entries. Find the key named “Wallpaper” and double click on it and put the path of the picture you want as your new wallpaper (example path is “C:\Users\Bob\Pictures\new_wallpaper.jpg”)&lt;/li&gt;
&lt;li&gt;Right-click on the “Desktop” folder in regedit that you found in step 2 and click Permissions.&lt;/li&gt;
&lt;li&gt;Click “Advanced”&lt;/li&gt;
&lt;li&gt;Go to “Owner” tab, highlight your name in the box that says ‘Change owner to’ ( There are only two choices the other is Administrator )… once your user name is highlighted click “OK”&lt;/li&gt;
&lt;li&gt;Click on “Advanced” again&lt;/li&gt;
&lt;li&gt;Uncheck the button that reads “Include inheritable permissions from the object’s parent”… click “Remove” when prompted&lt;/li&gt;
&lt;li&gt;Click “Add”&lt;/li&gt;
&lt;li&gt;Type “Everyone” and click “OK”&lt;/li&gt;
&lt;li&gt;Check Allow “Read Control” and click “OK”&lt;/li&gt;
&lt;li&gt;Click “OK” again&lt;/li&gt;
&lt;li&gt;Highlight “Everyone” and check to Allow “Read” and click “OK”&lt;/li&gt;
&lt;li&gt;Restart Computer and enjoy new Wallpaper&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Basically what the steps have done is remove the ability to do anything but “Read” that piece of info. That means modifying that piece of info is not possible as well… unless you change those permissions. So…. &lt;/p&gt;

&lt;p&gt;If you want to change the wallpaper again &lt;em&gt;after you have gone through the steps above once&lt;/em&gt; just do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open regedit&lt;/li&gt;
&lt;li&gt;Go to “HKEY&lt;em&gt;CURRENT&lt;/em&gt;USER\Control Panel\Desktop\” folder and RIGHT-CLICK on it, and go to “Permissions” (just like step 4 above)&lt;/li&gt;
&lt;li&gt;Check the box to Allow “Full Control” and click OK&lt;/li&gt;
&lt;li&gt;Now you can go to “Wallpaper” on the right hand side and change the path to the wallpaper you really wanted&lt;/li&gt;
&lt;li&gt;Right-Click “Desktop” folder again and go to “Permissions”&lt;/li&gt;
&lt;li&gt;UN-CHECK the box that says Allow “Full Control” and click OK&lt;/li&gt;
&lt;li&gt;Go to Start Menu, Log Off —-&gt; Log On again… and you should have a new wallpaper again&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or just install Ubuntu.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-12-31:314</id>
    <published>2009-12-31T08:17:00Z</published>
    <updated>2009-12-31T08:18:28Z</updated>
    <category term="Health"/>
    <category term="Technology"/>
    <category term="health"/>
    <category term="hhs"/>
    <category term="hipaa"/>
    <category term="hitech"/>
    <link href="http://neverlet.be/2009/12/31/meaningful-use" rel="alternate" type="text/html"/>
    <title>meaningful use</title>
<content type="html">
            &lt;p&gt;So the Health and Human Services department released an interim final rule for certification of electronic health record (EHR) technology here in the States (&lt;a href=&quot;http://healthit.hhs.gov/blog/onc/index.php/2009/12/30/a-defining-moment-for-meaningful-use/&quot;&gt;http://healthit.hhs.gov/blog/onc/index.php/2009/12/30/a-defining-moment-for-meaningful-use/&lt;/a&gt;. The crux of this is that in the new recovery bills a lot of money is targeted at expanding the use of helath information technology (HIT). In order to get this money, you have to be an &#8220;eligible provider&#8221; with &#8220;meaningful use&#8221; of a &#8220;certified &lt;span class=&quot;caps&quot;&gt;EHR&lt;/span&gt;&#8221;. When the legislation was written, the last two qualifications were pretty vague. Over the past few months, &#8220;meaningful use&#8221; has a set of criteria and a timeline (which includes point of care in 2013!). The final piece of the puzzle took shape today:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;The certification criteria adopted in this initial set establish the capabilities and related standards that certified electronic health record (EHR) technology will need to include in order to, at a minimum, support the achievement of the proposed meaningful use Stage 1 (beginning in 2011) by eligible professionals and eligible hospitals under the Medicare and Medicaid &lt;span class=&quot;caps&quot;&gt;EHR&lt;/span&gt; Incentive Programs.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;The &lt;a href=&quot;http://www.federalregister.gov/OFRUpload/OFRData/2009-31216_PI.pdf&quot;&gt;document&lt;/a&gt; (PDF) is 136 pages, which is a bit overwhelming. However, there is a lot of extremely useful history and basis for the new rule that is included making it a useful read if you aren&#8217;t familiar with the plethora of acronyms that come with health information technology (e.g., &lt;span class=&quot;caps&quot;&gt;HIPPA&lt;/span&gt;, HITECH, &lt;span class=&quot;caps&quot;&gt;PHSA&lt;/span&gt;, CCHIT, &lt;span class=&quot;caps&quot;&gt;AHIC&lt;/span&gt;, HITSP).&lt;/p&gt;


	&lt;p&gt;The rule is interesting to me on a number of levels, not the least of which is its relation to the National Data Standards work we did in Malawi. It is fascinating to see Malawi so far ahead on so many of the salient points. Additionally, the challenges from an IT perspective are strikingly similar (harmonizing code sets, agreeing on data transfer protocols, etc). I wonder if this is because the problems are germane to medical informatics or because we applied too much Western thought to the problem at hand.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Ultimately, to achieve semantic interoperability, we anticipate that multiple layers &#8211; network transportation protocols, data and services descriptions, information models, and vocabularies and code sets &#8211; will need to be standardized and/or harmonized to produce an inclusive, consistent representation of the interoperability requirements.  We anticipate using a harmonization process that will integrate different representations of health care information into a consistent representation and maintain and update that consistent representation over time.  For an information model, this process could include merging related concepts, adding new concepts, and mapping concepts from one representation of health care information to another.  Similar processes to support standardization of data and services descriptions and vocabularies and codes sets may also be needed. (pg 31).&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Still, I can&#8217;t help but think that we should admit defeat on shared code sets and start solving the problem of the comparability of heterogeneous, unstructured information.&lt;/p&gt;


	&lt;p&gt;Check out pages 51-61 for Table 1A (the main criteria) and Pages 79-81 for Table 2A (the content and vocabulary criteria standards) and Page 85 for Table 2B (the security criteria standards). Jumping through the tables you get the gist of what you need to know pretty quickly.&lt;/p&gt;


	&lt;p&gt;Simultaneously the &lt;a href=&quot;http://www.federalregister.gov/OFRUpload/OFRData/2009-31217_PI.pdf&quot;&gt;Electronic Health Record Incentive Program&lt;/a&gt; for Medicare and Medicaid was released. I haven&#8217;t started on that one yet (it is 556 pages long).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-11-24:307</id>
    <published>2009-11-24T18:52:00Z</published>
    <updated>2009-11-24T18:52:39Z</updated>
    <category term="Technology"/>
    <link href="http://neverlet.be/2009/11/24/syntax-highlighting-more-files-in-xcode" rel="alternate" type="text/html"/>
    <title>syntax highlighting more files in xcode</title>
<content type="html">
            &lt;p&gt;So I use XCode. I really do. And I kinda like it. But one thing I hate is that there are files it doesn&#8217;t want to highlight as Ruby. This has been discussed elsewhere, but I needed to be able to find it more quickly. Here is how you change that. You need to edit the file: /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Versions/A/Resources/Standard file types.pbfilespec. You want to find these two lines:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;Extensions = (rb,rbw);
MagicWord = (&quot;#!/bin/ruby&quot;, &quot;#! /bin/ruby&quot;, &quot;#!/usr/bin/ruby&quot;, &quot;#! /usr/bin/ruby&quot;, &quot;#!/usr/local/bin/ruby&quot;, &quot;#! /usr/local/bin/ruby&quot;);&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;And change them to:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;Extensions = (rb,rbw,rake);
MagicWord = (&quot;#!/bin/ruby&quot;, &quot;#! /bin/ruby&quot;, &quot;#!/usr/bin/ruby&quot;, &quot;#! /usr/bin/ruby&quot;, &quot;#!/usr/local/bin/ruby&quot;, &quot;#! /usr/local/bin/ruby&quot;, &quot;#!/usr/bin/env ruby&quot;);&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Also, find:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;Extensions = (shtml, jsp, rhtml);&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;And change it to:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;Extensions = (shtml, jsp, rhtml, erb);&lt;/code&gt;&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-10-12:303</id>
    <published>2009-10-12T21:45:00Z</published>
    <updated>2009-10-12T21:45:51Z</updated>
    <category term="Robot"/>
    <category term="festival"/>
    <category term="flite"/>
    <category term="lite"/>
    <category term="osx"/>
    <category term="robot"/>
    <category term="sound"/>
    <link href="http://neverlet.be/2009/10/12/compiling-festival-lite-on-osx" rel="alternate" type="text/html"/>
    <title>compiling festival lite on osx</title>
<content type="html">
            &lt;p&gt;Festival is a text-to-speech (TTS) system that was developed until 2005 by the &lt;a href=&quot;http://www.speech.cs.cmu.edu/&quot;&gt;Speech Group at Carnegie Mellon University&lt;/a&gt; It is a nifty little tool and the voice sounds like a robot. Jude and I have been working on our robot and will need some text to speech capability on our OpenWRT Asus WL-520gu. Of course, I also want to test things on my Mac and therefore I needed to complile the festival lite kit locally. This took some digging, but the mailing list archives turned up the answers.&lt;/p&gt;


	&lt;p&gt;First you will want to go to the website to see whats there:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;http://www.speech.cs.cmu.edu/flite/&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Then in a terminal grab the source:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;wget http://www.speech.cs.cmu.edu/flite/packed/flite-1.3/flite-1.3-release.tar.gz&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Unpack the source and go to the folder:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;tar xvzf flite-1.3-release.tar.gz
rm flite-1.3-release.tar.gz
cd flite-1.3-release&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Now here is the trick. The Apple sting.h file defines a method called swab which we don&#8217;t want. So lets cheat and make a copy of the string.h file in our local include folder:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;cp /usr/include/string.h include/
chmod +w include/string.h&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Now, comment out the offending line (for me this was line 137):&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;// void     swab(const void * __restrict, void * __restrict, ssize_t);&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Then in your terminal, make:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;make&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;At this point everything should build (assuming you have a good build chain). Then you can run flite:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;bin/flite --help&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Of course, some of the options are not going to work (namely, outputting to an &lt;span class=&quot;caps&quot;&gt;OSX&lt;/span&gt; sound device). For me that is okay, I can just process it through lame and play it using madplay or mpg123:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;bin/flite &quot;Hello World&quot; hello.wav; lame hello.wav; mpg123 hello.wav.mp3&lt;/code&gt;&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-09-01:302</id>
    <published>2009-09-01T00:17:00Z</published>
    <updated>2009-09-01T18:22:17Z</updated>
    <category term="Health"/>
    <category term="Technology"/>
    <category term="ant"/>
    <category term="junit"/>
    <category term="openmrs"/>
    <category term="test"/>
    <link href="http://neverlet.be/2009/9/1/ant-based-testing-for-openmrs" rel="alternate" type="text/html"/>
    <title>ant based testing for openmrs</title>
<content type="html">
            &lt;p&gt;So I needed to do some module development on &lt;a href=&quot;http://openmrs.org&quot;&gt;OpenMRS&lt;/a&gt; and I didn&#8217;t want to setup eclipse. I had already figured out the basics of gabbing the code, building, and deploying things&#8230; but testing was missing. So I spent some time playing with JUnit ant tasks. In the end I came up with a single build.xml file that will work for core and for modules:&lt;/p&gt;


&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;55&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;56&lt;tt&gt;
&lt;/tt&gt;57&lt;tt&gt;
&lt;/tt&gt;58&lt;tt&gt;
&lt;/tt&gt;59&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;61&lt;tt&gt;
&lt;/tt&gt;62&lt;tt&gt;
&lt;/tt&gt;63&lt;tt&gt;
&lt;/tt&gt;64&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;65&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;66&lt;tt&gt;
&lt;/tt&gt;67&lt;tt&gt;
&lt;/tt&gt;68&lt;tt&gt;
&lt;/tt&gt;69&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;70&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;71&lt;tt&gt;
&lt;/tt&gt;72&lt;tt&gt;
&lt;/tt&gt;73&lt;tt&gt;
&lt;/tt&gt;74&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;75&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;76&lt;tt&gt;
&lt;/tt&gt;77&lt;tt&gt;
&lt;/tt&gt;78&lt;tt&gt;
&lt;/tt&gt;79&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;80&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;81&lt;tt&gt;
&lt;/tt&gt;82&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pp&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ********************************************************* --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ** Tests                                               ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- **                                                     ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ** Some options:                                       ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- **                                                     ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- **   ant test -Dtest=org.openmrs.YourClassTest         ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- **   ant test -Dformat=(plain|brief|xml)               ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- **                                                     ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ** @author Jeff Rafter                                 ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ** @version 0.1                                        ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ********************************************************* --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;project&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;default&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fork&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;yes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;base.dir&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;condition&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;property&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;format.plain&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;matches&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;string&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${format}&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;pattern&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;plain&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;/condition&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;condition&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;property&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;format.brief&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;matches&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;string&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${format}&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;pattern&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;brief&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;/condition&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;condition&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;property&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;format.xml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;matches&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;string&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${format}&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;pattern&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;xml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;/condition&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;path&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;id&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;classpath&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;pathelement&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;pathelement&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;web&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;pathelement&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;pathelement&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${base.dir}/build&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;pathelement&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${base.dir}/dist&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;pathelement&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${base.dir}/web/WEB-INF&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;pathelement&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${base.dir}/web/META-INF&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- This might be a little greedy --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;fileset&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;dir&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${base.dir}&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;include&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;**/*.jar&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/fileset&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;/path&amp;gt;&lt;/span&gt;    &lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Clean out the old test class build area --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;delete&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;dir&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Setup the new test target --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;mkdir&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;dir&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Copy over the log4j.xml so that it is used --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;copy&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;todir&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;build/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;fileset&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;dir&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;metadata/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;includes&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;**/*&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/copy&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Compile the tests --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;javac&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;destdir&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;debug&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;debuglevel&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lines,source,vars&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;classpath&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;refid&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;classpath&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;src&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;path&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;include&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;**/*.java&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/javac&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Run the units --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;junit&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;printsummary&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;haltonfailure&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;failureProperty&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test.failure&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;formatter&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;plain&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;usefile&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;if&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;format.plain&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;formatter&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;brief&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;usefile&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;if&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;format.brief&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;formatter&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;xml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;usefile&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;if&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;format.xml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;classpath&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;refid&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;classpath&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;test&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${test}&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;if&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;batchtest&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;fork&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${fork}&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;unless&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;ta&quot;&gt;&amp;lt;fileset&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;dir&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          &lt;span class=&quot;ta&quot;&gt;&amp;lt;include&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;**/*Test.class&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          &lt;span class=&quot;ta&quot;&gt;&amp;lt;exclude&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;**/*BaseTest*&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          &lt;span class=&quot;ta&quot;&gt;&amp;lt;exclude&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;**/Base*&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;          &lt;tt&gt;
&lt;/tt&gt;          &lt;span class=&quot;ta&quot;&gt;&amp;lt;exclude&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;**/OpenmrsTestsTest*&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;ta&quot;&gt;&amp;lt;/fileset&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;/batchtest&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/junit&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Fail the ant build if a test failed --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;fail&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;message&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test failed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;if&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test.failure&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;I put this file in the &lt;code&gt;test&lt;/code&gt; folder in the repository. This means that it is separate from the main &lt;code&gt;build.xml&lt;/code&gt; which I felt was a bit safer for now. To make the output behave, you need to create a separate &lt;code&gt;log4j.xml&lt;/code&gt; to silence a lot of the output. Create a &lt;code&gt;metadata&lt;/code&gt; folder inside of your &lt;code&gt;test&lt;/code&gt; folder and make copy the following content into &lt;code&gt;log4j.xml&lt;/code&gt;:&lt;/p&gt;


&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pp&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;pp&quot;&gt;&amp;lt;!DOCTYPE log4j:configuration SYSTEM &amp;quot;log4j.dtd&amp;quot;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;log4j:configuration&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;xmlns:log4j&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://jakarta.apache.org/log4j/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;appender&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;CONSOLE&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;org.apache.log4j.ConsoleAppender&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;layout&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;org.apache.log4j.PatternLayout&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;ta&quot;&gt;&amp;lt;param&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ConversionPattern&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;%p - %C{1}.%M(%L) |%d{ISO8601}| %m%n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/layout&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;/appender&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;root&amp;gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;priority&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;FATAL&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;appender-ref&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;ref&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;CONSOLE&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;/log4j:configuration&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;If, for some reason, you need the logger output, simply change the &lt;code&gt;FATAL&lt;/code&gt; value to &lt;code&gt;DEBUG&lt;/code&gt; or &lt;code&gt;WARN&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Also take note that I have added a couple of options to the main task:&lt;/p&gt;


&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- **   ant test -Dtest=org.openmrs.YourClassTest         ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- **   ant test -Dformat=(plain|brief|xml)               ** --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Passing in the &lt;code&gt;test&lt;/code&gt; property allows you to run only the tests in a single test class. It still recompiles all of the tests, but that doesn&#8217;t seem to take too long. JUnit allows multiple formatters, but by default I am not using them. If you want to see more verbose output set the &lt;code&gt;format&lt;/code&gt; property.&lt;/p&gt;


	&lt;p&gt;One last option:&lt;/p&gt;


&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;    &lt;span class=&quot;ta&quot;&gt;&amp;lt;property&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fork&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;yes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;I have broken out the option to fork when running the tests. By default the test runner will fork a new &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt; process for every test class. Turning this off makes the tests run much much more quickly. In module tests this will generally work great, however, turning this off might run you out of memory, and breaks the core tests. To turn it off, simply change the value to &lt;code&gt;no&lt;/code&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-07-31:296</id>
    <published>2009-07-31T13:09:00Z</published>
    <updated>2009-07-31T14:00:49Z</updated>
    <category term="Health"/>
    <category term="Technology"/>
    <category term="baobab"/>
    <category term="emr"/>
    <category term="health"/>
    <category term="neno"/>
    <category term="openmrs"/>
    <category term="pih"/>
    <category term="point-of-care"/>
    <category term="prescription"/>
    <link href="http://neverlet.be/2009/7/31/suggesting-prescriptions" rel="alternate" type="text/html"/>
    <title>suggesting prescriptions</title>
<content type="html">
            &lt;p&gt;So it has been a busy month in Malawi. Seriously busy. Lots of code written, lots of new features and in general cool cool things. While in Lilongwe this past month, Mwatha, Kondwani, Soyapi, Dave and Edmond helped me merge the &lt;a href=&quot;http://pih.org&quot;&gt;Partners in Health&lt;/a&gt; and &lt;a href=&quot;http://baobabhealth.org&quot;&gt;Baobab Health&lt;/a&gt; versions of our touchscreen electronic medical record systems. We had forked the project as Baobab started on the its off-the-grid Ministry of Health sites and as we in Neno started focusing on outpatient diagnosis and treatment. This is a long way of saying that Baobab had made some cool stuff and PIH had made some cool stuff and we put it together to make everyone a little more cool.&lt;/p&gt;

&lt;p&gt;One of the features that has me most excited is patient prescription suggestion.&lt;/p&gt;

&lt;h2&gt;Treatment&lt;/h2&gt;

&lt;p&gt;The treatment workflow will generally be performed by clinicians after a diagnosis has been made. The user selects this workflow (or it is
automatically selected) and they are first asked for which diagnosis the treatment is being made (no diagnosis is an allowable answer).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2023.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;&lt;/p&gt;

&lt;p&gt;If a diagnosis is chosen then the system, then the system will suggest popular treatment protocols for that diagnosis based on historical information
collected in the system. This is where the feature really comes alive. Basically, because every prescription is connected to a specific diagnosis we can look in the database and see what the most popular prescription for the patient's current diagnosis is. Now, this may not always be right (more on that later) but it will cover the vast majority of cases and truly speed up the workflow in the clinic.&lt;/p&gt;

&lt;p&gt;If the user selects a prescription, it is added to the patient's list of orders and will be printed on a visit label that can be presented at the pharmacy.&lt;/p&gt;

&lt;p&gt;In some cases (especially when the system is first deployed and not full of historical data), it is possible that the user will not want to use this and will instead choose to create a new prescription. &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2032.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;&lt;/p&gt;

&lt;p&gt;When building a prescription the user must first choose the generic drug and then a filtered list of formulations of that drug. We actually worked on several revisions of this and landed here. Basically we found that there were so many forms of similar drugs that we needed to do it in two steps. This way you can pick the kind of drug (for example Ciprofloxicin, and then the specific formulation and strength.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2024.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;
&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2025.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;&lt;/p&gt;

&lt;p&gt;From there two types of prescription are allowed &quot;Standard&quot; and &quot;Variable&quot;. A standard prescription means that each dose that is given is the same (for example 2 tablets in the morning, 2 tablets in the evening). The user should choose &quot;Variable&quot; when the dose strength is different at different times in the
day (for example: 1 tablet in the morning 1/2 tablet in the afternoon, 2 tablets at night). We find these to be far less common but they do occur (especially when prescribing starter packs of drugs for Antiretroviral treatments).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2026.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;&lt;/p&gt;

&lt;p&gt;The dose strength allows the user to input how much (in specified units that the drug is delivered in) each dose should be. So in the case of something like Cipro the drug is dosed in mg, however in other drugs it might use &quot;tablets&quot; or &quot;vials&quot; or &quot;mg/mL&quot; for the units. This is configurable in the database when drugs are added.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2027.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;&lt;/p&gt;

&lt;p&gt;Next you need to decide the frequency for the dosage. This comes from a set of concepts in the database and is ultimately stored as plain text. Really, I wish the frequency were stored as a concept and concept name (in OpenMRS speak) because then it could be aggregated a little better and faster, but this works okay. If you were prescribing a variable dose this would be skipped and instead you would need to select the dose for each period (in the morning, in the afternoon, in the evening, at night).
&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2028.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;

&lt;p&gt;Finally you select the number of days to continue the prescription and whether or not it should be taken only as needed (e.g., for pain).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2029.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;
&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2030.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;&lt;/p&gt;

&lt;p&gt;New prescriptions are listed in the prescription dashboard. Tracking which orders are filled (dispensed) is not currently part of the treatment workflow (as we do not currently have a pharmacy workstation in Neno).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/jeffrafter/mateme/raw/master/workplans/images/Picture%2031.png&quot; height=&quot;340&quot; width=&quot;400&quot;&gt;&lt;/p&gt;

&lt;h2&gt;But wait, it might be wrong!&lt;/h2&gt;

&lt;p&gt;Right. It might not have the best prescription for a particular patient or even a particular diagnosis. We are conscious that it doesn't give any advice about dosage strengths for age or weight bands and that this might be problematic. This slowed us down for a long time until we realized that the system is not supposed to replace clinicians. It is supposed to make them faster. It keeps the clinicians from needing to write anything in a large number of cases which makes the data more consistent, auditable, and readable by the pharmacist. But in general you need someone with clinical experience to know if the suggestions are right or wrong. I look forward to checking the data in a few months to see how often non-suggested prescriptions occur.&lt;/p&gt;

&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;Now how this feature came to be is one of those great mysteries of &quot;whose idea was that?&quot; that often happen when you have a really great project manager. I mean, it is pretty common that people want medical record systems to do magic things with data, so the idea is not necessarily novel. Nevertheless, the actual data and workflow pieces of the implementation here came from a late-night/early-morning Skype session with Evan after he had been meeting with clinicians. &lt;a href=&quot;http://twitter.com/evanjmwaters&quot;&gt;Evan Waters&lt;/a&gt; fills the role of project manager (among other things) in Neno and is one of those truly brilliant guys. He is probably more socially brilliant than technically (where he is quite adept) and he just knows how to get the best from people.&lt;/p&gt;

&lt;p&gt;A lot of the thinking on how prescriptions should work on the touchscreen came from work that Gerry Douglas and Zach Landis Lewis had done for the pharmacy system at Kamuzu Central Hospital. Those evolved into the Baobab Anti-Retroviral treatment prescription system used in the HIV clinics that Baobab supports. All of this led to a series of meetings at Lighthouse where a group of us (including Andreas Jahn, Soyapi, and Mike) hashed out just how to use the drug tables in OpenMRS. Ultimately Evan and I took this, formulated a proposal to the OpenMRS developers list and simplified where we could.&lt;/p&gt;

&lt;p&gt;With the one change of connecting the diagnosis observation to the drug order, this should be generally useful and possible inside of OpenMRS and should maybe become a module. Of course, this assumes that you have the data and the patient in the same place when you are prescribing and that the information for their current diagnosis is in the system. To do that you need to have a &lt;strong&gt;point-of-care system&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Want to try it?&lt;/h2&gt;

&lt;p&gt;As always you can go try out a demo copy at &lt;a href=&quot;http://mateme.socialrange.org&quot;&gt;http://mateme.socialrange.org&lt;/a&gt; using the user name &quot;Demo&quot; and the password &quot;Demo&quot;. Please don't input real patient information in there! Also, keep in mind the system is &quot;empty&quot; right now and I will probably update the database with the data learned from Neno soon. &lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>Jeff Rafter</name>
    </author>
    <id>tag:neverlet.be,2009-06-10:293</id>
    <published>2009-06-10T21:15:00Z</published>
    <updated>2009-06-10T21:16:26Z</updated>
    <category term="Family"/>
    <category term="Poetry"/>
    <category term="essay"/>
    <category term="iowa"/>
    <category term="mp3"/>
    <category term="radio"/>
    <link href="http://neverlet.be/2009/6/10/the-automatic-flushing-system" rel="alternate" type="text/html"/>
    <title>the automatic flushing system</title>
<content type="html">
            &lt;p&gt;So back at the University of Iowa, one of my favorite classes was by Jeff Porter. Radio Essays. Basically a step by step how-to for This American Life style audio essays. We all made them. It was great. There was a whole website that was devoted to it on the Twist server but it seems to have vanished. I will have to get it online here. In the meantime I uploaded my essays&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/jeffrafter-flushingsystem.mp3&quot;&gt;The Automatic Flushing System&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/jeffrafter-brokenleg.mp3&quot;&gt;The story of my broken leg. Now I'm Old.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I really liked both of these when I made them, but realize now that I wish I had cleaned them up some more. I would be better at that now, I think. I also uploaded Nick Gregory's &quot;Sailor Boy&quot; here which I had around because I always thought it was the best one of the whole class. It's great I think. Hopefully he sees this and contacts me&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/nickgregory-sailorboy.mp3&quot;&gt;Sailor Boy, by Nick Gregory&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-05-20:291</id>
    <published>2009-05-20T06:11:00Z</published>
    <updated>2009-05-20T06:19:06Z</updated>
    <category term="Technology"/>
    <category term="build"/>
    <category term="gem"/>
    <category term="github"/>
    <category term="jeweler"/>
    <category term="ruby"/>
    <link href="http://neverlet.be/2009/5/20/github-gem-build" rel="alternate" type="text/html"/>
    <title>github-gem-build</title>
<content type="html">
            &lt;p&gt;So the fact that GitHub hosts gems is really great. I find myself writing gems all the time now because it is easy to publish (and super easy to write thanks to &lt;a href=&quot;http://github.com/technicalpickles/jeweler&quot;&gt;jeweler&lt;/a&gt;). But the gem builder on GitHub is finicky. And when that's working, getting the gem into the spec file is slow. I hate waiting. I also hate building the gem locally because it always ends up without the owner's name prefixed. Then when the gem is ready on GitHub I end up with two different gems and a debugging nightmare.&lt;/p&gt;

&lt;p&gt;Well, I got a little fed up and &lt;a href=&quot;http://github.com/jeffrafter/github-gem-build/blob/master/bin/github-gem-build&quot;&gt;wrote a script&lt;/a&gt; that clones a repository, changes the gemspec so that the name matches, builds the gem and installs all with a simple command:&lt;/p&gt;

&lt;pre&gt;github-gem-build owner repository&lt;/pre&gt;

&lt;p&gt;It also validates the gemspec using the same code that GitHub &lt;a href=&quot;http://gems.github.com/&quot;&gt;recommends&lt;/a&gt; for testing if you are having problems. I probably need to tweak a few things to make it work properly on Windows (removing the sudo call if it is running on Windows, fixing the fact that File.join uses '/'), and I imagine that is coming soon. It might also be nice to support multiple gem versions based on tag or something. I &lt;a href=&quot;http://github.com/jeffrafter/github-gem-build&quot;&gt;packaged it as a gem&lt;/a&gt; so that you could just install it through the gem install command:&lt;/p&gt;

&lt;pre&gt;sudo gem install jeffrafter-github-gem-build&lt;/pre&gt;

&lt;p&gt;The irony? The gem builder didn't want to build it right away so I had to use it to install itself.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-05-14:286</id>
    <published>2009-05-14T20:13:00Z</published>
    <updated>2009-05-14T22:11:00Z</updated>
    <category term="Technology"/>
    <category term="docs"/>
    <category term="documentation"/>
    <category term="github"/>
    <category term="joe"/>
    <category term="nick"/>
    <category term="rdocinfo"/>
    <category term="yard"/>
    <link href="http://neverlet.be/2009/5/14/github-has-an-apps-platform" rel="alternate" type="text/html"/>
    <title>github has an apps platform</title>
<content type="html">
            &lt;p&gt;So when &lt;a href=&quot;http://blog.zerosum.org/&quot;&gt;Nick&lt;/a&gt; told me about his &lt;a href=&quot;http://rdoc.info&quot;&gt;http://rdoc.info&lt;/a&gt; project for generating Ruby documentation with YARD it hit me immediately. Like a ton of bricks in the face. The place for documentation about GitHub projects is on GitHub. Why had they never built it in? Then I realized, they didn't need to. We could do it ourselves.&lt;/p&gt;

&lt;p&gt;The concept was simple enough: register the user name &quot;&lt;a href=&quot;http://github.com/docs&quot;&gt;docs&lt;/a&gt;&quot; on GitHub and create a GitHub Pages repository. This would allow us to publish content to &lt;a href=&quot;http://docs.github.com&quot;&gt;http://docs.github.com&lt;/a&gt;. So I hacked around on a prototype (borrowing every image, stylesheet and layout I could from the exsiting GitHub site) and we came up with something that looked pretty good.&lt;/p&gt;

&lt;div class=&quot;thumbnail&quot;&gt;&lt;a href=&quot;http://skitch.com/jeffrafter/bxktw/github-documentation&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090514-j6xi7hrpnnyx93cnek5x3cfxaw.preview.jpg&quot; alt=&quot;GitHub Documentation&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href=&quot;http://plasq.com/&quot;&gt;plasq&lt;/a&gt;'s &lt;a href=&quot;http://skitch.com&quot;&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;We realized though, that we would need to get permission from GitHub to do this before we showed anyone. So we took everything to Rails conference and met up with them over whiskey in the Star Trek lounge. They instantly got it, gave us the go ahead, and started talking about what would need to happen for it to really work well. We grabbed some beers, paired up with &lt;a href=&quot;http://faithfulgeek.org&quot;&gt;Joe&lt;/a&gt; and started hacking some more.&lt;/p&gt;

&lt;div class=&quot;thumbnail&quot;&gt;&lt;a href=&quot;http://skitch.com/jeffrafter/bxk4w/lsegals-yard-class-yard-codeobjects-base-github-documentation&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090514-ta4intbnkifpkckqi6bhc5wiuk.preview.jpg&quot; alt=&quot;lsegal's yard - Class: YARD::CodeObjects::Base - GitHub Documentation&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href=&quot;http://plasq.com/&quot;&gt;plasq&lt;/a&gt;'s &lt;a href=&quot;http://skitch.com&quot;&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;It turns out it's really hard to go back to static websites with no server-side code. But with GitHub pages you have to do just that. So we built a couple of clever JavaScript libraries for accessing &lt;a href=&quot;http://gist.github.com/110280&quot;&gt;repository&lt;/a&gt; and &lt;a href=&quot;http://gist.github.com/110227&quot;&gt;commit&lt;/a&gt; information from the API. We also made use of the 404.html page that you get with GitHub Pages. Add a couple of meta-redirects and one cross-site post and you have something that feels pretty normal.&lt;/p&gt;

&lt;div class=&quot;thumbnail&quot;&gt;&lt;a href=&quot;http://skitch.com/jeffrafter/bxkis/github-documentation&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090514-m8w6663b386arbqs6jda4yrt2.preview.jpg&quot; alt=&quot;GitHub Documentation - 404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href=&quot;http://plasq.com/&quot;&gt;plasq&lt;/a&gt;'s &lt;a href=&quot;http://skitch.com&quot;&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;When you search for a repository that has not been generated yet you are pushed to the 404.html where there is a form for generating. After entering the information, we check that the repository really exists and then post to &lt;a href=&quot;http://rdoc.info&quot;&gt;http://rdoc.info&lt;/a&gt;. Everytime it generates documentation for a project it simultaneously generates pages using our custom GitHub YARD template and pushes it to the &quot;docs&quot; repository. We tell it that we want a redirect to our &quot;generating&quot; page so you don't notice that you left.&lt;/p&gt;

&lt;div class=&quot;thumbnail&quot;&gt;&lt;a href=&quot;http://skitch.com/jeffrafter/bxk4q/github-documentation-generating&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090514-dwsr39u878tgc1sgemsux1y7i4.preview.jpg&quot; alt=&quot;GitHub Documentation - Generating&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href=&quot;http://plasq.com/&quot;&gt;plasq&lt;/a&gt;'s &lt;a href=&quot;http://skitch.com&quot;&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;For the documentation itself, we maintain separate copies of the documentation per commit SHA. This allows you to have links to various versions of documentation which are static and permanent. For each page we added a namespaces button and methods button instead of using frames.&lt;/p&gt;

&lt;div class=&quot;thumbnail&quot;&gt;&lt;a href=&quot;http://skitch.com/jeffrafter/bxmbk/lsegals-yard-class-yard-codeobjects-base-github-documentation&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090514-qp4t3ea3yn77jp4i6tn97pb4un.preview.jpg&quot; alt=&quot;lsegal's yard - Class: YARD::CodeObjects::Base - GitHub Documentation&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href=&quot;http://plasq.com/&quot;&gt;plasq&lt;/a&gt;'s &lt;a href=&quot;http://skitch.com&quot;&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;When you view source for a given method, there is a link back to the actual revision of the file in the repository. This allows you to quickly see specific source areas in context.&lt;/p&gt;

&lt;div class=&quot;thumbnail&quot;&gt;&lt;a href=&quot;http://skitch.com/jeffrafter/bxmbi/lsegals-yard-class-yard-codeobjects-base-github-documentation&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090514-dmsk1xh8bfpjtr3r1424qh3pf5.preview.jpg&quot; alt=&quot;lsegal's yard - Class: YARD::CodeObjects::Base - GitHub Documentation&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;Uploaded with &lt;a href=&quot;http://plasq.com/&quot;&gt;plasq&lt;/a&gt;'s &lt;a href=&quot;http://skitch.com&quot;&gt;Skitch&lt;/a&gt;!&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;We are eager for feedback; please comment here or send us a message on &lt;a href=&quot;http://github.com/jeffrafter&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-05-09:285</id>
    <published>2009-05-09T21:48:00Z</published>
    <updated>2009-05-09T21:49:07Z</updated>
    <category term="Technology"/>
    <category term="dir"/>
    <category term="getcwd"/>
    <category term="pwd"/>
    <category term="ruby"/>
    <link href="http://neverlet.be/2009/5/9/no-such-file-or-directory" rel="alternate" type="text/html"/>
    <title>no such file or directory</title>
<content type="html">
            &lt;p&gt;Sorry, brief interlude here for something that keeps getting me. I get this error on &lt;code&gt;getcwd&lt;/code&gt; all the time when doing programmatic git things. This is how you recreate it:&lt;/p&gt;

&lt;p&gt;Make a directory, change to it and open a console:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /tmp
mkdir foo
cd foo
irb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Check the &lt;code&gt;pwd&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ irb
irb(main):001:0&gt; Dir.pwd
=&gt; &quot;/private/tmp/foo&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, in a separate terminal, delete that foo folder (leaving irb open)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm -rf /tmp/foo
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, back in your console, get the &lt;code&gt;pwd&lt;/code&gt; again:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;irb(main):002:0&gt; Dir.pwd
Errno::ENOENT: No such file or directory - getcwd
	from (irb):2:in `pwd'
	from (irb):2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So if you are getting this in your code, it is because you are deleting a folder out from under yourself (which tends to happen a lot when testing).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-04-27:284</id>
    <published>2009-04-27T03:44:00Z</published>
    <updated>2009-04-27T04:06:27Z</updated>
    <category term="Technology"/>
    <category term="ajax"/>
    <category term="fulltext"/>
    <category term="javascript"/>
    <category term="search"/>
    <category term="sphinx"/>
    <category term="suffixes"/>
    <link href="http://neverlet.be/2009/4/27/full-text-searching-in-javascript" rel="alternate" type="text/html"/>
    <title>full text searching in javascript</title>
<content type="html">
            &lt;p&gt;So I have this project I am working on with Nick. One of the things we needed was a fancy customizable search solution. Generally, this is done in the ruby world using something like Spinix, Ferret, Solr or the like. Only problem is that all of these require you to have some fancy server-side setup. But for our project we weren't going to have that-- only a static site that we generate once.&lt;/p&gt;

&lt;p&gt;Well, I had a little search engine I had written called Fates search. It was based on Mauricio Fernandez's FT_Search (see &lt;a href=&quot;http://eigenclass.org/hiki/simple+full+text+search+engine&quot;&gt;http://eigenclass.org/hiki/simple+full+text+search+engine&lt;/a&gt;). With some help from Nick I cleaned up a lot of my code (it could use more cleanup, believe me). Then in a couple of late night fits of coding, I converted the whole thing to Javascript.&lt;/p&gt;

&lt;p&gt;There was a problem. The reason the fulltext searching was quick was because of some elegant file seeking and binary searching. But if every user had to download megabytes and megabytes of indexes and the fulltext corpus every time they wanted to search... well, they would not be impressed. So I decided that I needed to shard the whole thing. Basically I divided the main index (the suffixes) into four-character shards. So hits for &quot;Jeffrey&quot; would fall into the &quot;jeff&quot; shard. Clearly, the right length depends on the data you are indexing, but for my fifty-thousand name sample, four seemed about right. Most of the index shards turned out to be less than 1kb with a couple of pathological cases for common names.&lt;/p&gt;

&lt;p&gt;However, it wasn't just the main index that needed sharding. In order to run the binary search, each step needed to peek in the main fulltext corpus which contained all of the text, and which was of course, very big. Because the file is not ordered in any way, sharding by a prefix wasn't an option. But because I would have offsets into the file for seeking, I figured I could just chunk the whole thing into smaller 1kb file chunks. This way, if the search engine needed to seek to offset 15693, I could simply divide to find the appropriate file chunk, retrieve it, then seek to the position based on the modulus.&lt;/p&gt;

&lt;p&gt;Finally, I added a little bit of jQuery goodness so that it would look prettier while you search.&lt;/p&gt;

&lt;p&gt;I posted the code to GitHub at &lt;a href=&quot;http://jeffrafter.github.com/fates&quot;&gt;http://jeffrafter.github.com/fates&lt;/a&gt; and the Indexer is available in the main Fates repository &lt;a href=&quot;http://github.com/jeffrafter/fates&quot;&gt;http://github.com/jeffrafter/fates&lt;/a&gt;. Try it out and make sure you watch the console in Firebug to see the shards and chunks being retrieved.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://neverlet.be/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:neverlet.be,2009-04-16:283</id>
    <published>2009-04-16T22:56:00Z</published>
    <updated>2009-04-16T22:56:21Z</updated>
    <category term="Technology"/>
    <category term="next"/>
    <category term="sensory"/>
    <category term="twitter"/>
    <category term="web"/>
    <link href="http://neverlet.be/2009/4/16/the-sensory-web" rel="alternate" type="text/html"/>
    <title>the sensory web</title>
<content type="html">
            &lt;p&gt;I know I keep talking about the next web and everyone is getting a little bored I am sure. But it is beginning to make sense to me, really. For a long time I have been talking about a &lt;a href=&quot;http://www.wired.com/wired/archive/15.04/esp.html&quot;&gt;very specific Wired article about augmenting human senses&lt;/a&gt;. Basically, some German researchers thought it would be interesting to give humans a sense of true north. Birds have this sense built in (maybe from magnetite in their stomachs?) and it helps them to migrate thousands of miles and know where they are going. But humans don't have magnetite in our stomachs (unless you are a &lt;a href=&quot;http://blog.wired.com/biotech/2006/11/you_are_a_cybor.html&quot;&gt;cyborg&lt;/a&gt;. Its why men get lost and need to ask for directions.&lt;/p&gt;

&lt;p&gt;So the Germans made a belt. And the northern most part of the belt would vibrate just a little. After a month, the bird-people had molded their brains enough to expect this. The researchers found that the people had an incredibly good sense o direction. In fact, when the experiment was over and the belts were taken away most of the people freaked out and bought GPS devices.&lt;/p&gt;

&lt;p&gt;This is why people freak out when Twitter goes down. Twitter is a new human sense. Throughout history some people have been really good in social situations. They had an innate sense to say or do the right thing, or to better understand the people they were talking to. Clearly these people had a distinct advantage and we evolved into a social species.&lt;/p&gt;

&lt;p&gt;The Futurists all wrote about how computers will think for us. And I they were probably very close. The computers will add senses to us. 6th senses. 7th senses. People will become more and more intuitive based on these enhanced senses. Mike tells me I should be reading Kurzweil and he is probably right.&lt;/p&gt;

&lt;p&gt;The &quot;Social Sense&quot; that twitter adds is like the true-north belt. When you receive status updates it is like a little buzz telling you what is happening
in your chosen social sphere. If this just happened once it would be helpful. Instead it happens constantly and your brain adapts to expect this information. For people who don't use Twitter (or Facebook status updates) it is difficult to understand this. It seems like exhibitionism and voyeurism.&lt;/p&gt;

&lt;p&gt;But suppose you did it. Suppose you got status updates on your phone and you could tell from the latest updates that a particular friend was feeling down.  This might cause you to call or see the friend to cheer them up. Critics of Twitter are always saying that you should call your friend to ask how they are doing. Sure. But what if you just knew?&lt;/p&gt;

&lt;p&gt;More than once I have stopped myself from making an ill-timed joke or recognized the dynamic of a room of friends at a party simply because I follow their status updates. I admit it isn't perfect, but I feel it gives me a distinct advantage in social situations compared to those who do not understand the context.&lt;/p&gt;

&lt;p&gt;This is why the notification web is important. This is why twitter is a platform. The interesting thing about sensory perception is that it is a series 
of notifications you sense things by letting your brain respond to incoming streams of sensation. Smells, lights, touch... anything. Notification applications (like Twitter) will tend toward success if they cultivate &quot;senses&quot;.&lt;/p&gt;

&lt;p&gt;Twitter focuses on social senses, but there are a lot of other lesser known senses that could be enhanced. When someone says &quot;he has good business sense&quot; it is a figure of speech. What they mean is, he has an intuitive ability to do the right thing in business situations. Suppose you can train the brain to respond better by using an enhanced set of notifications. Something more fundamental than just having good data. Something targeted and constant. Can you imagine if you had the same sensation about a business deal as you had standing on the edge of a cliff? We see the height of the cliff and know not to walk off of it, mainly because we have trained our minds by walking off of smaller things. People understood this before understanding gravity. Maybe it is possible to give someone good business sense without them understanding the dynamics of market forces and economics as well.&lt;/p&gt;

&lt;p&gt;It is fairly amazing to watch the rate at which the internet is going through massive iterations.&lt;/p&gt;
          </content>  </entry>
</feed>
