<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6023627401335780316</id><updated>2012-01-09T12:08:37.080+01:00</updated><category term='pdflatex'/><category term='education'/><category term='siebel'/><category term='REST'/><category term='automated characterization'/><category term='perl'/><category term='.Net'/><category term='nagios'/><category term='Postscript'/><category term='eastwood'/><category term='COM'/><category term='MS SQL'/><category term='cloud'/><category term='Java'/><category term='evidence-based practice'/><category term='C#'/><category term='WCF'/><category term='groovy'/><category term='Apache CXF'/><category term='OLE'/><category term='GroovyWS'/><category term='google charts'/><category term='Dtrace'/><category term='moinmoin'/><category term='profile'/><title type='text'>Jason Brazile</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-7348824159612072063</id><published>2012-01-09T11:48:00.002+01:00</published><updated>2012-01-09T12:08:37.093+01:00</updated><title type='text'>Scripted vmdk/ova images w/boxgrinder and virtualbox</title><content type='html'>It wasn't immediately clear to me from boxgrinder or virtualbox documentation how to script the complete creation of a self-contained runnable virtual image. Since it took me some effort to get it all together, I'll post here a complete example. The script creates a Fedora 16 w/graphical UI machine image by first creating a virtualbox vmdk image (pretty straightforward) and then from that, scripted creation of a more self-contained .ova image (less straightforward).&lt;br /&gt;&lt;br /&gt;I have the following packages installed:&lt;br /&gt; &lt;li&gt;VirtualBox-OSE&lt;br /&gt; &lt;li&gt;rubygem-boxgrinder-build&lt;br /&gt;&lt;br /&gt;Starting from a boxgrinder appliance definition file...&lt;br /&gt;&lt;br /&gt; http://boxgrinder.org/tutorials/appliance-definition/&lt;br /&gt;&lt;br /&gt;...the script creates an .ova image that can be easily imported and used by 3rd parties like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  $ VBoxManage import f16-xfce.ova&lt;br /&gt;  $ VirtualBox --startvm f16-xfce&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And now for the script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;NAME=f16-xfce&lt;br /&gt;OS=Fedora_64&lt;br /&gt;IMAGE=/tmp/${NAME}.vmdk&lt;br /&gt;SZMB=1536&lt;br /&gt;INSTDIR=/tmp/boxes/&lt;br /&gt;BUILDDIR=/tmp/builds/&lt;br /&gt;&lt;br /&gt;mkdir -p ${BUILDDIR}&lt;br /&gt;cat &gt; ${BUILDDIR}/${NAME}.appl &lt;&lt; EOF&lt;br /&gt;name: f16-xfce&lt;br /&gt;summary: Fedora with xfce&lt;br /&gt;os:&lt;br /&gt;  name: fedora&lt;br /&gt;  version: 16&lt;br /&gt;hardware:&lt;br /&gt;  partitions:&lt;br /&gt;    "/":&lt;br /&gt;      size: 5&lt;br /&gt;packages:&lt;br /&gt;  - @base&lt;br /&gt;  - @base-x&lt;br /&gt;  - @fonts&lt;br /&gt;  - @xfce-desktop&lt;br /&gt;  - @critical-path-xfce&lt;br /&gt;post:&lt;br /&gt;  base:&lt;br /&gt;   - "useradd boxgrinder &amp;&amp; echo boxgrinder | passwd boxgrinder --stdin"&lt;br /&gt;   - "ln -s --force /lib/systemd/system/graphical.target /etc/systemd/system/default.target"&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;cd ${BUILDDIR}&lt;br /&gt;sudo -E boxgrinder-build -p virtualbox ${NAME}.appl&lt;br /&gt;cp ${BUILDDIR}/build/appliances/x86_64/fedora/16/${NAME}/1.0/virtualbox-plugin/${NAME}.vmdk ${IMAGE}&lt;br /&gt;VBoxManage createvm --name ${NAME} --ostype ${OS} --register --basefolder ${INSTDIR}&lt;br /&gt;VBoxManage modifyvm ${NAME} --memory ${SZMB} --vram 32&lt;br /&gt;VBoxManage storagectl ${NAME} --name "SATA Controller" --add sata --controller IntelAHCI&lt;br /&gt;VBoxManage storageattach ${NAME} --storagectl "SATA Controller" --type hdd --port 0 --device 0 --medium ${IMAGE}&lt;br /&gt;VBoxManage export ${NAME} --manifest -o ${BUILDDIR}/${NAME}.ova&lt;br /&gt;# VirtualBox --startvm ${NAME}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-7348824159612072063?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/7348824159612072063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=7348824159612072063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7348824159612072063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7348824159612072063'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2012/01/scripted-vmdkova-images-wboxgrinder-and.html' title='Scripted vmdk/ova images w/boxgrinder and virtualbox'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-6834239375837024756</id><published>2010-10-21T09:35:00.003+02:00</published><updated>2010-10-21T09:44:50.130+02:00</updated><title type='text'>ministat example for comparing performance</title><content type='html'>This is mostly a reminder to myself how to get and use FreeBSD's ministat for performance comparisons. This somewhat useless example shows that -server is apparently the default flag for java these days. Note: you have to strip out some FreeBSD-isms to get it to compile on Linux.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;vocal(jason): cat mstatdemo.sh&lt;br /&gt;#!/bin/sh&lt;br /&gt;wget -O ministat.c 'http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/ministat/ministat.c?rev=1.14;content-type=text%2Fplain'&lt;br /&gt;egrep -v '(FBSDID|ttycom)' ministat.c | gcc -x c -o ministat - -lm&lt;br /&gt;wget -O scimark2lib.jar 'http://math.nist.gov/scimark2/scimark2lib.jar'&lt;br /&gt;rm -f results-default.txt results-server.txt&lt;br /&gt;for i in `seq 3`; do&lt;br /&gt; echo "default $i"&lt;br /&gt; java -cp scimark2lib.jar jnt.scimark2.commandline | grep Composite | awk '{print $3}' &gt;&gt; results-default.txt&lt;br /&gt; echo "server $i"&lt;br /&gt; java -server -cp scimark2lib.jar jnt.scimark2.commandline | grep Composite | awk '{print $3}' &gt;&gt; results-server.txt&lt;br /&gt;done&lt;br /&gt;ministat results-default.txt results-server.txt&lt;br /&gt;vocal(jason) sh mstatdemo.sh&lt;br /&gt;...&lt;br /&gt;x results-default.txt&lt;br /&gt;+ results-server.txt&lt;br /&gt;+------------------------------------------------------------------------------+&lt;br /&gt;|         ++x                                      + x                    x    |&lt;br /&gt;||_________M___|________A_____________________A|_____M________________________||&lt;br /&gt;+------------------------------------------------------------------------------+&lt;br /&gt;    N           Min           Max        Median           Avg        Stddev&lt;br /&gt;x   3      518.6688     521.25366     520.35719     520.09322     1.3124921&lt;br /&gt;+   3     518.60099     520.27189     518.64299     519.17196     0.9528036&lt;br /&gt;No difference proven at 95.0% confidence&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-6834239375837024756?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/6834239375837024756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=6834239375837024756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/6834239375837024756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/6834239375837024756'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2010/10/ministat-example-for-comparing.html' title='ministat example for comparing performance'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-1907580407433005240</id><published>2010-06-09T15:39:00.002+02:00</published><updated>2010-06-09T16:12:35.032+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><title type='text'>Cloud abstraction APIs getting interesting</title><content type='html'>With many people rightly &lt;a href="http://www.ciozone.com/index.php/Cloud-Computing/What-to-Do-About-Cloud-Lock-Inu.html"&gt;nervous about compute cloud lock-in&lt;/a&gt;, we seem to be entering an interesting time in the development of compute &lt;a href="http://www.cloudslamevent.com/compute-cloud-abstraction-apis-who-needs-em"&gt;cloud abstraction libraries and APIs&lt;/a&gt; for trying to work around this. I noticed that last month RedHat's deltacloud has become the &lt;a href="http://incubator.apache.org/projects/deltacloud.html"&gt;apache deltacloud (Ruby) incubator project&lt;/a&gt; alongside the already existing  &lt;a href="http://incubator.apache.org/projects/libcloud.html"&gt;apache libcloud (Python) incubator project&lt;/a&gt;, which has a pretty impressive list of &lt;a href="http://incubator.apache.org/libcloud/index.html"&gt;supported providers&lt;/a&gt;. An interesting alternative to these is &lt;a href="http://github.com/jclouds/jclouds"&gt;jclouds (Java)&lt;/a&gt; with its own &lt;a href="http://code.google.com/p/jclouds/#Supported_Services"&gt;impressive list of supported providers&lt;/a&gt;. However, just this month, libcloud has announced that they too are working on a &lt;a href="http://mail-archives.apache.org/mod_mbox/incubator-libcloud/201006.mbox/%3CAANLkTikjmdKjLx0T_Zafu7L-nDTIftVVxuHLHFxNKNUC@mail.gmail.com%3E"&gt;Java version of their API&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;According to Ohloh, all of the &lt;a href="http://www.ohloh.net/p/libcloud/analyses/latest"&gt;libcloud&lt;/a&gt;, &lt;a href="http://www.ohloh.net/p/deltacloud/analyses/latest"&gt;deltacloud&lt;/a&gt;, and &lt;a href="http://www.ohloh.net/p/jclouds/analyses/latest"&gt;jclouds&lt;/a&gt; projects are showing a lot of recent development activity - very good news for those of us rooting for the possibility of lockin-free compute clouds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-1907580407433005240?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/1907580407433005240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=1907580407433005240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/1907580407433005240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/1907580407433005240'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2010/06/cloud-abstraction-apis-getting.html' title='Cloud abstraction APIs getting interesting'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-8880098829267001732</id><published>2010-02-09T17:16:00.005+01:00</published><updated>2010-02-09T17:37:45.178+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='evidence-based practice'/><title type='text'>Learning how to teach physics (and probably math)</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Eric_Mazur"&gt;Eric Mazur&lt;/a&gt;, a Harvard professor, talks about his experience discovering that in spite of good in-class exam scores and good end-of-the-semester teacher evaluations, his students shockingly weren't internalizing elementary physics concepts e.g. in the context of everyday situations. He had only learned this because he had seen the result presented at a conference and didn't believe it, so decided to test his own classes to disprove the result. He was shocked that it was true in his classes as well - year after year.&lt;br /&gt;&lt;br /&gt;He could have left things as-is - all the standard metrics (exams, evaluations) showed there was no dire need to change anything. But  true conceptual internalization wasn't taking place.&lt;br /&gt;&lt;br /&gt;Where was the problem? Wasn't he a good teacher?  And weren't his students of the highest quality?&lt;br /&gt;&lt;br /&gt;Dr Mazur discusses the characteristics of the concepts he wanted his students to internalize, the tests he used to test them, the metrics to measure the results and his multiple attempts to change his teaching style to achieve those results.&lt;br /&gt;&lt;br /&gt;The process that in the end produced good outcomes (and has been validated in programs throughout the country) turns out to focus less on lecturing and more on directing peer-instruction. Well worth a watch...&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; Eric Mazur presents &lt;a href="http://www.youtube.com/watch?v=WwslBPj8GgI"&gt; Confessions of a Converted Lecturer&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;There seems to also be &lt;a href="http://www.bestevidence.org/math/elem/top.htm"&gt;good evidence for peer-assisted instruction&lt;/a&gt; for elementary level mathematics as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-8880098829267001732?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/8880098829267001732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=8880098829267001732' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8880098829267001732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8880098829267001732'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2010/02/learning-how-to-teach-physics-and.html' title='Learning how to teach physics (and probably math)'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-5780236731381031778</id><published>2010-02-01T12:45:00.004+01:00</published><updated>2010-02-09T16:02:30.072+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='evidence-based practice'/><title type='text'>What makes a great teacher?</title><content type='html'>What makes a great teacher? Probably not what you think. Here is an &lt;a href="http://www.theatlantic.com/doc/201001/good-teaching"&gt;article in the Atlantic&lt;/a&gt; describing data collected  and analyzed by &lt;a href="http://en.wikipedia.org/wiki/Teach_For_America"&gt;Teach for America&lt;/a&gt; (the non-profit organization that recruits recent college graduates and professionals to teach for two years in low-income communities throughout the US).&lt;br /&gt;&lt;blockquote&gt;Starting in 2002, Teach for America began using student test-score progress data to put teachers into one of three categories: those who move their students one and a half or more years ahead in one year; those who achieve one to one and a half years of growth; and those who yield less than one year of gains.&lt;/blockquote&gt;&lt;br /&gt;According to the article, the characteristics could be summarized as:&lt;br /&gt; &lt;li&gt;set big goals&lt;br /&gt; &lt;li&gt;continuously seek to improve effectiveness&lt;br /&gt; &lt;li&gt;recruit students and families into the process&lt;br /&gt; &lt;li&gt;plan exhaustively and purposefully &lt;br /&gt; &lt;li&gt;work backwards from desired outcome&lt;br /&gt; &lt;li&gt;refuse to surrender to [...] bureaucracy and budgetary shortfalls&lt;br /&gt;&lt;br /&gt;At the moment, TfA claims larger gains than can be independently verified (which are also only for math) but their approach still looks promising...&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;So far, only one independent, random-assignment study of Teach for America’s effectiveness has been conducted. &lt;a href="http://www.mathematica-mpr.com/publications/pdfs/teach.pdf"&gt;That report&lt;/a&gt;, published by Mathematica Policy Research in 2004, looked at the organization’s teachers and found that, in math, their students significantly outperformed those of their more experienced counterparts. (In reading, though, the teachers’ students did the same as other teachers’ students.) Another study is due out in 2012 or 2013.&lt;/blockquote&gt;&lt;br /&gt;For the teaching of reading, &lt;a href="http://www.thefreelibrary.com/_/print/PrintArticle.aspx?id=20632861"&gt;Siegfried Engelmann's Direct Instruction&lt;/a&gt; seems to have &lt;a href="http://psych.athabascau.ca/html/387/OpenModules/Engelmann/references.html"&gt;years of evidence&lt;/a&gt;. And you can purchase an &lt;a href="http://www.funnix.com/funnix2006/developed.htm"&gt;e-tutor&lt;/a&gt; that implements the &lt;a href="http://psych.athabascau.ca/html/387/OpenModules/Engelmann/EngelmannDI.html"&gt;method&lt;/a&gt; for home use&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-5780236731381031778?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/5780236731381031778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=5780236731381031778' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/5780236731381031778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/5780236731381031778'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2010/02/what-makes-great-teacher.html' title='What makes a great teacher?'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-7484771777226991458</id><published>2009-11-05T15:13:00.006+01:00</published><updated>2010-10-26T11:22:46.054+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdflatex'/><category scheme='http://www.blogger.com/atom/ns#' term='moinmoin'/><category scheme='http://www.blogger.com/atom/ns#' term='eastwood'/><category scheme='http://www.blogger.com/atom/ns#' term='google charts'/><title type='text'>web and print with moinmoin, pdflatex, google charts and eastwood</title><content type='html'>As always, this is mainly a reminder to myself... We wanted to create a nice report/handbook that will be occasionally be printed, but in between printings should be a living (web) document. As typical for reports, it will contain charts and tables. We went with a wiki, which has pretty good tables and google charts looked like a perfect fit, until we saw that output is limited to png with a &lt;a href="http://code.google.com/apis/chart/basics.html"&gt;maximum resolution of 300k pixels&lt;/a&gt;. Then we found eastwood, a reimplementation of the google chart api in java with jfreechart as the back end. So here's how we do it:&lt;ul&gt;&lt;li&gt;each report section is a &lt;a href="http://moinmoin.in/"&gt;moinmoin wiki page&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;limit yourself to moinmoin's native tables, footnotes, sections, enumerations, descriptions&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use moinmoin's &lt;a href="http://moinmo.in/macro/HTML.py"&gt;HTML macro&lt;/a&gt; to add &lt;a href="http://code.google.com/apis/chart/types.html"&gt;google charts&lt;/a&gt; inline&lt;/li&gt;&lt;br /&gt;&lt;li&gt;for the print version, install &lt;a href="http://www.jfree.org/eastwood/samples.html"&gt;Eastwood&lt;/a&gt;, the free java re-implementation of the google chart API&lt;/li&gt;&lt;br /&gt;&lt;li&gt;into Eastwood, &lt;a href="http://dolf.trieschnigg.nl/jfreechart/"&gt;integrate the Batik library&lt;/a&gt; for rendering SVG&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use &lt;b&gt;&lt;tt&gt;inkscape -z -E chart.eps chart.svg&lt;/tt&gt;&lt;/b&gt; to convert svg to eps (eps works better than pdf for chart boundaries) and use &lt;b&gt;&lt;tt&gt;epstopdf chart.eps&lt;/tt&gt;&lt;/b&gt; to convert eps to pdf&lt;/li&gt;&lt;br /&gt;&lt;li&gt;install the &lt;b&gt;&lt;tt&gt;text_latex.py&lt;/tt&gt;&lt;/b&gt; moinmoin formatter from &lt;a href="http://moinmo.in/FormatterMarket/"&gt; moinmoin FormatterMarket&lt;/a&gt; (this adds a &lt;b&gt;renderAsLatex&lt;/b&gt; action)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use &lt;b&gt;&lt;tt&gt;wget -O section.tex --user-agent="Mozilla/5.0" --user=user --password=pw 'http://your.moinmoin.site/section?action=format&amp;mimetype=text/latex'&lt;/tt&gt;&lt;/b&gt; (or &lt;b&gt;&lt;tt&gt;curl -o section.text -A 'Mozilla/5.0' -u user:pw 'http://your.moinmoin.site/section?action=format&amp;mimetype=text/latex'&lt;/tt&gt;&lt;/b&gt;) to download one of your wiki pages as LaTeX &lt;/li&gt;&lt;br /&gt;&lt;li&gt;For professional stuff, hire a &lt;a href="http://www.texnology.com/index.htm"&gt;LaTeX expert&lt;/a&gt; to define/create a &lt;a href="http://netcetera.ch/en/references/references-transport/mainParagraphs/0/content_en_files/file1/pathfinder_en_20080730.pdf"&gt;professional print layout&lt;/a&gt; and its associated macros&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use your script-fu (e.g. awk,sed) to fixup the moinmoin-translated LaTeX markup and e.g. to call the right latex macros for including the pdf charts&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use &lt;a href="http://www.tug.org/applications/pdftex/"&gt;pdflatex&lt;/a&gt; for generating your print-format report&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Automate all of the above with ant, make, shell or even .bat files&lt;/li&gt;&lt;br /&gt;&lt;li&gt;And &lt;a href="http://labix.org/editmoin"&gt;editmoin&lt;/a&gt; allows you to use &lt;pre&gt;$EDITOR&lt;/pre&gt; to edit content instead of a browser's textarea editor&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-7484771777226991458?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/7484771777226991458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=7484771777226991458' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7484771777226991458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7484771777226991458'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2009/11/web-and-print-with-moinmoin-pdflatex.html' title='web and print with moinmoin, pdflatex, google charts and eastwood'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-2821358158178500314</id><published>2009-05-29T15:08:00.008+02:00</published><updated>2009-05-29T17:21:55.889+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='profile'/><title type='text'>Poor Man's Java memory profiler</title><content type='html'>Here is an example of do-it-yourself memory profiling e.g. showing used heap memory over the life of a program run. I compared it with results from YourKit to convince myself it's ok.&lt;br /&gt;&lt;br /&gt;The concept:&lt;br /&gt; &lt;li&gt; Launch a separate thread that collects used memory stats&lt;br /&gt; &lt;li&gt; add a shutdown hook to output the stats&lt;br /&gt;&lt;br /&gt;Here's an example in a Junit test...&lt;br /&gt;&lt;pre&gt;public class CacheRebuildReloadTest extends RollbackTestCase {&lt;br /&gt;  private static int  j   = 0;&lt;br /&gt;  private static final long t0 = System.currentTimeMillis();&lt;br /&gt;  private static long t[] = new long[32767];&lt;br /&gt;  private static long m[] = new long[32767];&lt;br /&gt;  private static Runtime r = Runtime.getRuntime();&lt;br /&gt;  private static boolean done = false;&lt;br /&gt;  static {&lt;br /&gt;    Runtime.getRuntime().addShutdownHook(new Thread() {&lt;br /&gt;      public void run() {&lt;br /&gt;        for (int i = 0; i &lt; j; i++) {&lt;br /&gt;          System.out.println(t[i] + "\t" + m[i]);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    });&lt;br /&gt;    new Thread() {&lt;br /&gt;      public void run() {&lt;br /&gt;        while (!done) {&lt;br /&gt;          t[j]   = System.currentTimeMillis() - t0;&lt;br /&gt;          m[j++] = r.totalMemory() - r.freeMemory();&lt;br /&gt;          try {Thread.sleep(500);} catch (Exception e) {}&lt;br /&gt;          if (j &gt; 32767) {done = true;}&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }.start();&lt;br /&gt;  }&lt;br /&gt;  public void testRebuildReload() {&lt;br /&gt;    // stuff here&lt;br /&gt;    done = true;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Here is a comparison with a YourKit memory profile (and a plot of the 2 sampling frequencies and distributions - I used .5s and YourKit apparently 1s). Good enough for my purposes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ddYkeUPn-dw/Sh_6cHKxVzI/AAAAAAAAAAM/pm-BuDuQyV8/s1600-h/0b.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ddYkeUPn-dw/Sh_6cHKxVzI/AAAAAAAAAAM/pm-BuDuQyV8/s320/0b.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5341263043952203570" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ddYkeUPn-dw/Sh_63BMzF6I/AAAAAAAAAAU/Zhfxqag-s70/s1600-h/0a.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ddYkeUPn-dw/Sh_63BMzF6I/AAAAAAAAAAU/Zhfxqag-s70/s320/0a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5341263506206562210" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-2821358158178500314?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/2821358158178500314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=2821358158178500314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/2821358158178500314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/2821358158178500314'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2009/05/poor-mans-java-memory-profiler.html' title='Poor Man&apos;s Java memory profiler'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ddYkeUPn-dw/Sh_6cHKxVzI/AAAAAAAAAAM/pm-BuDuQyV8/s72-c/0b.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-544165846656335632</id><published>2008-10-07T17:34:00.005+02:00</published><updated>2008-10-07T17:51:00.338+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JUnitPerf timed load JUnit test example</title><content type='html'>For my own future reference, here is a complete example of a &lt;a href="http://clarkware.com/software/JUnitPerf.html"&gt;JUnitPerf&lt;/a&gt; timed load test of a JUnit test.&lt;br /&gt;&lt;br /&gt;First the normal JUnit test case. In this case, just write a non-trivial sized file...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.lang.reflect.Array;&lt;br /&gt;&lt;br /&gt;public class AppTest extends TestCase {&lt;br /&gt;  public AppTest(String testName) { super(testName); }&lt;br /&gt;  public void testApp() {&lt;br /&gt;    byte[] ary = (byte[]) Array.newInstance(byte.class, 65534);&lt;br /&gt;    try {&lt;br /&gt;      File tmp = File.createTempFile("writeTest", ".txt");&lt;br /&gt;      tmp.deleteOnExit();&lt;br /&gt;      FileOutputStream os = new FileOutputStream(tmp);&lt;br /&gt;      FileDescriptor fd = os.getFD();&lt;br /&gt;      for(int i=0; i&amp;lt;1000; i++) { os.write(ary); }&lt;br /&gt;      os.flush(); fd.sync();&lt;br /&gt;    } catch (IOException e) { }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then a JUnit-compatible junitperf test suite. Run in sizes of powers of two (and 3 times each)...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import com.clarkware.junitperf.*;&lt;br /&gt;import junit.framework.*;&lt;br /&gt;&lt;br /&gt;public class AppTimedLoadTest extends TestCase {&lt;br /&gt;&lt;br /&gt; private static final String TEST = "testApp";&lt;br /&gt;&lt;br /&gt; public static Test timedNload(int n, int s, String testName) {&lt;br /&gt;   boolean wait  = true;&lt;br /&gt;   Test test     = new AppTest(testName);&lt;br /&gt;   LoadTest load = new LoadTest(test, n); load.setEnforceTestAtomicity(false);&lt;br /&gt;   Test timed    = new TimedTest(load, s * 1000, wait);&lt;br /&gt;   return timed;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static Test suite() {&lt;br /&gt;   TestSuite suite = new TestSuite();&lt;br /&gt;   suite.addTest(timedNload(1, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(1, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(1, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(2, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(2, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(2, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(4, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(4, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(4, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(8, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(8, 30, TEST));&lt;br /&gt;   suite.addTest(timedNload(8, 30, TEST));&lt;br /&gt;   return suite;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The results of a &lt;tt&gt;mvn test&lt;/tt&gt; run (with added spaces to see the grouping)...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-------------------------------------------------------&lt;br /&gt;T E S T S&lt;br /&gt;-------------------------------------------------------&lt;br /&gt;Running AppTest&lt;br /&gt;Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.295 sec&lt;br /&gt;Running AppTimedLoadTest&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 2245 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 2397 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 2241 ms&lt;br /&gt;&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 4274 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 4425 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 4374 ms&lt;br /&gt;&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 9067 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 10204 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 8802 ms&lt;br /&gt;&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 17439 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 18558 ms&lt;br /&gt;TimedTest (WAITING): LoadTest (NON-ATOMIC): ThreadedTest: testApp(AppTest): 19724 ms&lt;br /&gt;Tests run: 45, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 103.782 sec&lt;br /&gt;Results :&lt;br /&gt;Tests run: 46, Failures: 0, Errors: 0, Skipped: 0&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-544165846656335632?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/544165846656335632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=544165846656335632' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/544165846656335632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/544165846656335632'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2008/10/junitperf-timed-load-junit-test-example.html' title='JUnitPerf timed load JUnit test example'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-5116270468261155548</id><published>2008-08-05T09:23:00.003+02:00</published><updated>2008-08-05T10:11:42.465+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='MS SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>A perl-wrapped java-based Nagios MS SQL plugin: check_mssql</title><content type='html'>I didn't find a &lt;a href="http://www.nagios.org"&gt;nagios&lt;/a&gt; plugin that I like for monitoring our MS SQL databases. So I hacked up one in java using the &lt;a href="http://jtds.sourceforge.net"&gt;jtds jdbc driver&lt;/a&gt;. Yes, the 2 minor things I do to improve "security" are horrible. I'll handle those things better later....&lt;br /&gt;&lt;br /&gt;First, the java code... MSSQL.java&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.sql.*;&lt;br /&gt;&lt;br /&gt;// constr (jdbc:jtds:sqlserver://hostname:1433/DBNAME), user, pw, query&lt;br /&gt;public class MSSQL {&lt;br /&gt;  public static String MSG[] = {"OK", "WARNING", "CRITICAL", "UNKNOWN"};&lt;br /&gt;  public static String msg   = "";&lt;br /&gt;  public static int    s     = 3; // default is UNKNOWN&lt;br /&gt;  public static long   n     = 0;&lt;br /&gt;  public static long   t0ms  = System.currentTimeMillis();&lt;br /&gt;&lt;br /&gt;  public static String rot13(String in) {&lt;br /&gt;    StringBuilder sb = new StringBuilder(); int c;&lt;br /&gt;    for (int b : in.getBytes()) {&lt;br /&gt;      c = b &amp; 32; b &amp;= ~c;&lt;br /&gt;      b = ((b &gt;= 'A') &amp;&amp; (b &lt;= 'Z') ? ((b - 'A' + 13) % 26 + 'A') : b) | c;&lt;br /&gt;      sb.append((char) b);&lt;br /&gt;    }&lt;br /&gt;    return sb.toString();&lt;br /&gt;  }&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    Runtime.getRuntime().addShutdownHook(new Thread() {&lt;br /&gt;      public void run() {&lt;br /&gt;        String m = (new Exception().getStackTrace())[0].getClassName();&lt;br /&gt;        System.out.println(String.format("%s %s %s|time=%dms;;; rows=%d;;;",&lt;br /&gt;          m.substring(0, m.length() - 2), MSG[s], msg,&lt;br /&gt;          System.currentTimeMillis() - t0ms, n));&lt;br /&gt;        Runtime.getRuntime().halt(s);&lt;br /&gt;      }&lt;br /&gt;    });&lt;br /&gt;    try {&lt;br /&gt;      if (args.length != 4) {throw new Exception("4 args expected");}&lt;br /&gt;      String c=args[0]; String u=args[1]; String p=args[2]; String q=args[3];&lt;br /&gt;      Class.forName("net.sourceforge.jtds.jdbc.Driver");&lt;br /&gt;      Connection conn = DriverManager.getConnection(c, u, rot13(p));&lt;br /&gt;      Statement stmt = conn.createStatement();&lt;br /&gt;      ResultSet rset = stmt.executeQuery(String.format("select * from %s", q));&lt;br /&gt;      n = 0; while (rset.next()) { n++; } stmt.close(); conn.close();&lt;br /&gt;      msg = String.format("%d rows",n); s = 0;&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      s = 2; String m = e.getMessage(); if (m != null) { msg = m; }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, how to build the perl wrapper... buildmyself.sh&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;wget http://surfnet.dl.sourceforge.net/sourceforge/jtds/jtds-1.2.2-dist.zip &amp;&amp; \&lt;br /&gt;unzip jtds-1.2.2-dist.zip jtds-1.2.2.jar &amp;&amp; \&lt;br /&gt;jar xvf jtds-1.2.2.jar &gt; /dev/null &amp;&amp; \&lt;br /&gt;rm -rf META-INF &amp;&amp; \&lt;br /&gt;javac MSSQL.java &amp;&amp; \&lt;br /&gt;printf "Main-Class: MSSQL\n" &gt; .X &amp;&amp; \&lt;br /&gt;jar cfm MSSQL.jar .X MS*.class net $0 MSSQL.java &amp;&amp; \&lt;br /&gt;rm -rf .X MS*.class jtds-1.2.2-dist.zip jtds-1.2.2.jar check_mssql net&lt;br /&gt;cat &gt; check_mssql &lt;&lt; EOF&lt;br /&gt;#!/usr/bin/env perl&lt;br /&gt;use strict;&lt;br /&gt;use File::Temp qw/tempfile/;&lt;br /&gt;my @jar = &amp;lt;DATA&amp;gt;; my \$r; foreach (@jar) { \$r .= unpack('u',\$_); }&lt;br /&gt;my(\$fh, \$fn) = &amp;tempfile('/tmp/MSSQL-XXXXXX', SUFFIX =&gt; '.jar');&lt;br /&gt;binmode(\$fh); syswrite(\$fh, \$r) || die('write failed');&lt;br /&gt;close(\$fh) || die('close failed');&lt;br /&gt;my @args = @ARGV; unshift @args, ("java", "-jar", \$fn);&lt;br /&gt;system @args; \$r = \$? &gt;&gt; 8; END { unlink \$fn; \$? = \$r; }&lt;br /&gt;__END__&lt;br /&gt;EOF&lt;br /&gt;uuencode MSSQL.jar MSSQL.jar &gt; .X&lt;br /&gt;N=`wc -l .X | awk '{print $1}'`&lt;br /&gt;tail -`expr $N - 1` .X | head -`expr $N - 2` &gt;&gt; check_mssql &amp;&amp; rm .X MSSQL.jar&lt;br /&gt;chmod a+rx check_mssql&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note to self: On fedora uuencode is in the sharutils package...&lt;br /&gt;&lt;br /&gt;Now when you run buildmyself.sh, it produces a perl-wrapped check_mssql that looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/env perl&lt;br /&gt;use strict;&lt;br /&gt;use File::Temp qw/tempfile/;&lt;br /&gt;my @jar = &amp;lt;DATA&amp;gt;; my $r; foreach (@jar) { $r .= unpack('u',$_); }&lt;br /&gt;my($fh, $fn) = &amp;tempfile('/tmp/MSSQL-XXXXXX', SUFFIX =&gt; '.jar');&lt;br /&gt;binmode($fh); syswrite($fh, $r) || die('write failed');&lt;br /&gt;close($fh) || die('close failed');&lt;br /&gt;my @args = @ARGV; unshift @args, ("java", "-jar", $fn);&lt;br /&gt;system @args; $r = $? &gt;&gt; 8; END { unlink $fn; $? = $r; }&lt;br /&gt;__END__&lt;br /&gt;M4$L#!`H``````$))!3D````````````````)````345402U)3D8O4$L#!`H`&lt;br /&gt;M```(`%Q)!3D$N9B&amp;lt;%````!(````4````345402U)3D8O34%.249%4U0N34;S&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Usage like this:&lt;br /&gt;vocal(jason): check_mssql jdbc:jtds:sqlserver://hostname:1433/DBNAME user passrot13 "FOO where BAR='baz'"&lt;br /&gt;MSSQL OK 397 rows|time=1534ms;;;&lt;br /&gt;vocal(jason): echo $?&lt;br /&gt;0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-5116270468261155548?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/5116270468261155548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=5116270468261155548' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/5116270468261155548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/5116270468261155548'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2008/08/perl-wrapped-java-based-nagios-ms-sql.html' title='A perl-wrapped java-based Nagios MS SQL plugin: check_mssql'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-8448554009462931825</id><published>2008-07-23T09:36:00.003+02:00</published><updated>2008-07-23T09:42:45.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>check_http as a Nagios Web Service plugin</title><content type='html'>We typically use &lt;a href="http://www.nagios.org"&gt;nagios&lt;/a&gt; to monitor our hardware and hosted services. Now that we are starting to offer more web services, we wanted to replace the ad-hoc &lt;a href="http://curl.haxx.se/docs/manpage.html"&gt;curl&lt;/a&gt; wrapper we were using with a more standard nagios plugin. After searching for one and not finding any, it occurred to me that if curl can do it, maybe you can trick the standard &lt;a href="http://nagiosplugins.org/man/check_http"&gt;check_http plugin&lt;/a&gt; to also do it. A quick experiment with an https hosted web service (&lt;a href="http://www.mail-archive.com/openssl-users@openssl.org/msg31923.html"&gt;self signed certificate&lt;/a&gt; for this test) shows that it works:&lt;br /&gt;&lt;br /&gt;./check_http -S -k 'SOAPAction: ping' -r 'Current Status.*OK' -T text/xml -P '&amp;lt;s:envelope s="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;&amp;lt;s:header/&amp;gt;&amp;lt;s:body&amp;gt;&amp;lt;ping/&amp;gt;&amp;lt;s:Body&amp;gt;&amp;lt;s:Envelope&amp;gt;' -t 10 -m 512 -p 8083 -H  192.168.1.254  -u /Services/Search/search.svc&lt;br /&gt;HTTP OK HTTP/1.1 200 OK - 0.033 second response time |time=0.032722s;;;0.000000 size=897B;512;0;0&lt;br /&gt;&lt;br /&gt;Now time to look at &lt;a href="http://wiki.contribs.org/Nagios_Grapher"&gt;nagios grapher&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-8448554009462931825?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/8448554009462931825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=8448554009462931825' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8448554009462931825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8448554009462931825'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2008/07/checkhttp-as-nagios-web-service-plugin.html' title='check_http as a Nagios Web Service plugin'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-4098302710171684115</id><published>2008-03-17T00:47:00.004+01:00</published><updated>2008-03-17T00:52:49.511+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='siebel'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Siebel COM programming with Groovy</title><content type='html'>After my success in using Perl to program the siebel COM interface, I thought I'd try groovy. Yes it works as well.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import org.codehaus.groovy.scriptom.*&lt;br /&gt;&lt;br /&gt;Scriptom.inApartment&lt;br /&gt;{&lt;br /&gt;def sa = new ActiveXObject('SiebelDataServer.ApplicationObject');&lt;br /&gt;VariantByref rc = new VariantByref(0 as short);&lt;br /&gt;&lt;br /&gt;sa.LoadObjects("C:/sea/client/OBJECTS/siebel.cfg", rc);&lt;br /&gt;(rc.value == 0) || println("a: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;sa.Login("user", "password", rc)&lt;br /&gt;(rc.value == 0) || println("b: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;def bo = sa.GetBusObject("Contact", rc)&lt;br /&gt;(rc.value == 0) || println("c: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;def bc = bo.GetBusComp("Contact", rc);&lt;br /&gt;(rc.value == 0) || println("d: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;bc.ClearToQuery(rc);&lt;br /&gt;(rc.value == 0) || println("e: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;bc.ActivateField("Birth Date", rc);&lt;br /&gt;(rc.value == 0) || println("f: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;bc.ActivateField("First Name", rc);&lt;br /&gt;(rc.value == 0) || println("g: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;bc.ActivateField("Last Name", rc);&lt;br /&gt;(rc.value == 0) || println("h: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;bc.ActivateField("Id", rc);&lt;br /&gt;(rc.value == 0) || println("i: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;bc.SetSearchExpr("[Birth Date] = 01/01/1900 AND [Last Name] LIKE 'R*'", rc)&lt;br /&gt;(rc.value == 0) || println("j: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;bc.ExecuteQuery(true, rc);&lt;br /&gt;(rc.value == 0) || println("k: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;def moreRecords = bc.FirstRecord(rc);&lt;br /&gt;(rc.value == 0) || println("l: " + sa.GetLastErrText())&lt;br /&gt;&lt;br /&gt;while(moreRecords) {&lt;br /&gt; println " Last Name: " + bc.GetFieldValue("Last Name", rc);&lt;br /&gt; (rc.value == 0) || println("m: " + sa.GetLastErrText())&lt;br /&gt; println "First Name: " + bc.GetFieldValue("First Name", rc);&lt;br /&gt; (rc.value == 0) || println("n: " + sa.GetLastErrText())&lt;br /&gt; println "Birth Date: " + bc.GetFieldValue("Birth Date", rc);&lt;br /&gt; (rc.value == 0) || println("o: " + sa.GetLastErrText())&lt;br /&gt; println "        Id: " + bc.GetFieldValue("Id", rc);&lt;br /&gt; (rc.value == 0) || println("p: " + sa.GetLastErrText())&lt;br /&gt; moreRecords = bc.NextRecord(rc);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;println 'Done'&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-4098302710171684115?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/4098302710171684115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=4098302710171684115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/4098302710171684115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/4098302710171684115'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2008/03/siebel-com-programming-with-groovy.html' title='Siebel COM programming with Groovy'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-2475260740532035079</id><published>2008-03-17T00:18:00.004+01:00</published><updated>2008-03-17T00:33:58.441+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OLE'/><category scheme='http://www.blogger.com/atom/ns#' term='COM'/><category scheme='http://www.blogger.com/atom/ns#' term='siebel'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Siebel COM programming with Perl</title><content type='html'>I wanted to play around with the Siebel COM interface using a dynamic language instead of having to re-compile after every change. I happened to have perl installed on my machine so it was the natural choice. Since google didn't show me any usable hits beforehand and it took a bit of investigation, I'm posting my results here.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!c:/perl/bin/perl.exe -w&lt;br /&gt;use strict;&lt;br /&gt;use Win32::OLE;&lt;br /&gt;use Win32::OLE::Variant;&lt;br /&gt;&lt;br /&gt;my $schema = {&lt;br /&gt;'Contact' =&gt; [&lt;br /&gt; 'Birth Date', 'Created', 'Created By Name', 'Email Address', 'Fax Phone #',&lt;br /&gt; 'First Name', 'Id', 'Job Title', 'Last Name', 'Updated', 'Updated By Name',&lt;br /&gt; 'Work Phone #']&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;my $cfg = "C:/sea/client/OBJECTS/siebel.cfg";&lt;br /&gt;&lt;br /&gt;my $sa = Win32::OLE-&gt;new("SiebelDataServer.ApplicationObject") or die "failed";&lt;br /&gt;&lt;br /&gt;sub x&lt;br /&gt;{&lt;br /&gt;my ($tag, $rc) = @_;&lt;br /&gt;if ($rc != 0) {warn("[$tag] " . $sa-&gt;GetLastErrText());}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub main&lt;br /&gt;{&lt;br /&gt;my ($bo, $bc, $key, $field, $moreResults, $rcref);&lt;br /&gt;&lt;br /&gt;$rcref = Variant(VT_I2|VT_BYREF, 0);&lt;br /&gt;$sa-&gt;LoadObjects($cfg, $rcref);             &amp;amp;x("a", $rcref);&lt;br /&gt;$sa-&gt;Login("user", "password", $rcref);     &amp;amp;x("b", $rcref);&lt;br /&gt;&lt;br /&gt;foreach $key (keys(%$schema)) {&lt;br /&gt; $bo = $sa-&gt;GetBusObject($key, $rcref);    &amp;amp;x("c", $rcref);&lt;br /&gt; $bc = $bo-&gt;GetBusComp($key,   $rcref);    &amp;amp;x("d", $rcref);&lt;br /&gt; foreach $field (@{$schema-&gt;{$key}}) {&lt;br /&gt;   $bc-&gt;ActivateField($field, $rcref);     &amp;amp;x("e", $rcref);&lt;br /&gt; }&lt;br /&gt; $bc-&gt;ClearToQuery($rcref);                &amp;amp;x("f", $rcref);&lt;br /&gt; $bc-&gt;SetSearchExpr("[Email Address] IS NOT NULL AND [Last Name] LIKE 'R*'", $rcref);&lt;br /&gt;                                           &amp;amp;x("g", $rcref);&lt;br /&gt;&lt;br /&gt; $bc-&gt;ExecuteQuery(1, $rcref);             &amp;amp;x("h", $rcref);&lt;br /&gt; $moreResults = $bc-&gt;FirstRecord($rcref);  &amp;amp;x("i", $rcref);&lt;br /&gt; while ($moreResults) {&lt;br /&gt;   printf("-----\n");&lt;br /&gt;   foreach $field (@{$schema-&gt;{$key}}) {&lt;br /&gt;     printf ("%40s: %s\n",$field, $bc-&gt;GetFieldValue($field, $rcref));&lt;br /&gt;                                           &amp;amp;x("j", $rcref);&lt;br /&gt;   }&lt;br /&gt;   $moreResults = $bc-&gt;NextRecord($rcref); &amp;amp;x("k", $rcref);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&amp;main;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-2475260740532035079?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/2475260740532035079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=2475260740532035079' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/2475260740532035079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/2475260740532035079'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2008/03/siebel-com-programming-with-perl.html' title='Siebel COM programming with Perl'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-6807146866939446440</id><published>2008-03-06T08:24:00.002+01:00</published><updated>2008-03-17T00:55:51.876+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Csharp checkstyle partial solution</title><content type='html'>There doesn't seem to be an equivalent to Java/Eclipse's checkstyle for Csharp.Net&lt;br /&gt;&lt;br /&gt;For the purpose of attempting to enforce a common code formatting style, microsoft recommends a &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=253597"&gt;per-solution config file together with a VB macro that automatically loads it up when you open the solution&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-6807146866939446440?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/6807146866939446440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=6807146866939446440' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/6807146866939446440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/6807146866939446440'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2008/03/csharp-checkstyle-partial-solution.html' title='Csharp checkstyle partial solution'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-3716260530383446964</id><published>2008-03-05T16:51:00.010+01:00</published><updated>2008-03-18T09:35:20.226+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache CXF'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><category scheme='http://www.blogger.com/atom/ns#' term='GroovyWS'/><title type='text'>Testing WCF Services using groovyWS (Apache CXF)</title><content type='html'>I wanted to use &lt;a href="http://groovy.codehaus.org/GroovyWS"&gt;groovyWS&lt;/a&gt; to test my WSDL-first .Net WCF web services. By default, WCF doesn't publish its WSDL, it doesn't publish a flat WSDL, and the recommended WsHttpBinding binding makes groovyWS unhappy. Once you work around these things, it is possible to very conveniently write independent dynamic tests for your services.&lt;br /&gt;&lt;br /&gt;Since it took a while to collect all this information, I thought I would post my result: a WCF ping service that is interoperable with a groovyWS (i.e. Apache CXF) client.&lt;br /&gt;&lt;br /&gt;The steps I took:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use GroovyWS to model my service. (groovy mockup\pingserver in one window and groovy pingclient in another) &lt;/li&gt;&lt;li&gt;Captured the WSDL it generated (wget -O Ping.wsdl http://localhost:7020/Ping?wsdl) &lt;/li&gt;&lt;li&gt;Wrote a .bat program to use the WCF svcutil.exe with XMLSerialization to generate marshaling code from the WSDL, and sed to remove generated ReplyAction="*" per operation so that it will properly expose information when it publishes its WSDL&lt;/li&gt;&lt;li&gt;Use the included boiler plate code to do the self hosting (i.e. standalone server) with the BasicHttpBinding, and used the FlatWsdl() class, which along with proper namespace annotations to allow generation of a "flat wsdl".&lt;/li&gt;&lt;li&gt;Appended a "ServiceBehavior" class which implements an interface generated from the WSDL, whose operations stubs can be generated from within Visual Studio by selecting the interface name, right click -&gt; "Implement Interface" &lt;/li&gt;&lt;/ol&gt;All of this is bundled in a &lt;a href="http://www.geo.uzh.ch/%7Ejbrazile/pingWCFgroovy-sln.zip"&gt;VS solution&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Prerequisites: &lt;ol&gt;&lt;li&gt;groovy &lt;a href="http://dist.groovy.codehaus.org/distributions/groovy-binary-1.5.4.zip"&gt;zip distribution&lt;/a&gt;&lt;/li&gt;&lt;li&gt;groovyWS &lt;a href="http://docs.codehaus.org/download/attachments/9242181/groovyws-standalone-0.3.0-SNAPSHOT.jar"&gt;standalone jar&lt;/a&gt; (goes in lib dir) &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/info.aspx?na=40&amp;amp;p=1&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=f54f5537-cc86-4bf5-ae44-f5a1e805680d&amp;amp;u=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3fFamilyId%3d10CC340B-F857-4A14-83F5-25634C3BF043%26displaylang%3den"&gt;.Net Framework 3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=F54F5537-CC86-4BF5-AE44-F5A1E805680D&amp;amp;displaylang=en"&gt;.Net Framework 3.0 WCF/WPF extensions&lt;/a&gt; &lt;/li&gt;&lt;/ol&gt;References:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bloggingabout.net/blogs/dennis/archive/2007/04/21/wcf-simple-example.aspx"&gt;Simple WCF Example&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.thinktecture.com/cweyer/archive/2007/05/10/414840.aspx"&gt;Improving WCF Interoperability: Flattening your WSDL&lt;/a&gt;&lt;br /&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2029998&amp;amp;SiteID=1"&gt;eliminating http://tempuri.org in wsdl&lt;/a&gt;&lt;br /&gt;&lt;a href="http://groovy.codehaus.org/GroovyWS"&gt;Getting started with groovyWS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Update (6 March): Java/.Net interoperability&lt;a href="http://www.infoq.com/articles/os-ws-stacks-background"&gt; interviews with various SOAP project spokespersons&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-3716260530383446964?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/3716260530383446964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=3716260530383446964' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/3716260530383446964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/3716260530383446964'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2008/03/testing-wcf-services-using-groovyws.html' title='Testing WCF Services using groovyWS (Apache CXF)'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-9112700343215372056</id><published>2007-11-15T09:45:00.004+01:00</published><updated>2008-08-07T14:14:11.466+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Dtrace'/><title type='text'>Cross Platform Java Analysis with DTrace</title><content type='html'>Since URLs to Jazoon07 slides and blog postings seem to be changing, I'm posting here a stable link to my look into &lt;a href="http://www.geo.uzh.ch/%7Ejbrazile/jazoon07-dtrace-conference.ppt"&gt;Cross Platform Java Analysis with DTrace&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Update: I gave an updated talk, &lt;a href="http://jazoon.com/jazoon08/en/conference/presentations/ts/4260"&gt;Dtrace for Java Developers&lt;/a&gt; at Jazoon08&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-9112700343215372056?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/9112700343215372056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=9112700343215372056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/9112700343215372056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/9112700343215372056'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/11/since-urls-to-jazoon07-slides-and-blog.html' title='Cross Platform Java Analysis with DTrace'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-3899812300069320917</id><published>2007-10-02T12:41:00.002+02:00</published><updated>2008-03-06T08:17:53.362+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated characterization'/><title type='text'>Passive Characterization via Statistical Analysis</title><content type='html'>One area of &lt;a href="http://www.geo.uzh.ch/%7Ejbrazile/"&gt;my research&lt;/a&gt; employs the use of statistical analysis to &lt;a href="http://dx.doi.org/10.1109/LGRS.2006.873873"&gt;passively characterize an instrument using artifacts inherent in the output it produces&lt;/a&gt;. If asked to make an "&lt;a href="http://en.wikipedia.org/wiki/Elevator_pitch"&gt;elevator pitch&lt;/a&gt;" for it, I like to refer to similar but easier to describe applications such as the ability to &lt;a href="http://bookblog.net/gender/genie.php"&gt;determine an author's gender solely artifacts inherent in the text&lt;/a&gt;, or the ability to &lt;a href="http://www.cl.cam.ac.uk/%7Esjm217/talks/eurobsdcon07hotornot.pdf"&gt;identify particular anonymous machines on the internet by watching its packets go by&lt;/a&gt; using timing crystal artifacts inherent in is message timestamps. I just read a review in &lt;a href="http://economist.com/"&gt;the economist&lt;/a&gt; for a book called &lt;a href="http://www.amazon.de/exec/obidos/ASIN/0553805401"&gt;super crunchers&lt;/a&gt;, which sounds like it might be another source for such applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-3899812300069320917?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/3899812300069320917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=3899812300069320917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/3899812300069320917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/3899812300069320917'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/10/passive-characterization-via.html' title='Passive Characterization via Statistical Analysis'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-1982957505103809434</id><published>2007-04-19T07:48:00.002+02:00</published><updated>2008-03-06T09:31:58.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Postscript'/><title type='text'>Week day</title><content type='html'>In Europe, week numbers are used pretty extensively: The board is due to meet in week 33. Michael will be gone for military service in weeks 24-25. Please submit the quarterly numbers by week 17. Did you know there are &lt;a href="http://en.wikipedia.org/w/index.php?title=Week&amp;amp;section=9#_note-2"&gt;at least 6 different ways &lt;/a&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=Week&amp;amp;section=9#_note-2"&gt;that weeks are numbered&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Most of Europe seems to follow &lt;a href="http://en.wikipedia.org/wiki/ISO_8601"&gt;ISO 8601 numbering,&lt;/a&gt; which seems to be what BSD's "&lt;a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?cal"&gt;ncal -w&lt;/a&gt;" computes. But I need to fix my &lt;a href="http://www.geo.unizh.ch/%7Ejbrazile/quarter.ps"&gt;quarterly agenda generator in postscript &lt;/a&gt;(that I hacked up starting with &lt;a href="http://www.iainmurray.net/useful/pscal.ps"&gt;pscal code)&lt;/a&gt;, since I apparently coded up the American numbering by mistake.&lt;br /&gt;&lt;br /&gt;If you're always online, there is of course a web-based &lt;a href="http://personal.ecu.edu/mccartyr/isowdcal.html"&gt;alternative&lt;/a&gt; for looking it up. Its not clear&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;&lt;a href="http://calendar.yahoo.com/fbrazile_a36?v=2"&gt;which week number standard yahoo's calendar uses,&lt;/a&gt; since I only remember being able to specify which day the week begins on. Maybe it is inferred from your configured time zone?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-1982957505103809434?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/1982957505103809434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=1982957505103809434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/1982957505103809434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/1982957505103809434'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/04/week-day.html' title='Week day'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-7311718892490123302</id><published>2007-04-17T08:52:00.001+02:00</published><updated>2008-03-06T09:29:55.387+01:00</updated><title type='text'>Programming like it is still 1975?</title><content type='html'>There is an interesting new project called &lt;a href="http://varnish.projects.linpro.no/"&gt;Varnish&lt;/a&gt;, which implements a reverse proxy. It is apparently up to 10 times faster than squid.  But more interesting is why.&lt;br /&gt;&lt;br /&gt;The software architect, who is usually a kernel programmer, decided to do a "userland program" for a change, as a fun project.  Apparently he was disappointed that &lt;a href="http://varnish.projects.linpro.no/wiki/ArchitectNotes"&gt;most programs haven't even taken advantage of things that have already been available in FreeBSD and Linux for at&lt;br /&gt;least 10 years&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-7311718892490123302?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/7311718892490123302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=7311718892490123302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7311718892490123302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7311718892490123302'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/04/programming-like-it-is-still-1975.html' title='Programming like it is still 1975?'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-8825592832647040562</id><published>2007-04-17T08:48:00.000+02:00</published><updated>2007-04-17T08:51:58.931+02:00</updated><title type='text'>Linux threading scalability problems</title><content type='html'>After a couple of years of work on trying to make the FreeBSD kernel&lt;br /&gt;more concurrent, a couple of kernel hackers started to enable the&lt;br /&gt;concurrency (which is off by default) on an 8 CPU system &lt;a href="http://jeffr-tech.livejournal.com/6268.html#cutid1"&gt;and started &lt;br /&gt;to see much improved results&lt;/a&gt; using a mysql benchmark&lt;br /&gt;to measure it.&lt;br /&gt;&lt;br /&gt;To make sure they weren't too far behind linux (which they have been&lt;br /&gt;over the past couple of years) they compared the same benchmark on&lt;br /&gt;the same hardware with the most recent linux and found that linux had&lt;br /&gt;problems scaling when the number of threads was greater than the&lt;br /&gt;number of CPUs.&lt;br /&gt;&lt;br /&gt;Some linux hackers began to investigate this and found out that it is&lt;br /&gt;not just mysql. The most likely cause seems to be &lt;a href="http://www.gossamer-threads.com/lists/linux/kernel/737480?do=post_view_threaded"&gt;2 problems with&lt;br /&gt;glibc - meaning that any program that does threading and uses glibc&lt;br /&gt;(this includes java) would have the problem.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I guess once they identify the problem, it will probably be fixed within&lt;br /&gt;the next few months.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-8825592832647040562?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/8825592832647040562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=8825592832647040562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8825592832647040562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8825592832647040562'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/04/linux-threading-scalability-problems.html' title='Linux threading scalability problems'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-7118786690434885125</id><published>2007-04-17T08:38:00.001+02:00</published><updated>2008-03-06T09:31:00.148+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Conference: Soundly choosing language features</title><content type='html'>After a philosophical discussion with my brothers on programming languages, I &lt;a href="http://blog.jazoon.com/2007/04/12/off-on-a-tangent-soundly-choosing-language-features"&gt;posted my thoughts &lt;/a&gt;on how it is about time to add a little more science into the art of designing programming languages. Instead of relying on the &lt;a href="http://www.cs.inf.ethz.ch/%7Ewirth/Articles/GoodIdeas_origFig.pdf"&gt;individual tastes of Wirth&lt;/a&gt;, Gosling, Wall, or these days von Rossum or Matsumoto, we need languages that help less &lt;a href="http://www.spectrum.ieee.org/sep05/1685"&gt;IT projects to fail&lt;/a&gt;. And we need &lt;a href="http://wwwipd.ira.uka.de/%7Eprechelt/Biblio/jccpprtTR.pdf"&gt;objective metrics of real programmers&lt;/a&gt; for evaluating and quantifying our hypotheses on what works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-7118786690434885125?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/7118786690434885125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=7118786690434885125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7118786690434885125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/7118786690434885125'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/04/java-conference-soundly-choosing.html' title='Java Conference: Soundly choosing language features'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-4085764915745138257</id><published>2007-04-17T08:25:00.001+02:00</published><updated>2008-03-06T09:31:14.813+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Conference: Thoughts on future of concurrency</title><content type='html'>In &lt;a href="http://blog.jazoon.com/2007/04/02/off-on-a-tangent-the-future-of-concurrency/"&gt;another post &lt;/a&gt;on the Jazoon conference site, I describe a non-obvious concurrency problem we had to deal with in a recent project and daydream about the possibility of eventually having &lt;a href="http://en.wikipedia.org/wiki/Promise_%28programming%29"&gt;futures/promises&lt;/a&gt;, or something like it, that could maybe remove these kinds of problems from everyday coding much like garbage collection/reference counting removed (most) memory management problems from everyday programming. I point out that it would also be nice to implement it with an eye toward &lt;a href="http://www.cs.utexas.edu/users/moore/publications/mech-analysis-of-verif-strategies.pdf"&gt;mechanical verfiability.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-4085764915745138257?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/4085764915745138257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=4085764915745138257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/4085764915745138257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/4085764915745138257'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/04/jazoon-conference-thoughts-on-future-of.html' title='Java Conference: Thoughts on future of concurrency'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6023627401335780316.post-8074925136242983894</id><published>2007-04-17T08:15:00.001+02:00</published><updated>2008-03-06T08:18:31.010+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>Java Conference: REST for java</title><content type='html'>I will be presenting a &lt;a href="http://jazoon.com/en/conference/program/ts.html"&gt;RESTful grid tool &lt;/a&gt;at the upcoming &lt;a href="http://jazoon.com/"&gt;Jazoon international conference on java.&lt;/a&gt; As I mentioned in more detail &lt;a href="http://blog.jazoon.com/2007/03/21/rest-gaining-momentum/"&gt;there,&lt;/a&gt; I am glad to see that there will soon be more supported (and therefore likely to be more consistent) alternatives for REST (as opposed to WS-*) for web services in Java. Also interesting is that &lt;a href="http://www.ics.uci.edu/%7Efielding/"&gt;Roy Fielding, father of REST&lt;/a&gt;, has been invited as a Keynote speaker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6023627401335780316-8074925136242983894?l=jbrazile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jbrazile.blogspot.com/feeds/8074925136242983894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6023627401335780316&amp;postID=8074925136242983894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8074925136242983894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6023627401335780316/posts/default/8074925136242983894'/><link rel='alternate' type='text/html' href='http://jbrazile.blogspot.com/2007/04/java-conference-rest-for-java.html' title='Java Conference: REST for java'/><author><name>Jason Brazile</name><uri>http://www.blogger.com/profile/10953864724434166682</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
